Skip to content

Commit 05abeca

Browse files
authored
Merge pull request #21 from Webperf-se/include-resolved-issues
Introduce subIssues as concept
2 parents bd533e9 + dc31808 commit 05abeca

File tree

2 files changed

+89
-70
lines changed

2 files changed

+89
-70
lines changed

lib/harAnalyzer.js

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@ export class HarAnalyzer {
1414
overrideConfigFile: true,
1515
overrideConfig: securityConfig
1616
});
17+
this.securityRules = securityConfig[0].rules;
1718
this.eslintStandard = new ESLint({
1819
overrideConfigFile: true,
1920
overrideConfig: standardConfig
2021
});
22+
this.standardRules = standardConfig[0].rules;
2123

2224
const libFolder = fileURLToPath(new URL('..', import.meta.url));
2325
this.pluginFolder = path.resolve(libFolder, '..');
@@ -91,8 +93,7 @@ export class HarAnalyzer {
9193
let knowledgeData = {
9294
'url': url,
9395
'group': group,
94-
'issues': [],
95-
'resolved-rules': []
96+
'issues': {}
9697
};
9798

9899
if (analyzedData === undefined) {
@@ -139,8 +140,40 @@ export class HarAnalyzer {
139140

140141
// Wait for all linting promises to resolve and flatten the results
141142
const lintResults = await Promise.all(lintPromises);
142-
knowledgeData.issues = lintResults.flat();
143+
const flatResults = lintResults.flat();
144+
145+
// Convert issues to a set grouped by rule
146+
const issuesByRule = {};
147+
for (const issue of flatResults) {
148+
if (!issuesByRule[issue.rule]) {
149+
issuesByRule[issue.rule] = {
150+
rule: issue.rule,
151+
category: issue.category,
152+
severity: issue.severity,
153+
subIssues: []
154+
};
155+
}
156+
issuesByRule[issue.rule].subIssues.push(issue);
157+
}
158+
159+
// Add missing rules from securityConfig and standardConfig
160+
const allRules = [
161+
...Object.keys(this.securityRules || {}).filter(rule => this.securityRules[rule] !== "off"),
162+
...Object.keys(this.standardRules || {}).filter(rule => this.standardRules[rule] !== "off")
163+
];
164+
165+
for (const rule of allRules) {
166+
if (!issuesByRule[rule]) {
167+
issuesByRule[rule] = {
168+
rule: rule,
169+
category: rule in this.securityRules ? 'security' : 'standard',
170+
severity: 'resolved', // Default severity for missing issues
171+
subIssues: []
172+
};
173+
}
174+
}
143175

176+
knowledgeData.issues = issuesByRule;
144177

145178
return knowledgeData;
146179
}

pug/index.pug

Lines changed: 53 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,84 +1,70 @@
11
- let pluginData = pageInfo.data['webperf-plugin-javascript'].run ? pageInfo.data['webperf-plugin-javascript'].run : pageInfo.data['webperf-plugin-javascript'].pageSummary
22

3-
if pluginData.knowledgeData && pluginData.knowledgeData.issues && pluginData.knowledgeData.issues.length > 0
4-
- if (pluginData.knowledgeData.issues.length > 15)
5-
h1 Grouped Issues
6-
- let groupedIssues = {};
7-
- pluginData.knowledgeData.issues.forEach(issue => {
8-
- let key = `${issue.rule}-${issue.category}-${issue.severity}`;
9-
- if (!groupedIssues[key]) {
10-
- groupedIssues[key] = { rule: issue.rule, category: issue.category, severity: issue.severity, count: 0 };
11-
- }
12-
- groupedIssues[key].count++;
13-
- });
14-
- const severityOrder = { critical: 4, error: 3, warning: 2, info: 1 };
15-
- let sortedGroupedIssues = Object.values(groupedIssues).sort((a, b) => {
16-
- if (severityOrder[b.severity] !== severityOrder[a.severity]) {
17-
- return severityOrder[b.severity] - severityOrder[a.severity];
18-
- }
19-
- return b.count - a.count;
20-
- });
21-
table
22-
thead
3+
if pluginData.knowledgeData && pluginData.knowledgeData.issues && Object.keys(pluginData.knowledgeData.issues).length > 0
4+
- let issueSets = pluginData.knowledgeData.issues;
5+
- let issues = Object.values(issueSets);
6+
- const severityOrder = { critical: 4, error: 3, warning: 2, info: 1, none: 0 };
7+
- let sortedIssues = issues.sort((a, b) => {
8+
- if (severityOrder[b.severity] !== severityOrder[a.severity]) {
9+
- return severityOrder[b.severity] - severityOrder[a.severity];
10+
- }
11+
- return b.subIssues.length - a.subIssues.length;
12+
- });
13+
14+
h1 Issues
15+
table
16+
thead
17+
tr
18+
th Rule
19+
th Category
20+
th Sub Issue Count
21+
th Severity
22+
tbody
23+
each value in sortedIssues
2324
tr
24-
th Rule
25-
th Category
26-
th Severity
27-
th Count
28-
tbody
29-
each value in sortedGroupedIssues
30-
tr
31-
td
32-
a(href=`#rule-${value.rule}`)= value.rule
33-
td= value.category
34-
td= value.severity
35-
td= value.count
25+
td
26+
a(href=`#rule-${value.rule}`)= value.rule
27+
td= value.category
28+
td= value.subIssues.length
29+
td
30+
if value.severity === 'resolved'
31+
span.label.ok Resolved
32+
else if value.severity === 'warning'
33+
span.label.warning Warning
34+
else if value.severity === 'error'
35+
span.label.error Error
36+
else if value.severity === 'info'
37+
span.label.info Info
38+
else
39+
= value.severity
3640

37-
// Add tables for each rule
38-
each value in sortedGroupedIssues
39-
h2(id=`rule-${value.rule}`)= `Rule: ${value.rule}`
40-
p
41-
strong Category:
42-
= value.category
43-
br
44-
strong Severity:
45-
= value.severity
46-
- if (pluginData.knowledgeData.issues.filter(issue => issue.rule === value.rule).length > 100)
47-
p Note: Only the first 100 issues are displayed.
48-
table
49-
thead
50-
tr
51-
th URL
52-
th Text
53-
th Line
54-
th Column
55-
tbody
56-
- let limitedIssues = pluginData.knowledgeData.issues.filter(issue => issue.rule === value.rule).slice(0, 100);
57-
each issue in limitedIssues
58-
tr
59-
td= issue.url
60-
td= issue.text
61-
td= issue.line
62-
td= issue.column
63-
- else
64-
h1 Issues
41+
// Add tables for each rule
42+
each value in sortedIssues
43+
h2(id=`rule-${value.rule}`)= `${value.rule}`
44+
p
45+
strong Category:
46+
= value.category
47+
br
48+
strong Severity:
49+
= value.severity
50+
br
51+
strong More info link:
52+
a(href=`https://eslint.org/docs/latest/rules/${value.rule}` target="_blank")= "ESLint Docs"
53+
54+
- if (value.subIssues.length > 100)
55+
p Note: Only the first 100 issues are displayed.
6556
table
6657
thead
6758
tr
6859
th URL
69-
th Rule
70-
th Category
71-
th Severity
7260
th Text
7361
th Line
7462
th Column
7563
tbody
76-
each issue in pluginData.knowledgeData.issues
64+
- let limitedIssues = value.subIssues.slice(0, 100);
65+
each issue in limitedIssues
7766
tr
7867
td= issue.url
79-
td= issue.rule
80-
td= issue.category
81-
td= issue.severity
8268
td= issue.text
8369
td= issue.line
8470
td= issue.column

0 commit comments

Comments
 (0)