supasec 1.0.3 ā 1.0.5
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/Feature-List.md +233 -0
- package/README.md +53 -12
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +1 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/scan.d.ts.map +1 -1
- package/dist/commands/scan.js +82 -26
- package/dist/commands/scan.js.map +1 -1
- package/dist/commands/snapshot.d.ts +32 -0
- package/dist/commands/snapshot.d.ts.map +1 -0
- package/dist/commands/snapshot.js +282 -0
- package/dist/commands/snapshot.js.map +1 -0
- package/dist/reporters/html.d.ts +3 -2
- package/dist/reporters/html.d.ts.map +1 -1
- package/dist/reporters/html.js +844 -538
- package/dist/reporters/html.js.map +1 -1
- package/dist/reporters/terminal.d.ts +38 -2
- package/dist/reporters/terminal.d.ts.map +1 -1
- package/dist/reporters/terminal.js +292 -131
- package/dist/reporters/terminal.js.map +1 -1
- package/dist/scanners/auth/analyzer.d.ts +40 -0
- package/dist/scanners/auth/analyzer.d.ts.map +1 -0
- package/dist/scanners/auth/analyzer.js +673 -0
- package/dist/scanners/auth/analyzer.js.map +1 -0
- package/dist/scanners/auth/index.d.ts +6 -0
- package/dist/scanners/auth/index.d.ts.map +1 -0
- package/dist/scanners/auth/index.js +22 -0
- package/dist/scanners/auth/index.js.map +1 -0
- package/dist/scanners/edge/analyzer.d.ts +35 -0
- package/dist/scanners/edge/analyzer.d.ts.map +1 -0
- package/dist/scanners/edge/analyzer.js +614 -0
- package/dist/scanners/edge/analyzer.js.map +1 -0
- package/dist/scanners/edge/index.d.ts +6 -0
- package/dist/scanners/edge/index.d.ts.map +1 -0
- package/dist/scanners/edge/index.js +22 -0
- package/dist/scanners/edge/index.js.map +1 -0
- package/dist/scanners/functions/analyzer.d.ts +41 -0
- package/dist/scanners/functions/analyzer.d.ts.map +1 -0
- package/dist/scanners/functions/analyzer.js +378 -0
- package/dist/scanners/functions/analyzer.js.map +1 -0
- package/dist/scanners/functions/index.d.ts +6 -0
- package/dist/scanners/functions/index.d.ts.map +1 -0
- package/dist/scanners/functions/index.js +22 -0
- package/dist/scanners/functions/index.js.map +1 -0
- package/dist/scanners/git/index.d.ts +6 -0
- package/dist/scanners/git/index.d.ts.map +1 -0
- package/dist/scanners/git/index.js +22 -0
- package/dist/scanners/git/index.js.map +1 -0
- package/dist/scanners/git/scanner.d.ts +22 -0
- package/dist/scanners/git/scanner.d.ts.map +1 -0
- package/dist/scanners/git/scanner.js +531 -0
- package/dist/scanners/git/scanner.js.map +1 -0
- package/dist/scanners/https/analyzer.d.ts +42 -0
- package/dist/scanners/https/analyzer.d.ts.map +1 -0
- package/dist/scanners/https/analyzer.js +470 -0
- package/dist/scanners/https/analyzer.js.map +1 -0
- package/dist/scanners/https/index.d.ts +8 -0
- package/dist/scanners/https/index.d.ts.map +1 -0
- package/dist/scanners/https/index.js +17 -0
- package/dist/scanners/https/index.js.map +1 -0
- package/dist/scanners/index.d.ts +6 -0
- package/dist/scanners/index.d.ts.map +1 -1
- package/dist/scanners/index.js +6 -0
- package/dist/scanners/index.js.map +1 -1
- package/dist/scanners/rls/fuzzer.d.ts +40 -0
- package/dist/scanners/rls/fuzzer.d.ts.map +1 -0
- package/dist/scanners/rls/fuzzer.js +360 -0
- package/dist/scanners/rls/fuzzer.js.map +1 -0
- package/dist/scanners/rls/index.d.ts +1 -0
- package/dist/scanners/rls/index.d.ts.map +1 -1
- package/dist/scanners/rls/index.js +1 -0
- package/dist/scanners/rls/index.js.map +1 -1
- package/dist/scanners/secrets/detector.d.ts.map +1 -1
- package/dist/scanners/secrets/detector.js +44 -12
- package/dist/scanners/secrets/detector.js.map +1 -1
- package/dist/scanners/secrets/index.d.ts +1 -0
- package/dist/scanners/secrets/index.d.ts.map +1 -1
- package/dist/scanners/secrets/index.js +4 -0
- package/dist/scanners/secrets/index.js.map +1 -1
- package/dist/scanners/secrets/patterns.d.ts +25 -0
- package/dist/scanners/secrets/patterns.d.ts.map +1 -1
- package/dist/scanners/secrets/patterns.js +138 -27
- package/dist/scanners/secrets/patterns.js.map +1 -1
- package/dist/scanners/storage/analyzer.d.ts +49 -0
- package/dist/scanners/storage/analyzer.d.ts.map +1 -0
- package/dist/scanners/storage/analyzer.js +438 -0
- package/dist/scanners/storage/analyzer.js.map +1 -0
- package/dist/scanners/storage/index.d.ts +6 -0
- package/dist/scanners/storage/index.d.ts.map +1 -0
- package/dist/scanners/storage/index.js +22 -0
- package/dist/scanners/storage/index.js.map +1 -0
- package/package.json +1 -1
- package/reports/{supasec-audityour-app-2026-01-28-17-09-24.html ā supasec-audityour-app-2026-01-28-19-42-22.html} +51 -16
- package/reports/supasec-audityour-app-2026-01-28-19-49-18.html +1122 -0
- package/COMPLETION_REPORT.md +0 -324
- package/FIXES_SUMMARY.md +0 -224
- package/IMPLEMENTATION_NOTES.md +0 -305
- package/QUICK_REFERENCE.md +0 -185
- package/REPORTING.md +0 -217
- package/STATUS.md +0 -269
- package/reports/supasec---------app-2026-01-28-16-58-47.html +0 -804
- package/reports/supasec---------app-2026-01-28-17-06-43.html +0 -722
- package/reports/supasec---------app-2026-01-28-17-07-23.html +0 -722
- package/reports/supasec---------app-2026-01-28-17-08-00.html +0 -722
- package/reports/supasec---------app-2026-01-28-17-08-20.html +0 -722
- package/reports/supasec---------app-2026-01-28-17-08-41.html +0 -722
- package/reports/supasec-au---your-app-2026-01-28-17-14-57.html +0 -715
- package/reports/supasec-au---your-app-2026-01-28-17-19-03.html +0 -715
- package/reports/supasec-ex-mple-com-2026-01-28-17-14-52.json +0 -229
- package/reports/supasec-ex-mple-com-2026-01-28-17-15-39.html +0 -715
- package/reports/supasec-ex-mple-com-2026-01-28-17-17-22.html +0 -715
- package/reports/supasec-example-com-2026-01-28-17-15-06.html +0 -715
- package/reports/supasec-my--------------name-com-2026-01-28-17-15-02.html +0 -715
- package/reports/supasec-st-ging-com-2026-01-28-17-16-17.html +0 -715
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/commands/snapshot.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,UAAU,CAAC;IACxB,QAAQ,EAAE;QACR,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,MAAM,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAID;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyD/D"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Snapshot Command
|
|
4
|
+
* Creates and manages security snapshots for tracking changes over time
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.registerSnapshotCommands = registerSnapshotCommands;
|
|
41
|
+
const fs = __importStar(require("fs/promises"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const SNAPSHOT_DIR = '.supasec/snapshots';
|
|
44
|
+
/**
|
|
45
|
+
* Register snapshot commands
|
|
46
|
+
*/
|
|
47
|
+
function registerSnapshotCommands(program) {
|
|
48
|
+
const snapshotCmd = program
|
|
49
|
+
.command('snapshot')
|
|
50
|
+
.description('Manage security snapshots');
|
|
51
|
+
snapshotCmd
|
|
52
|
+
.command('create')
|
|
53
|
+
.description('Create a new security snapshot')
|
|
54
|
+
.option('-n, --name <name>', 'Snapshot name')
|
|
55
|
+
.option('-o, --output <dir>', 'Output directory', SNAPSHOT_DIR)
|
|
56
|
+
.action(async (options) => {
|
|
57
|
+
try {
|
|
58
|
+
await createSnapshot(options);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
console.error('Snapshot creation failed:', error instanceof Error ? error.message : error);
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
snapshotCmd
|
|
66
|
+
.command('list')
|
|
67
|
+
.description('List all snapshots')
|
|
68
|
+
.action(async () => {
|
|
69
|
+
try {
|
|
70
|
+
await listSnapshots();
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
console.error('Failed to list snapshots:', error instanceof Error ? error.message : error);
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
snapshotCmd
|
|
78
|
+
.command('diff')
|
|
79
|
+
.description('Compare two snapshots')
|
|
80
|
+
.argument('<snapshot1>', 'First snapshot name or ID')
|
|
81
|
+
.argument('<snapshot2>', 'Second snapshot name or ID')
|
|
82
|
+
.action(async (snapshot1, snapshot2) => {
|
|
83
|
+
try {
|
|
84
|
+
await compareSnapshots({ snapshot1, snapshot2 });
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
console.error('Snapshot comparison failed:', error instanceof Error ? error.message : error);
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
snapshotCmd
|
|
92
|
+
.command('delete')
|
|
93
|
+
.description('Delete a snapshot')
|
|
94
|
+
.argument('<name>', 'Snapshot name or ID')
|
|
95
|
+
.action(async (name) => {
|
|
96
|
+
try {
|
|
97
|
+
await deleteSnapshot(name);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
console.error('Failed to delete snapshot:', error instanceof Error ? error.message : error);
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Create a new security snapshot
|
|
107
|
+
*/
|
|
108
|
+
async function createSnapshot(options) {
|
|
109
|
+
const snapshotDir = options.outputDir || SNAPSHOT_DIR;
|
|
110
|
+
// Ensure snapshot directory exists
|
|
111
|
+
await fs.mkdir(snapshotDir, { recursive: true });
|
|
112
|
+
// Generate snapshot name if not provided
|
|
113
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
|
114
|
+
const snapshotName = options.name || `snapshot-${timestamp}`;
|
|
115
|
+
// TODO: In real implementation, this would run a scan and save the result
|
|
116
|
+
// For now, create a placeholder snapshot
|
|
117
|
+
const snapshot = {
|
|
118
|
+
id: generateSnapshotId(),
|
|
119
|
+
name: snapshotName,
|
|
120
|
+
created_at: new Date().toISOString(),
|
|
121
|
+
scan_result: {}, // Placeholder
|
|
122
|
+
metadata: {
|
|
123
|
+
target_url: 'placeholder',
|
|
124
|
+
scanner_version: '1.0.4',
|
|
125
|
+
total_issues: 0,
|
|
126
|
+
grade: 'A',
|
|
127
|
+
score: 100
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
const snapshotPath = path.join(snapshotDir, `${snapshotName}.json`);
|
|
131
|
+
await fs.writeFile(snapshotPath, JSON.stringify(snapshot, null, 2));
|
|
132
|
+
console.log(`\nšø Snapshot created: ${snapshotName}`);
|
|
133
|
+
console.log(` Path: ${snapshotPath}`);
|
|
134
|
+
console.log(` ID: ${snapshot.id}`);
|
|
135
|
+
console.log(` Time: ${snapshot.created_at}`);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* List all snapshots
|
|
139
|
+
*/
|
|
140
|
+
async function listSnapshots() {
|
|
141
|
+
const snapshotDir = SNAPSHOT_DIR;
|
|
142
|
+
try {
|
|
143
|
+
await fs.access(snapshotDir);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
console.log('\nNo snapshots found. Create one with: supasec snapshot create');
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
const files = await fs.readdir(snapshotDir);
|
|
150
|
+
const snapshots = files.filter(f => f.endsWith('.json'));
|
|
151
|
+
if (snapshots.length === 0) {
|
|
152
|
+
console.log('\nNo snapshots found. Create one with: supasec snapshot create');
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
console.log('\nšø Security Snapshots');
|
|
156
|
+
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
157
|
+
for (const file of snapshots.sort().reverse()) {
|
|
158
|
+
const snapshotPath = path.join(snapshotDir, file);
|
|
159
|
+
const content = await fs.readFile(snapshotPath, 'utf-8');
|
|
160
|
+
const snapshot = JSON.parse(content);
|
|
161
|
+
const date = new Date(snapshot.created_at).toLocaleString();
|
|
162
|
+
const grade = snapshot.metadata.grade;
|
|
163
|
+
const score = snapshot.metadata.score;
|
|
164
|
+
const issues = snapshot.metadata.total_issues;
|
|
165
|
+
console.log(`\n š ${snapshot.name}`);
|
|
166
|
+
console.log(` ID: ${snapshot.id}`);
|
|
167
|
+
console.log(` Created: ${date}`);
|
|
168
|
+
console.log(` Grade: ${grade} (${score}/100)`);
|
|
169
|
+
console.log(` Issues: ${issues}`);
|
|
170
|
+
}
|
|
171
|
+
console.log(`\n Total: ${snapshots.length} snapshot(s)`);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Compare two snapshots
|
|
175
|
+
*/
|
|
176
|
+
async function compareSnapshots(options) {
|
|
177
|
+
// Load snapshots
|
|
178
|
+
const snapshot1 = await loadSnapshot(options.snapshot1);
|
|
179
|
+
const snapshot2 = await loadSnapshot(options.snapshot2);
|
|
180
|
+
if (!snapshot1 || !snapshot2) {
|
|
181
|
+
console.error('ā One or both snapshots not found');
|
|
182
|
+
process.exit(1);
|
|
183
|
+
}
|
|
184
|
+
// Calculate differences
|
|
185
|
+
const gradeChange = snapshot2.metadata.score - snapshot1.metadata.score;
|
|
186
|
+
const issuesChange = snapshot2.metadata.total_issues - snapshot1.metadata.total_issues;
|
|
187
|
+
console.log('\nš Snapshot Comparison');
|
|
188
|
+
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
189
|
+
console.log(`\n ${snapshot1.name} ā ${snapshot2.name}`);
|
|
190
|
+
console.log(` ${new Date(snapshot1.created_at).toLocaleDateString()} ā ${new Date(snapshot2.created_at).toLocaleDateString()}`);
|
|
191
|
+
console.log('\nš Grade Change');
|
|
192
|
+
const gradeEmoji = gradeChange > 0 ? 'ā
' : gradeChange < 0 ? 'ā ļø' : 'ā”ļø';
|
|
193
|
+
console.log(` ${gradeEmoji} ${snapshot1.metadata.grade} (${snapshot1.metadata.score}) ā ${snapshot2.metadata.grade} (${snapshot2.metadata.score})`);
|
|
194
|
+
if (gradeChange !== 0) {
|
|
195
|
+
console.log(` ${gradeChange > 0 ? '+' : ''}${gradeChange} points`);
|
|
196
|
+
}
|
|
197
|
+
console.log('\nš Issues Change');
|
|
198
|
+
const issuesEmoji = issuesChange < 0 ? 'ā
' : issuesChange > 0 ? 'ā ļø' : 'ā”ļø';
|
|
199
|
+
console.log(` ${issuesEmoji} ${snapshot1.metadata.total_issues} ā ${snapshot2.metadata.total_issues} issues`);
|
|
200
|
+
if (issuesChange !== 0) {
|
|
201
|
+
console.log(` ${issuesChange > 0 ? '+' : ''}${issuesChange} issues`);
|
|
202
|
+
}
|
|
203
|
+
// Compare findings (placeholder)
|
|
204
|
+
console.log('\nš Finding Changes');
|
|
205
|
+
console.log(' (Detailed finding comparison not yet implemented)');
|
|
206
|
+
console.log('\n⨠Summary');
|
|
207
|
+
if (gradeChange > 0 && issuesChange <= 0) {
|
|
208
|
+
console.log(' ā
Security posture improved!');
|
|
209
|
+
}
|
|
210
|
+
else if (gradeChange < 0 || issuesChange > 0) {
|
|
211
|
+
console.log(' ā ļø Security posture degraded - review recommended');
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
console.log(' ā”ļø No significant changes');
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Delete a snapshot
|
|
219
|
+
*/
|
|
220
|
+
async function deleteSnapshot(name) {
|
|
221
|
+
const snapshotDir = SNAPSHOT_DIR;
|
|
222
|
+
const snapshotPath = path.join(snapshotDir, `${name}.json`);
|
|
223
|
+
try {
|
|
224
|
+
await fs.access(snapshotPath);
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
// Try finding by ID
|
|
228
|
+
const files = await fs.readdir(snapshotDir);
|
|
229
|
+
for (const file of files) {
|
|
230
|
+
const content = await fs.readFile(path.join(snapshotDir, file), 'utf-8');
|
|
231
|
+
const snapshot = JSON.parse(content);
|
|
232
|
+
if (snapshot.id === name || snapshot.name === name) {
|
|
233
|
+
await fs.unlink(path.join(snapshotDir, file));
|
|
234
|
+
console.log(`\nšļø Snapshot deleted: ${snapshot.name}`);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
console.error(`ā Snapshot not found: ${name}`);
|
|
239
|
+
process.exit(1);
|
|
240
|
+
}
|
|
241
|
+
await fs.unlink(snapshotPath);
|
|
242
|
+
console.log(`\nšļø Snapshot deleted: ${name}`);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Load a snapshot by name or ID
|
|
246
|
+
*/
|
|
247
|
+
async function loadSnapshot(nameOrId) {
|
|
248
|
+
const snapshotDir = SNAPSHOT_DIR;
|
|
249
|
+
// Try direct file access first
|
|
250
|
+
const directPath = path.join(snapshotDir, `${nameOrId}.json`);
|
|
251
|
+
try {
|
|
252
|
+
const content = await fs.readFile(directPath, 'utf-8');
|
|
253
|
+
return JSON.parse(content);
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
// Not a direct file match, search by ID or name
|
|
257
|
+
}
|
|
258
|
+
// Search all snapshots
|
|
259
|
+
try {
|
|
260
|
+
const files = await fs.readdir(snapshotDir);
|
|
261
|
+
for (const file of files) {
|
|
262
|
+
if (!file.endsWith('.json'))
|
|
263
|
+
continue;
|
|
264
|
+
const content = await fs.readFile(path.join(snapshotDir, file), 'utf-8');
|
|
265
|
+
const snapshot = JSON.parse(content);
|
|
266
|
+
if (snapshot.id === nameOrId || snapshot.name === nameOrId) {
|
|
267
|
+
return snapshot;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
// Directory doesn't exist or error reading
|
|
273
|
+
}
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Generate unique snapshot ID
|
|
278
|
+
*/
|
|
279
|
+
function generateSnapshotId() {
|
|
280
|
+
return `snap_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/commands/snapshot.ts"],"names":[],"mappings":"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"}
|
package/dist/reporters/html.d.ts
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* HTML Reporter
|
|
3
|
-
* Generates
|
|
3
|
+
* Generates enterprise-grade professional HTML reports
|
|
4
4
|
*/
|
|
5
5
|
import { ScanResult } from '../models/scan-result.js';
|
|
6
6
|
export interface HTMLReportOptions {
|
|
7
7
|
title?: string;
|
|
8
8
|
includeDetails?: boolean;
|
|
9
|
+
theme?: 'light' | 'dark';
|
|
9
10
|
}
|
|
10
11
|
/**
|
|
11
|
-
* Generate HTML report from scan result
|
|
12
|
+
* Generate enterprise-grade HTML report from scan result
|
|
12
13
|
*/
|
|
13
14
|
export declare function generateHTMLReport(result: ScanResult, options?: HTMLReportOptions): string;
|
|
14
15
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/reporters/html.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/reporters/html.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAe,MAAM,0BAA0B,CAAC;AAEnE,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,UAAU,EAClB,OAAO,GAAE,iBAAsB,GAC9B,MAAM,CA27BR;AAqRD;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAIf"}
|