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.
Files changed (275) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/LICENSE.md +55 -0
  3. package/README.md +699 -0
  4. package/dist/bootstrap.cjs +37 -0
  5. package/dist/bootstrap.cjs.map +1 -0
  6. package/dist/bootstrap.d.cts +17 -0
  7. package/dist/bootstrap.d.cts.map +1 -0
  8. package/dist/bootstrap.d.ts +17 -0
  9. package/dist/bootstrap.d.ts.map +1 -0
  10. package/dist/bootstrap.js +33 -0
  11. package/dist/bootstrap.js.map +1 -0
  12. package/dist/cli/commands/history.cjs +459 -0
  13. package/dist/cli/commands/history.cjs.map +1 -0
  14. package/dist/cli/commands/history.d.cts +34 -0
  15. package/dist/cli/commands/history.d.cts.map +1 -0
  16. package/dist/cli/commands/history.d.ts +34 -0
  17. package/dist/cli/commands/history.d.ts.map +1 -0
  18. package/dist/cli/commands/history.js +422 -0
  19. package/dist/cli/commands/history.js.map +1 -0
  20. package/dist/cli/commands/init.cjs +566 -0
  21. package/dist/cli/commands/init.cjs.map +1 -0
  22. package/dist/cli/commands/init.d.cts +26 -0
  23. package/dist/cli/commands/init.d.cts.map +1 -0
  24. package/dist/cli/commands/init.d.ts +26 -0
  25. package/dist/cli/commands/init.d.ts.map +1 -0
  26. package/dist/cli/commands/init.js +562 -0
  27. package/dist/cli/commands/init.js.map +1 -0
  28. package/dist/cli/commands/run.cjs +285 -0
  29. package/dist/cli/commands/run.cjs.map +1 -0
  30. package/dist/cli/commands/run.d.cts +37 -0
  31. package/dist/cli/commands/run.d.cts.map +1 -0
  32. package/dist/cli/commands/run.d.ts +37 -0
  33. package/dist/cli/commands/run.d.ts.map +1 -0
  34. package/dist/cli/commands/run.js +248 -0
  35. package/dist/cli/commands/run.js.map +1 -0
  36. package/dist/cli/index.cjs +523 -0
  37. package/dist/cli/index.cjs.map +1 -0
  38. package/dist/cli/index.d.cts +58 -0
  39. package/dist/cli/index.d.cts.map +1 -0
  40. package/dist/cli/index.d.ts +58 -0
  41. package/dist/cli/index.d.ts.map +1 -0
  42. package/dist/cli/index.js +515 -0
  43. package/dist/cli/index.js.map +1 -0
  44. package/dist/config/manager.cjs +370 -0
  45. package/dist/config/manager.cjs.map +1 -0
  46. package/dist/config/manager.d.cts +46 -0
  47. package/dist/config/manager.d.cts.map +1 -0
  48. package/dist/config/manager.d.ts +46 -0
  49. package/dist/config/manager.d.ts.map +1 -0
  50. package/dist/config/manager.js +333 -0
  51. package/dist/config/manager.js.map +1 -0
  52. package/dist/config/schema.cjs +182 -0
  53. package/dist/config/schema.cjs.map +1 -0
  54. package/dist/config/schema.d.cts +51 -0
  55. package/dist/config/schema.d.cts.map +1 -0
  56. package/dist/config/schema.d.ts +51 -0
  57. package/dist/config/schema.d.ts.map +1 -0
  58. package/dist/config/schema.js +145 -0
  59. package/dist/config/schema.js.map +1 -0
  60. package/dist/constants.cjs +22 -0
  61. package/dist/constants.cjs.map +1 -0
  62. package/dist/constants.d.cts +10 -0
  63. package/dist/constants.d.cts.map +1 -0
  64. package/dist/constants.d.ts +10 -0
  65. package/dist/constants.d.ts.map +1 -0
  66. package/dist/constants.js +19 -0
  67. package/dist/constants.js.map +1 -0
  68. package/dist/core/benchmark-schema.cjs +135 -0
  69. package/dist/core/benchmark-schema.cjs.map +1 -0
  70. package/dist/core/benchmark-schema.d.cts +139 -0
  71. package/dist/core/benchmark-schema.d.cts.map +1 -0
  72. package/dist/core/benchmark-schema.d.ts +139 -0
  73. package/dist/core/benchmark-schema.d.ts.map +1 -0
  74. package/dist/core/benchmark-schema.js +132 -0
  75. package/dist/core/benchmark-schema.js.map +1 -0
  76. package/dist/core/engine.cjs +669 -0
  77. package/dist/core/engine.cjs.map +1 -0
  78. package/dist/core/engine.d.cts +128 -0
  79. package/dist/core/engine.d.cts.map +1 -0
  80. package/dist/core/engine.d.ts +128 -0
  81. package/dist/core/engine.d.ts.map +1 -0
  82. package/dist/core/engine.js +632 -0
  83. package/dist/core/engine.js.map +1 -0
  84. package/dist/core/engines/accurate-engine.cjs +292 -0
  85. package/dist/core/engines/accurate-engine.cjs.map +1 -0
  86. package/dist/core/engines/accurate-engine.d.cts +63 -0
  87. package/dist/core/engines/accurate-engine.d.cts.map +1 -0
  88. package/dist/core/engines/accurate-engine.d.ts +63 -0
  89. package/dist/core/engines/accurate-engine.d.ts.map +1 -0
  90. package/dist/core/engines/accurate-engine.js +288 -0
  91. package/dist/core/engines/accurate-engine.js.map +1 -0
  92. package/dist/core/engines/index.cjs +21 -0
  93. package/dist/core/engines/index.cjs.map +1 -0
  94. package/dist/core/engines/index.d.cts +16 -0
  95. package/dist/core/engines/index.d.cts.map +1 -0
  96. package/dist/core/engines/index.d.ts +16 -0
  97. package/dist/core/engines/index.d.ts.map +1 -0
  98. package/dist/core/engines/index.js +16 -0
  99. package/dist/core/engines/index.js.map +1 -0
  100. package/dist/core/engines/tinybench-engine.cjs +286 -0
  101. package/dist/core/engines/tinybench-engine.cjs.map +1 -0
  102. package/dist/core/engines/tinybench-engine.d.cts +18 -0
  103. package/dist/core/engines/tinybench-engine.d.cts.map +1 -0
  104. package/dist/core/engines/tinybench-engine.d.ts +18 -0
  105. package/dist/core/engines/tinybench-engine.d.ts.map +1 -0
  106. package/dist/core/engines/tinybench-engine.js +282 -0
  107. package/dist/core/engines/tinybench-engine.js.map +1 -0
  108. package/dist/core/error-manager.cjs +303 -0
  109. package/dist/core/error-manager.cjs.map +1 -0
  110. package/dist/core/error-manager.d.cts +77 -0
  111. package/dist/core/error-manager.d.cts.map +1 -0
  112. package/dist/core/error-manager.d.ts +77 -0
  113. package/dist/core/error-manager.d.ts.map +1 -0
  114. package/dist/core/error-manager.js +299 -0
  115. package/dist/core/error-manager.js.map +1 -0
  116. package/dist/core/loader.cjs +287 -0
  117. package/dist/core/loader.cjs.map +1 -0
  118. package/dist/core/loader.d.cts +55 -0
  119. package/dist/core/loader.d.cts.map +1 -0
  120. package/dist/core/loader.d.ts +55 -0
  121. package/dist/core/loader.d.ts.map +1 -0
  122. package/dist/core/loader.js +250 -0
  123. package/dist/core/loader.js.map +1 -0
  124. package/dist/core/stats-utils.cjs +99 -0
  125. package/dist/core/stats-utils.cjs.map +1 -0
  126. package/dist/core/stats-utils.d.cts +50 -0
  127. package/dist/core/stats-utils.d.cts.map +1 -0
  128. package/dist/core/stats-utils.d.ts +50 -0
  129. package/dist/core/stats-utils.d.ts.map +1 -0
  130. package/dist/core/stats-utils.js +94 -0
  131. package/dist/core/stats-utils.js.map +1 -0
  132. package/dist/index.cjs +64 -0
  133. package/dist/index.cjs.map +1 -0
  134. package/dist/index.d.cts +22 -0
  135. package/dist/index.d.cts.map +1 -0
  136. package/dist/index.d.ts +22 -0
  137. package/dist/index.d.ts.map +1 -0
  138. package/dist/index.js +30 -0
  139. package/dist/index.js.map +1 -0
  140. package/dist/progress/manager.cjs +325 -0
  141. package/dist/progress/manager.cjs.map +1 -0
  142. package/dist/progress/manager.d.cts +125 -0
  143. package/dist/progress/manager.d.cts.map +1 -0
  144. package/dist/progress/manager.d.ts +125 -0
  145. package/dist/progress/manager.d.ts.map +1 -0
  146. package/dist/progress/manager.js +321 -0
  147. package/dist/progress/manager.js.map +1 -0
  148. package/dist/reporters/csv.cjs +250 -0
  149. package/dist/reporters/csv.cjs.map +1 -0
  150. package/dist/reporters/csv.d.cts +92 -0
  151. package/dist/reporters/csv.d.cts.map +1 -0
  152. package/dist/reporters/csv.d.ts +92 -0
  153. package/dist/reporters/csv.d.ts.map +1 -0
  154. package/dist/reporters/csv.js +246 -0
  155. package/dist/reporters/csv.js.map +1 -0
  156. package/dist/reporters/human.cjs +516 -0
  157. package/dist/reporters/human.cjs.map +1 -0
  158. package/dist/reporters/human.d.cts +86 -0
  159. package/dist/reporters/human.d.cts.map +1 -0
  160. package/dist/reporters/human.d.ts +86 -0
  161. package/dist/reporters/human.d.ts.map +1 -0
  162. package/dist/reporters/human.js +509 -0
  163. package/dist/reporters/human.js.map +1 -0
  164. package/dist/reporters/index.cjs +17 -0
  165. package/dist/reporters/index.cjs.map +1 -0
  166. package/dist/reporters/index.d.cts +10 -0
  167. package/dist/reporters/index.d.cts.map +1 -0
  168. package/dist/reporters/index.d.ts +10 -0
  169. package/dist/reporters/index.d.ts.map +1 -0
  170. package/dist/reporters/index.js +10 -0
  171. package/dist/reporters/index.js.map +1 -0
  172. package/dist/reporters/json.cjs +215 -0
  173. package/dist/reporters/json.cjs.map +1 -0
  174. package/dist/reporters/json.d.cts +79 -0
  175. package/dist/reporters/json.d.cts.map +1 -0
  176. package/dist/reporters/json.d.ts +79 -0
  177. package/dist/reporters/json.d.ts.map +1 -0
  178. package/dist/reporters/json.js +211 -0
  179. package/dist/reporters/json.js.map +1 -0
  180. package/dist/reporters/registry.cjs +255 -0
  181. package/dist/reporters/registry.cjs.map +1 -0
  182. package/dist/reporters/registry.d.cts +155 -0
  183. package/dist/reporters/registry.d.cts.map +1 -0
  184. package/dist/reporters/registry.d.ts +155 -0
  185. package/dist/reporters/registry.d.ts.map +1 -0
  186. package/dist/reporters/registry.js +249 -0
  187. package/dist/reporters/registry.js.map +1 -0
  188. package/dist/reporters/simple.cjs +328 -0
  189. package/dist/reporters/simple.cjs.map +1 -0
  190. package/dist/reporters/simple.d.cts +51 -0
  191. package/dist/reporters/simple.d.cts.map +1 -0
  192. package/dist/reporters/simple.d.ts +51 -0
  193. package/dist/reporters/simple.d.ts.map +1 -0
  194. package/dist/reporters/simple.js +321 -0
  195. package/dist/reporters/simple.js.map +1 -0
  196. package/dist/schema/modestbench-config.schema.json +162 -0
  197. package/dist/storage/history.cjs +456 -0
  198. package/dist/storage/history.cjs.map +1 -0
  199. package/dist/storage/history.d.cts +99 -0
  200. package/dist/storage/history.d.cts.map +1 -0
  201. package/dist/storage/history.d.ts +99 -0
  202. package/dist/storage/history.d.ts.map +1 -0
  203. package/dist/storage/history.js +452 -0
  204. package/dist/storage/history.js.map +1 -0
  205. package/dist/types/cli.cjs +21 -0
  206. package/dist/types/cli.cjs.map +1 -0
  207. package/dist/types/cli.d.cts +296 -0
  208. package/dist/types/cli.d.cts.map +1 -0
  209. package/dist/types/cli.d.ts +296 -0
  210. package/dist/types/cli.d.ts.map +1 -0
  211. package/dist/types/cli.js +18 -0
  212. package/dist/types/cli.js.map +1 -0
  213. package/dist/types/core.cjs +14 -0
  214. package/dist/types/core.cjs.map +1 -0
  215. package/dist/types/core.d.cts +380 -0
  216. package/dist/types/core.d.cts.map +1 -0
  217. package/dist/types/core.d.ts +380 -0
  218. package/dist/types/core.d.ts.map +1 -0
  219. package/dist/types/core.js +13 -0
  220. package/dist/types/core.js.map +1 -0
  221. package/dist/types/index.cjs +27 -0
  222. package/dist/types/index.cjs.map +1 -0
  223. package/dist/types/index.d.cts +11 -0
  224. package/dist/types/index.d.cts.map +1 -0
  225. package/dist/types/index.d.ts +11 -0
  226. package/dist/types/index.d.ts.map +1 -0
  227. package/dist/types/index.js +11 -0
  228. package/dist/types/index.js.map +1 -0
  229. package/dist/types/interfaces.cjs +10 -0
  230. package/dist/types/interfaces.cjs.map +1 -0
  231. package/dist/types/interfaces.d.cts +381 -0
  232. package/dist/types/interfaces.d.cts.map +1 -0
  233. package/dist/types/interfaces.d.ts +381 -0
  234. package/dist/types/interfaces.d.ts.map +1 -0
  235. package/dist/types/interfaces.js +9 -0
  236. package/dist/types/interfaces.js.map +1 -0
  237. package/dist/types/utility.cjs +92 -0
  238. package/dist/types/utility.cjs.map +1 -0
  239. package/dist/types/utility.d.cts +330 -0
  240. package/dist/types/utility.d.cts.map +1 -0
  241. package/dist/types/utility.d.ts +330 -0
  242. package/dist/types/utility.d.ts.map +1 -0
  243. package/dist/types/utility.js +78 -0
  244. package/dist/types/utility.js.map +1 -0
  245. package/package.json +211 -0
  246. package/src/bootstrap.ts +35 -0
  247. package/src/cli/commands/history.ts +569 -0
  248. package/src/cli/commands/init.ts +658 -0
  249. package/src/cli/commands/run.ts +346 -0
  250. package/src/cli/index.ts +642 -0
  251. package/src/config/manager.ts +387 -0
  252. package/src/config/schema.ts +188 -0
  253. package/src/constants.ts +21 -0
  254. package/src/core/benchmark-schema.ts +185 -0
  255. package/src/core/engine.ts +888 -0
  256. package/src/core/engines/accurate-engine.ts +408 -0
  257. package/src/core/engines/index.ts +16 -0
  258. package/src/core/engines/tinybench-engine.ts +335 -0
  259. package/src/core/error-manager.ts +372 -0
  260. package/src/core/loader.ts +324 -0
  261. package/src/core/stats-utils.ts +135 -0
  262. package/src/index.ts +46 -0
  263. package/src/progress/manager.ts +415 -0
  264. package/src/reporters/csv.ts +368 -0
  265. package/src/reporters/human.ts +707 -0
  266. package/src/reporters/index.ts +10 -0
  267. package/src/reporters/json.ts +302 -0
  268. package/src/reporters/registry.ts +349 -0
  269. package/src/reporters/simple.ts +459 -0
  270. package/src/storage/history.ts +600 -0
  271. package/src/types/cli.ts +312 -0
  272. package/src/types/core.ts +414 -0
  273. package/src/types/index.ts +18 -0
  274. package/src/types/interfaces.ts +451 -0
  275. 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"}