modestbench 0.9.0 → 0.9.2

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 (224) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/cli/builder.cjs +259 -0
  3. package/dist/cli/builder.cjs.map +1 -0
  4. package/dist/cli/builder.d.cts +37 -0
  5. package/dist/cli/builder.d.cts.map +1 -0
  6. package/dist/cli/builder.d.ts +37 -0
  7. package/dist/cli/builder.d.ts.map +1 -0
  8. package/dist/cli/builder.js +255 -0
  9. package/dist/cli/builder.js.map +1 -0
  10. package/dist/cli/commands/baseline.cjs +4 -33
  11. package/dist/cli/commands/baseline.cjs.map +1 -1
  12. package/dist/cli/commands/baseline.d.cts.map +1 -1
  13. package/dist/cli/commands/baseline.d.ts.map +1 -1
  14. package/dist/cli/commands/baseline.js +2 -31
  15. package/dist/cli/commands/baseline.js.map +1 -1
  16. package/dist/cli/commands/history.cjs +2 -14
  17. package/dist/cli/commands/history.cjs.map +1 -1
  18. package/dist/cli/commands/history.d.cts.map +1 -1
  19. package/dist/cli/commands/history.d.ts.map +1 -1
  20. package/dist/cli/commands/history.js +1 -13
  21. package/dist/cli/commands/history.js.map +1 -1
  22. package/dist/cli/commands/init.cjs +2 -2
  23. package/dist/cli/commands/init.cjs.map +1 -1
  24. package/dist/cli/commands/init.js +2 -2
  25. package/dist/cli/commands/init.js.map +1 -1
  26. package/dist/cli/commands/run.cjs +3 -3
  27. package/dist/cli/commands/run.cjs.map +1 -1
  28. package/dist/cli/commands/run.d.cts +0 -13
  29. package/dist/cli/commands/run.d.cts.map +1 -1
  30. package/dist/cli/commands/run.d.ts +0 -13
  31. package/dist/cli/commands/run.d.ts.map +1 -1
  32. package/dist/cli/commands/run.js +1 -1
  33. package/dist/cli/commands/run.js.map +1 -1
  34. package/dist/cli/commands/test.cjs +1 -1
  35. package/dist/cli/commands/test.cjs.map +1 -1
  36. package/dist/cli/commands/test.js +1 -1
  37. package/dist/cli/commands/test.js.map +1 -1
  38. package/dist/cli/context.cjs +60 -0
  39. package/dist/cli/context.cjs.map +1 -0
  40. package/dist/cli/context.d.cts +28 -0
  41. package/dist/cli/context.d.cts.map +1 -0
  42. package/dist/cli/context.d.ts +28 -0
  43. package/dist/cli/context.d.ts.map +1 -0
  44. package/dist/cli/context.js +56 -0
  45. package/dist/cli/context.js.map +1 -0
  46. package/dist/cli/handlers.cjs +74 -0
  47. package/dist/cli/handlers.cjs.map +1 -0
  48. package/dist/cli/handlers.d.cts +13 -0
  49. package/dist/cli/handlers.d.cts.map +1 -0
  50. package/dist/cli/handlers.d.ts +13 -0
  51. package/dist/cli/handlers.d.ts.map +1 -0
  52. package/dist/cli/handlers.js +70 -0
  53. package/dist/cli/handlers.js.map +1 -0
  54. package/dist/cli/index.cjs +45 -978
  55. package/dist/cli/index.cjs.map +1 -1
  56. package/dist/cli/index.d.cts +6 -31
  57. package/dist/cli/index.d.cts.map +1 -1
  58. package/dist/cli/index.d.ts +6 -31
  59. package/dist/cli/index.d.ts.map +1 -1
  60. package/dist/cli/index.js +43 -974
  61. package/dist/cli/index.js.map +1 -1
  62. package/dist/cli/parsers/analyze.cjs +54 -0
  63. package/dist/cli/parsers/analyze.cjs.map +1 -0
  64. package/dist/cli/parsers/analyze.d.cts +37 -0
  65. package/dist/cli/parsers/analyze.d.cts.map +1 -0
  66. package/dist/cli/parsers/analyze.d.ts +37 -0
  67. package/dist/cli/parsers/analyze.d.ts.map +1 -0
  68. package/dist/cli/parsers/analyze.js +51 -0
  69. package/dist/cli/parsers/analyze.js.map +1 -0
  70. package/dist/cli/parsers/baseline.cjs +75 -0
  71. package/dist/cli/parsers/baseline.cjs.map +1 -0
  72. package/dist/cli/parsers/baseline.d.cts +59 -0
  73. package/dist/cli/parsers/baseline.d.cts.map +1 -0
  74. package/dist/cli/parsers/baseline.d.ts +59 -0
  75. package/dist/cli/parsers/baseline.d.ts.map +1 -0
  76. package/dist/cli/parsers/baseline.js +72 -0
  77. package/dist/cli/parsers/baseline.js.map +1 -0
  78. package/dist/cli/parsers/global.cjs +49 -0
  79. package/dist/cli/parsers/global.cjs.map +1 -0
  80. package/dist/cli/parsers/global.d.cts +45 -0
  81. package/dist/cli/parsers/global.d.cts.map +1 -0
  82. package/dist/cli/parsers/global.d.ts +45 -0
  83. package/dist/cli/parsers/global.d.ts.map +1 -0
  84. package/dist/cli/parsers/global.js +46 -0
  85. package/dist/cli/parsers/global.js.map +1 -0
  86. package/dist/cli/parsers/history.cjs +138 -0
  87. package/dist/cli/parsers/history.cjs.map +1 -0
  88. package/dist/cli/parsers/history.d.cts +108 -0
  89. package/dist/cli/parsers/history.d.cts.map +1 -0
  90. package/dist/cli/parsers/history.d.ts +108 -0
  91. package/dist/cli/parsers/history.d.ts.map +1 -0
  92. package/dist/cli/parsers/history.js +135 -0
  93. package/dist/cli/parsers/history.js.map +1 -0
  94. package/dist/cli/parsers/index.cjs +35 -0
  95. package/dist/cli/parsers/index.cjs.map +1 -0
  96. package/dist/cli/parsers/index.d.cts +15 -0
  97. package/dist/cli/parsers/index.d.cts.map +1 -0
  98. package/dist/cli/parsers/index.d.ts +15 -0
  99. package/dist/cli/parsers/index.d.ts.map +1 -0
  100. package/dist/cli/parsers/index.js +15 -0
  101. package/dist/cli/parsers/index.js.map +1 -0
  102. package/dist/cli/parsers/init.cjs +39 -0
  103. package/dist/cli/parsers/init.cjs.map +1 -0
  104. package/dist/cli/parsers/init.d.cts +32 -0
  105. package/dist/cli/parsers/init.d.cts.map +1 -0
  106. package/dist/cli/parsers/init.d.ts +32 -0
  107. package/dist/cli/parsers/init.d.ts.map +1 -0
  108. package/dist/cli/parsers/init.js +36 -0
  109. package/dist/cli/parsers/init.js.map +1 -0
  110. package/dist/cli/parsers/run.cjs +99 -0
  111. package/dist/cli/parsers/run.cjs.map +1 -0
  112. package/dist/cli/parsers/run.d.cts +62 -0
  113. package/dist/cli/parsers/run.d.cts.map +1 -0
  114. package/dist/cli/parsers/run.d.ts +62 -0
  115. package/dist/cli/parsers/run.d.ts.map +1 -0
  116. package/dist/cli/parsers/run.js +96 -0
  117. package/dist/cli/parsers/run.js.map +1 -0
  118. package/dist/cli/parsers/test.cjs +42 -0
  119. package/dist/cli/parsers/test.cjs.map +1 -0
  120. package/dist/cli/parsers/test.d.cts +31 -0
  121. package/dist/cli/parsers/test.d.cts.map +1 -0
  122. package/dist/cli/parsers/test.d.ts +31 -0
  123. package/dist/cli/parsers/test.d.ts.map +1 -0
  124. package/dist/cli/parsers/test.js +39 -0
  125. package/dist/cli/parsers/test.js.map +1 -0
  126. package/dist/cli/theme.cjs +35 -0
  127. package/dist/cli/theme.cjs.map +1 -0
  128. package/dist/cli/theme.d.cts +31 -0
  129. package/dist/cli/theme.d.cts.map +1 -0
  130. package/dist/cli/theme.d.ts +31 -0
  131. package/dist/cli/theme.d.ts.map +1 -0
  132. package/dist/cli/theme.js +32 -0
  133. package/dist/cli/theme.js.map +1 -0
  134. package/dist/config/budget-schema.cjs +1 -1
  135. package/dist/config/budget-schema.cjs.map +1 -1
  136. package/dist/config/budget-schema.js +1 -1
  137. package/dist/config/budget-schema.js.map +1 -1
  138. package/dist/core/engines/accurate-engine.cjs +1 -1
  139. package/dist/core/engines/accurate-engine.cjs.map +1 -1
  140. package/dist/core/engines/accurate-engine.d.cts.map +1 -1
  141. package/dist/core/engines/accurate-engine.d.ts.map +1 -1
  142. package/dist/core/engines/accurate-engine.js +1 -1
  143. package/dist/core/engines/accurate-engine.js.map +1 -1
  144. package/dist/errors/base.cjs +3 -12
  145. package/dist/errors/base.cjs.map +1 -1
  146. package/dist/errors/base.d.cts +0 -7
  147. package/dist/errors/base.d.cts.map +1 -1
  148. package/dist/errors/base.d.ts +0 -7
  149. package/dist/errors/base.d.ts.map +1 -1
  150. package/dist/errors/base.js +1 -9
  151. package/dist/errors/base.js.map +1 -1
  152. package/dist/formatters/history/compare.cjs +6 -6
  153. package/dist/formatters/history/compare.cjs.map +1 -1
  154. package/dist/formatters/history/compare.js +6 -6
  155. package/dist/formatters/history/compare.js.map +1 -1
  156. package/dist/formatters/history/show.cjs +2 -2
  157. package/dist/formatters/history/show.cjs.map +1 -1
  158. package/dist/formatters/history/show.js +2 -2
  159. package/dist/formatters/history/show.js.map +1 -1
  160. package/dist/formatters/history/trends.cjs +1 -1
  161. package/dist/formatters/history/trends.cjs.map +1 -1
  162. package/dist/formatters/history/trends.js +1 -1
  163. package/dist/formatters/history/trends.js.map +1 -1
  164. package/dist/reporters/human.cjs +3 -3
  165. package/dist/reporters/human.cjs.map +1 -1
  166. package/dist/reporters/human.d.cts.map +1 -1
  167. package/dist/reporters/human.d.ts.map +1 -1
  168. package/dist/reporters/human.js +3 -3
  169. package/dist/reporters/human.js.map +1 -1
  170. package/dist/reporters/nyan.cjs +1 -1
  171. package/dist/reporters/nyan.cjs.map +1 -1
  172. package/dist/reporters/nyan.js +1 -1
  173. package/dist/reporters/nyan.js.map +1 -1
  174. package/dist/services/budget-evaluator.cjs +2 -2
  175. package/dist/services/budget-evaluator.cjs.map +1 -1
  176. package/dist/services/budget-evaluator.js +2 -2
  177. package/dist/services/budget-evaluator.js.map +1 -1
  178. package/dist/services/config-manager.cjs +2 -2
  179. package/dist/services/config-manager.cjs.map +1 -1
  180. package/dist/services/config-manager.js +2 -2
  181. package/dist/services/config-manager.js.map +1 -1
  182. package/dist/services/profiler/profile-runner.cjs +11 -0
  183. package/dist/services/profiler/profile-runner.cjs.map +1 -1
  184. package/dist/services/profiler/profile-runner.d.cts +2 -0
  185. package/dist/services/profiler/profile-runner.d.cts.map +1 -1
  186. package/dist/services/profiler/profile-runner.d.ts +2 -0
  187. package/dist/services/profiler/profile-runner.d.ts.map +1 -1
  188. package/dist/services/profiler/profile-runner.js +11 -0
  189. package/dist/services/profiler/profile-runner.js.map +1 -1
  190. package/dist/services/reporter-registry.cjs +8 -8
  191. package/dist/services/reporter-registry.cjs.map +1 -1
  192. package/dist/services/reporter-registry.js +8 -8
  193. package/dist/services/reporter-registry.js.map +1 -1
  194. package/package.json +7 -9
  195. package/src/cli/builder.ts +387 -0
  196. package/src/cli/commands/baseline.ts +7 -33
  197. package/src/cli/commands/history.ts +1 -16
  198. package/src/cli/commands/init.ts +2 -2
  199. package/src/cli/commands/run.ts +1 -1
  200. package/src/cli/commands/test.ts +1 -1
  201. package/src/cli/context.ts +117 -0
  202. package/src/cli/handlers.ts +76 -0
  203. package/src/cli/index.ts +49 -1194
  204. package/src/cli/parsers/analyze.ts +61 -0
  205. package/src/cli/parsers/baseline.ts +92 -0
  206. package/src/cli/parsers/global.ts +51 -0
  207. package/src/cli/parsers/history.ts +168 -0
  208. package/src/cli/parsers/index.ts +28 -0
  209. package/src/cli/parsers/init.ts +45 -0
  210. package/src/cli/parsers/run.ts +118 -0
  211. package/src/cli/parsers/test.ts +46 -0
  212. package/src/cli/theme.ts +33 -0
  213. package/src/config/budget-schema.ts +1 -1
  214. package/src/core/engines/accurate-engine.ts +1 -1
  215. package/src/errors/base.ts +1 -10
  216. package/src/formatters/history/compare.ts +6 -6
  217. package/src/formatters/history/show.ts +2 -2
  218. package/src/formatters/history/trends.ts +1 -1
  219. package/src/reporters/human.ts +5 -3
  220. package/src/reporters/nyan.ts +1 -1
  221. package/src/services/budget-evaluator.ts +2 -2
  222. package/src/services/config-manager.ts +2 -2
  223. package/src/services/profiler/profile-runner.ts +15 -0
  224. package/src/services/reporter-registry.ts +8 -8
@@ -51,7 +51,7 @@ const PROJECT_TEMPLATES = {
51
51
  outputDir: DEFAULT_OUTPUT_DIR,
52
52
  pattern: `${DEFAULT_BENCHMARK_DIR}/**/*.bench.{js,ts}`,
53
53
  reporters: ['human', 'json'],
54
- time: 10000,
54
+ time: 10_000,
55
55
  warmup: 50,
56
56
  },
57
57
  description: 'Feature-rich setup with multiple reporters and configuration',
@@ -77,7 +77,7 @@ const PROJECT_TEMPLATES = {
77
77
  outputDir: DEFAULT_OUTPUT_DIR,
78
78
  pattern: `${DEFAULT_BENCHMARK_DIR}/**/*.bench.{js,ts}`,
79
79
  reporters: ['human', 'json'],
80
- time: 15000,
80
+ time: 15_000,
81
81
  warmup: 100,
82
82
  },
83
83
  description: 'Optimized for library performance testing',
@@ -46,7 +46,7 @@ import { hasErrorCode, isError } from '../../utils/type-guards.js';
46
46
  * arguments provide values. They represent sensible defaults for running
47
47
  * benchmarks.
48
48
  */
49
- export const RUN_COMMAND_DEFAULTS = {
49
+ const RUN_COMMAND_DEFAULTS = {
50
50
  bail: false,
51
51
  quiet: false,
52
52
  reporters: ['human'],
@@ -55,7 +55,7 @@ const getDefaultTestConfig = (
55
55
  tags: [],
56
56
  thresholds: {},
57
57
  time: 1000,
58
- timeout: 30000,
58
+ timeout: 30_000,
59
59
  verbose,
60
60
  warmup,
61
61
  });
@@ -0,0 +1,117 @@
1
+ /**
2
+ * CLI Context
3
+ *
4
+ * Provides dependency injection container for CLI commands, including
5
+ * configuration manager, benchmark engine, history storage, and reporters.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+
10
+ import type { InferParserValues } from '@boneskull/bargs';
11
+
12
+ import type {
13
+ BenchmarkEngine,
14
+ ConfigurationManager,
15
+ Engine,
16
+ HistoryStorage,
17
+ ProgressManager,
18
+ ReporterRegistry,
19
+ } from '../types/index.js';
20
+ import type { globalOptions } from './parsers/global.js';
21
+
22
+ import { bootstrap } from '../bootstrap.js';
23
+ import { DEFAULT_ENGINE, Engines, ExitCodes, Reporters } from '../constants.js';
24
+ import { AccurateEngine, TinybenchEngine } from '../core/engines/index.js';
25
+ import {
26
+ CsvReporter,
27
+ HumanReporter,
28
+ JsonReporter,
29
+ NyanReporter,
30
+ SimpleReporter,
31
+ } from '../reporters/index.js';
32
+
33
+ /**
34
+ * CLI context with initialized services
35
+ */
36
+ export interface CliContext {
37
+ readonly abortController: AbortController;
38
+ readonly configManager: ConfigurationManager;
39
+ readonly engine: BenchmarkEngine;
40
+ readonly historyStorage: HistoryStorage;
41
+ readonly options: InferParserValues<typeof globalOptions>;
42
+ readonly progressManager: ProgressManager;
43
+ readonly reporterRegistry: ReporterRegistry;
44
+ }
45
+
46
+ /**
47
+ * Create CLI context with dependency injection
48
+ */
49
+ export const createCliContext = async (
50
+ options: InferParserValues<typeof globalOptions>,
51
+ abortController: AbortController,
52
+ engineType: Engine = DEFAULT_ENGINE,
53
+ ): Promise<CliContext> => {
54
+ try {
55
+ const dependencies = bootstrap();
56
+
57
+ // Select engine based on type
58
+ const engine =
59
+ engineType === Engines.ACCURATE
60
+ ? new AccurateEngine(dependencies)
61
+ : new TinybenchEngine(dependencies);
62
+
63
+ // Register built-in reporters
64
+ engine.registerReporter(
65
+ Reporters.HUMAN,
66
+ new HumanReporter({
67
+ color: !options.noColor,
68
+ verbose: options.verbose,
69
+ }),
70
+ );
71
+
72
+ engine.registerReporter(
73
+ 'json',
74
+ new JsonReporter({
75
+ prettyPrint: false,
76
+ }),
77
+ );
78
+
79
+ engine.registerReporter(
80
+ 'csv',
81
+ new CsvReporter({
82
+ includeHeaders: true,
83
+ includeMetadata: true,
84
+ }),
85
+ );
86
+
87
+ engine.registerReporter(
88
+ 'simple',
89
+ new SimpleReporter({
90
+ verbose: options.verbose,
91
+ }),
92
+ );
93
+
94
+ engine.registerReporter(
95
+ 'nyan',
96
+ new NyanReporter({
97
+ color: !options.noColor,
98
+ }),
99
+ );
100
+
101
+ return {
102
+ abortController,
103
+ configManager: engine.configManager,
104
+ engine,
105
+ historyStorage: engine.historyStorage,
106
+ options,
107
+ progressManager: engine.progressManager,
108
+ reporterRegistry: engine.reporterRegistry,
109
+ };
110
+ } catch (error) {
111
+ console.error(
112
+ 'Failed to initialize ModestBench:',
113
+ error instanceof Error ? error.message : String(error),
114
+ );
115
+ process.exit(ExitCodes.CONFIG_ERROR);
116
+ }
117
+ };
@@ -0,0 +1,76 @@
1
+ /**
2
+ * CLI Signal Handlers
3
+ *
4
+ * Handles process signals (SIGINT, SIGTERM, etc.) and uncaught errors for
5
+ * graceful shutdown of benchmark runs.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+
10
+ import { ABORT_TIMEOUT, ExitCodes } from '../constants.js';
11
+ import { isModestBenchError, UnknownError } from '../errors/index.js';
12
+ import { isError } from '../utils/type-guards.js';
13
+
14
+ /**
15
+ * Handle process signals gracefully
16
+ */
17
+ export const setupSignalHandlers = (abortController: AbortController): void => {
18
+ let abortRequested = false;
19
+
20
+ const handleSignal = (signal: NodeJS.Signals) => {
21
+ if (abortRequested) {
22
+ // Second signal, force exit
23
+ console.log(`\nReceived ${signal} again, forcing exit...`);
24
+ process.exit(computeExitCode(signal));
25
+ }
26
+
27
+ console.log(`\nReceived ${signal}, aborting benchmarks...`);
28
+ abortRequested = true;
29
+ abortController.abort();
30
+
31
+ // Give a short grace period for cleanup, then exit
32
+ setTimeout(() => {
33
+ console.log('\nBenchmark aborted.');
34
+ process.exit(computeExitCode(signal));
35
+ }, ABORT_TIMEOUT);
36
+ };
37
+
38
+ process
39
+ .once('SIGINT', handleSignal)
40
+ .once('SIGQUIT', handleSignal)
41
+ .once('SIGTERM', handleSignal)
42
+ .once('uncaughtException', (error) => {
43
+ // Wrap non-ModestBench errors with UnknownError
44
+ const wrappedError: Error = isModestBenchError(error)
45
+ ? error
46
+ : new UnknownError(error.message, { cause: error });
47
+ console.error(`${wrappedError}`);
48
+ process.exit(ExitCodes.RUNTIME_ERROR);
49
+ })
50
+ .once('unhandledRejection', (reason) => {
51
+ const wrappedError: Error = isModestBenchError(reason)
52
+ ? reason
53
+ : new UnknownError(isError(reason) ? reason.message : String(reason), {
54
+ cause: reason,
55
+ });
56
+ console.error(`${wrappedError}`);
57
+ process.exit(ExitCodes.RUNTIME_ERROR);
58
+ });
59
+ };
60
+
61
+ /**
62
+ * Compute the exit code based on the signal
63
+ *
64
+ * @param signal - The signal that caused the exit
65
+ * @returns The exit code
66
+ */
67
+ const computeExitCode = (signal: NodeJS.Signals): number => {
68
+ switch (signal) {
69
+ case 'SIGINT':
70
+ return 130; // 128 + 2
71
+ case 'SIGQUIT':
72
+ return 131; // 128 + 3
73
+ default:
74
+ return 143; // 128 + 15 (SIGTERM)
75
+ }
76
+ };