modestbench 0.0.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/CHANGELOG.md +45 -0
- package/LICENSE.md +55 -0
- package/README.md +699 -0
- package/dist/bootstrap.cjs +37 -0
- package/dist/bootstrap.cjs.map +1 -0
- package/dist/bootstrap.d.cts +17 -0
- package/dist/bootstrap.d.cts.map +1 -0
- package/dist/bootstrap.d.ts +17 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +33 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/cli/commands/history.cjs +459 -0
- package/dist/cli/commands/history.cjs.map +1 -0
- package/dist/cli/commands/history.d.cts +34 -0
- package/dist/cli/commands/history.d.cts.map +1 -0
- package/dist/cli/commands/history.d.ts +34 -0
- package/dist/cli/commands/history.d.ts.map +1 -0
- package/dist/cli/commands/history.js +422 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/init.cjs +566 -0
- package/dist/cli/commands/init.cjs.map +1 -0
- package/dist/cli/commands/init.d.cts +26 -0
- package/dist/cli/commands/init.d.cts.map +1 -0
- package/dist/cli/commands/init.d.ts +26 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +562 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/run.cjs +285 -0
- package/dist/cli/commands/run.cjs.map +1 -0
- package/dist/cli/commands/run.d.cts +37 -0
- package/dist/cli/commands/run.d.cts.map +1 -0
- package/dist/cli/commands/run.d.ts +37 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +248 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/index.cjs +523 -0
- package/dist/cli/index.cjs.map +1 -0
- package/dist/cli/index.d.cts +58 -0
- package/dist/cli/index.d.cts.map +1 -0
- package/dist/cli/index.d.ts +58 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +515 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/manager.cjs +370 -0
- package/dist/config/manager.cjs.map +1 -0
- package/dist/config/manager.d.cts +46 -0
- package/dist/config/manager.d.cts.map +1 -0
- package/dist/config/manager.d.ts +46 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +333 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/schema.cjs +182 -0
- package/dist/config/schema.cjs.map +1 -0
- package/dist/config/schema.d.cts +51 -0
- package/dist/config/schema.d.cts.map +1 -0
- package/dist/config/schema.d.ts +51 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +145 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/constants.cjs +22 -0
- package/dist/constants.cjs.map +1 -0
- package/dist/constants.d.cts +10 -0
- package/dist/constants.d.cts.map +1 -0
- package/dist/constants.d.ts +10 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +19 -0
- package/dist/constants.js.map +1 -0
- package/dist/core/benchmark-schema.cjs +135 -0
- package/dist/core/benchmark-schema.cjs.map +1 -0
- package/dist/core/benchmark-schema.d.cts +139 -0
- package/dist/core/benchmark-schema.d.cts.map +1 -0
- package/dist/core/benchmark-schema.d.ts +139 -0
- package/dist/core/benchmark-schema.d.ts.map +1 -0
- package/dist/core/benchmark-schema.js +132 -0
- package/dist/core/benchmark-schema.js.map +1 -0
- package/dist/core/engine.cjs +669 -0
- package/dist/core/engine.cjs.map +1 -0
- package/dist/core/engine.d.cts +128 -0
- package/dist/core/engine.d.cts.map +1 -0
- package/dist/core/engine.d.ts +128 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +632 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/engines/accurate-engine.cjs +292 -0
- package/dist/core/engines/accurate-engine.cjs.map +1 -0
- package/dist/core/engines/accurate-engine.d.cts +63 -0
- package/dist/core/engines/accurate-engine.d.cts.map +1 -0
- package/dist/core/engines/accurate-engine.d.ts +63 -0
- package/dist/core/engines/accurate-engine.d.ts.map +1 -0
- package/dist/core/engines/accurate-engine.js +288 -0
- package/dist/core/engines/accurate-engine.js.map +1 -0
- package/dist/core/engines/index.cjs +21 -0
- package/dist/core/engines/index.cjs.map +1 -0
- package/dist/core/engines/index.d.cts +16 -0
- package/dist/core/engines/index.d.cts.map +1 -0
- package/dist/core/engines/index.d.ts +16 -0
- package/dist/core/engines/index.d.ts.map +1 -0
- package/dist/core/engines/index.js +16 -0
- package/dist/core/engines/index.js.map +1 -0
- package/dist/core/engines/tinybench-engine.cjs +286 -0
- package/dist/core/engines/tinybench-engine.cjs.map +1 -0
- package/dist/core/engines/tinybench-engine.d.cts +18 -0
- package/dist/core/engines/tinybench-engine.d.cts.map +1 -0
- package/dist/core/engines/tinybench-engine.d.ts +18 -0
- package/dist/core/engines/tinybench-engine.d.ts.map +1 -0
- package/dist/core/engines/tinybench-engine.js +282 -0
- package/dist/core/engines/tinybench-engine.js.map +1 -0
- package/dist/core/error-manager.cjs +303 -0
- package/dist/core/error-manager.cjs.map +1 -0
- package/dist/core/error-manager.d.cts +77 -0
- package/dist/core/error-manager.d.cts.map +1 -0
- package/dist/core/error-manager.d.ts +77 -0
- package/dist/core/error-manager.d.ts.map +1 -0
- package/dist/core/error-manager.js +299 -0
- package/dist/core/error-manager.js.map +1 -0
- package/dist/core/loader.cjs +287 -0
- package/dist/core/loader.cjs.map +1 -0
- package/dist/core/loader.d.cts +55 -0
- package/dist/core/loader.d.cts.map +1 -0
- package/dist/core/loader.d.ts +55 -0
- package/dist/core/loader.d.ts.map +1 -0
- package/dist/core/loader.js +250 -0
- package/dist/core/loader.js.map +1 -0
- package/dist/core/stats-utils.cjs +99 -0
- package/dist/core/stats-utils.cjs.map +1 -0
- package/dist/core/stats-utils.d.cts +50 -0
- package/dist/core/stats-utils.d.cts.map +1 -0
- package/dist/core/stats-utils.d.ts +50 -0
- package/dist/core/stats-utils.d.ts.map +1 -0
- package/dist/core/stats-utils.js +94 -0
- package/dist/core/stats-utils.js.map +1 -0
- package/dist/index.cjs +64 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +22 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/progress/manager.cjs +325 -0
- package/dist/progress/manager.cjs.map +1 -0
- package/dist/progress/manager.d.cts +125 -0
- package/dist/progress/manager.d.cts.map +1 -0
- package/dist/progress/manager.d.ts +125 -0
- package/dist/progress/manager.d.ts.map +1 -0
- package/dist/progress/manager.js +321 -0
- package/dist/progress/manager.js.map +1 -0
- package/dist/reporters/csv.cjs +250 -0
- package/dist/reporters/csv.cjs.map +1 -0
- package/dist/reporters/csv.d.cts +92 -0
- package/dist/reporters/csv.d.cts.map +1 -0
- package/dist/reporters/csv.d.ts +92 -0
- package/dist/reporters/csv.d.ts.map +1 -0
- package/dist/reporters/csv.js +246 -0
- package/dist/reporters/csv.js.map +1 -0
- package/dist/reporters/human.cjs +516 -0
- package/dist/reporters/human.cjs.map +1 -0
- package/dist/reporters/human.d.cts +86 -0
- package/dist/reporters/human.d.cts.map +1 -0
- package/dist/reporters/human.d.ts +86 -0
- package/dist/reporters/human.d.ts.map +1 -0
- package/dist/reporters/human.js +509 -0
- package/dist/reporters/human.js.map +1 -0
- package/dist/reporters/index.cjs +17 -0
- package/dist/reporters/index.cjs.map +1 -0
- package/dist/reporters/index.d.cts +10 -0
- package/dist/reporters/index.d.cts.map +1 -0
- package/dist/reporters/index.d.ts +10 -0
- package/dist/reporters/index.d.ts.map +1 -0
- package/dist/reporters/index.js +10 -0
- package/dist/reporters/index.js.map +1 -0
- package/dist/reporters/json.cjs +215 -0
- package/dist/reporters/json.cjs.map +1 -0
- package/dist/reporters/json.d.cts +79 -0
- package/dist/reporters/json.d.cts.map +1 -0
- package/dist/reporters/json.d.ts +79 -0
- package/dist/reporters/json.d.ts.map +1 -0
- package/dist/reporters/json.js +211 -0
- package/dist/reporters/json.js.map +1 -0
- package/dist/reporters/registry.cjs +255 -0
- package/dist/reporters/registry.cjs.map +1 -0
- package/dist/reporters/registry.d.cts +155 -0
- package/dist/reporters/registry.d.cts.map +1 -0
- package/dist/reporters/registry.d.ts +155 -0
- package/dist/reporters/registry.d.ts.map +1 -0
- package/dist/reporters/registry.js +249 -0
- package/dist/reporters/registry.js.map +1 -0
- package/dist/reporters/simple.cjs +328 -0
- package/dist/reporters/simple.cjs.map +1 -0
- package/dist/reporters/simple.d.cts +51 -0
- package/dist/reporters/simple.d.cts.map +1 -0
- package/dist/reporters/simple.d.ts +51 -0
- package/dist/reporters/simple.d.ts.map +1 -0
- package/dist/reporters/simple.js +321 -0
- package/dist/reporters/simple.js.map +1 -0
- package/dist/schema/modestbench-config.schema.json +162 -0
- package/dist/storage/history.cjs +456 -0
- package/dist/storage/history.cjs.map +1 -0
- package/dist/storage/history.d.cts +99 -0
- package/dist/storage/history.d.cts.map +1 -0
- package/dist/storage/history.d.ts +99 -0
- package/dist/storage/history.d.ts.map +1 -0
- package/dist/storage/history.js +452 -0
- package/dist/storage/history.js.map +1 -0
- package/dist/types/cli.cjs +21 -0
- package/dist/types/cli.cjs.map +1 -0
- package/dist/types/cli.d.cts +296 -0
- package/dist/types/cli.d.cts.map +1 -0
- package/dist/types/cli.d.ts +296 -0
- package/dist/types/cli.d.ts.map +1 -0
- package/dist/types/cli.js +18 -0
- package/dist/types/cli.js.map +1 -0
- package/dist/types/core.cjs +14 -0
- package/dist/types/core.cjs.map +1 -0
- package/dist/types/core.d.cts +380 -0
- package/dist/types/core.d.cts.map +1 -0
- package/dist/types/core.d.ts +380 -0
- package/dist/types/core.d.ts.map +1 -0
- package/dist/types/core.js +13 -0
- package/dist/types/core.js.map +1 -0
- package/dist/types/index.cjs +27 -0
- package/dist/types/index.cjs.map +1 -0
- package/dist/types/index.d.cts +11 -0
- package/dist/types/index.d.cts.map +1 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +11 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/interfaces.cjs +10 -0
- package/dist/types/interfaces.cjs.map +1 -0
- package/dist/types/interfaces.d.cts +381 -0
- package/dist/types/interfaces.d.cts.map +1 -0
- package/dist/types/interfaces.d.ts +381 -0
- package/dist/types/interfaces.d.ts.map +1 -0
- package/dist/types/interfaces.js +9 -0
- package/dist/types/interfaces.js.map +1 -0
- package/dist/types/utility.cjs +92 -0
- package/dist/types/utility.cjs.map +1 -0
- package/dist/types/utility.d.cts +330 -0
- package/dist/types/utility.d.cts.map +1 -0
- package/dist/types/utility.d.ts +330 -0
- package/dist/types/utility.d.ts.map +1 -0
- package/dist/types/utility.js +78 -0
- package/dist/types/utility.js.map +1 -0
- package/package.json +211 -0
- package/src/bootstrap.ts +35 -0
- package/src/cli/commands/history.ts +569 -0
- package/src/cli/commands/init.ts +658 -0
- package/src/cli/commands/run.ts +346 -0
- package/src/cli/index.ts +642 -0
- package/src/config/manager.ts +387 -0
- package/src/config/schema.ts +188 -0
- package/src/constants.ts +21 -0
- package/src/core/benchmark-schema.ts +185 -0
- package/src/core/engine.ts +888 -0
- package/src/core/engines/accurate-engine.ts +408 -0
- package/src/core/engines/index.ts +16 -0
- package/src/core/engines/tinybench-engine.ts +335 -0
- package/src/core/error-manager.ts +372 -0
- package/src/core/loader.ts +324 -0
- package/src/core/stats-utils.ts +135 -0
- package/src/index.ts +46 -0
- package/src/progress/manager.ts +415 -0
- package/src/reporters/csv.ts +368 -0
- package/src/reporters/human.ts +707 -0
- package/src/reporters/index.ts +10 -0
- package/src/reporters/json.ts +302 -0
- package/src/reporters/registry.ts +349 -0
- package/src/reporters/simple.ts +459 -0
- package/src/storage/history.ts +600 -0
- package/src/types/cli.ts +312 -0
- package/src/types/core.ts +414 -0
- package/src/types/index.ts +18 -0
- package/src/types/interfaces.ts +451 -0
- package/src/types/utility.ts +446 -0
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ModestBench History Storage
|
|
4
|
+
*
|
|
5
|
+
* File-based storage system for benchmark run history and results. Provides
|
|
6
|
+
* querying, cleanup, and export capabilities for historical data.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.FileHistoryStorage = void 0;
|
|
10
|
+
const node_crypto_1 = require("node:crypto");
|
|
11
|
+
const node_fs_1 = require("node:fs");
|
|
12
|
+
const node_path_1 = require("node:path");
|
|
13
|
+
/**
|
|
14
|
+
* File-based history storage implementation
|
|
15
|
+
*/
|
|
16
|
+
class FileHistoryStorage {
|
|
17
|
+
index = null;
|
|
18
|
+
indexFile;
|
|
19
|
+
maxFileSize;
|
|
20
|
+
storageDir;
|
|
21
|
+
constructor(options = {}) {
|
|
22
|
+
this.storageDir =
|
|
23
|
+
options.storageDir || (0, node_path_1.join)(process.cwd(), '.modestbench', 'history');
|
|
24
|
+
this.indexFile = (0, node_path_1.join)(this.storageDir, 'index.json');
|
|
25
|
+
this.maxFileSize = options.maxFileSize || 10 * 1024 * 1024; // 10MB default
|
|
26
|
+
this.ensureStorageDir();
|
|
27
|
+
}
|
|
28
|
+
static isValidBenchmarkRun(obj) {
|
|
29
|
+
// Type guard function that checks properties on unknown object
|
|
30
|
+
return (!!obj &&
|
|
31
|
+
typeof obj === 'object' &&
|
|
32
|
+
'id' in obj &&
|
|
33
|
+
typeof obj.id === 'string' &&
|
|
34
|
+
'files' in obj &&
|
|
35
|
+
Array.isArray(obj.files) &&
|
|
36
|
+
'startTime' in obj &&
|
|
37
|
+
!!obj.startTime &&
|
|
38
|
+
'endTime' in obj &&
|
|
39
|
+
!!obj.endTime &&
|
|
40
|
+
'environment' in obj &&
|
|
41
|
+
!!obj.environment &&
|
|
42
|
+
'summary' in obj &&
|
|
43
|
+
!!obj.summary);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Clean up old data according to retention policy
|
|
47
|
+
*/
|
|
48
|
+
async cleanup(policy) {
|
|
49
|
+
try {
|
|
50
|
+
const index = await this.loadIndex();
|
|
51
|
+
const entriesToRemove = [];
|
|
52
|
+
let totalSize = 0;
|
|
53
|
+
// Calculate current storage metrics
|
|
54
|
+
for (const entry of index.entries) {
|
|
55
|
+
totalSize += entry.sizeBytes;
|
|
56
|
+
}
|
|
57
|
+
// Sort entries by date (oldest first) for cleanup
|
|
58
|
+
const sortedEntries = [...index.entries].sort((a, b) => a.date.getTime() - b.date.getTime());
|
|
59
|
+
// Apply retention policies
|
|
60
|
+
for (const entry of sortedEntries) {
|
|
61
|
+
let shouldRemove = false;
|
|
62
|
+
// Check max age
|
|
63
|
+
if (policy.maxAge &&
|
|
64
|
+
Date.now() - entry.date.getTime() > policy.maxAge) {
|
|
65
|
+
shouldRemove = true;
|
|
66
|
+
}
|
|
67
|
+
// Check max runs count (remove oldest)
|
|
68
|
+
if (policy.maxRuns &&
|
|
69
|
+
index.entries.length - entriesToRemove.length > policy.maxRuns) {
|
|
70
|
+
shouldRemove = true;
|
|
71
|
+
}
|
|
72
|
+
// Check max size (remove oldest until under limit)
|
|
73
|
+
if (policy.maxSize && totalSize > policy.maxSize) {
|
|
74
|
+
shouldRemove = true;
|
|
75
|
+
totalSize -= entry.sizeBytes;
|
|
76
|
+
}
|
|
77
|
+
if (shouldRemove) {
|
|
78
|
+
entriesToRemove.push(entry);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Remove files and update index
|
|
82
|
+
const removedFiles = [];
|
|
83
|
+
let freedBytes = 0;
|
|
84
|
+
for (const entry of entriesToRemove) {
|
|
85
|
+
const filePath = (0, node_path_1.join)(this.storageDir, entry.filename);
|
|
86
|
+
try {
|
|
87
|
+
if ((0, node_fs_1.existsSync)(filePath)) {
|
|
88
|
+
(0, node_fs_1.unlinkSync)(filePath);
|
|
89
|
+
removedFiles.push(entry.filename);
|
|
90
|
+
freedBytes += entry.sizeBytes;
|
|
91
|
+
}
|
|
92
|
+
await this.removeFromIndex(entry.id);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
// Log but continue with other deletions
|
|
96
|
+
console.warn(`Failed to remove file ${entry.filename}: ${error}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
freedBytes,
|
|
101
|
+
removedFiles,
|
|
102
|
+
removedRuns: entriesToRemove.length,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
throw new Error(`Failed to cleanup storage: ${error instanceof Error ? error.message : String(error)}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Export historical data
|
|
111
|
+
*/
|
|
112
|
+
async export(format, query) {
|
|
113
|
+
try {
|
|
114
|
+
const runs = await this.queryRuns(query || {});
|
|
115
|
+
if (format === 'json') {
|
|
116
|
+
return JSON.stringify(runs, null, 2);
|
|
117
|
+
}
|
|
118
|
+
else if (format === 'csv') {
|
|
119
|
+
return this.exportToCsv(runs);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
throw new Error(`Unsupported export format: ${format}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
throw new Error(`Failed to export data: ${error instanceof Error ? error.message : String(error)}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Get index of all stored runs
|
|
131
|
+
*/
|
|
132
|
+
async getIndex() {
|
|
133
|
+
try {
|
|
134
|
+
const index = await this.loadIndex();
|
|
135
|
+
return index.entries.map((entry) => ({
|
|
136
|
+
date: entry.date,
|
|
137
|
+
id: entry.id,
|
|
138
|
+
summary: entry.summary,
|
|
139
|
+
}));
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
throw new Error(`Failed to get storage index: ${error instanceof Error ? error.message : String(error)}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Get storage statistics
|
|
147
|
+
*/
|
|
148
|
+
async getStats() {
|
|
149
|
+
try {
|
|
150
|
+
const index = await this.loadIndex();
|
|
151
|
+
const dates = index.entries
|
|
152
|
+
.map((e) => e.date)
|
|
153
|
+
.sort((a, b) => a.getTime() - b.getTime());
|
|
154
|
+
return {
|
|
155
|
+
newestRun: dates[dates.length - 1],
|
|
156
|
+
oldestRun: dates[0],
|
|
157
|
+
totalRuns: index.entries.length,
|
|
158
|
+
totalSize: index.entries.reduce((total, entry) => total + entry.sizeBytes, 0),
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return { totalRuns: 0, totalSize: 0 };
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get storage directory path
|
|
167
|
+
*/
|
|
168
|
+
getStorageDir() {
|
|
169
|
+
return this.storageDir;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get total storage size in bytes
|
|
173
|
+
*/
|
|
174
|
+
async getStorageSize() {
|
|
175
|
+
try {
|
|
176
|
+
const index = await this.loadIndex();
|
|
177
|
+
return index.entries.reduce((total, entry) => total + entry.sizeBytes, 0);
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return 0;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Load a specific benchmark run
|
|
185
|
+
*/
|
|
186
|
+
async loadRun(id) {
|
|
187
|
+
try {
|
|
188
|
+
const index = await this.loadIndex();
|
|
189
|
+
const entry = index.entries.find((e) => e.id === id);
|
|
190
|
+
if (!entry) {
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
const filePath = (0, node_path_1.join)(this.storageDir, entry.filename);
|
|
194
|
+
if (!(0, node_fs_1.existsSync)(filePath)) {
|
|
195
|
+
// File missing, clean up index
|
|
196
|
+
await this.removeFromIndex(id);
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
const data = (0, node_fs_1.readFileSync)(filePath, 'utf8');
|
|
200
|
+
const run = JSON.parse(data);
|
|
201
|
+
// Validate the loaded run
|
|
202
|
+
if (!FileHistoryStorage.isValidBenchmarkRun(run)) {
|
|
203
|
+
throw new Error(`Invalid benchmark run data in file ${entry.filename}`);
|
|
204
|
+
}
|
|
205
|
+
return run;
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
throw new Error(`Failed to load benchmark run ${id}: ${error instanceof Error ? error.message : String(error)}`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Query historical runs
|
|
213
|
+
*/
|
|
214
|
+
async queryRuns(query) {
|
|
215
|
+
try {
|
|
216
|
+
const index = await this.loadIndex();
|
|
217
|
+
let filteredEntries = [...index.entries];
|
|
218
|
+
// Apply filters
|
|
219
|
+
if (query.since) {
|
|
220
|
+
filteredEntries = filteredEntries.filter((e) => e.date >= query.since);
|
|
221
|
+
}
|
|
222
|
+
if (query.until) {
|
|
223
|
+
filteredEntries = filteredEntries.filter((e) => e.date <= query.until);
|
|
224
|
+
}
|
|
225
|
+
if (query.pattern) {
|
|
226
|
+
const regex = new RegExp(query.pattern, 'i');
|
|
227
|
+
filteredEntries = filteredEntries.filter((e) => regex.test(e.summary));
|
|
228
|
+
}
|
|
229
|
+
if (query.tags && query.tags.length > 0) {
|
|
230
|
+
filteredEntries = filteredEntries.filter((e) => query.tags.some((tag) => e.tags.includes(tag)));
|
|
231
|
+
}
|
|
232
|
+
// Apply sorting
|
|
233
|
+
const sortBy = query.sortBy || 'date';
|
|
234
|
+
const sort = query.sort || 'desc';
|
|
235
|
+
filteredEntries.sort((a, b) => {
|
|
236
|
+
let comparison = 0;
|
|
237
|
+
switch (sortBy) {
|
|
238
|
+
case 'date':
|
|
239
|
+
comparison = a.date.getTime() - b.date.getTime();
|
|
240
|
+
break;
|
|
241
|
+
case 'name':
|
|
242
|
+
comparison = a.summary.localeCompare(b.summary);
|
|
243
|
+
break;
|
|
244
|
+
default:
|
|
245
|
+
comparison = a.date.getTime() - b.date.getTime();
|
|
246
|
+
}
|
|
247
|
+
return sort === 'desc' ? -comparison : comparison;
|
|
248
|
+
});
|
|
249
|
+
// Apply pagination
|
|
250
|
+
const offset = query.offset || 0;
|
|
251
|
+
const limit = query.limit || filteredEntries.length;
|
|
252
|
+
const paginatedEntries = filteredEntries.slice(offset, offset + limit);
|
|
253
|
+
// Load the actual runs
|
|
254
|
+
const runs = [];
|
|
255
|
+
for (const entry of paginatedEntries) {
|
|
256
|
+
const run = await this.loadRun(entry.id);
|
|
257
|
+
if (run) {
|
|
258
|
+
runs.push(run);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return runs;
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
throw new Error(`Failed to query benchmark runs: ${error instanceof Error ? error.message : String(error)}`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Save a benchmark run to storage
|
|
269
|
+
*/
|
|
270
|
+
async saveRun(run) {
|
|
271
|
+
try {
|
|
272
|
+
this.ensureStorageDir();
|
|
273
|
+
// Generate filename based on run ID and timestamp
|
|
274
|
+
const filename = this.generateFilename(run);
|
|
275
|
+
const filePath = (0, node_path_1.join)(this.storageDir, filename);
|
|
276
|
+
// Serialize the run data
|
|
277
|
+
const data = JSON.stringify(run, null, 2);
|
|
278
|
+
// Check file size limit
|
|
279
|
+
if (Buffer.byteLength(data, 'utf8') > this.maxFileSize) {
|
|
280
|
+
throw new Error(`Benchmark run data exceeds maximum file size of ${this.maxFileSize} bytes`);
|
|
281
|
+
}
|
|
282
|
+
// Write the run data
|
|
283
|
+
(0, node_fs_1.writeFileSync)(filePath, data, 'utf8');
|
|
284
|
+
// Update the index
|
|
285
|
+
await this.updateIndex(run, filename, Buffer.byteLength(data, 'utf8'));
|
|
286
|
+
}
|
|
287
|
+
catch (error) {
|
|
288
|
+
throw new Error(`Failed to save benchmark run: ${error instanceof Error ? error.message : String(error)}`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Ensure storage directory exists
|
|
293
|
+
*/
|
|
294
|
+
ensureStorageDir() {
|
|
295
|
+
if (!(0, node_fs_1.existsSync)(this.storageDir)) {
|
|
296
|
+
(0, node_fs_1.mkdirSync)(this.storageDir, { recursive: true });
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Export runs to CSV format
|
|
301
|
+
*/
|
|
302
|
+
exportToCsv(runs) {
|
|
303
|
+
const headers = [
|
|
304
|
+
'runId',
|
|
305
|
+
'startTime',
|
|
306
|
+
'endTime',
|
|
307
|
+
'duration',
|
|
308
|
+
'files',
|
|
309
|
+
'suites',
|
|
310
|
+
'tasks',
|
|
311
|
+
'passed',
|
|
312
|
+
'failed',
|
|
313
|
+
'nodeVersion',
|
|
314
|
+
'platform',
|
|
315
|
+
'arch',
|
|
316
|
+
'gitCommit',
|
|
317
|
+
'gitBranch',
|
|
318
|
+
];
|
|
319
|
+
const rows = runs.map((run) => [
|
|
320
|
+
run.id,
|
|
321
|
+
run.startTime.toISOString(),
|
|
322
|
+
run.endTime.toISOString(),
|
|
323
|
+
run.duration.toString(),
|
|
324
|
+
run.summary.totalFiles.toString(),
|
|
325
|
+
run.summary.totalSuites.toString(),
|
|
326
|
+
run.summary.totalTasks.toString(),
|
|
327
|
+
run.summary.passedTasks.toString(),
|
|
328
|
+
run.summary.failedTasks.toString(),
|
|
329
|
+
run.environment.nodeVersion,
|
|
330
|
+
run.environment.platform,
|
|
331
|
+
run.environment.arch,
|
|
332
|
+
run.git?.commit || '',
|
|
333
|
+
run.git?.branch || '',
|
|
334
|
+
]);
|
|
335
|
+
const csvLines = [headers, ...rows];
|
|
336
|
+
return csvLines
|
|
337
|
+
.map((row) => row.map((cell) => `"${cell.replace(/"/g, '""')}"`).join(','))
|
|
338
|
+
.join('\n');
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Generate filename for a benchmark run
|
|
342
|
+
*/
|
|
343
|
+
generateFilename(run) {
|
|
344
|
+
const timestamp = run.startTime.toISOString().replace(/[:.]/g, '-');
|
|
345
|
+
const hash = (0, node_crypto_1.createHash)('md5').update(run.id).digest('hex').substring(0, 8);
|
|
346
|
+
return `run-${timestamp}-${hash}.json`;
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Generate a human-readable summary for a run
|
|
350
|
+
*/
|
|
351
|
+
generateSummary(run) {
|
|
352
|
+
const fileCount = run.files.length;
|
|
353
|
+
const taskCount = run.summary.totalTasks;
|
|
354
|
+
const failedCount = run.summary.failedTasks;
|
|
355
|
+
if (failedCount > 0) {
|
|
356
|
+
return `${fileCount} files, ${taskCount} tasks (${failedCount} failed)`;
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
return `${fileCount} files, ${taskCount} tasks`;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Load the storage index
|
|
364
|
+
*/
|
|
365
|
+
async loadIndex() {
|
|
366
|
+
if (this.index) {
|
|
367
|
+
return this.index;
|
|
368
|
+
}
|
|
369
|
+
if (!(0, node_fs_1.existsSync)(this.indexFile)) {
|
|
370
|
+
this.index = {
|
|
371
|
+
created: new Date(),
|
|
372
|
+
entries: [],
|
|
373
|
+
lastModified: new Date(),
|
|
374
|
+
version: '1.0.0',
|
|
375
|
+
};
|
|
376
|
+
await this.saveIndex();
|
|
377
|
+
return this.index; // We just assigned it, so it's not null
|
|
378
|
+
}
|
|
379
|
+
try {
|
|
380
|
+
const data = (0, node_fs_1.readFileSync)(this.indexFile, 'utf8');
|
|
381
|
+
const parsed = JSON.parse(data);
|
|
382
|
+
// Convert date strings back to Date objects
|
|
383
|
+
this.index = {
|
|
384
|
+
created: new Date(parsed.created),
|
|
385
|
+
entries: parsed.entries.map((entry) => ({
|
|
386
|
+
...entry,
|
|
387
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access
|
|
388
|
+
date: new Date(entry.date),
|
|
389
|
+
})),
|
|
390
|
+
lastModified: new Date(parsed.lastModified),
|
|
391
|
+
version: '1.0.0',
|
|
392
|
+
};
|
|
393
|
+
return this.index; // We just assigned it, so it's not null
|
|
394
|
+
}
|
|
395
|
+
catch (error) {
|
|
396
|
+
throw new Error(`Failed to load storage index: ${error instanceof Error ? error.message : String(error)}`);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Remove an entry from the index
|
|
401
|
+
*/
|
|
402
|
+
async removeFromIndex(id) {
|
|
403
|
+
const index = await this.loadIndex();
|
|
404
|
+
const entryIndex = index.entries.findIndex((e) => e.id === id);
|
|
405
|
+
if (entryIndex >= 0) {
|
|
406
|
+
index.entries.splice(entryIndex, 1);
|
|
407
|
+
this.index = index;
|
|
408
|
+
await this.saveIndex();
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Save the storage index
|
|
413
|
+
*/
|
|
414
|
+
async saveIndex() {
|
|
415
|
+
if (!this.index) {
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
try {
|
|
419
|
+
this.index = {
|
|
420
|
+
...this.index,
|
|
421
|
+
lastModified: new Date(),
|
|
422
|
+
};
|
|
423
|
+
const data = JSON.stringify(this.index, null, 2);
|
|
424
|
+
(0, node_fs_1.writeFileSync)(this.indexFile, data, 'utf8');
|
|
425
|
+
}
|
|
426
|
+
catch (error) {
|
|
427
|
+
throw new Error(`Failed to save storage index: ${error instanceof Error ? error.message : String(error)}`);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Update index with a new run
|
|
432
|
+
*/
|
|
433
|
+
async updateIndex(run, filename, sizeBytes) {
|
|
434
|
+
const index = await this.loadIndex();
|
|
435
|
+
const entry = {
|
|
436
|
+
date: run.startTime,
|
|
437
|
+
filename,
|
|
438
|
+
id: run.id,
|
|
439
|
+
sizeBytes,
|
|
440
|
+
summary: this.generateSummary(run),
|
|
441
|
+
tags: run.tags || [],
|
|
442
|
+
};
|
|
443
|
+
// Remove existing entry if it exists
|
|
444
|
+
const existingIndex = index.entries.findIndex((e) => e.id === run.id);
|
|
445
|
+
if (existingIndex >= 0) {
|
|
446
|
+
index.entries.splice(existingIndex, 1);
|
|
447
|
+
}
|
|
448
|
+
// Add new entry
|
|
449
|
+
index.entries.push(entry);
|
|
450
|
+
// Update index
|
|
451
|
+
this.index = index;
|
|
452
|
+
await this.saveIndex();
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
exports.FileHistoryStorage = FileHistoryStorage;
|
|
456
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/storage/history.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ModestBench History Storage
|
|
3
|
+
*
|
|
4
|
+
* File-based storage system for benchmark run history and results. Provides
|
|
5
|
+
* querying, cleanup, and export capabilities for historical data.
|
|
6
|
+
*/
|
|
7
|
+
import type { BenchmarkRun, CleanupResult, HistoryQuery, HistoryStorage, RetentionPolicy } from "../types/index.cjs";
|
|
8
|
+
/**
|
|
9
|
+
* File-based history storage implementation
|
|
10
|
+
*/
|
|
11
|
+
export declare class FileHistoryStorage implements HistoryStorage {
|
|
12
|
+
private index;
|
|
13
|
+
private readonly indexFile;
|
|
14
|
+
private readonly maxFileSize;
|
|
15
|
+
private readonly storageDir;
|
|
16
|
+
constructor(options?: {
|
|
17
|
+
maxFileSize?: number;
|
|
18
|
+
storageDir?: string;
|
|
19
|
+
});
|
|
20
|
+
static isValidBenchmarkRun(obj: unknown): obj is BenchmarkRun;
|
|
21
|
+
/**
|
|
22
|
+
* Clean up old data according to retention policy
|
|
23
|
+
*/
|
|
24
|
+
cleanup(policy: RetentionPolicy): Promise<CleanupResult>;
|
|
25
|
+
/**
|
|
26
|
+
* Export historical data
|
|
27
|
+
*/
|
|
28
|
+
export(format: 'csv' | 'json', query?: HistoryQuery): Promise<string>;
|
|
29
|
+
/**
|
|
30
|
+
* Get index of all stored runs
|
|
31
|
+
*/
|
|
32
|
+
getIndex(): Promise<Array<{
|
|
33
|
+
date: Date;
|
|
34
|
+
id: string;
|
|
35
|
+
summary: string;
|
|
36
|
+
}>>;
|
|
37
|
+
/**
|
|
38
|
+
* Get storage statistics
|
|
39
|
+
*/
|
|
40
|
+
getStats(): Promise<{
|
|
41
|
+
newestRun?: Date | undefined;
|
|
42
|
+
oldestRun?: Date | undefined;
|
|
43
|
+
totalRuns: number;
|
|
44
|
+
totalSize: number;
|
|
45
|
+
}>;
|
|
46
|
+
/**
|
|
47
|
+
* Get storage directory path
|
|
48
|
+
*/
|
|
49
|
+
getStorageDir(): string;
|
|
50
|
+
/**
|
|
51
|
+
* Get total storage size in bytes
|
|
52
|
+
*/
|
|
53
|
+
getStorageSize(): Promise<number>;
|
|
54
|
+
/**
|
|
55
|
+
* Load a specific benchmark run
|
|
56
|
+
*/
|
|
57
|
+
loadRun(id: string): Promise<BenchmarkRun | null>;
|
|
58
|
+
/**
|
|
59
|
+
* Query historical runs
|
|
60
|
+
*/
|
|
61
|
+
queryRuns(query: HistoryQuery): Promise<BenchmarkRun[]>;
|
|
62
|
+
/**
|
|
63
|
+
* Save a benchmark run to storage
|
|
64
|
+
*/
|
|
65
|
+
saveRun(run: BenchmarkRun): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Ensure storage directory exists
|
|
68
|
+
*/
|
|
69
|
+
private ensureStorageDir;
|
|
70
|
+
/**
|
|
71
|
+
* Export runs to CSV format
|
|
72
|
+
*/
|
|
73
|
+
private exportToCsv;
|
|
74
|
+
/**
|
|
75
|
+
* Generate filename for a benchmark run
|
|
76
|
+
*/
|
|
77
|
+
private generateFilename;
|
|
78
|
+
/**
|
|
79
|
+
* Generate a human-readable summary for a run
|
|
80
|
+
*/
|
|
81
|
+
private generateSummary;
|
|
82
|
+
/**
|
|
83
|
+
* Load the storage index
|
|
84
|
+
*/
|
|
85
|
+
private loadIndex;
|
|
86
|
+
/**
|
|
87
|
+
* Remove an entry from the index
|
|
88
|
+
*/
|
|
89
|
+
private removeFromIndex;
|
|
90
|
+
/**
|
|
91
|
+
* Save the storage index
|
|
92
|
+
*/
|
|
93
|
+
private saveIndex;
|
|
94
|
+
/**
|
|
95
|
+
* Update index with a new run
|
|
96
|
+
*/
|
|
97
|
+
private updateIndex;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/storage/history.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,cAAc,EACd,eAAe,EAChB,2BAA0B;AAwB3B;;GAEG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IACvD,OAAO,CAAC,KAAK,CAA6B;IAE1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAGlC,OAAO,GAAE;QACP,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;KAChB;WAUM,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,YAAY;IAoBpE;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC;IA8E9D;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,EAAE,KAAK,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAkB3E;;OAEG;IACG,QAAQ,IAAI,OAAO,CACvB,KAAK,CAAC;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CACnD;IAeD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC;QACxB,SAAS,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;QAC7B,SAAS,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;QAC7B,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAqBF;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IASvC;;OAEG;IACG,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAiCvD;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAoE7D;;OAEG;IACG,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IA8B/C;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,OAAO,CAAC,WAAW;IA2CnB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;YACW,SAAS;IA6CvB;;OAEG;YACW,eAAe;IAW7B;;OAEG;YACW,SAAS;IAoBvB;;OAEG;YACW,WAAW;CA6B1B"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ModestBench History Storage
|
|
3
|
+
*
|
|
4
|
+
* File-based storage system for benchmark run history and results. Provides
|
|
5
|
+
* querying, cleanup, and export capabilities for historical data.
|
|
6
|
+
*/
|
|
7
|
+
import type { BenchmarkRun, CleanupResult, HistoryQuery, HistoryStorage, RetentionPolicy } from "../types/index.js";
|
|
8
|
+
/**
|
|
9
|
+
* File-based history storage implementation
|
|
10
|
+
*/
|
|
11
|
+
export declare class FileHistoryStorage implements HistoryStorage {
|
|
12
|
+
private index;
|
|
13
|
+
private readonly indexFile;
|
|
14
|
+
private readonly maxFileSize;
|
|
15
|
+
private readonly storageDir;
|
|
16
|
+
constructor(options?: {
|
|
17
|
+
maxFileSize?: number;
|
|
18
|
+
storageDir?: string;
|
|
19
|
+
});
|
|
20
|
+
static isValidBenchmarkRun(obj: unknown): obj is BenchmarkRun;
|
|
21
|
+
/**
|
|
22
|
+
* Clean up old data according to retention policy
|
|
23
|
+
*/
|
|
24
|
+
cleanup(policy: RetentionPolicy): Promise<CleanupResult>;
|
|
25
|
+
/**
|
|
26
|
+
* Export historical data
|
|
27
|
+
*/
|
|
28
|
+
export(format: 'csv' | 'json', query?: HistoryQuery): Promise<string>;
|
|
29
|
+
/**
|
|
30
|
+
* Get index of all stored runs
|
|
31
|
+
*/
|
|
32
|
+
getIndex(): Promise<Array<{
|
|
33
|
+
date: Date;
|
|
34
|
+
id: string;
|
|
35
|
+
summary: string;
|
|
36
|
+
}>>;
|
|
37
|
+
/**
|
|
38
|
+
* Get storage statistics
|
|
39
|
+
*/
|
|
40
|
+
getStats(): Promise<{
|
|
41
|
+
newestRun?: Date | undefined;
|
|
42
|
+
oldestRun?: Date | undefined;
|
|
43
|
+
totalRuns: number;
|
|
44
|
+
totalSize: number;
|
|
45
|
+
}>;
|
|
46
|
+
/**
|
|
47
|
+
* Get storage directory path
|
|
48
|
+
*/
|
|
49
|
+
getStorageDir(): string;
|
|
50
|
+
/**
|
|
51
|
+
* Get total storage size in bytes
|
|
52
|
+
*/
|
|
53
|
+
getStorageSize(): Promise<number>;
|
|
54
|
+
/**
|
|
55
|
+
* Load a specific benchmark run
|
|
56
|
+
*/
|
|
57
|
+
loadRun(id: string): Promise<BenchmarkRun | null>;
|
|
58
|
+
/**
|
|
59
|
+
* Query historical runs
|
|
60
|
+
*/
|
|
61
|
+
queryRuns(query: HistoryQuery): Promise<BenchmarkRun[]>;
|
|
62
|
+
/**
|
|
63
|
+
* Save a benchmark run to storage
|
|
64
|
+
*/
|
|
65
|
+
saveRun(run: BenchmarkRun): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Ensure storage directory exists
|
|
68
|
+
*/
|
|
69
|
+
private ensureStorageDir;
|
|
70
|
+
/**
|
|
71
|
+
* Export runs to CSV format
|
|
72
|
+
*/
|
|
73
|
+
private exportToCsv;
|
|
74
|
+
/**
|
|
75
|
+
* Generate filename for a benchmark run
|
|
76
|
+
*/
|
|
77
|
+
private generateFilename;
|
|
78
|
+
/**
|
|
79
|
+
* Generate a human-readable summary for a run
|
|
80
|
+
*/
|
|
81
|
+
private generateSummary;
|
|
82
|
+
/**
|
|
83
|
+
* Load the storage index
|
|
84
|
+
*/
|
|
85
|
+
private loadIndex;
|
|
86
|
+
/**
|
|
87
|
+
* Remove an entry from the index
|
|
88
|
+
*/
|
|
89
|
+
private removeFromIndex;
|
|
90
|
+
/**
|
|
91
|
+
* Save the storage index
|
|
92
|
+
*/
|
|
93
|
+
private saveIndex;
|
|
94
|
+
/**
|
|
95
|
+
* Update index with a new run
|
|
96
|
+
*/
|
|
97
|
+
private updateIndex;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/storage/history.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,cAAc,EACd,eAAe,EAChB,0BAA0B;AAwB3B;;GAEG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IACvD,OAAO,CAAC,KAAK,CAA6B;IAE1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAGlC,OAAO,GAAE;QACP,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;KAChB;WAUM,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,YAAY;IAoBpE;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC;IA8E9D;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,EAAE,KAAK,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAkB3E;;OAEG;IACG,QAAQ,IAAI,OAAO,CACvB,KAAK,CAAC;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CACnD;IAeD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC;QACxB,SAAS,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;QAC7B,SAAS,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;QAC7B,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAqBF;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IASvC;;OAEG;IACG,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAiCvD;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAoE7D;;OAEG;IACG,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IA8B/C;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,OAAO,CAAC,WAAW;IA2CnB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;YACW,SAAS;IA6CvB;;OAEG;YACW,eAAe;IAW7B;;OAEG;YACW,SAAS;IAoBvB;;OAEG;YACW,WAAW;CA6B1B"}
|