@sfdxy/mule-lint 1.4.0 → 1.5.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/README.md +25 -7
- package/dist/bin/mule-lint.js +5 -0
- package/dist/bin/mule-lint.js.map +1 -1
- package/dist/src/formatters/CsvFormatter.d.ts +6 -0
- package/dist/src/formatters/CsvFormatter.d.ts.map +1 -0
- package/dist/src/formatters/CsvFormatter.js +46 -0
- package/dist/src/formatters/CsvFormatter.js.map +1 -0
- package/dist/src/formatters/HtmlFormatter.d.ts +6 -0
- package/dist/src/formatters/HtmlFormatter.d.ts.map +1 -0
- package/dist/src/formatters/HtmlFormatter.js +386 -0
- package/dist/src/formatters/HtmlFormatter.js.map +1 -0
- package/dist/src/formatters/index.d.ts +2 -0
- package/dist/src/formatters/index.d.ts.map +1 -1
- package/dist/src/formatters/index.js +8 -0
- package/dist/src/formatters/index.js.map +1 -1
- package/dist/src/types/Config.d.ts +1 -1
- package/dist/src/types/Config.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
**Mule-Lint** is a TypeScript-based linting tool designed to enforce best practices and standards for MuleSoft applications. It provides:
|
|
21
21
|
|
|
22
22
|
- ✅ **10+ Built-in Rules** covering error handling, naming conventions, security, and logging
|
|
23
|
-
- ✅ **Multiple Output Formats** - Table
|
|
23
|
+
- ✅ **Multiple Output Formats** - Table, JSON, SARIF, HTML, CSV <!-- id: 4 -->
|
|
24
24
|
- ✅ **CI/CD Ready** - Exit codes and machine-readable output
|
|
25
25
|
- ✅ **TypeScript** - Fully typed for VS Code extension integration
|
|
26
26
|
- ✅ **Extensible** - Add custom rules for your organization
|
|
@@ -65,7 +65,7 @@ flowchart LR
|
|
|
65
65
|
B --> C["Execute Rules"]
|
|
66
66
|
C --> D["Collect Issues"]
|
|
67
67
|
D --> E["Format Output"]
|
|
68
|
-
E --> F["Table / JSON / SARIF"]
|
|
68
|
+
E --> F["Table / JSON / SARIF / HTML / CSV"]
|
|
69
69
|
```
|
|
70
70
|
|
|
71
71
|
|
|
@@ -75,10 +75,10 @@ flowchart LR
|
|
|
75
75
|
|
|
76
76
|
```bash
|
|
77
77
|
# Global installation
|
|
78
|
-
npm install -g mule-lint
|
|
78
|
+
npm install -g @sfdxy/mule-lint
|
|
79
79
|
|
|
80
80
|
# Or as a dev dependency
|
|
81
|
-
npm install --save-dev mule-lint
|
|
81
|
+
npm install --save-dev @sfdxy/mule-lint
|
|
82
82
|
```
|
|
83
83
|
|
|
84
84
|
---
|
|
@@ -109,7 +109,7 @@ mule-lint ./src/main/mule --fail-on-warning
|
|
|
109
109
|
|
|
110
110
|
| Option | Description |
|
|
111
111
|
|--------|-------------|
|
|
112
|
-
| `-f, --format <type>` | Output format: `table`, `json`, `sarif` (default: `table`) |
|
|
112
|
+
| `-f, --format <type>` | Output format: `table`, `json`, `sarif`, `html`, `csv` (default: `table`) |
|
|
113
113
|
| `-o, --output <file>` | Write output to file instead of stdout |
|
|
114
114
|
| `-c, --config <file>` | Path to configuration file |
|
|
115
115
|
| `-q, --quiet` | Show only errors (suppress warnings and info) |
|
|
@@ -259,6 +259,24 @@ Machine-readable for scripting:
|
|
|
259
259
|
}
|
|
260
260
|
```
|
|
261
261
|
|
|
262
|
+
### HTML (Human Readable)
|
|
263
|
+
|
|
264
|
+
Generates a visual report with summary cards and correct issue highlighting:
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
mule-lint src/main/mule -f html -o report.html
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### CSV (Spreadsheet)
|
|
271
|
+
|
|
272
|
+
Generates a comma-separated values file for Excel import:
|
|
273
|
+
|
|
274
|
+
```csv
|
|
275
|
+
Severity,Rule,File,Line,Column,Message
|
|
276
|
+
error,MULE-001,src/main/mule/app.xml,10,5,"Global Error Handler missing"
|
|
277
|
+
warning,MULE-002,src/main/mule/app.xml,15,4,"Flow name not kebab-case"
|
|
278
|
+
```
|
|
279
|
+
|
|
262
280
|
---
|
|
263
281
|
|
|
264
282
|
## Configuration
|
|
@@ -298,7 +316,7 @@ Create a `.mulelintrc.json` file in your project root:
|
|
|
298
316
|
Import directly into your TypeScript/JavaScript projects:
|
|
299
317
|
|
|
300
318
|
```typescript
|
|
301
|
-
import { LintEngine, ALL_RULES, formatSarif } from 'mule-lint';
|
|
319
|
+
import { LintEngine, ALL_RULES, formatSarif } from '@sfdxy/mule-lint';
|
|
302
320
|
|
|
303
321
|
// Create engine with all rules
|
|
304
322
|
const engine = new LintEngine({
|
|
@@ -325,7 +343,7 @@ const issues = engine.scanContent(xmlContent, 'file.xml');
|
|
|
325
343
|
See [Extending Guide](docs/extending.md) for detailed instructions on creating custom rules.
|
|
326
344
|
|
|
327
345
|
```typescript
|
|
328
|
-
import { BaseRule, ValidationContext, Issue } from 'mule-lint';
|
|
346
|
+
import { BaseRule, ValidationContext, Issue } from '@sfdxy/mule-lint';
|
|
329
347
|
|
|
330
348
|
export class MyCustomRule extends BaseRule {
|
|
331
349
|
id = 'CUSTOM-001';
|
package/dist/bin/mule-lint.js
CHANGED
|
@@ -111,6 +111,11 @@ async function runLint(targetPath, options) {
|
|
|
111
111
|
fs.writeFileSync(outputPath, output, 'utf-8');
|
|
112
112
|
console.log(`Report written to: ${outputPath}`);
|
|
113
113
|
}
|
|
114
|
+
else if (formatterType === 'html') {
|
|
115
|
+
const outputPath = path.resolve('report.html');
|
|
116
|
+
fs.writeFileSync(outputPath, output, 'utf-8');
|
|
117
|
+
console.log(`Report written to: ${outputPath}`);
|
|
118
|
+
}
|
|
114
119
|
else {
|
|
115
120
|
console.log(output);
|
|
116
121
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mule-lint.js","sourceRoot":"","sources":["../../bin/mule-lint.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mule-lint.js","sourceRoot":"","sources":["../../bin/mule-lint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CsvFormatter.d.ts","sourceRoot":"","sources":["../../../src/formatters/CsvFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAiCpD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatCsv = formatCsv;
|
|
4
|
+
/**
|
|
5
|
+
* Format lint report as CSV
|
|
6
|
+
*/
|
|
7
|
+
function formatCsv(report) {
|
|
8
|
+
const lines = [];
|
|
9
|
+
// Header
|
|
10
|
+
lines.push('Severity,Rule,File,Line,Column,Message');
|
|
11
|
+
// Files
|
|
12
|
+
for (const file of report.files) {
|
|
13
|
+
if (!file.parsed) {
|
|
14
|
+
lines.push(escapeCsvRow([
|
|
15
|
+
'error',
|
|
16
|
+
'PARSE-ERROR',
|
|
17
|
+
file.relativePath,
|
|
18
|
+
'1',
|
|
19
|
+
'1',
|
|
20
|
+
file.parseError || 'Failed to parse file'
|
|
21
|
+
]));
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
for (const issue of file.issues) {
|
|
25
|
+
lines.push(escapeCsvRow([
|
|
26
|
+
issue.severity,
|
|
27
|
+
issue.ruleId,
|
|
28
|
+
file.relativePath,
|
|
29
|
+
issue.line.toString(),
|
|
30
|
+
(issue.column || 0).toString(),
|
|
31
|
+
issue.message
|
|
32
|
+
]));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return lines.join('\n');
|
|
36
|
+
}
|
|
37
|
+
function escapeCsvRow(fields) {
|
|
38
|
+
return fields.map(field => {
|
|
39
|
+
const escaped = field.replace(/"/g, '""');
|
|
40
|
+
if (escaped.includes(',') || escaped.includes('"') || escaped.includes('\n')) {
|
|
41
|
+
return `"${escaped}"`;
|
|
42
|
+
}
|
|
43
|
+
return escaped;
|
|
44
|
+
}).join(',');
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=CsvFormatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CsvFormatter.js","sourceRoot":"","sources":["../../../src/formatters/CsvFormatter.ts"],"names":[],"mappings":";;AAKA,8BAiCC;AApCD;;GAEG;AACH,SAAgB,SAAS,CAAC,MAAkB;IACxC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,SAAS;IACT,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IAErD,QAAQ;IACR,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC;gBACpB,OAAO;gBACP,aAAa;gBACb,IAAI,CAAC,YAAY;gBACjB,GAAG;gBACH,GAAG;gBACH,IAAI,CAAC,UAAU,IAAI,sBAAsB;aAC5C,CAAC,CAAC,CAAC;YACJ,SAAS;QACb,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC;gBACpB,KAAK,CAAC,QAAQ;gBACd,KAAK,CAAC,MAAM;gBACZ,IAAI,CAAC,YAAY;gBACjB,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE;gBACrB,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE;gBAC9B,KAAK,CAAC,OAAO;aAChB,CAAC,CAAC,CAAC;QACR,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,YAAY,CAAC,MAAgB;IAClC,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QACtB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1C,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3E,OAAO,IAAI,OAAO,GAAG,CAAC;QAC1B,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HtmlFormatter.d.ts","sourceRoot":"","sources":["../../../src/formatters/HtmlFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAkXrD"}
|
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatHtml = formatHtml;
|
|
4
|
+
/**
|
|
5
|
+
* Format lint report as a modern, interactive HTML page
|
|
6
|
+
*/
|
|
7
|
+
function formatHtml(report) {
|
|
8
|
+
const title = 'Mule-Lint Report';
|
|
9
|
+
const date = new Date(report.timestamp).toLocaleString();
|
|
10
|
+
// Calculate stats
|
|
11
|
+
const totalErrors = report.summary.bySeverity.error;
|
|
12
|
+
const totalWarnings = report.summary.bySeverity.warning;
|
|
13
|
+
const totalInfos = report.summary.bySeverity.info;
|
|
14
|
+
const totalIssues = totalErrors + totalWarnings + totalInfos;
|
|
15
|
+
// Collect all issues into a flat list for the table
|
|
16
|
+
const allIssues = [];
|
|
17
|
+
for (const file of report.files) {
|
|
18
|
+
if (!file.parsed) {
|
|
19
|
+
allIssues.push({
|
|
20
|
+
severity: 'error',
|
|
21
|
+
file: file.relativePath,
|
|
22
|
+
line: 1,
|
|
23
|
+
column: 1,
|
|
24
|
+
message: file.parseError || 'Failed to parse XML file',
|
|
25
|
+
ruleId: 'PARSE-ERROR'
|
|
26
|
+
});
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
for (const issue of file.issues) {
|
|
30
|
+
allIssues.push({
|
|
31
|
+
severity: issue.severity,
|
|
32
|
+
file: file.relativePath,
|
|
33
|
+
line: issue.line,
|
|
34
|
+
column: issue.column || 0,
|
|
35
|
+
message: issue.message,
|
|
36
|
+
ruleId: issue.ruleId
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return `<!DOCTYPE html>
|
|
41
|
+
<html lang="en">
|
|
42
|
+
<head>
|
|
43
|
+
<meta charset="UTF-8">
|
|
44
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
45
|
+
<title>${title}</title>
|
|
46
|
+
<style>
|
|
47
|
+
:root {
|
|
48
|
+
--primary: #00A1DF; /* MuleSoft Blue */
|
|
49
|
+
--primary-dark: #0077A5;
|
|
50
|
+
--success: #4CAF50;
|
|
51
|
+
--error: #F44336;
|
|
52
|
+
--warning: #FF9800;
|
|
53
|
+
--info: #2196F3;
|
|
54
|
+
--surface: #ffffff;
|
|
55
|
+
--background: #f4f6f8;
|
|
56
|
+
--text-primary: #172b4d;
|
|
57
|
+
--text-secondary: #6b778c;
|
|
58
|
+
--border: #dfe1e6;
|
|
59
|
+
--shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
body {
|
|
63
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
|
|
64
|
+
margin: 0;
|
|
65
|
+
padding: 0;
|
|
66
|
+
background-color: var(--background);
|
|
67
|
+
color: var(--text-primary);
|
|
68
|
+
line-height: 1.6;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/* Layout */
|
|
72
|
+
.container {
|
|
73
|
+
width: 95%; /* Full width as requested */
|
|
74
|
+
margin: 0 auto;
|
|
75
|
+
padding: 20px;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* Header */
|
|
79
|
+
header {
|
|
80
|
+
background-color: var(--surface);
|
|
81
|
+
padding: 1rem 0;
|
|
82
|
+
box-shadow: 0 2px 4px rgba(0,0,0,0.05);
|
|
83
|
+
margin-bottom: 2rem;
|
|
84
|
+
position: sticky;
|
|
85
|
+
top: 0;
|
|
86
|
+
z-index: 100;
|
|
87
|
+
}
|
|
88
|
+
.header-content {
|
|
89
|
+
display: flex;
|
|
90
|
+
justify-content: space-between;
|
|
91
|
+
align-items: center;
|
|
92
|
+
}
|
|
93
|
+
h1 { margin: 0; color: var(--primary); font-size: 1.5rem; display: flex; align-items: center; gap: 10px; }
|
|
94
|
+
.meta { color: var(--text-secondary); font-size: 0.9em; }
|
|
95
|
+
|
|
96
|
+
/* Dashboard Grid */
|
|
97
|
+
.dashboard {
|
|
98
|
+
display: grid;
|
|
99
|
+
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
|
100
|
+
gap: 20px;
|
|
101
|
+
margin-bottom: 30px;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/* Cards */
|
|
105
|
+
.card {
|
|
106
|
+
background: var(--surface);
|
|
107
|
+
padding: 24px;
|
|
108
|
+
border-radius: 8px;
|
|
109
|
+
box-shadow: var(--shadow);
|
|
110
|
+
display: flex;
|
|
111
|
+
flex-direction: column;
|
|
112
|
+
align-items: center;
|
|
113
|
+
justify-content: center;
|
|
114
|
+
transition: transform 0.2s;
|
|
115
|
+
}
|
|
116
|
+
.card:hover { transform: translateY(-2px); }
|
|
117
|
+
|
|
118
|
+
.number { font-size: 3rem; font-weight: 700; line-height: 1; margin-bottom: 0.5rem; }
|
|
119
|
+
.label { color: var(--text-secondary); font-size: 0.9rem; text-transform: uppercase; letter-spacing: 0.05em; font-weight: 600; }
|
|
120
|
+
|
|
121
|
+
/* Filters */
|
|
122
|
+
.controls {
|
|
123
|
+
display: flex;
|
|
124
|
+
gap: 15px;
|
|
125
|
+
margin-bottom: 20px;
|
|
126
|
+
align-items: center;
|
|
127
|
+
background: var(--surface);
|
|
128
|
+
padding: 15px;
|
|
129
|
+
border-radius: 8px;
|
|
130
|
+
box-shadow: var(--shadow);
|
|
131
|
+
}
|
|
132
|
+
.search-box {
|
|
133
|
+
flex: 1;
|
|
134
|
+
padding: 10px 15px;
|
|
135
|
+
border: 1px solid var(--border);
|
|
136
|
+
border-radius: 6px;
|
|
137
|
+
font-size: 1rem;
|
|
138
|
+
}
|
|
139
|
+
.filter-group {
|
|
140
|
+
display: flex;
|
|
141
|
+
gap: 10px;
|
|
142
|
+
}
|
|
143
|
+
.filter-btn {
|
|
144
|
+
padding: 8px 16px;
|
|
145
|
+
border: 1px solid var(--border);
|
|
146
|
+
background: var(--background);
|
|
147
|
+
border-radius: 6px;
|
|
148
|
+
cursor: pointer;
|
|
149
|
+
font-weight: 500;
|
|
150
|
+
color: var(--text-secondary);
|
|
151
|
+
display: flex;
|
|
152
|
+
align-items: center;
|
|
153
|
+
gap: 6px;
|
|
154
|
+
}
|
|
155
|
+
.filter-btn.active {
|
|
156
|
+
background: var(--primary);
|
|
157
|
+
color: white;
|
|
158
|
+
border-color: var(--primary);
|
|
159
|
+
}
|
|
160
|
+
.filter-btn:hover:not(.active) { background: #e0e0e0; }
|
|
161
|
+
|
|
162
|
+
/* Issues Table */
|
|
163
|
+
.table-container {
|
|
164
|
+
background: var(--surface);
|
|
165
|
+
border-radius: 8px;
|
|
166
|
+
box-shadow: var(--shadow);
|
|
167
|
+
overflow-x: auto;
|
|
168
|
+
}
|
|
169
|
+
table {
|
|
170
|
+
width: 100%;
|
|
171
|
+
border-collapse: collapse;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
th, td {
|
|
175
|
+
text-align: left;
|
|
176
|
+
padding: 12px 20px;
|
|
177
|
+
border-bottom: 1px solid var(--border);
|
|
178
|
+
}
|
|
179
|
+
th {
|
|
180
|
+
background: #f9f9f9;
|
|
181
|
+
color: var(--text-secondary);
|
|
182
|
+
font-weight: 600;
|
|
183
|
+
font-size: 0.85rem;
|
|
184
|
+
text-transform: uppercase;
|
|
185
|
+
position: sticky;
|
|
186
|
+
top: 0;
|
|
187
|
+
}
|
|
188
|
+
tr:hover { background-color: #f5f9ff; }
|
|
189
|
+
tr:last-child td { border-bottom: none; }
|
|
190
|
+
|
|
191
|
+
.severity-badge {
|
|
192
|
+
font-weight: 700;
|
|
193
|
+
text-transform: uppercase;
|
|
194
|
+
font-size: 0.75rem;
|
|
195
|
+
padding: 4px 8px;
|
|
196
|
+
border-radius: 4px;
|
|
197
|
+
display: inline-block;
|
|
198
|
+
min-width: 60px;
|
|
199
|
+
text-align: center;
|
|
200
|
+
}
|
|
201
|
+
.bg-error { background-color: #ffebee; color: var(--error); }
|
|
202
|
+
.bg-warning { background-color: #fff3e0; color: var(--warning); }
|
|
203
|
+
.bg-info { background-color: #e3f2fd; color: var(--info); }
|
|
204
|
+
|
|
205
|
+
.file-link { font-family: monospace; font-weight: 600; color: var(--text-primary); }
|
|
206
|
+
.location { font-family: monospace; color: var(--text-secondary); }
|
|
207
|
+
|
|
208
|
+
.rule-pill {
|
|
209
|
+
display: inline-block;
|
|
210
|
+
background: #eef2f5;
|
|
211
|
+
padding: 2px 8px;
|
|
212
|
+
border-radius: 4px;
|
|
213
|
+
font-size: 0.8rem;
|
|
214
|
+
color: var(--text-secondary);
|
|
215
|
+
font-family: monospace;
|
|
216
|
+
border: 1px solid #dce1e6;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
.empty-state {
|
|
220
|
+
text-align: center;
|
|
221
|
+
padding: 60px;
|
|
222
|
+
color: var(--text-secondary);
|
|
223
|
+
}
|
|
224
|
+
.empty-icon { font-size: 3rem; margin-bottom: 1rem; }
|
|
225
|
+
|
|
226
|
+
/* Responsive */
|
|
227
|
+
@media (max-width: 768px) {
|
|
228
|
+
.controls { flex-direction: column; align-items: stretch; }
|
|
229
|
+
.filter-group { justify-content: space-between; }
|
|
230
|
+
}
|
|
231
|
+
</style>
|
|
232
|
+
</head>
|
|
233
|
+
<body>
|
|
234
|
+
<header>
|
|
235
|
+
<div class="container header-content">
|
|
236
|
+
<div>
|
|
237
|
+
<h1>
|
|
238
|
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5"/></svg>
|
|
239
|
+
${title}
|
|
240
|
+
</h1>
|
|
241
|
+
<div class="meta">Generated on ${date}</div>
|
|
242
|
+
</div>
|
|
243
|
+
<div>
|
|
244
|
+
<a href="#" onclick="window.print()" style="color: var(--primary); text-decoration: none; font-weight: 500;">Download / Print</a>
|
|
245
|
+
</div>
|
|
246
|
+
</div>
|
|
247
|
+
</header>
|
|
248
|
+
|
|
249
|
+
<div class="container">
|
|
250
|
+
<!-- Dashboard -->
|
|
251
|
+
<div class="dashboard">
|
|
252
|
+
<div class="card">
|
|
253
|
+
<span class="number" style="color: var(--error)">${totalErrors}</span>
|
|
254
|
+
<span class="label">Errors</span>
|
|
255
|
+
</div>
|
|
256
|
+
<div class="card">
|
|
257
|
+
<span class="number" style="color: var(--warning)">${totalWarnings}</span>
|
|
258
|
+
<span class="label">Warnings</span>
|
|
259
|
+
</div>
|
|
260
|
+
<div class="card">
|
|
261
|
+
<span class="number" style="color: var(--info)">${totalInfos}</span>
|
|
262
|
+
<span class="label">Infos</span>
|
|
263
|
+
</div>
|
|
264
|
+
<div class="card">
|
|
265
|
+
<span class="number">${report.files.length}</span>
|
|
266
|
+
<span class="label">Files Scanned</span>
|
|
267
|
+
</div>
|
|
268
|
+
</div>
|
|
269
|
+
|
|
270
|
+
<!-- Controls -->
|
|
271
|
+
<div class="controls">
|
|
272
|
+
<input type="text" id="searchInput" class="search-box" placeholder="Search by file, message, or rule..." onkeyup="filterTable()">
|
|
273
|
+
<div class="filter-group">
|
|
274
|
+
<button class="filter-btn active" onclick="toggleFilter('all', this)" id="btn-all">All</button>
|
|
275
|
+
<button class="filter-btn" onclick="toggleFilter('error', this)" id="btn-error">Errors</button>
|
|
276
|
+
<button class="filter-btn" onclick="toggleFilter('warning', this)" id="btn-warning">Warnings</button>
|
|
277
|
+
<button class="filter-btn" onclick="toggleFilter('info', this)" id="btn-info">Infos</button>
|
|
278
|
+
</div>
|
|
279
|
+
</div>
|
|
280
|
+
|
|
281
|
+
<!-- Main Table -->
|
|
282
|
+
<div class="table-container">
|
|
283
|
+
<table id="issuesTable">
|
|
284
|
+
<thead>
|
|
285
|
+
<tr>
|
|
286
|
+
<th width="100">Severity</th>
|
|
287
|
+
<th width="150">Rule</th>
|
|
288
|
+
<th width="300">File</th>
|
|
289
|
+
<th width="100">Location</th>
|
|
290
|
+
<th>Message</th>
|
|
291
|
+
</tr>
|
|
292
|
+
</thead>
|
|
293
|
+
<tbody>
|
|
294
|
+
${allIssues.map(issue => renderIssueRow(issue)).join('')}
|
|
295
|
+
</tbody>
|
|
296
|
+
</table>
|
|
297
|
+
|
|
298
|
+
${totalIssues === 0 && report.summary.parseErrors === 0 ? `
|
|
299
|
+
<div class="empty-state">
|
|
300
|
+
<div class="empty-icon">🎉</div>
|
|
301
|
+
<h2>No issues found!</h2>
|
|
302
|
+
<p>Your MuleSoft code looks clean and compliant.</p>
|
|
303
|
+
</div>
|
|
304
|
+
` : ''}
|
|
305
|
+
|
|
306
|
+
<div id="noResults" class="empty-state" style="display: none;">
|
|
307
|
+
<h2>No matching issues found</h2>
|
|
308
|
+
<p>Try adjusting your search filters.</p>
|
|
309
|
+
</div>
|
|
310
|
+
</div>
|
|
311
|
+
</div>
|
|
312
|
+
|
|
313
|
+
<script>
|
|
314
|
+
let currentSeverity = 'all';
|
|
315
|
+
|
|
316
|
+
function toggleFilter(severity, btn) {
|
|
317
|
+
currentSeverity = severity;
|
|
318
|
+
|
|
319
|
+
// Update buttons
|
|
320
|
+
document.querySelectorAll('.filter-btn').forEach(b => b.classList.remove('active'));
|
|
321
|
+
btn.classList.add('active');
|
|
322
|
+
|
|
323
|
+
filterTable();
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
function filterTable() {
|
|
327
|
+
const input = document.getElementById('searchInput');
|
|
328
|
+
const filter = input.value.toLowerCase();
|
|
329
|
+
const table = document.getElementById('issuesTable');
|
|
330
|
+
const tr = table.getElementsByTagName('tr');
|
|
331
|
+
let visibleCount = 0;
|
|
332
|
+
|
|
333
|
+
for (let i = 1; i < tr.length; i++) {
|
|
334
|
+
const row = tr[i];
|
|
335
|
+
const severity = row.getAttribute('data-severity');
|
|
336
|
+
const text = row.innerText.toLowerCase();
|
|
337
|
+
|
|
338
|
+
const severityMatch = currentSeverity === 'all' || severity === currentSeverity;
|
|
339
|
+
const textMatch = text.includes(filter);
|
|
340
|
+
|
|
341
|
+
if (severityMatch && textMatch) {
|
|
342
|
+
row.style.display = '';
|
|
343
|
+
visibleCount++;
|
|
344
|
+
} else {
|
|
345
|
+
row.style.display = 'none';
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// Show/hide no results message
|
|
350
|
+
const noResults = document.getElementById('noResults');
|
|
351
|
+
const emptyState = document.querySelector('.empty-state:not(#noResults)');
|
|
352
|
+
|
|
353
|
+
if (emptyState) return; // Don't interfere if main empty state is shown
|
|
354
|
+
|
|
355
|
+
if (visibleCount === 0 && tr.length > 1) {
|
|
356
|
+
noResults.style.display = 'block';
|
|
357
|
+
table.style.display = 'none';
|
|
358
|
+
} else {
|
|
359
|
+
noResults.style.display = 'none';
|
|
360
|
+
table.style.display = '';
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
</script>
|
|
364
|
+
</body>
|
|
365
|
+
</html>`;
|
|
366
|
+
}
|
|
367
|
+
function renderIssueRow(issue) {
|
|
368
|
+
const badgeClass = issue.severity === 'error' ? 'bg-error' :
|
|
369
|
+
issue.severity === 'warning' ? 'bg-warning' : 'bg-info';
|
|
370
|
+
return `<tr data-severity="${issue.severity}">
|
|
371
|
+
<td><span class="severity-badge ${badgeClass}">${issue.severity}</span></td>
|
|
372
|
+
<td><span class="rule-pill">${issue.ruleId}</span></td>
|
|
373
|
+
<td class="file-link" title="${issue.file}">${issue.file}</td>
|
|
374
|
+
<td class="location">${issue.line}:${issue.column}</td>
|
|
375
|
+
<td>${escapeHtml(issue.message)}</td>
|
|
376
|
+
</tr>`;
|
|
377
|
+
}
|
|
378
|
+
function escapeHtml(unsafe) {
|
|
379
|
+
return unsafe
|
|
380
|
+
.replace(/&/g, "&")
|
|
381
|
+
.replace(/</g, "<")
|
|
382
|
+
.replace(/>/g, ">")
|
|
383
|
+
.replace(/"/g, """)
|
|
384
|
+
.replace(/'/g, "'");
|
|
385
|
+
}
|
|
386
|
+
//# sourceMappingURL=HtmlFormatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HtmlFormatter.js","sourceRoot":"","sources":["../../../src/formatters/HtmlFormatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export * from './TableFormatter';
|
|
2
2
|
export * from './JsonFormatter';
|
|
3
3
|
export * from './SarifFormatter';
|
|
4
|
+
export * from './HtmlFormatter';
|
|
5
|
+
export * from './CsvFormatter';
|
|
4
6
|
import { LintReport } from '../types/Report';
|
|
5
7
|
import { FormatterType } from '../types/Config';
|
|
6
8
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/formatters/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/formatters/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAE/B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAQhD;;GAEG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,CAiBtE"}
|
|
@@ -18,10 +18,14 @@ exports.format = format;
|
|
|
18
18
|
__exportStar(require("./TableFormatter"), exports);
|
|
19
19
|
__exportStar(require("./JsonFormatter"), exports);
|
|
20
20
|
__exportStar(require("./SarifFormatter"), exports);
|
|
21
|
+
__exportStar(require("./HtmlFormatter"), exports);
|
|
22
|
+
__exportStar(require("./CsvFormatter"), exports);
|
|
21
23
|
const rules_1 = require("../rules");
|
|
22
24
|
const TableFormatter_1 = require("./TableFormatter");
|
|
23
25
|
const JsonFormatter_1 = require("./JsonFormatter");
|
|
24
26
|
const SarifFormatter_1 = require("./SarifFormatter");
|
|
27
|
+
const HtmlFormatter_1 = require("./HtmlFormatter");
|
|
28
|
+
const CsvFormatter_1 = require("./CsvFormatter");
|
|
25
29
|
/**
|
|
26
30
|
* Format a lint report using the specified formatter
|
|
27
31
|
*/
|
|
@@ -33,6 +37,10 @@ function format(report, type) {
|
|
|
33
37
|
return (0, JsonFormatter_1.formatJson)(report);
|
|
34
38
|
case 'sarif':
|
|
35
39
|
return (0, SarifFormatter_1.formatSarif)(report, rules_1.ALL_RULES);
|
|
40
|
+
case 'html':
|
|
41
|
+
return (0, HtmlFormatter_1.formatHtml)(report);
|
|
42
|
+
case 'csv':
|
|
43
|
+
return (0, CsvFormatter_1.formatCsv)(report);
|
|
36
44
|
default: {
|
|
37
45
|
const _exhaustiveCheck = type;
|
|
38
46
|
throw new Error(`Unknown formatter type: ${String(_exhaustiveCheck)}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/formatters/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/formatters/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAkBA,wBAiBC;AAnCD,mDAAiC;AACjC,kDAAgC;AAChC,mDAAiC;AACjC,kDAAgC;AAChC,iDAA+B;AAI/B,oCAAqC;AACrC,qDAA+C;AAC/C,mDAA6C;AAC7C,qDAA+C;AAC/C,mDAA6C;AAC7C,iDAA2C;AAE3C;;GAEG;AACH,SAAgB,MAAM,CAAC,MAAkB,EAAE,IAAmB;IAC1D,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,OAAO;YACR,OAAO,IAAA,4BAAW,EAAC,MAAM,CAAC,CAAC;QAC/B,KAAK,MAAM;YACP,OAAO,IAAA,0BAAU,EAAC,MAAM,CAAC,CAAC;QAC9B,KAAK,OAAO;YACR,OAAO,IAAA,4BAAW,EAAC,MAAM,EAAE,iBAAS,CAAC,CAAC;QAC1C,KAAK,MAAM;YACP,OAAO,IAAA,0BAAU,EAAC,MAAM,CAAC,CAAC;QAC9B,KAAK,KAAK;YACN,OAAO,IAAA,wBAAS,EAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,CAAC,CAAC,CAAC;YACN,MAAM,gBAAgB,GAAU,IAAI,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;IACL,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../../../src/types/Config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../../../src/types/Config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAE5B,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC;IAE5C,yCAAyC;IACzC,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB,yCAAyC;IACzC,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB,qCAAqC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,mCAAmC;IACnC,gBAAgB,EAAE,aAAa,CAAC;IAEhC,mCAAmC;IACnC,aAAa,EAAE,OAAO,CAAC;IAEvB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,UAU5B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,uBAAuB;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,qBAAqB;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB"}
|