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,51 @@
1
+ /**
2
+ * ModestBench Simple Console Reporter
3
+ *
4
+ * Provides plain text output without colors, ANSI codes, or decorative
5
+ * elements. Ideal for CI/CD environments, piping, or non-TTY outputs.
6
+ */
7
+ import type { BenchmarkRun, FileResult, ProgressState, SuiteResult, TaskResult } from "../types/index.js";
8
+ import { BaseReporter } from "./registry.js";
9
+ /**
10
+ * Simple console reporter with plain text output (no colors or progress bars)
11
+ */
12
+ export declare class SimpleReporter extends BaseReporter {
13
+ private currentFile;
14
+ private currentSuite;
15
+ private failures;
16
+ private readonly quiet;
17
+ private startTime;
18
+ private suiteResults;
19
+ private readonly verbose;
20
+ constructor(options?: {
21
+ quiet?: boolean;
22
+ verbose?: boolean;
23
+ });
24
+ onEnd(run: BenchmarkRun): void;
25
+ onError(error: Error): void;
26
+ onFileEnd(result: FileResult): void;
27
+ onFileStart(file: string): void;
28
+ onProgress(_state: ProgressState): void;
29
+ onStart(run: BenchmarkRun): void;
30
+ onSuiteEnd(result: SuiteResult): void;
31
+ onSuiteStart(suite: string): void;
32
+ onTaskResult(result: TaskResult): void;
33
+ onTaskStart(task: string): void;
34
+ /**
35
+ * Format bytes in human-readable format
36
+ */
37
+ private formatBytes;
38
+ /**
39
+ * Format file path - show relative path if within CWD, otherwise absolute
40
+ */
41
+ private formatPath;
42
+ /**
43
+ * Simple pluralization helper
44
+ */
45
+ private pluralize;
46
+ /**
47
+ * Print all task results in a suite with aligned columns
48
+ */
49
+ private printAlignedSuiteResults;
50
+ }
51
+ //# sourceMappingURL=simple.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple.d.ts","sourceRoot":"","sources":["../../src/reporters/simple.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,aAAa,EACb,WAAW,EACX,UAAU,EACX,0BAA0B;AAE3B,OAAO,EAAE,YAAY,EAAE,sBAAsB;AAY7C;;GAEG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,WAAW,CAAM;IAEzB,OAAO,CAAC,YAAY,CAAM;IAE1B,OAAO,CAAC,QAAQ,CAKR;IAER,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;IAEhC,OAAO,CAAC,SAAS,CAAK;IAEtB,OAAO,CAAC,YAAY,CAAoB;IAExC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;gBAGhC,OAAO,GAAE;QACP,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,OAAO,CAAC,EAAE,OAAO,CAAC;KACd;IAQR,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI;IA4D9B,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAY3B,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IA4BnC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAW/B,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAKvC,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI;IAiChC,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IA0BrC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAkBjC,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAStC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAW/B;;OAEG;IACH,OAAO,CAAC,WAAW;IAanB;;OAEG;IACH,OAAO,CAAC,UAAU;IAYlB;;OAEG;IACH,OAAO,CAAC,SAAS;IAIjB;;OAEG;IACH,OAAO,CAAC,wBAAwB;CA4IjC"}
@@ -0,0 +1,321 @@
1
+ /**
2
+ * ModestBench Simple Console Reporter
3
+ *
4
+ * Provides plain text output without colors, ANSI codes, or decorative
5
+ * elements. Ideal for CI/CD environments, piping, or non-TTY outputs.
6
+ */
7
+ import path from 'node:path';
8
+ import { BaseReporter } from "./registry.js";
9
+ /**
10
+ * Basic symbols for plain text output
11
+ */
12
+ const symbols = {
13
+ approx: '≈',
14
+ checkmark: '√',
15
+ cross: '×',
16
+ plusMinus: '±',
17
+ };
18
+ /**
19
+ * Simple console reporter with plain text output (no colors or progress bars)
20
+ */
21
+ export class SimpleReporter extends BaseReporter {
22
+ currentFile = '';
23
+ currentSuite = '';
24
+ failures = [];
25
+ quiet;
26
+ startTime = 0;
27
+ suiteResults = [];
28
+ verbose;
29
+ constructor(options = {}) {
30
+ super('simple', options);
31
+ this.verbose = options.verbose ?? false;
32
+ this.quiet = options.quiet ?? false;
33
+ }
34
+ onEnd(run) {
35
+ if (this.quiet) {
36
+ return;
37
+ }
38
+ const duration = Date.now() - this.startTime;
39
+ const totalFiles = run.files.length;
40
+ // Calculate totals across all files
41
+ let totalSuites = 0;
42
+ let totalPassed = 0;
43
+ let totalFailed = 0;
44
+ for (const file of run.files) {
45
+ totalSuites += file.suites.length;
46
+ for (const suite of file.suites) {
47
+ totalPassed += suite.tasks.filter((t) => !t.error).length;
48
+ totalFailed += suite.tasks.filter((t) => t.error).length;
49
+ }
50
+ }
51
+ // Results header
52
+ console.log('== Results');
53
+ console.log();
54
+ if (totalFailed > 0) {
55
+ console.log(`${symbols.cross} Failed: ${totalFailed}`);
56
+ console.log(`${symbols.checkmark} Passed: ${totalPassed}`);
57
+ }
58
+ else {
59
+ console.log(`${symbols.checkmark} All tests passed: ${totalPassed}`);
60
+ }
61
+ console.log(`- Files: ${totalFiles}`);
62
+ console.log(`- Suites: ${totalSuites}`);
63
+ console.log(`${symbols.approx} Duration: ${this.formatDuration(duration * 1e6)}`);
64
+ console.log();
65
+ if (totalFailed > 0) {
66
+ console.log(`${symbols.cross.repeat(3)} Some benchmarks failed`);
67
+ // Display failed tasks with details
68
+ if (this.failures.length > 0) {
69
+ console.log();
70
+ console.log('Failed Tasks:');
71
+ console.log();
72
+ for (const failure of this.failures) {
73
+ const displayPath = this.formatPath(failure.file);
74
+ console.log(` ${displayPath} > ${failure.suite} > ${failure.task}`);
75
+ console.log(` ${failure.error}`);
76
+ console.log();
77
+ }
78
+ }
79
+ }
80
+ else {
81
+ console.log('All benchmarks completed successfully!');
82
+ }
83
+ }
84
+ onError(error) {
85
+ if (this.quiet) {
86
+ return;
87
+ }
88
+ console.error(`${symbols.cross.repeat(3)} Error:`, error.message);
89
+ if (this.verbose && error.stack) {
90
+ console.error(error.stack);
91
+ }
92
+ }
93
+ onFileEnd(result) {
94
+ if (this.quiet) {
95
+ return;
96
+ }
97
+ const totalTasks = result.suites.reduce((sum, suite) => sum + suite.tasks.length, 0);
98
+ const totalPassed = result.suites.reduce((sum, suite) => sum + suite.tasks.filter((t) => !t.error).length, 0);
99
+ const totalFailed = totalTasks - totalPassed;
100
+ if (totalFailed > 0) {
101
+ console.log(` ${symbols.cross} ${totalFailed} failed, ${totalPassed} passed`);
102
+ }
103
+ else {
104
+ console.log(` ${symbols.checkmark} ${totalPassed > 1 ? 'All ' : ''}${totalPassed} ${this.pluralize('task', totalPassed)} passed`);
105
+ }
106
+ console.log();
107
+ }
108
+ onFileStart(file) {
109
+ this.currentFile = file;
110
+ if (this.quiet) {
111
+ return;
112
+ }
113
+ const displayPath = this.formatPath(file);
114
+ console.log(`-- ${displayPath}`);
115
+ }
116
+ onProgress(_state) {
117
+ // Simple reporter does not display progress bars
118
+ return;
119
+ }
120
+ onStart(run) {
121
+ this.startTime = Date.now();
122
+ this.failures = []; // Reset failures for new run
123
+ if (this.quiet) {
124
+ return;
125
+ }
126
+ console.log('modestbench');
127
+ console.log();
128
+ if (run.environment) {
129
+ console.log(` node.js: ${run.environment.nodeVersion}`);
130
+ console.log(` platform: ${run.environment.platform} ${run.environment.arch}`);
131
+ console.log(` cpu: ${run.environment.cpu.model} (${run.environment.cpu.cores} cores)`);
132
+ console.log(` mem: ${this.formatBytes(run.environment.memory.total)}`);
133
+ console.log();
134
+ }
135
+ if (run.git) {
136
+ console.log(` Git: ${run.git.commit}`);
137
+ }
138
+ if (run.ci) {
139
+ console.log(` CI: ${run.ci.provider}`);
140
+ console.log();
141
+ }
142
+ }
143
+ onSuiteEnd(result) {
144
+ if (this.quiet) {
145
+ return;
146
+ }
147
+ // Print all buffered task results with aligned columns
148
+ this.printAlignedSuiteResults();
149
+ // Skip displaying summary for the implicit "default" suite
150
+ if (result.name === 'default') {
151
+ return;
152
+ }
153
+ const passed = result.tasks.filter((t) => !t.error).length;
154
+ const failed = result.tasks.filter((t) => t.error).length;
155
+ if (failed > 0) {
156
+ console.log(` ${symbols.cross} ${failed} failed, ${passed} passed`);
157
+ }
158
+ else {
159
+ console.log(` ${symbols.checkmark} ${passed} ${this.pluralize('task', passed)} passed`);
160
+ }
161
+ console.log();
162
+ }
163
+ onSuiteStart(suite) {
164
+ this.currentSuite = suite;
165
+ if (this.quiet) {
166
+ return;
167
+ }
168
+ this.suiteResults = []; // Reset buffer for new suite
169
+ // Skip displaying the implicit "default" suite header
170
+ if (suite === 'default') {
171
+ return;
172
+ }
173
+ console.log();
174
+ console.log(` -- ${suite}`);
175
+ }
176
+ onTaskResult(result) {
177
+ if (this.quiet) {
178
+ return;
179
+ }
180
+ // Buffer the result for later printing with proper alignment
181
+ this.suiteResults.push(result);
182
+ }
183
+ onTaskStart(task) {
184
+ if (this.quiet) {
185
+ return;
186
+ }
187
+ // Only show static markers in verbose mode
188
+ if (this.verbose) {
189
+ console.log(` - ${task}`);
190
+ }
191
+ }
192
+ /**
193
+ * Format bytes in human-readable format
194
+ */
195
+ formatBytes(bytes) {
196
+ const units = ['B', 'KB', 'MB', 'GB', 'TB'];
197
+ let size = bytes;
198
+ let unitIndex = 0;
199
+ while (size >= 1024 && unitIndex < units.length - 1) {
200
+ size /= 1024;
201
+ unitIndex++;
202
+ }
203
+ return `${size.toFixed(1)} ${units[unitIndex]}`;
204
+ }
205
+ /**
206
+ * Format file path - show relative path if within CWD, otherwise absolute
207
+ */
208
+ formatPath(filePath) {
209
+ const cwd = process.cwd();
210
+ const absolutePath = path.resolve(filePath);
211
+ // Check if the file is within the current working directory
212
+ if (absolutePath.startsWith(cwd + path.sep) || absolutePath === cwd) {
213
+ return path.relative(cwd, absolutePath);
214
+ }
215
+ return absolutePath;
216
+ }
217
+ /**
218
+ * Simple pluralization helper
219
+ */
220
+ pluralize(str, count) {
221
+ return count === 1 ? str : `${str}s`;
222
+ }
223
+ /**
224
+ * Print all task results in a suite with aligned columns
225
+ */
226
+ printAlignedSuiteResults() {
227
+ if (this.suiteResults.length === 0) {
228
+ return;
229
+ }
230
+ const MAX_NAME_WIDTH = 60;
231
+ const BASE_INDENT = ' '; // 4 spaces
232
+ const separator = '-'; // Simple text separator instead of bullet
233
+ const formatted = this.suiteResults.map((result) => {
234
+ const status = result.error ? symbols.cross : symbols.checkmark;
235
+ const name = result.name.trim();
236
+ const nameLength = name.length;
237
+ if (result.error) {
238
+ return {
239
+ durationLen: 0,
240
+ durationStr: '',
241
+ error: true,
242
+ errorMessage: result.error?.message || String(result.error),
243
+ iterations: 0,
244
+ name,
245
+ nameLength,
246
+ opsPerSecLen: 0,
247
+ opsPerSecStr: '',
248
+ rmeLen: 0,
249
+ rmeStr: '',
250
+ status,
251
+ };
252
+ }
253
+ const duration = this.formatDuration(result.mean * 1e9);
254
+ const opsPerSec = this.formatOpsPerSecond(result.opsPerSecond);
255
+ const rme = this.formatPercentage(result.marginOfError * 100);
256
+ return {
257
+ durationLen: duration.length,
258
+ durationStr: duration,
259
+ error: false,
260
+ iterations: result.iterations,
261
+ name,
262
+ nameLength,
263
+ opsPerSecLen: opsPerSec.length,
264
+ opsPerSecStr: opsPerSec,
265
+ rmeLen: rme.length,
266
+ rmeStr: rme,
267
+ status,
268
+ };
269
+ });
270
+ // Find max widths
271
+ const nonWrappingTasks = formatted.filter((t) => t.nameLength <= MAX_NAME_WIDTH);
272
+ const maxNameLen = nonWrappingTasks.length > 0
273
+ ? Math.max(...nonWrappingTasks.map((t) => t.nameLength))
274
+ : 40; // Default if all tasks wrap
275
+ const maxDurationLen = Math.max(...formatted.filter((t) => !t.error).map((t) => t.durationLen), 0);
276
+ const maxRmeLen = Math.max(...formatted.filter((t) => !t.error).map((t) => t.rmeLen), 0);
277
+ const maxOpsLen = Math.max(...formatted.filter((t) => !t.error).map((t) => t.opsPerSecLen), 0);
278
+ // Calculate the position where numbers start for unwrapped lines
279
+ // BASE_INDENT (4) + status (1 char) + space (1) + maxNameLen + ": " (2) = 8 + maxNameLen
280
+ const numbersStartPos = BASE_INDENT.length + 2 + maxNameLen + 2;
281
+ // Print each task with aligned columns
282
+ for (const task of formatted) {
283
+ if (task.error) {
284
+ // Track failure for end summary
285
+ this.failures.push({
286
+ error: task.errorMessage || 'Unknown error',
287
+ file: this.currentFile,
288
+ suite: this.currentSuite,
289
+ task: task.name,
290
+ });
291
+ console.log(`${BASE_INDENT}${task.status} ${task.name} FAILED`);
292
+ }
293
+ else if (task.nameLength > MAX_NAME_WIDTH) {
294
+ // Long name - wrap to next line, but align numbers with unwrapped lines
295
+ console.log(`${BASE_INDENT}${task.status} ${task.name}:`);
296
+ // Calculate padding to align with unwrapped lines
297
+ // We need to get to numbersStartPos from the beginning of the line
298
+ const leadingPad = ' '.repeat(numbersStartPos);
299
+ const durationPad = ' '.repeat(maxDurationLen - task.durationLen);
300
+ const rmePad = ' '.repeat(maxRmeLen - task.rmeLen);
301
+ const opsPad = ' '.repeat(maxOpsLen - task.opsPerSecLen);
302
+ console.log(`${leadingPad}${durationPad}${task.durationStr} ${separator} ${symbols.plusMinus}${rmePad}${task.rmeStr} ${separator} ${opsPad}${task.opsPerSecStr}`);
303
+ if (this.verbose && task.iterations > 0) {
304
+ console.log(` ${task.iterations} iterations`);
305
+ }
306
+ }
307
+ else {
308
+ // Normal length - align on same line
309
+ const namePad = ' '.repeat(maxNameLen - task.nameLength);
310
+ const durationPad = ' '.repeat(maxDurationLen - task.durationLen);
311
+ const rmePad = ' '.repeat(maxRmeLen - task.rmeLen);
312
+ const opsPad = ' '.repeat(maxOpsLen - task.opsPerSecLen);
313
+ console.log(`${BASE_INDENT}${task.status} ${task.name}${namePad}: ${durationPad}${task.durationStr} ${separator} ${symbols.plusMinus}${rmePad}${task.rmeStr} ${separator} ${opsPad}${task.opsPerSecStr}`);
314
+ if (this.verbose && task.iterations > 0) {
315
+ console.log(` ${task.iterations} iterations`);
316
+ }
317
+ }
318
+ }
319
+ }
320
+ }
321
+ //# sourceMappingURL=simple.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple.js","sourceRoot":"","sources":["../../src/reporters/simple.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,162 @@
1
+ {
2
+ "$id": "https://github.com/boneskull/modestbench/schema/config.json",
3
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
4
+ "type": "object",
5
+ "properties": {
6
+ "$schema": {
7
+ "description": "JSON Schema reference for IDE support (not used by ModestBench)",
8
+ "type": "string"
9
+ },
10
+ "bail": {
11
+ "description": "Stop benchmark execution on first failure",
12
+ "type": "boolean"
13
+ },
14
+ "exclude": {
15
+ "description": "Glob patterns to exclude from benchmark file discovery (e.g., \"node_modules/**\", \".git/**\")",
16
+ "type": "array",
17
+ "items": {
18
+ "type": "string"
19
+ }
20
+ },
21
+ "excludeTags": {
22
+ "description": "Tags to exclude from benchmark execution. Benchmarks matching any of these tags will be skipped.",
23
+ "type": "array",
24
+ "items": {
25
+ "type": "string"
26
+ }
27
+ },
28
+ "iterations": {
29
+ "description": "Default number of iterations to run for each benchmark task. Higher values provide more accurate statistics but take longer to execute.",
30
+ "type": "integer",
31
+ "exclusiveMinimum": 0,
32
+ "maximum": 9007199254740991
33
+ },
34
+ "limitBy": {
35
+ "description": "How to limit benchmark execution: \"time\" stops after time limit, \"iterations\" stops after iteration count, \"any\" stops at whichever comes first, \"all\" runs until both limits are reached",
36
+ "type": "string",
37
+ "enum": [
38
+ "time",
39
+ "iterations",
40
+ "any",
41
+ "all"
42
+ ]
43
+ },
44
+ "metadata": {
45
+ "description": "Custom metadata to attach to benchmark runs. Can include project name, version, environment details, etc.",
46
+ "type": "object",
47
+ "propertyNames": {
48
+ "type": "string"
49
+ },
50
+ "additionalProperties": {}
51
+ },
52
+ "outputDir": {
53
+ "description": "Directory path where benchmark results and reports will be written",
54
+ "type": "string",
55
+ "minLength": 1
56
+ },
57
+ "pattern": {
58
+ "description": "Glob pattern(s) for discovering benchmark files. Can be a single pattern string or array of patterns (e.g., \"**/*.bench.{cjs,cts,js,mjs,mts,ts}\")",
59
+ "anyOf": [
60
+ {
61
+ "type": "string",
62
+ "minLength": 1
63
+ },
64
+ {
65
+ "type": "array",
66
+ "items": {
67
+ "type": "string",
68
+ "minLength": 1
69
+ }
70
+ }
71
+ ]
72
+ },
73
+ "quiet": {
74
+ "description": "Run in quiet mode with minimal console output (only errors and final results)",
75
+ "type": "boolean"
76
+ },
77
+ "reporterConfig": {
78
+ "description": "Configuration options specific to individual reporters, keyed by reporter name",
79
+ "type": "object",
80
+ "propertyNames": {
81
+ "type": "string"
82
+ },
83
+ "additionalProperties": {}
84
+ },
85
+ "reporters": {
86
+ "description": "List of reporter names to use for output. Available reporters: \"human\", \"json\", \"csv\"",
87
+ "minItems": 1,
88
+ "type": "array",
89
+ "items": {
90
+ "type": "string"
91
+ }
92
+ },
93
+ "tags": {
94
+ "description": "Tags to filter which benchmarks to run. If empty, all benchmarks are included. Only benchmarks with matching tags will execute.",
95
+ "type": "array",
96
+ "items": {
97
+ "type": "string"
98
+ }
99
+ },
100
+ "thresholds": {
101
+ "description": "Performance assertion thresholds for benchmark validation",
102
+ "title": "Threshold Configuration",
103
+ "type": "object",
104
+ "properties": {
105
+ "maxMarginOfError": {
106
+ "description": "Maximum allowed margin of error as a percentage",
107
+ "type": "number",
108
+ "exclusiveMinimum": 0
109
+ },
110
+ "maxMean": {
111
+ "description": "Maximum allowed mean execution time in nanoseconds",
112
+ "type": "number",
113
+ "exclusiveMinimum": 0
114
+ },
115
+ "maxP95": {
116
+ "description": "Maximum allowed 95th percentile execution time in nanoseconds",
117
+ "type": "number",
118
+ "exclusiveMinimum": 0
119
+ },
120
+ "maxP99": {
121
+ "description": "Maximum allowed 99th percentile execution time in nanoseconds",
122
+ "type": "number",
123
+ "exclusiveMinimum": 0
124
+ },
125
+ "maxStdDev": {
126
+ "description": "Maximum allowed standard deviation in nanoseconds",
127
+ "type": "number",
128
+ "exclusiveMinimum": 0
129
+ },
130
+ "minOpsPerSecond": {
131
+ "description": "Minimum required operations per second",
132
+ "type": "number",
133
+ "exclusiveMinimum": 0
134
+ }
135
+ },
136
+ "additionalProperties": false
137
+ },
138
+ "time": {
139
+ "description": "Maximum time to spend on each benchmark task in milliseconds. Tasks will run at least until this duration or iteration count is reached, depending on limitBy setting.",
140
+ "type": "integer",
141
+ "exclusiveMinimum": 0,
142
+ "maximum": 9007199254740991
143
+ },
144
+ "timeout": {
145
+ "description": "Timeout for individual benchmark tasks in milliseconds. Tasks exceeding this duration will be terminated and marked as failed.",
146
+ "type": "integer",
147
+ "exclusiveMinimum": 0,
148
+ "maximum": 9007199254740991
149
+ },
150
+ "verbose": {
151
+ "description": "Enable verbose output. Provides more detailed console output including progress, intermediate results, and diagnostic information",
152
+ "type": "boolean"
153
+ },
154
+ "warmup": {
155
+ "description": "Number of warmup iterations to run before measurement begins. Warmup helps stabilize performance by allowing JIT compilation and caching to occur.",
156
+ "type": "integer",
157
+ "minimum": 0,
158
+ "maximum": 9007199254740991
159
+ }
160
+ },
161
+ "additionalProperties": false
162
+ }