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 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reporters/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,oCAAuC;AAA9B,qGAAA,WAAW,OAAA;AACpB,wCAA2C;AAAlC,yGAAA,aAAa,OAAA;AACtB,sCAAyC;AAAhC,uGAAA,YAAY,OAAA;AACrB,0CAA6C;AAApC,2GAAA,cAAc,OAAA"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * ModestBench Reporters
3
+ *
4
+ * Export all available reporters and registry functionality.
5
+ */
6
+ export { CsvReporter } from "./csv.cjs";
7
+ export { HumanReporter } from "./human.cjs";
8
+ export { JsonReporter } from "./json.cjs";
9
+ export { SimpleReporter } from "./simple.cjs";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reporters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,kBAAiB;AACvC,OAAO,EAAE,aAAa,EAAE,oBAAmB;AAC3C,OAAO,EAAE,YAAY,EAAE,mBAAkB;AACzC,OAAO,EAAE,cAAc,EAAE,qBAAoB"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * ModestBench Reporters
3
+ *
4
+ * Export all available reporters and registry functionality.
5
+ */
6
+ export { CsvReporter } from "./csv.js";
7
+ export { HumanReporter } from "./human.js";
8
+ export { JsonReporter } from "./json.js";
9
+ export { SimpleReporter } from "./simple.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reporters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,iBAAiB;AACvC,OAAO,EAAE,aAAa,EAAE,mBAAmB;AAC3C,OAAO,EAAE,YAAY,EAAE,kBAAkB;AACzC,OAAO,EAAE,cAAc,EAAE,oBAAoB"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * ModestBench Reporters
3
+ *
4
+ * Export all available reporters and registry functionality.
5
+ */
6
+ export { CsvReporter } from "./csv.js";
7
+ export { HumanReporter } from "./human.js";
8
+ export { JsonReporter } from "./json.js";
9
+ export { SimpleReporter } from "./simple.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reporters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,iBAAiB;AACvC,OAAO,EAAE,aAAa,EAAE,mBAAmB;AAC3C,OAAO,EAAE,YAAY,EAAE,kBAAkB;AACzC,OAAO,EAAE,cAAc,EAAE,oBAAoB"}
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ /**
3
+ * ModestBench JSON Reporter
4
+ *
5
+ * Outputs benchmark results in structured JSON format. Suitable for machine
6
+ * processing, CI/CD integration, and data analysis.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.JsonReporter = void 0;
10
+ const node_fs_1 = require("node:fs");
11
+ const node_path_1 = require("node:path");
12
+ const registry_js_1 = require("./registry.cjs");
13
+ /**
14
+ * JSON reporter for structured output
15
+ */
16
+ class JsonReporter extends registry_js_1.BaseReporter {
17
+ currentRun;
18
+ includeMetadata;
19
+ includeStatistics;
20
+ outputPath;
21
+ prettyPrint;
22
+ quiet;
23
+ statistics = {
24
+ taskCount: 0,
25
+ totalIterations: 0,
26
+ totalOpsPerSecond: 0,
27
+ };
28
+ constructor(options = {}) {
29
+ super('json', options);
30
+ this.outputPath = options.outputPath;
31
+ this.prettyPrint = options.prettyPrint ?? true;
32
+ this.includeStatistics = options.includeStatistics ?? true;
33
+ this.includeMetadata = options.includeMetadata ?? true;
34
+ this.quiet = options.quiet ?? false;
35
+ }
36
+ /**
37
+ * Check if statistics are included
38
+ */
39
+ areStatisticsIncluded() {
40
+ return this.includeStatistics;
41
+ }
42
+ /**
43
+ * Get the output path (if configured)
44
+ */
45
+ getOutputPath() {
46
+ return this.outputPath;
47
+ }
48
+ /**
49
+ * Check if metadata is included
50
+ */
51
+ isMetadataIncluded() {
52
+ return this.includeMetadata;
53
+ }
54
+ /**
55
+ * Check if pretty printing is enabled
56
+ */
57
+ isPrettyPrintEnabled() {
58
+ return this.prettyPrint;
59
+ }
60
+ async onEnd(run) {
61
+ const output = this.buildJsonOutput(run);
62
+ if (this.outputPath) {
63
+ await this.writeToFile(output);
64
+ }
65
+ else {
66
+ this.writeToStdout(output);
67
+ }
68
+ }
69
+ onError(error) {
70
+ // For JSON reporter, we'll include errors in the final output
71
+ // but we can also log to stderr for immediate feedback
72
+ console.error('JSON Reporter Error:', error.message);
73
+ }
74
+ onFileEnd(_result) {
75
+ // No-op for JSON reporter
76
+ }
77
+ onFileStart(_file) {
78
+ // No-op for JSON reporter
79
+ }
80
+ onProgress(_state) {
81
+ // No-op for JSON reporter - we don't output progress in JSON format
82
+ }
83
+ onStart(run) {
84
+ this.currentRun = run;
85
+ this.resetStatistics();
86
+ }
87
+ onSuiteEnd(_result) {
88
+ // No-op for JSON reporter
89
+ }
90
+ onSuiteStart(_suite) {
91
+ // No-op for JSON reporter
92
+ }
93
+ onTaskResult(result) {
94
+ if (!result.error) {
95
+ this.updateStatistics(result);
96
+ }
97
+ }
98
+ onTaskStart(_task) {
99
+ // No-op for JSON reporter
100
+ }
101
+ /**
102
+ * Build the complete JSON output structure
103
+ */
104
+ buildJsonOutput(run) {
105
+ const output = {
106
+ meta: {
107
+ format: 'modestbench-json',
108
+ timestamp: new Date().toISOString(),
109
+ version: '0.1.0', // TODO: Get from package.json
110
+ },
111
+ run: this.includeMetadata ? run : this.sanitizeRun(run),
112
+ };
113
+ if (this.includeStatistics) {
114
+ const stats = {
115
+ averageOpsPerSecond: this.statistics.taskCount > 0
116
+ ? this.statistics.totalOpsPerSecond / this.statistics.taskCount
117
+ : 0,
118
+ totalIterations: this.statistics.totalIterations,
119
+ ...(this.statistics.fastestTask && {
120
+ fastestTask: this.statistics.fastestTask,
121
+ }),
122
+ ...(this.statistics.slowestTask && {
123
+ slowestTask: this.statistics.slowestTask,
124
+ }),
125
+ };
126
+ output.statistics = stats;
127
+ }
128
+ return output;
129
+ }
130
+ /**
131
+ * Reset statistics tracking
132
+ */
133
+ resetStatistics() {
134
+ this.statistics = {
135
+ taskCount: 0,
136
+ totalIterations: 0,
137
+ totalOpsPerSecond: 0,
138
+ };
139
+ }
140
+ /**
141
+ * Remove potentially sensitive metadata from run data
142
+ */
143
+ sanitizeRun(run) {
144
+ let sanitized = {
145
+ ...run,
146
+ environment: {
147
+ ...run.environment,
148
+ env: {}, // Remove environment variables
149
+ hostname: 'redacted', // Remove hostname
150
+ },
151
+ };
152
+ if (run.git) {
153
+ sanitized = {
154
+ ...sanitized,
155
+ git: {
156
+ ...run.git,
157
+ author: 'redacted', // Remove author info
158
+ },
159
+ };
160
+ }
161
+ return sanitized;
162
+ }
163
+ /**
164
+ * Update running statistics with a task result
165
+ */
166
+ updateStatistics(result) {
167
+ this.statistics.totalIterations += result.iterations;
168
+ this.statistics.totalOpsPerSecond += result.opsPerSecond;
169
+ this.statistics.taskCount++;
170
+ // Track fastest task
171
+ if (!this.statistics.fastestTask ||
172
+ result.mean < this.statistics.fastestTask.mean) {
173
+ this.statistics.fastestTask = result;
174
+ }
175
+ // Track slowest task
176
+ if (!this.statistics.slowestTask ||
177
+ result.mean > this.statistics.slowestTask.mean) {
178
+ this.statistics.slowestTask = result;
179
+ }
180
+ }
181
+ /**
182
+ * Write JSON output to file
183
+ */
184
+ async writeToFile(output) {
185
+ if (!this.outputPath) {
186
+ throw new Error('Output path not specified');
187
+ }
188
+ try {
189
+ // Ensure directory exists
190
+ const dir = (0, node_path_1.dirname)(this.outputPath);
191
+ (0, node_fs_1.mkdirSync)(dir, { recursive: true });
192
+ // Write JSON file
193
+ const jsonString = this.prettyPrint
194
+ ? JSON.stringify(output, null, 2)
195
+ : JSON.stringify(output);
196
+ (0, node_fs_1.writeFileSync)(this.outputPath, jsonString, 'utf8');
197
+ }
198
+ catch (error) {
199
+ throw new Error(`Failed to write JSON output to ${this.outputPath}: ${error instanceof Error ? error.message : String(error)}`);
200
+ }
201
+ }
202
+ /**
203
+ * Write JSON output to stdout
204
+ */
205
+ writeToStdout(output) {
206
+ // Always write to stdout when no output path is specified
207
+ // The quiet flag only affects progress messages (stderr), not data output
208
+ const jsonString = this.prettyPrint
209
+ ? JSON.stringify(output, null, 2)
210
+ : JSON.stringify(output);
211
+ console.log(jsonString);
212
+ }
213
+ }
214
+ exports.JsonReporter = JsonReporter;
215
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/reporters/json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * ModestBench JSON Reporter
3
+ *
4
+ * Outputs benchmark results in structured JSON format. Suitable for machine
5
+ * processing, CI/CD integration, and data analysis.
6
+ */
7
+ import type { BenchmarkRun, FileResult, ProgressState, SuiteResult, TaskResult } from "../types/index.cjs";
8
+ import { BaseReporter } from "./registry.cjs";
9
+ /**
10
+ * JSON reporter for structured output
11
+ */
12
+ export declare class JsonReporter extends BaseReporter {
13
+ private currentRun?;
14
+ private readonly includeMetadata;
15
+ private readonly includeStatistics;
16
+ private readonly outputPath?;
17
+ private readonly prettyPrint;
18
+ private readonly quiet;
19
+ private statistics;
20
+ constructor(options?: {
21
+ includeMetadata?: boolean;
22
+ includeStatistics?: boolean;
23
+ outputPath?: string;
24
+ prettyPrint?: boolean;
25
+ quiet?: boolean;
26
+ verbose?: boolean;
27
+ });
28
+ /**
29
+ * Check if statistics are included
30
+ */
31
+ areStatisticsIncluded(): boolean;
32
+ /**
33
+ * Get the output path (if configured)
34
+ */
35
+ getOutputPath(): string | undefined;
36
+ /**
37
+ * Check if metadata is included
38
+ */
39
+ isMetadataIncluded(): boolean;
40
+ /**
41
+ * Check if pretty printing is enabled
42
+ */
43
+ isPrettyPrintEnabled(): boolean;
44
+ onEnd(run: BenchmarkRun): Promise<void>;
45
+ onError(error: Error): void;
46
+ onFileEnd(_result: FileResult): void;
47
+ onFileStart(_file: string): void;
48
+ onProgress(_state: ProgressState): void;
49
+ onStart(run: BenchmarkRun): void;
50
+ onSuiteEnd(_result: SuiteResult): void;
51
+ onSuiteStart(_suite: string): void;
52
+ onTaskResult(result: TaskResult): void;
53
+ onTaskStart(_task: string): void;
54
+ /**
55
+ * Build the complete JSON output structure
56
+ */
57
+ private buildJsonOutput;
58
+ /**
59
+ * Reset statistics tracking
60
+ */
61
+ private resetStatistics;
62
+ /**
63
+ * Remove potentially sensitive metadata from run data
64
+ */
65
+ private sanitizeRun;
66
+ /**
67
+ * Update running statistics with a task result
68
+ */
69
+ private updateStatistics;
70
+ /**
71
+ * Write JSON output to file
72
+ */
73
+ private writeToFile;
74
+ /**
75
+ * Write JSON output to stdout
76
+ */
77
+ private writeToStdout;
78
+ }
79
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/reporters/json.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,aAAa,EACb,WAAW,EACX,UAAU,EACX,2BAA0B;AAE3B,OAAO,EAAE,YAAY,EAAE,uBAAsB;AAuB7C;;GAEG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,UAAU,CAAC,CAAe;IAElC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAE1C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAU;IAE5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAqB;IAEjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IAEtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;IAEhC,OAAO,CAAC,UAAU,CAUhB;gBAGA,OAAO,GAAE;QACP,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,OAAO,CAAC,EAAE,OAAO,CAAC;KACd;IAWR;;OAEG;IACH,qBAAqB,IAAI,OAAO;IAIhC;;OAEG;IACH,aAAa,IAAI,MAAM,GAAG,SAAS;IAInC;;OAEG;IACH,kBAAkB,IAAI,OAAO;IAI7B;;OAEG;IACH,oBAAoB,IAAI,OAAO;IAIzB,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAU7C,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAM3B,SAAS,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAIpC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIhC,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAIvC,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI;IAKhC,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAItC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIlC,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAMtC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIhC;;OAEG;IACH,OAAO,CAAC,eAAe;IA+BvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;IACH,OAAO,CAAC,WAAW;IAuBnB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsBxB;;OAEG;YACW,WAAW;IAuBzB;;OAEG;IACH,OAAO,CAAC,aAAa;CAStB"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * ModestBench JSON Reporter
3
+ *
4
+ * Outputs benchmark results in structured JSON format. Suitable for machine
5
+ * processing, CI/CD integration, and data analysis.
6
+ */
7
+ import type { BenchmarkRun, FileResult, ProgressState, SuiteResult, TaskResult } from "../types/index.js";
8
+ import { BaseReporter } from "./registry.js";
9
+ /**
10
+ * JSON reporter for structured output
11
+ */
12
+ export declare class JsonReporter extends BaseReporter {
13
+ private currentRun?;
14
+ private readonly includeMetadata;
15
+ private readonly includeStatistics;
16
+ private readonly outputPath?;
17
+ private readonly prettyPrint;
18
+ private readonly quiet;
19
+ private statistics;
20
+ constructor(options?: {
21
+ includeMetadata?: boolean;
22
+ includeStatistics?: boolean;
23
+ outputPath?: string;
24
+ prettyPrint?: boolean;
25
+ quiet?: boolean;
26
+ verbose?: boolean;
27
+ });
28
+ /**
29
+ * Check if statistics are included
30
+ */
31
+ areStatisticsIncluded(): boolean;
32
+ /**
33
+ * Get the output path (if configured)
34
+ */
35
+ getOutputPath(): string | undefined;
36
+ /**
37
+ * Check if metadata is included
38
+ */
39
+ isMetadataIncluded(): boolean;
40
+ /**
41
+ * Check if pretty printing is enabled
42
+ */
43
+ isPrettyPrintEnabled(): boolean;
44
+ onEnd(run: BenchmarkRun): Promise<void>;
45
+ onError(error: Error): void;
46
+ onFileEnd(_result: FileResult): void;
47
+ onFileStart(_file: string): void;
48
+ onProgress(_state: ProgressState): void;
49
+ onStart(run: BenchmarkRun): void;
50
+ onSuiteEnd(_result: SuiteResult): void;
51
+ onSuiteStart(_suite: string): void;
52
+ onTaskResult(result: TaskResult): void;
53
+ onTaskStart(_task: string): void;
54
+ /**
55
+ * Build the complete JSON output structure
56
+ */
57
+ private buildJsonOutput;
58
+ /**
59
+ * Reset statistics tracking
60
+ */
61
+ private resetStatistics;
62
+ /**
63
+ * Remove potentially sensitive metadata from run data
64
+ */
65
+ private sanitizeRun;
66
+ /**
67
+ * Update running statistics with a task result
68
+ */
69
+ private updateStatistics;
70
+ /**
71
+ * Write JSON output to file
72
+ */
73
+ private writeToFile;
74
+ /**
75
+ * Write JSON output to stdout
76
+ */
77
+ private writeToStdout;
78
+ }
79
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/reporters/json.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,aAAa,EACb,WAAW,EACX,UAAU,EACX,0BAA0B;AAE3B,OAAO,EAAE,YAAY,EAAE,sBAAsB;AAuB7C;;GAEG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,UAAU,CAAC,CAAe;IAElC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAE1C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAU;IAE5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAqB;IAEjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IAEtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;IAEhC,OAAO,CAAC,UAAU,CAUhB;gBAGA,OAAO,GAAE;QACP,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,OAAO,CAAC,EAAE,OAAO,CAAC;KACd;IAWR;;OAEG;IACH,qBAAqB,IAAI,OAAO;IAIhC;;OAEG;IACH,aAAa,IAAI,MAAM,GAAG,SAAS;IAInC;;OAEG;IACH,kBAAkB,IAAI,OAAO;IAI7B;;OAEG;IACH,oBAAoB,IAAI,OAAO;IAIzB,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAU7C,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAM3B,SAAS,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAIpC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIhC,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAIvC,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI;IAKhC,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAItC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIlC,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAMtC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIhC;;OAEG;IACH,OAAO,CAAC,eAAe;IA+BvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;IACH,OAAO,CAAC,WAAW;IAuBnB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsBxB;;OAEG;YACW,WAAW;IAuBzB;;OAEG;IACH,OAAO,CAAC,aAAa;CAStB"}
@@ -0,0 +1,211 @@
1
+ /**
2
+ * ModestBench JSON Reporter
3
+ *
4
+ * Outputs benchmark results in structured JSON format. Suitable for machine
5
+ * processing, CI/CD integration, and data analysis.
6
+ */
7
+ import { mkdirSync, writeFileSync } from 'node:fs';
8
+ import { dirname } from 'node:path';
9
+ import { BaseReporter } from "./registry.js";
10
+ /**
11
+ * JSON reporter for structured output
12
+ */
13
+ export class JsonReporter extends BaseReporter {
14
+ currentRun;
15
+ includeMetadata;
16
+ includeStatistics;
17
+ outputPath;
18
+ prettyPrint;
19
+ quiet;
20
+ statistics = {
21
+ taskCount: 0,
22
+ totalIterations: 0,
23
+ totalOpsPerSecond: 0,
24
+ };
25
+ constructor(options = {}) {
26
+ super('json', options);
27
+ this.outputPath = options.outputPath;
28
+ this.prettyPrint = options.prettyPrint ?? true;
29
+ this.includeStatistics = options.includeStatistics ?? true;
30
+ this.includeMetadata = options.includeMetadata ?? true;
31
+ this.quiet = options.quiet ?? false;
32
+ }
33
+ /**
34
+ * Check if statistics are included
35
+ */
36
+ areStatisticsIncluded() {
37
+ return this.includeStatistics;
38
+ }
39
+ /**
40
+ * Get the output path (if configured)
41
+ */
42
+ getOutputPath() {
43
+ return this.outputPath;
44
+ }
45
+ /**
46
+ * Check if metadata is included
47
+ */
48
+ isMetadataIncluded() {
49
+ return this.includeMetadata;
50
+ }
51
+ /**
52
+ * Check if pretty printing is enabled
53
+ */
54
+ isPrettyPrintEnabled() {
55
+ return this.prettyPrint;
56
+ }
57
+ async onEnd(run) {
58
+ const output = this.buildJsonOutput(run);
59
+ if (this.outputPath) {
60
+ await this.writeToFile(output);
61
+ }
62
+ else {
63
+ this.writeToStdout(output);
64
+ }
65
+ }
66
+ onError(error) {
67
+ // For JSON reporter, we'll include errors in the final output
68
+ // but we can also log to stderr for immediate feedback
69
+ console.error('JSON Reporter Error:', error.message);
70
+ }
71
+ onFileEnd(_result) {
72
+ // No-op for JSON reporter
73
+ }
74
+ onFileStart(_file) {
75
+ // No-op for JSON reporter
76
+ }
77
+ onProgress(_state) {
78
+ // No-op for JSON reporter - we don't output progress in JSON format
79
+ }
80
+ onStart(run) {
81
+ this.currentRun = run;
82
+ this.resetStatistics();
83
+ }
84
+ onSuiteEnd(_result) {
85
+ // No-op for JSON reporter
86
+ }
87
+ onSuiteStart(_suite) {
88
+ // No-op for JSON reporter
89
+ }
90
+ onTaskResult(result) {
91
+ if (!result.error) {
92
+ this.updateStatistics(result);
93
+ }
94
+ }
95
+ onTaskStart(_task) {
96
+ // No-op for JSON reporter
97
+ }
98
+ /**
99
+ * Build the complete JSON output structure
100
+ */
101
+ buildJsonOutput(run) {
102
+ const output = {
103
+ meta: {
104
+ format: 'modestbench-json',
105
+ timestamp: new Date().toISOString(),
106
+ version: '0.1.0', // TODO: Get from package.json
107
+ },
108
+ run: this.includeMetadata ? run : this.sanitizeRun(run),
109
+ };
110
+ if (this.includeStatistics) {
111
+ const stats = {
112
+ averageOpsPerSecond: this.statistics.taskCount > 0
113
+ ? this.statistics.totalOpsPerSecond / this.statistics.taskCount
114
+ : 0,
115
+ totalIterations: this.statistics.totalIterations,
116
+ ...(this.statistics.fastestTask && {
117
+ fastestTask: this.statistics.fastestTask,
118
+ }),
119
+ ...(this.statistics.slowestTask && {
120
+ slowestTask: this.statistics.slowestTask,
121
+ }),
122
+ };
123
+ output.statistics = stats;
124
+ }
125
+ return output;
126
+ }
127
+ /**
128
+ * Reset statistics tracking
129
+ */
130
+ resetStatistics() {
131
+ this.statistics = {
132
+ taskCount: 0,
133
+ totalIterations: 0,
134
+ totalOpsPerSecond: 0,
135
+ };
136
+ }
137
+ /**
138
+ * Remove potentially sensitive metadata from run data
139
+ */
140
+ sanitizeRun(run) {
141
+ let sanitized = {
142
+ ...run,
143
+ environment: {
144
+ ...run.environment,
145
+ env: {}, // Remove environment variables
146
+ hostname: 'redacted', // Remove hostname
147
+ },
148
+ };
149
+ if (run.git) {
150
+ sanitized = {
151
+ ...sanitized,
152
+ git: {
153
+ ...run.git,
154
+ author: 'redacted', // Remove author info
155
+ },
156
+ };
157
+ }
158
+ return sanitized;
159
+ }
160
+ /**
161
+ * Update running statistics with a task result
162
+ */
163
+ updateStatistics(result) {
164
+ this.statistics.totalIterations += result.iterations;
165
+ this.statistics.totalOpsPerSecond += result.opsPerSecond;
166
+ this.statistics.taskCount++;
167
+ // Track fastest task
168
+ if (!this.statistics.fastestTask ||
169
+ result.mean < this.statistics.fastestTask.mean) {
170
+ this.statistics.fastestTask = result;
171
+ }
172
+ // Track slowest task
173
+ if (!this.statistics.slowestTask ||
174
+ result.mean > this.statistics.slowestTask.mean) {
175
+ this.statistics.slowestTask = result;
176
+ }
177
+ }
178
+ /**
179
+ * Write JSON output to file
180
+ */
181
+ async writeToFile(output) {
182
+ if (!this.outputPath) {
183
+ throw new Error('Output path not specified');
184
+ }
185
+ try {
186
+ // Ensure directory exists
187
+ const dir = dirname(this.outputPath);
188
+ mkdirSync(dir, { recursive: true });
189
+ // Write JSON file
190
+ const jsonString = this.prettyPrint
191
+ ? JSON.stringify(output, null, 2)
192
+ : JSON.stringify(output);
193
+ writeFileSync(this.outputPath, jsonString, 'utf8');
194
+ }
195
+ catch (error) {
196
+ throw new Error(`Failed to write JSON output to ${this.outputPath}: ${error instanceof Error ? error.message : String(error)}`);
197
+ }
198
+ }
199
+ /**
200
+ * Write JSON output to stdout
201
+ */
202
+ writeToStdout(output) {
203
+ // Always write to stdout when no output path is specified
204
+ // The quiet flag only affects progress messages (stderr), not data output
205
+ const jsonString = this.prettyPrint
206
+ ? JSON.stringify(output, null, 2)
207
+ : JSON.stringify(output);
208
+ console.log(jsonString);
209
+ }
210
+ }
211
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/reporters/json.ts"],"names":[],"mappings":"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"}