verification-layer 0.13.0 → 0.15.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.
- package/README.md +78 -2
- package/dist/cli.js +153 -0
- package/dist/cli.js.map +1 -1
- package/dist/compliance-score.d.ts +39 -0
- package/dist/compliance-score.d.ts.map +1 -0
- package/dist/compliance-score.js +171 -0
- package/dist/compliance-score.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/reporters/auditor-report.d.ts +16 -0
- package/dist/reporters/auditor-report.d.ts.map +1 -0
- package/dist/reporters/auditor-report.js +404 -0
- package/dist/reporters/auditor-report.js.map +1 -0
- package/dist/reporters/enhanced-html.d.ts +14 -0
- package/dist/reporters/enhanced-html.d.ts.map +1 -0
- package/dist/reporters/enhanced-html.js +421 -0
- package/dist/reporters/enhanced-html.js.map +1 -0
- package/dist/scan.d.ts.map +1 -1
- package/dist/scan.js +8 -1
- package/dist/scan.js.map +1 -1
- package/dist/types.d.ts +22 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ScanResult } from '../types.js';
|
|
2
|
+
interface AuditorReportOptions {
|
|
3
|
+
organizationName?: string;
|
|
4
|
+
reportPeriod?: string;
|
|
5
|
+
auditorName?: string;
|
|
6
|
+
includeBaseline?: boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Generate auditor-ready HTML report with compliance score and SHA256 hash
|
|
10
|
+
*/
|
|
11
|
+
export declare function generateAuditorReport(result: ScanResult, targetPath: string, options?: AuditorReportOptions): {
|
|
12
|
+
html: string;
|
|
13
|
+
hash: string;
|
|
14
|
+
};
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=auditor-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auditor-report.d.ts","sourceRoot":"","sources":["../../src/reporters/auditor-report.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,UAAU,oBAAoB;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,UAAU,EAClB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,oBAAyB,GACjC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CA6YhC"}
|
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
import { createHash } from 'crypto';
|
|
2
|
+
import { generateComplianceScoreGauge, generateExecutiveSummary, generateEnhancedCSS } from './enhanced-html.js';
|
|
3
|
+
/**
|
|
4
|
+
* Generate auditor-ready HTML report with compliance score and SHA256 hash
|
|
5
|
+
*/
|
|
6
|
+
export function generateAuditorReport(result, targetPath, options = {}) {
|
|
7
|
+
const { organizationName = 'Organization', reportPeriod = new Date().toLocaleDateString('en-US', { year: 'numeric', month: 'long' }), auditorName = 'VLayer Automated Scan', includeBaseline = false, } = options;
|
|
8
|
+
const timestamp = new Date().toISOString();
|
|
9
|
+
const score = result.complianceScore;
|
|
10
|
+
// Calculate findings
|
|
11
|
+
const activeFindings = result.findings.filter(f => !f.isBaseline && !f.suppressed);
|
|
12
|
+
const acknowledgedFindings = result.findings.filter(f => f.acknowledged && !f.acknowledgment?.expired);
|
|
13
|
+
const suppressedFindings = result.findings.filter(f => f.suppressed);
|
|
14
|
+
const baselineFindings = result.findings.filter(f => f.isBaseline);
|
|
15
|
+
const html = `<!DOCTYPE html>
|
|
16
|
+
<html lang="en">
|
|
17
|
+
<head>
|
|
18
|
+
<meta charset="UTF-8">
|
|
19
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
20
|
+
<title>HIPAA Compliance Audit Report - ${organizationName}</title>
|
|
21
|
+
<style>
|
|
22
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
23
|
+
body {
|
|
24
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
|
25
|
+
line-height: 1.6;
|
|
26
|
+
color: #1f2937;
|
|
27
|
+
background: #f9fafb;
|
|
28
|
+
padding: 2rem;
|
|
29
|
+
}
|
|
30
|
+
.container { max-width: 1200px; margin: 0 auto; background: white; }
|
|
31
|
+
|
|
32
|
+
/* Header with branding */
|
|
33
|
+
.report-header {
|
|
34
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
35
|
+
color: white;
|
|
36
|
+
padding: 3rem 2rem;
|
|
37
|
+
text-align: center;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.logo-placeholder {
|
|
41
|
+
width: 80px;
|
|
42
|
+
height: 80px;
|
|
43
|
+
background: rgba(255,255,255,0.2);
|
|
44
|
+
border-radius: 50%;
|
|
45
|
+
margin: 0 auto 1rem;
|
|
46
|
+
display: flex;
|
|
47
|
+
align-items: center;
|
|
48
|
+
justify-content: center;
|
|
49
|
+
font-size: 2rem;
|
|
50
|
+
font-weight: bold;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.report-header h1 {
|
|
54
|
+
font-size: 2rem;
|
|
55
|
+
margin-bottom: 0.5rem;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.report-header .subtitle {
|
|
59
|
+
opacity: 0.9;
|
|
60
|
+
font-size: 1.1rem;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.report-meta {
|
|
64
|
+
background: #f3f4f6;
|
|
65
|
+
padding: 1.5rem 2rem;
|
|
66
|
+
border-bottom: 2px solid #e5e7eb;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.report-meta-grid {
|
|
70
|
+
display: grid;
|
|
71
|
+
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
|
72
|
+
gap: 1rem;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.meta-item {
|
|
76
|
+
display: flex;
|
|
77
|
+
flex-direction: column;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.meta-label {
|
|
81
|
+
font-size: 0.75rem;
|
|
82
|
+
color: #6b7280;
|
|
83
|
+
text-transform: uppercase;
|
|
84
|
+
letter-spacing: 0.05em;
|
|
85
|
+
margin-bottom: 0.25rem;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.meta-value {
|
|
89
|
+
font-size: 1rem;
|
|
90
|
+
color: #1f2937;
|
|
91
|
+
font-weight: 600;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.content {
|
|
95
|
+
padding: 2rem;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
h2 {
|
|
99
|
+
color: #374151;
|
|
100
|
+
margin: 2rem 0 1rem;
|
|
101
|
+
padding-bottom: 0.5rem;
|
|
102
|
+
border-bottom: 2px solid #e5e7eb;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
h3 {
|
|
106
|
+
color: #4b5563;
|
|
107
|
+
margin: 1.5rem 0 1rem;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/* Enhanced styles from enhanced-html */
|
|
111
|
+
${generateEnhancedCSS()}
|
|
112
|
+
|
|
113
|
+
/* Findings table */
|
|
114
|
+
.findings-table {
|
|
115
|
+
width: 100%;
|
|
116
|
+
border-collapse: collapse;
|
|
117
|
+
margin: 1rem 0;
|
|
118
|
+
background: white;
|
|
119
|
+
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.findings-table th {
|
|
123
|
+
background: #f3f4f6;
|
|
124
|
+
padding: 0.75rem;
|
|
125
|
+
text-align: left;
|
|
126
|
+
font-weight: 600;
|
|
127
|
+
color: #374151;
|
|
128
|
+
border-bottom: 2px solid #e5e7eb;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.findings-table td {
|
|
132
|
+
padding: 0.75rem;
|
|
133
|
+
border-bottom: 1px solid #e5e7eb;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.findings-table tr:hover {
|
|
137
|
+
background: #f9fafb;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.severity-badge {
|
|
141
|
+
padding: 0.25rem 0.5rem;
|
|
142
|
+
border-radius: 4px;
|
|
143
|
+
font-size: 0.75rem;
|
|
144
|
+
font-weight: 600;
|
|
145
|
+
color: white;
|
|
146
|
+
text-transform: uppercase;
|
|
147
|
+
display: inline-block;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.severity-critical { background: #dc2626; }
|
|
151
|
+
.severity-high { background: #ea580c; }
|
|
152
|
+
.severity-medium { background: #ca8a04; }
|
|
153
|
+
.severity-low { background: #2563eb; }
|
|
154
|
+
|
|
155
|
+
.evidence-box {
|
|
156
|
+
background: #f9fafb;
|
|
157
|
+
border-left: 3px solid #667eea;
|
|
158
|
+
padding: 1rem;
|
|
159
|
+
margin: 1rem 0;
|
|
160
|
+
font-family: 'SF Mono', Monaco, 'Courier New', monospace;
|
|
161
|
+
font-size: 0.875rem;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.audit-trail {
|
|
165
|
+
background: #fef3c7;
|
|
166
|
+
border-left: 3px solid #f59e0b;
|
|
167
|
+
padding: 1rem;
|
|
168
|
+
margin: 1rem 0;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.report-footer {
|
|
172
|
+
background: #f3f4f6;
|
|
173
|
+
padding: 2rem;
|
|
174
|
+
border-top: 2px solid #e5e7eb;
|
|
175
|
+
text-align: center;
|
|
176
|
+
color: #6b7280;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.report-hash {
|
|
180
|
+
font-family: 'SF Mono', Monaco, 'Courier New', monospace;
|
|
181
|
+
font-size: 0.75rem;
|
|
182
|
+
color: #9ca3af;
|
|
183
|
+
margin-top: 1rem;
|
|
184
|
+
word-break: break-all;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/* Filters */
|
|
188
|
+
.filters {
|
|
189
|
+
background: #f9fafb;
|
|
190
|
+
padding: 1rem;
|
|
191
|
+
border-radius: 8px;
|
|
192
|
+
margin: 1rem 0;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
.filter-buttons {
|
|
196
|
+
display: flex;
|
|
197
|
+
gap: 0.5rem;
|
|
198
|
+
flex-wrap: wrap;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.filter-btn {
|
|
202
|
+
padding: 0.5rem 1rem;
|
|
203
|
+
border: 1px solid #e5e7eb;
|
|
204
|
+
background: white;
|
|
205
|
+
border-radius: 6px;
|
|
206
|
+
cursor: pointer;
|
|
207
|
+
font-size: 0.875rem;
|
|
208
|
+
transition: all 0.2s;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
.filter-btn:hover {
|
|
212
|
+
background: #f3f4f6;
|
|
213
|
+
border-color: #667eea;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
.filter-btn.active {
|
|
217
|
+
background: #667eea;
|
|
218
|
+
color: white;
|
|
219
|
+
border-color: #667eea;
|
|
220
|
+
}
|
|
221
|
+
</style>
|
|
222
|
+
</head>
|
|
223
|
+
<body>
|
|
224
|
+
<div class="container">
|
|
225
|
+
<div class="report-header">
|
|
226
|
+
<div class="logo-placeholder">VL</div>
|
|
227
|
+
<h1>HIPAA Compliance Audit Report</h1>
|
|
228
|
+
<div class="subtitle">${organizationName} - ${reportPeriod}</div>
|
|
229
|
+
</div>
|
|
230
|
+
|
|
231
|
+
<div class="report-meta">
|
|
232
|
+
<div class="report-meta-grid">
|
|
233
|
+
<div class="meta-item">
|
|
234
|
+
<div class="meta-label">Report Generated</div>
|
|
235
|
+
<div class="meta-value">${new Date(timestamp).toLocaleString()}</div>
|
|
236
|
+
</div>
|
|
237
|
+
<div class="meta-item">
|
|
238
|
+
<div class="meta-label">Auditor</div>
|
|
239
|
+
<div class="meta-value">${auditorName}</div>
|
|
240
|
+
</div>
|
|
241
|
+
<div class="meta-item">
|
|
242
|
+
<div class="meta-label">Target Path</div>
|
|
243
|
+
<div class="meta-value">${targetPath}</div>
|
|
244
|
+
</div>
|
|
245
|
+
<div class="meta-item">
|
|
246
|
+
<div class="meta-label">Files Scanned</div>
|
|
247
|
+
<div class="meta-value">${result.scannedFiles}</div>
|
|
248
|
+
</div>
|
|
249
|
+
</div>
|
|
250
|
+
</div>
|
|
251
|
+
|
|
252
|
+
<div class="content">
|
|
253
|
+
${generateExecutiveSummary(score, result.scannedFiles, result.scanDuration)}
|
|
254
|
+
|
|
255
|
+
${generateComplianceScoreGauge(score)}
|
|
256
|
+
|
|
257
|
+
<h2>📋 Findings Summary</h2>
|
|
258
|
+
<div class="filters">
|
|
259
|
+
<div class="filter-buttons">
|
|
260
|
+
<button class="filter-btn active" onclick="filterFindings('all')">All (${activeFindings.length})</button>
|
|
261
|
+
<button class="filter-btn" onclick="filterFindings('critical')">Critical (${activeFindings.filter(f => f.severity === 'critical').length})</button>
|
|
262
|
+
<button class="filter-btn" onclick="filterFindings('high')">High (${activeFindings.filter(f => f.severity === 'high').length})</button>
|
|
263
|
+
<button class="filter-btn" onclick="filterFindings('medium')">Medium (${activeFindings.filter(f => f.severity === 'medium').length})</button>
|
|
264
|
+
<button class="filter-btn" onclick="filterFindings('low')">Low (${activeFindings.filter(f => f.severity === 'low').length})</button>
|
|
265
|
+
</div>
|
|
266
|
+
</div>
|
|
267
|
+
|
|
268
|
+
<table class="findings-table" id="findings-table">
|
|
269
|
+
<thead>
|
|
270
|
+
<tr>
|
|
271
|
+
<th>Severity</th>
|
|
272
|
+
<th>Finding</th>
|
|
273
|
+
<th>File</th>
|
|
274
|
+
<th>HIPAA Ref</th>
|
|
275
|
+
</tr>
|
|
276
|
+
</thead>
|
|
277
|
+
<tbody>
|
|
278
|
+
${activeFindings.map(f => `
|
|
279
|
+
<tr class="finding-row" data-severity="${f.severity}">
|
|
280
|
+
<td><span class="severity-badge severity-${f.severity}">${f.severity}</span></td>
|
|
281
|
+
<td>${escapeHtml(f.title)}</td>
|
|
282
|
+
<td style="font-family: monospace; font-size: 0.875rem;">${escapeHtml(f.file)}:${f.line || 'N/A'}</td>
|
|
283
|
+
<td>${f.hipaaReference || '-'}</td>
|
|
284
|
+
</tr>
|
|
285
|
+
`).join('')}
|
|
286
|
+
</tbody>
|
|
287
|
+
</table>
|
|
288
|
+
|
|
289
|
+
${suppressedFindings.length > 0 ? `
|
|
290
|
+
<h2>🔕 Suppression Audit Trail</h2>
|
|
291
|
+
<p>The following findings have been suppressed with documented justifications:</p>
|
|
292
|
+
<table class="findings-table">
|
|
293
|
+
<thead>
|
|
294
|
+
<tr>
|
|
295
|
+
<th>Finding</th>
|
|
296
|
+
<th>Reason</th>
|
|
297
|
+
<th>File</th>
|
|
298
|
+
</tr>
|
|
299
|
+
</thead>
|
|
300
|
+
<tbody>
|
|
301
|
+
${suppressedFindings.map(f => `
|
|
302
|
+
<tr>
|
|
303
|
+
<td>${escapeHtml(f.title)}</td>
|
|
304
|
+
<td>${f.suppression?.reason || 'No reason provided'}</td>
|
|
305
|
+
<td style="font-family: monospace; font-size: 0.875rem;">${escapeHtml(f.file)}:${f.line || 'N/A'}</td>
|
|
306
|
+
</tr>
|
|
307
|
+
`).join('')}
|
|
308
|
+
</tbody>
|
|
309
|
+
</table>
|
|
310
|
+
` : ''}
|
|
311
|
+
|
|
312
|
+
${acknowledgedFindings.length > 0 ? `
|
|
313
|
+
<h2>✅ Acknowledged Findings</h2>
|
|
314
|
+
<p>The following findings have been formally acknowledged:</p>
|
|
315
|
+
<table class="findings-table">
|
|
316
|
+
<thead>
|
|
317
|
+
<tr>
|
|
318
|
+
<th>Finding</th>
|
|
319
|
+
<th>Reason</th>
|
|
320
|
+
<th>Acknowledged By</th>
|
|
321
|
+
<th>Date</th>
|
|
322
|
+
</tr>
|
|
323
|
+
</thead>
|
|
324
|
+
<tbody>
|
|
325
|
+
${acknowledgedFindings.map(f => `
|
|
326
|
+
<tr>
|
|
327
|
+
<td>${escapeHtml(f.title)}</td>
|
|
328
|
+
<td>${f.acknowledgment?.reason || 'No reason provided'}</td>
|
|
329
|
+
<td>${f.acknowledgment?.acknowledgedBy || 'Unknown'}</td>
|
|
330
|
+
<td>${f.acknowledgment?.acknowledgedAt ? new Date(f.acknowledgment.acknowledgedAt).toLocaleDateString() : 'N/A'}</td>
|
|
331
|
+
</tr>
|
|
332
|
+
`).join('')}
|
|
333
|
+
</tbody>
|
|
334
|
+
</table>
|
|
335
|
+
` : ''}
|
|
336
|
+
|
|
337
|
+
${includeBaseline && baselineFindings.length > 0 ? `
|
|
338
|
+
<h2>📊 Baseline Comparison</h2>
|
|
339
|
+
<p>${baselineFindings.length} finding(s) tracked in baseline (no change from previous scan).</p>
|
|
340
|
+
` : ''}
|
|
341
|
+
|
|
342
|
+
<h2>📜 Report Integrity</h2>
|
|
343
|
+
<div class="evidence-box">
|
|
344
|
+
<strong>Digital Signature:</strong> SHA256 hash of this report
|
|
345
|
+
<div class="report-hash" id="report-hash">Computing...</div>
|
|
346
|
+
</div>
|
|
347
|
+
<p style="color: #6b7280; font-size: 0.875rem; margin-top: 1rem;">
|
|
348
|
+
This report was generated by <strong>vlayer</strong> - an automated HIPAA compliance scanner.
|
|
349
|
+
The SHA256 hash above can be used to verify the integrity of this document.
|
|
350
|
+
</p>
|
|
351
|
+
</div>
|
|
352
|
+
|
|
353
|
+
<div class="report-footer">
|
|
354
|
+
<p><strong>VLayer HIPAA Compliance Scanner</strong></p>
|
|
355
|
+
<p>Automated compliance scanning for healthcare applications</p>
|
|
356
|
+
<p style="margin-top: 1rem; font-size: 0.875rem;">Generated: ${new Date(timestamp).toLocaleString()}</p>
|
|
357
|
+
</div>
|
|
358
|
+
</div>
|
|
359
|
+
|
|
360
|
+
<script>
|
|
361
|
+
function filterFindings(severity) {
|
|
362
|
+
const rows = document.querySelectorAll('.finding-row');
|
|
363
|
+
const buttons = document.querySelectorAll('.filter-btn');
|
|
364
|
+
|
|
365
|
+
buttons.forEach(btn => btn.classList.remove('active'));
|
|
366
|
+
event.target.classList.add('active');
|
|
367
|
+
|
|
368
|
+
rows.forEach(row => {
|
|
369
|
+
if (severity === 'all' || row.dataset.severity === severity) {
|
|
370
|
+
row.style.display = '';
|
|
371
|
+
} else {
|
|
372
|
+
row.style.display = 'none';
|
|
373
|
+
}
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// Calculate and display report hash
|
|
378
|
+
window.addEventListener('load', async () => {
|
|
379
|
+
const html = document.documentElement.outerHTML;
|
|
380
|
+
const encoder = new TextEncoder();
|
|
381
|
+
const data = encoder.encode(html);
|
|
382
|
+
const hashBuffer = await crypto.subtle.digest('SHA-256', data);
|
|
383
|
+
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
384
|
+
const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
|
|
385
|
+
document.getElementById('report-hash').textContent = hashHex;
|
|
386
|
+
});
|
|
387
|
+
</script>
|
|
388
|
+
</body>
|
|
389
|
+
</html>`;
|
|
390
|
+
// Calculate SHA256 hash
|
|
391
|
+
const hash = createHash('sha256').update(html).digest('hex');
|
|
392
|
+
return { html, hash };
|
|
393
|
+
}
|
|
394
|
+
function escapeHtml(text) {
|
|
395
|
+
const map = {
|
|
396
|
+
'&': '&',
|
|
397
|
+
'<': '<',
|
|
398
|
+
'>': '>',
|
|
399
|
+
'"': '"',
|
|
400
|
+
"'": ''',
|
|
401
|
+
};
|
|
402
|
+
return text.replace(/[&<>"']/g, m => map[m]);
|
|
403
|
+
}
|
|
404
|
+
//# sourceMappingURL=auditor-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auditor-report.js","sourceRoot":"","sources":["../../src/reporters/auditor-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ComplianceScore } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generate compliance score gauge HTML
|
|
4
|
+
*/
|
|
5
|
+
export declare function generateComplianceScoreGauge(score: ComplianceScore): string;
|
|
6
|
+
/**
|
|
7
|
+
* Generate executive summary HTML
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateExecutiveSummary(score: ComplianceScore, scannedFiles: number, scanDuration: number): string;
|
|
10
|
+
/**
|
|
11
|
+
* Generate enhanced CSS for compliance score and new features
|
|
12
|
+
*/
|
|
13
|
+
export declare function generateEnhancedCSS(): string;
|
|
14
|
+
//# sourceMappingURL=enhanced-html.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enhanced-html.d.ts","sourceRoot":"","sources":["../../src/reporters/enhanced-html.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAqF3E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CA2CnH;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CA+Q5C"}
|