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,333 @@
1
+ /**
2
+ * ModestBench Configuration Manager
3
+ *
4
+ * Handles loading, merging, and validation of configuration from multiple
5
+ * sources. Supports CLI arguments, config files (JSON/YAML/JS/TS), and
6
+ * defaults.
7
+ */
8
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
9
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
10
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
11
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
12
+ });
13
+ }
14
+ return path;
15
+ };
16
+ import { cosmiconfig } from 'cosmiconfig';
17
+ import { resolve } from 'node:path';
18
+ import { safeParseConfig } from "./schema.js";
19
+ /**
20
+ * Get the default reporter based on TTY status and environment
21
+ */
22
+ const getDefaultReporter = () => {
23
+ // Use simple reporter when stdout is not a TTY and color is not forced
24
+ if (!process.stdout.isTTY && !isColorForced()) {
25
+ return 'simple';
26
+ }
27
+ return 'human';
28
+ };
29
+ /**
30
+ * Check if color output has been forced via environment variables
31
+ */
32
+ const isColorForced = () => {
33
+ return (process.env.FORCE_COLOR !== undefined &&
34
+ process.env.FORCE_COLOR !== '0' &&
35
+ process.env.NO_COLOR === undefined);
36
+ };
37
+ /**
38
+ * Default configuration values Using minimal values to reduce test overhead
39
+ * while maintaining functionality
40
+ */
41
+ const DEFAULT_CONFIG = {
42
+ bail: false,
43
+ exclude: ['node_modules/**', '.git/**'],
44
+ excludeTags: [],
45
+ iterations: 100, // Sufficient iterations for reliable statistics
46
+ limitBy: 'iterations', // Default to limiting by iteration count
47
+ metadata: {},
48
+ outputDir: './benchmark-results',
49
+ pattern: '**/*.bench.{js,ts,mjs,cjs,mts,cts}',
50
+ quiet: false,
51
+ reporterConfig: {},
52
+ reporters: [getDefaultReporter()],
53
+ tags: [],
54
+ thresholds: {},
55
+ time: 1000, // 1 second minimum for tinybench to gather samples
56
+ timeout: 30000, // 30 seconds
57
+ verbose: false, // No verbose output by default
58
+ warmup: 0, // No warmup by default for test speed
59
+ };
60
+ /**
61
+ * Configuration precedence order (highest to lowest):
62
+ *
63
+ * 1. CLI arguments
64
+ * 2. Config file
65
+ * 3. Default values
66
+ */
67
+ export class ModestBenchConfigurationManager {
68
+ /**
69
+ * Apply smart defaults for limitBy based on which flags were provided
70
+ */
71
+ static applySmartDefaults(merged, cliArgs, fileConfig) {
72
+ // If limitBy was explicitly provided in CLI or file, use it
73
+ if (cliArgs['limit-by'] || cliArgs.limitBy || fileConfig.limitBy) {
74
+ return merged;
75
+ }
76
+ // Determine if user explicitly provided time or iterations
77
+ const userProvidedTime = 'time' in cliArgs || 't' in cliArgs;
78
+ const userProvidedIterations = 'iterations' in cliArgs || 'i' in cliArgs;
79
+ let smartDefault;
80
+ if (userProvidedTime && userProvidedIterations) {
81
+ // Both provided → stop at whichever comes first
82
+ smartDefault = 'any';
83
+ }
84
+ else if (userProvidedTime) {
85
+ // Only time → limit by time
86
+ smartDefault = 'time';
87
+ }
88
+ else {
89
+ // Only iterations (or neither) → limit by iterations
90
+ smartDefault = 'iterations';
91
+ }
92
+ return {
93
+ ...merged,
94
+ limitBy: smartDefault,
95
+ };
96
+ }
97
+ /**
98
+ * Get default configuration values
99
+ */
100
+ getDefaults() {
101
+ return { ...DEFAULT_CONFIG };
102
+ }
103
+ /**
104
+ * Load configuration from various sources with precedence
105
+ */
106
+ async load(configPath, cliArgs) {
107
+ try {
108
+ // Create a fresh explorer for each load to avoid module caching issues
109
+ const explorer = this.createExplorer();
110
+ // 1. Load config file using cosmiconfig
111
+ let result;
112
+ if (configPath) {
113
+ const resolvedPath = resolve(configPath);
114
+ // For .js/.mjs/.cjs files, add cache busting to the import to avoid Node's module cache
115
+ if (resolvedPath.endsWith('.js') ||
116
+ resolvedPath.endsWith('.mjs') ||
117
+ resolvedPath.endsWith('.cjs')) {
118
+ // Clear Node's module cache for this file to ensure fresh load
119
+ const moduleUrl = `${resolvedPath}?t=${Date.now()}`;
120
+ try {
121
+ const module = (await import(__rewriteRelativeImportExtension(moduleUrl)));
122
+ result = {
123
+ config: module.default || module,
124
+ filepath: resolvedPath,
125
+ };
126
+ }
127
+ catch {
128
+ // Fall back to explorer.load if cache busting fails
129
+ result = await explorer.load(resolvedPath);
130
+ }
131
+ }
132
+ else {
133
+ result = await explorer.load(resolvedPath);
134
+ }
135
+ }
136
+ else {
137
+ result = await explorer.search();
138
+ }
139
+ const fileConfig = (result?.config || {});
140
+ // 2. Merge: defaults <- file <- CLI args
141
+ const normalizedCliArgs = cliArgs ? this.normalizeCliArgs(cliArgs) : {};
142
+ const merged = this.merge(DEFAULT_CONFIG, fileConfig, normalizedCliArgs);
143
+ // 2.5. Apply smart defaults for limitBy if not explicitly provided
144
+ const finalConfig = ModestBenchConfigurationManager.applySmartDefaults(merged, cliArgs || {}, fileConfig);
145
+ // 3. Validate final configuration
146
+ const validation = this.validate(finalConfig);
147
+ if (!validation.valid) {
148
+ throw new Error(`Configuration validation failed: ${validation.errors.map((e) => e.message).join(', ')}`);
149
+ }
150
+ return finalConfig;
151
+ }
152
+ catch (error) {
153
+ throw new Error(`Failed to load configuration: ${error instanceof Error ? error.message : String(error)}`);
154
+ }
155
+ }
156
+ /**
157
+ * Merge multiple configuration objects with precedence
158
+ */
159
+ merge(...configs) {
160
+ let result = {};
161
+ for (const config of configs) {
162
+ result = {
163
+ ...result,
164
+ ...config,
165
+ // Special handling for arrays - replace rather than merge
166
+ // Allow empty arrays to override defaults (for pattern defaulting in loader)
167
+ ...(config.pattern !== undefined && {
168
+ pattern: Array.isArray(config.pattern)
169
+ ? [...config.pattern]
170
+ : config.pattern,
171
+ }),
172
+ ...(config.exclude && { exclude: [...config.exclude] }),
173
+ ...(config.excludeTags && { excludeTags: [...config.excludeTags] }),
174
+ ...(config.reporters && { reporters: [...config.reporters] }),
175
+ ...(config.tags && { tags: [...config.tags] }),
176
+ // Deep merge for objects
177
+ ...(config.reporterConfig && {
178
+ reporterConfig: {
179
+ ...result.reporterConfig,
180
+ ...config.reporterConfig,
181
+ },
182
+ }),
183
+ ...(config.metadata && {
184
+ metadata: { ...result.metadata, ...config.metadata },
185
+ }),
186
+ ...(config.thresholds && {
187
+ thresholds: { ...result.thresholds, ...config.thresholds },
188
+ }),
189
+ };
190
+ }
191
+ return { ...DEFAULT_CONFIG, ...result };
192
+ }
193
+ /**
194
+ * Validate configuration object using Zod schema
195
+ */
196
+ validate(config) {
197
+ const errors = [];
198
+ const warnings = [];
199
+ // Use Zod schema validation
200
+ const result = safeParseConfig(config);
201
+ if (!result.success) {
202
+ // Convert Zod errors to ValidationError format
203
+ for (const issue of result.error.issues) {
204
+ const path = issue.path.join('.');
205
+ errors.push({
206
+ code: `INVALID_${path.toUpperCase().replace(/\./g, '_') || 'CONFIG'}`,
207
+ file: 'configuration',
208
+ message: `${path ? `${path}: ` : ''}${issue.message}`,
209
+ severity: 'error',
210
+ });
211
+ }
212
+ }
213
+ // Additional logical validations and warnings
214
+ if (result.success) {
215
+ const validConfig = result.data;
216
+ // Warn about empty reporters
217
+ if (validConfig.reporters.length === 0) {
218
+ warnings.push({
219
+ code: 'NO_REPORTERS',
220
+ file: 'configuration',
221
+ message: 'no reporters specified, using default human reporter',
222
+ severity: 'warning',
223
+ });
224
+ }
225
+ // Warn about potentially long runtime
226
+ if (validConfig.iterations > 1000 && validConfig.time > 60000) {
227
+ warnings.push({
228
+ code: 'LONG_RUNTIME_WARNING',
229
+ file: 'configuration',
230
+ message: 'high iterations and time values may result in very long benchmark runs',
231
+ severity: 'warning',
232
+ });
233
+ }
234
+ }
235
+ return {
236
+ errors,
237
+ files: ['configuration'],
238
+ valid: errors.length === 0,
239
+ warnings,
240
+ };
241
+ }
242
+ /**
243
+ * Create a cosmiconfig explorer for loading configuration files
244
+ */
245
+ createExplorer() {
246
+ return cosmiconfig('modestbench', {
247
+ cache: false, // Disable caching to prevent cross-contamination between different config files
248
+ loaders: {
249
+ '.ts': async (filepath) => {
250
+ // Use cosmiconfig-typescript-loader to load TypeScript files
251
+ // This works without tsx in the import chain
252
+ const { TypeScriptLoader: createTypeScriptLoader } = await import('cosmiconfig-typescript-loader');
253
+ const loader = createTypeScriptLoader();
254
+ const { readFile } = await import('node:fs/promises');
255
+ const content = await readFile(filepath, 'utf-8');
256
+ return (await loader(filepath, content));
257
+ },
258
+ },
259
+ searchPlaces: [
260
+ 'package.json',
261
+ '.modestbenchrc',
262
+ '.modestbenchrc.json',
263
+ '.modestbenchrc.yaml',
264
+ '.modestbenchrc.yml',
265
+ '.modestbenchrc.js',
266
+ '.modestbenchrc.mjs',
267
+ '.modestbenchrc.cjs',
268
+ 'modestbench.config.json',
269
+ 'modestbench.config.yaml',
270
+ 'modestbench.config.yml',
271
+ 'modestbench.config.js',
272
+ 'modestbench.config.mjs',
273
+ 'modestbench.config.cjs',
274
+ 'modestbench.config.ts',
275
+ ],
276
+ });
277
+ }
278
+ /**
279
+ * Normalize CLI arguments to configuration format
280
+ */
281
+ normalizeCliArgs(cliArgs) {
282
+ const normalized = {};
283
+ // Map CLI argument names to config property names
284
+ const argMap = {
285
+ bail: 'bail',
286
+ exclude: 'exclude',
287
+ 'exclude-tags': 'excludeTags',
288
+ excludeTags: 'excludeTags',
289
+ i: 'iterations',
290
+ iterations: 'iterations',
291
+ 'limit-by': 'limitBy',
292
+ limitBy: 'limitBy',
293
+ o: 'outputDir',
294
+ output: 'outputDir',
295
+ 'output-dir': 'outputDir',
296
+ pattern: 'pattern',
297
+ q: 'quiet',
298
+ quiet: 'quiet',
299
+ r: 'reporters',
300
+ reporters: 'reporters',
301
+ t: 'time',
302
+ tags: 'tags',
303
+ time: 'time',
304
+ timeout: 'timeout',
305
+ v: 'verbose',
306
+ verbose: 'verbose',
307
+ w: 'warmup',
308
+ warmup: 'warmup',
309
+ };
310
+ for (const [cliKey, configKey] of Object.entries(argMap)) {
311
+ if (cliKey in cliArgs && cliArgs[cliKey] !== undefined) {
312
+ const value = cliArgs[cliKey];
313
+ // Handle array arguments that might come as strings
314
+ if (configKey === 'exclude' ||
315
+ configKey === 'excludeTags' ||
316
+ configKey === 'reporters' ||
317
+ configKey === 'tags') {
318
+ if (typeof value === 'string') {
319
+ normalized[configKey] = value.split(',').map((s) => s.trim());
320
+ }
321
+ else if (Array.isArray(value)) {
322
+ normalized[configKey] = value;
323
+ }
324
+ }
325
+ else {
326
+ normalized[configKey] = value;
327
+ }
328
+ }
329
+ }
330
+ return normalized;
331
+ }
332
+ }
333
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ /**
3
+ * ModestBench Configuration Schemas
4
+ *
5
+ * Zod schemas for validating configuration. These schemas are constrained to
6
+ * match the TypeScript types defined in types/core.ts, ensuring type safety and
7
+ * enabling JSON Schema generation.
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.safeParseConfig = exports.partialModestBenchConfigSchema = void 0;
44
+ const z = __importStar(require("zod"));
45
+ const constants_js_1 = require("../constants.cjs");
46
+ /**
47
+ * Schema for threshold configuration
48
+ *
49
+ * Defines performance assertion thresholds for benchmark validation.
50
+ */
51
+ const thresholdConfigSchema = z
52
+ .object({
53
+ maxMarginOfError: z
54
+ .number()
55
+ .positive()
56
+ .describe('Maximum allowed margin of error as a percentage')
57
+ .optional(),
58
+ maxMean: z
59
+ .number()
60
+ .positive()
61
+ .describe('Maximum allowed mean execution time in nanoseconds')
62
+ .optional(),
63
+ maxP95: z
64
+ .number()
65
+ .positive()
66
+ .describe('Maximum allowed 95th percentile execution time in nanoseconds')
67
+ .optional(),
68
+ maxP99: z
69
+ .number()
70
+ .positive()
71
+ .describe('Maximum allowed 99th percentile execution time in nanoseconds')
72
+ .optional(),
73
+ maxStdDev: z
74
+ .number()
75
+ .positive()
76
+ .describe('Maximum allowed standard deviation in nanoseconds')
77
+ .optional(),
78
+ minOpsPerSecond: z
79
+ .number()
80
+ .positive()
81
+ .describe('Minimum required operations per second')
82
+ .optional(),
83
+ })
84
+ .strict()
85
+ .describe('Performance assertion thresholds for benchmark validation')
86
+ .meta({
87
+ title: 'Threshold Configuration',
88
+ });
89
+ /**
90
+ * Schema for the main ModestBench configuration
91
+ *
92
+ * This is the complete configuration schema used for validating benchmark
93
+ * configuration from all sources (files, CLI args, defaults).
94
+ */
95
+ const modestBenchConfigSchema = z
96
+ .object({
97
+ $schema: z
98
+ .string()
99
+ .optional()
100
+ .describe('JSON Schema reference for IDE support (not used by ModestBench)'),
101
+ bail: z.boolean().describe('Stop benchmark execution on first failure'),
102
+ exclude: z
103
+ .array(z.string())
104
+ .describe('Glob patterns to exclude from benchmark file discovery (e.g., "node_modules/**", ".git/**")'),
105
+ excludeTags: z
106
+ .array(z.string())
107
+ .describe('Tags to exclude from benchmark execution. Benchmarks matching any of these tags will be skipped.'),
108
+ iterations: z
109
+ .number()
110
+ .int()
111
+ .positive()
112
+ .describe('Default number of iterations to run for each benchmark task. Higher values provide more accurate statistics but take longer to execute.'),
113
+ limitBy: z
114
+ .enum(['time', 'iterations', 'any', 'all'])
115
+ .describe('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'),
116
+ metadata: z
117
+ .record(z.string(), z.unknown())
118
+ .describe('Custom metadata to attach to benchmark runs. Can include project name, version, environment details, etc.'),
119
+ outputDir: z
120
+ .string()
121
+ .min(1)
122
+ .describe('Directory path where benchmark results and reports will be written'),
123
+ pattern: z
124
+ .union([z.string().min(1), z.array(z.string().min(1))])
125
+ .describe(`Glob pattern(s) for discovering benchmark files. Can be a single pattern string or array of patterns (e.g., "**/*${constants_js_1.BENCHMARK_FILE_PATTERN}")`),
126
+ quiet: z
127
+ .boolean()
128
+ .describe('Run in quiet mode with minimal console output (only errors and final results)'),
129
+ reporterConfig: z
130
+ .record(z.string(), z.unknown())
131
+ .describe('Configuration options specific to individual reporters, keyed by reporter name'),
132
+ reporters: z
133
+ .array(z.string())
134
+ .min(1)
135
+ .describe('List of reporter names to use for output. Available reporters: "human", "json", "csv"'),
136
+ tags: z
137
+ .array(z.string())
138
+ .describe('Tags to filter which benchmarks to run. If empty, all benchmarks are included. Only benchmarks with matching tags will execute.'),
139
+ thresholds: thresholdConfigSchema,
140
+ time: z
141
+ .number()
142
+ .int()
143
+ .positive()
144
+ .describe('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.'),
145
+ timeout: z
146
+ .number()
147
+ .int()
148
+ .positive()
149
+ .describe('Timeout for individual benchmark tasks in milliseconds. Tasks exceeding this duration will be terminated and marked as failed.'),
150
+ verbose: z
151
+ .boolean()
152
+ .describe('Enable verbose output. Provides more detailed console output including progress, intermediate results, and diagnostic information'),
153
+ warmup: z
154
+ .number()
155
+ .int()
156
+ .nonnegative()
157
+ .describe('Number of warmup iterations to run before measurement begins. Warmup helps stabilize performance by allowing JIT compilation and caching to occur.'),
158
+ })
159
+ .strict()
160
+ .describe('ModestBench configuration for controlling benchmark discovery, execution, and reporting')
161
+ .meta({
162
+ title: 'ModestBench Configuration',
163
+ });
164
+ /**
165
+ * Validate a partial configuration object
166
+ *
167
+ * This is used for validating configuration from files or CLI args before
168
+ * merging with defaults.
169
+ */
170
+ exports.partialModestBenchConfigSchema = modestBenchConfigSchema.partial();
171
+ /**
172
+ * Safely parse and validate a configuration object
173
+ *
174
+ * @param config - The configuration object to validate
175
+ * @returns A result object with either success: true and data, or success:
176
+ * false and error
177
+ */
178
+ const safeParseConfig = (config) => {
179
+ return modestBenchConfigSchema.safeParse(config);
180
+ };
181
+ exports.safeParseConfig = safeParseConfig;
182
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * ModestBench Configuration Schemas
3
+ *
4
+ * Zod schemas for validating configuration. These schemas are constrained to
5
+ * match the TypeScript types defined in types/core.ts, ensuring type safety and
6
+ * enabling JSON Schema generation.
7
+ */
8
+ import * as z from 'zod';
9
+ import type { ModestBenchConfig } from "../types/core.cjs";
10
+ /**
11
+ * Validate a partial configuration object
12
+ *
13
+ * This is used for validating configuration from files or CLI args before
14
+ * merging with defaults.
15
+ */
16
+ export declare const partialModestBenchConfigSchema: z.ZodType<Partial<ModestBenchConfig>>;
17
+ /**
18
+ * Safely parse and validate a configuration object
19
+ *
20
+ * @param config - The configuration object to validate
21
+ * @returns A result object with either success: true and data, or success:
22
+ * false and error
23
+ */
24
+ export declare const safeParseConfig: (config: unknown) => z.ZodSafeParseResult<{
25
+ bail: boolean;
26
+ exclude: string[];
27
+ excludeTags: string[];
28
+ iterations: number;
29
+ limitBy: "iterations" | "all" | "any" | "time";
30
+ metadata: Record<string, unknown>;
31
+ outputDir: string;
32
+ pattern: string | string[];
33
+ quiet: boolean;
34
+ reporterConfig: Record<string, unknown>;
35
+ reporters: string[];
36
+ tags: string[];
37
+ thresholds: {
38
+ maxMarginOfError?: number | undefined;
39
+ maxMean?: number | undefined;
40
+ maxP95?: number | undefined;
41
+ maxP99?: number | undefined;
42
+ maxStdDev?: number | undefined;
43
+ minOpsPerSecond?: number | undefined;
44
+ };
45
+ time: number;
46
+ timeout: number;
47
+ verbose: boolean;
48
+ warmup: number;
49
+ $schema?: string | undefined;
50
+ }>;
51
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,OAAO,KAAK,EAAE,iBAAiB,EAAE,0BAAyB;AA8J1D;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,EAAE,CAAC,CAAC,OAAO,CACpD,OAAO,CAAC,iBAAiB,CAAC,CACS,CAAC;AAEtC;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAI,QAAQ,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;EAE9C,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * ModestBench Configuration Schemas
3
+ *
4
+ * Zod schemas for validating configuration. These schemas are constrained to
5
+ * match the TypeScript types defined in types/core.ts, ensuring type safety and
6
+ * enabling JSON Schema generation.
7
+ */
8
+ import * as z from 'zod';
9
+ import type { ModestBenchConfig } from "../types/core.js";
10
+ /**
11
+ * Validate a partial configuration object
12
+ *
13
+ * This is used for validating configuration from files or CLI args before
14
+ * merging with defaults.
15
+ */
16
+ export declare const partialModestBenchConfigSchema: z.ZodType<Partial<ModestBenchConfig>>;
17
+ /**
18
+ * Safely parse and validate a configuration object
19
+ *
20
+ * @param config - The configuration object to validate
21
+ * @returns A result object with either success: true and data, or success:
22
+ * false and error
23
+ */
24
+ export declare const safeParseConfig: (config: unknown) => z.ZodSafeParseResult<{
25
+ bail: boolean;
26
+ exclude: string[];
27
+ excludeTags: string[];
28
+ iterations: number;
29
+ limitBy: "iterations" | "all" | "any" | "time";
30
+ metadata: Record<string, unknown>;
31
+ outputDir: string;
32
+ pattern: string | string[];
33
+ quiet: boolean;
34
+ reporterConfig: Record<string, unknown>;
35
+ reporters: string[];
36
+ tags: string[];
37
+ thresholds: {
38
+ maxMarginOfError?: number | undefined;
39
+ maxMean?: number | undefined;
40
+ maxP95?: number | undefined;
41
+ maxP99?: number | undefined;
42
+ maxStdDev?: number | undefined;
43
+ minOpsPerSecond?: number | undefined;
44
+ };
45
+ time: number;
46
+ timeout: number;
47
+ verbose: boolean;
48
+ warmup: number;
49
+ $schema?: string | undefined;
50
+ }>;
51
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,OAAO,KAAK,EAAE,iBAAiB,EAAE,yBAAyB;AA8J1D;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,EAAE,CAAC,CAAC,OAAO,CACpD,OAAO,CAAC,iBAAiB,CAAC,CACS,CAAC;AAEtC;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAI,QAAQ,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;EAE9C,CAAC"}