modestbench 0.0.3 → 0.2.0

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 (394) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +39 -31
  3. package/dist/bootstrap.cjs +10 -12
  4. package/dist/bootstrap.cjs.map +1 -1
  5. package/dist/bootstrap.d.cts.map +1 -1
  6. package/dist/bootstrap.d.ts.map +1 -1
  7. package/dist/bootstrap.js +5 -7
  8. package/dist/bootstrap.js.map +1 -1
  9. package/dist/cli/commands/history.cjs +108 -265
  10. package/dist/cli/commands/history.cjs.map +1 -1
  11. package/dist/cli/commands/history.d.cts +75 -12
  12. package/dist/cli/commands/history.d.cts.map +1 -1
  13. package/dist/cli/commands/history.d.ts +75 -12
  14. package/dist/cli/commands/history.d.ts.map +1 -1
  15. package/dist/cli/commands/history.js +105 -267
  16. package/dist/cli/commands/history.js.map +1 -1
  17. package/dist/cli/commands/init.cjs +5 -4
  18. package/dist/cli/commands/init.cjs.map +1 -1
  19. package/dist/cli/commands/init.d.cts.map +1 -1
  20. package/dist/cli/commands/init.d.ts.map +1 -1
  21. package/dist/cli/commands/init.js +5 -4
  22. package/dist/cli/commands/init.js.map +1 -1
  23. package/dist/cli/commands/run.cjs +32 -9
  24. package/dist/cli/commands/run.cjs.map +1 -1
  25. package/dist/cli/commands/run.d.cts +1 -0
  26. package/dist/cli/commands/run.d.cts.map +1 -1
  27. package/dist/cli/commands/run.d.ts +1 -0
  28. package/dist/cli/commands/run.d.ts.map +1 -1
  29. package/dist/cli/commands/run.js +32 -9
  30. package/dist/cli/commands/run.js.map +1 -1
  31. package/dist/cli/index.cjs +336 -103
  32. package/dist/cli/index.cjs.map +1 -1
  33. package/dist/cli/index.d.cts +1 -2
  34. package/dist/cli/index.d.cts.map +1 -1
  35. package/dist/cli/index.d.ts +1 -2
  36. package/dist/cli/index.d.ts.map +1 -1
  37. package/dist/cli/index.js +332 -99
  38. package/dist/cli/index.js.map +1 -1
  39. package/dist/constants.cjs +53 -1
  40. package/dist/constants.cjs.map +1 -1
  41. package/dist/constants.d.cts +36 -0
  42. package/dist/constants.d.cts.map +1 -1
  43. package/dist/constants.d.ts +36 -0
  44. package/dist/constants.d.ts.map +1 -1
  45. package/dist/constants.js +52 -0
  46. package/dist/constants.js.map +1 -1
  47. package/dist/core/engine.cjs +23 -43
  48. package/dist/core/engine.cjs.map +1 -1
  49. package/dist/core/engine.d.cts +4 -3
  50. package/dist/core/engine.d.cts.map +1 -1
  51. package/dist/core/engine.d.ts +4 -3
  52. package/dist/core/engine.d.ts.map +1 -1
  53. package/dist/core/engine.js +23 -43
  54. package/dist/core/engine.js.map +1 -1
  55. package/dist/core/engines/accurate-engine.cjs +2 -1
  56. package/dist/core/engines/accurate-engine.cjs.map +1 -1
  57. package/dist/core/engines/accurate-engine.d.cts.map +1 -1
  58. package/dist/core/engines/accurate-engine.d.ts.map +1 -1
  59. package/dist/core/engines/accurate-engine.js +2 -1
  60. package/dist/core/engines/accurate-engine.js.map +1 -1
  61. package/dist/core/engines/tinybench-engine.cjs +6 -5
  62. package/dist/core/engines/tinybench-engine.cjs.map +1 -1
  63. package/dist/core/engines/tinybench-engine.d.cts.map +1 -1
  64. package/dist/core/engines/tinybench-engine.d.ts.map +1 -1
  65. package/dist/core/engines/tinybench-engine.js +6 -5
  66. package/dist/core/engines/tinybench-engine.js.map +1 -1
  67. package/dist/core/output-path-resolver.cjs +34 -0
  68. package/dist/core/output-path-resolver.cjs.map +1 -0
  69. package/dist/core/output-path-resolver.d.cts +10 -0
  70. package/dist/core/output-path-resolver.d.cts.map +1 -0
  71. package/dist/core/output-path-resolver.d.ts +10 -0
  72. package/dist/core/output-path-resolver.d.ts.map +1 -0
  73. package/dist/core/output-path-resolver.js +30 -0
  74. package/dist/core/output-path-resolver.js.map +1 -0
  75. package/dist/errors/base.cjs +130 -0
  76. package/dist/errors/base.cjs.map +1 -0
  77. package/dist/errors/base.d.cts +97 -0
  78. package/dist/errors/base.d.cts.map +1 -0
  79. package/dist/errors/base.d.ts +97 -0
  80. package/dist/errors/base.d.ts.map +1 -0
  81. package/dist/errors/base.js +124 -0
  82. package/dist/errors/base.js.map +1 -0
  83. package/dist/errors/cli.cjs +58 -0
  84. package/dist/errors/cli.cjs.map +1 -0
  85. package/dist/errors/cli.d.cts +44 -0
  86. package/dist/errors/cli.d.cts.map +1 -0
  87. package/dist/errors/cli.d.ts +44 -0
  88. package/dist/errors/cli.d.ts.map +1 -0
  89. package/dist/errors/cli.js +52 -0
  90. package/dist/errors/cli.js.map +1 -0
  91. package/dist/errors/configuration.cjs +48 -0
  92. package/dist/errors/configuration.cjs.map +1 -0
  93. package/dist/errors/configuration.d.cts +41 -0
  94. package/dist/errors/configuration.d.cts.map +1 -0
  95. package/dist/errors/configuration.d.ts +41 -0
  96. package/dist/errors/configuration.d.ts.map +1 -0
  97. package/dist/errors/configuration.js +41 -0
  98. package/dist/errors/configuration.js.map +1 -0
  99. package/dist/errors/execution.cjs +65 -0
  100. package/dist/errors/execution.cjs.map +1 -0
  101. package/dist/errors/execution.d.cts +56 -0
  102. package/dist/errors/execution.d.cts.map +1 -0
  103. package/dist/errors/execution.d.ts +56 -0
  104. package/dist/errors/execution.d.ts.map +1 -0
  105. package/dist/errors/execution.js +56 -0
  106. package/dist/errors/execution.js.map +1 -0
  107. package/dist/errors/file.cjs +56 -0
  108. package/dist/errors/file.cjs.map +1 -0
  109. package/dist/errors/file.d.cts +48 -0
  110. package/dist/errors/file.d.cts.map +1 -0
  111. package/dist/errors/file.d.ts +48 -0
  112. package/dist/errors/file.d.ts.map +1 -0
  113. package/dist/errors/file.js +48 -0
  114. package/dist/errors/file.js.map +1 -0
  115. package/dist/errors/index.cjs +59 -0
  116. package/dist/errors/index.cjs.map +1 -0
  117. package/dist/errors/index.d.cts +16 -0
  118. package/dist/errors/index.d.cts.map +1 -0
  119. package/dist/errors/index.d.ts +16 -0
  120. package/dist/errors/index.d.ts.map +1 -0
  121. package/dist/errors/index.js +24 -0
  122. package/dist/errors/index.js.map +1 -0
  123. package/dist/errors/reporter.cjs +38 -0
  124. package/dist/errors/reporter.cjs.map +1 -0
  125. package/dist/errors/reporter.d.cts +32 -0
  126. package/dist/errors/reporter.d.cts.map +1 -0
  127. package/dist/errors/reporter.d.ts +32 -0
  128. package/dist/errors/reporter.d.ts.map +1 -0
  129. package/dist/errors/reporter.js +32 -0
  130. package/dist/errors/reporter.js.map +1 -0
  131. package/dist/errors/storage.cjs +55 -0
  132. package/dist/errors/storage.cjs.map +1 -0
  133. package/dist/errors/storage.d.cts +47 -0
  134. package/dist/errors/storage.d.cts.map +1 -0
  135. package/dist/errors/storage.d.ts +47 -0
  136. package/dist/errors/storage.d.ts.map +1 -0
  137. package/dist/errors/storage.js +47 -0
  138. package/dist/errors/storage.js.map +1 -0
  139. package/dist/errors/validation.cjs +38 -0
  140. package/dist/errors/validation.cjs.map +1 -0
  141. package/dist/errors/validation.d.cts +32 -0
  142. package/dist/errors/validation.d.cts.map +1 -0
  143. package/dist/errors/validation.d.ts +32 -0
  144. package/dist/errors/validation.d.ts.map +1 -0
  145. package/dist/errors/validation.js +32 -0
  146. package/dist/errors/validation.js.map +1 -0
  147. package/dist/formatters/history/base.cjs +9 -0
  148. package/dist/formatters/history/base.cjs.map +1 -0
  149. package/dist/formatters/history/base.d.cts +26 -0
  150. package/dist/formatters/history/base.d.cts.map +1 -0
  151. package/dist/formatters/history/base.d.ts +26 -0
  152. package/dist/formatters/history/base.d.ts.map +1 -0
  153. package/dist/formatters/history/base.js +8 -0
  154. package/dist/formatters/history/base.js.map +1 -0
  155. package/dist/formatters/history/compare.cjs +127 -0
  156. package/dist/formatters/history/compare.cjs.map +1 -0
  157. package/dist/formatters/history/compare.d.cts +21 -0
  158. package/dist/formatters/history/compare.d.cts.map +1 -0
  159. package/dist/formatters/history/compare.d.ts +21 -0
  160. package/dist/formatters/history/compare.d.ts.map +1 -0
  161. package/dist/formatters/history/compare.js +123 -0
  162. package/dist/formatters/history/compare.js.map +1 -0
  163. package/dist/formatters/history/list.cjs +74 -0
  164. package/dist/formatters/history/list.cjs.map +1 -0
  165. package/dist/formatters/history/list.d.cts +25 -0
  166. package/dist/formatters/history/list.d.cts.map +1 -0
  167. package/dist/formatters/history/list.d.ts +25 -0
  168. package/dist/formatters/history/list.d.ts.map +1 -0
  169. package/dist/formatters/history/list.js +70 -0
  170. package/dist/formatters/history/list.js.map +1 -0
  171. package/dist/formatters/history/show.cjs +98 -0
  172. package/dist/formatters/history/show.cjs.map +1 -0
  173. package/dist/formatters/history/show.d.cts +21 -0
  174. package/dist/formatters/history/show.d.cts.map +1 -0
  175. package/dist/formatters/history/show.d.ts +21 -0
  176. package/dist/formatters/history/show.d.ts.map +1 -0
  177. package/dist/formatters/history/show.js +94 -0
  178. package/dist/formatters/history/show.js.map +1 -0
  179. package/dist/formatters/history/trends.cjs +194 -0
  180. package/dist/formatters/history/trends.cjs.map +1 -0
  181. package/dist/formatters/history/trends.d.cts +22 -0
  182. package/dist/formatters/history/trends.d.cts.map +1 -0
  183. package/dist/formatters/history/trends.d.ts +22 -0
  184. package/dist/formatters/history/trends.d.ts.map +1 -0
  185. package/dist/formatters/history/trends.js +190 -0
  186. package/dist/formatters/history/trends.js.map +1 -0
  187. package/dist/formatters/history/visualization.cjs +79 -0
  188. package/dist/formatters/history/visualization.cjs.map +1 -0
  189. package/dist/formatters/history/visualization.d.cts +24 -0
  190. package/dist/formatters/history/visualization.d.cts.map +1 -0
  191. package/dist/formatters/history/visualization.d.ts +24 -0
  192. package/dist/formatters/history/visualization.d.ts.map +1 -0
  193. package/dist/formatters/history/visualization.js +74 -0
  194. package/dist/formatters/history/visualization.js.map +1 -0
  195. package/dist/index.cjs +17 -20
  196. package/dist/index.cjs.map +1 -1
  197. package/dist/index.d.cts +6 -6
  198. package/dist/index.d.cts.map +1 -1
  199. package/dist/index.d.ts +6 -6
  200. package/dist/index.d.ts.map +1 -1
  201. package/dist/index.js +9 -11
  202. package/dist/index.js.map +1 -1
  203. package/dist/reporters/csv.cjs +5 -4
  204. package/dist/reporters/csv.cjs.map +1 -1
  205. package/dist/reporters/csv.d.cts +1 -1
  206. package/dist/reporters/csv.d.cts.map +1 -1
  207. package/dist/reporters/csv.d.ts +1 -1
  208. package/dist/reporters/csv.d.ts.map +1 -1
  209. package/dist/reporters/csv.js +4 -3
  210. package/dist/reporters/csv.js.map +1 -1
  211. package/dist/reporters/human.cjs +24 -62
  212. package/dist/reporters/human.cjs.map +1 -1
  213. package/dist/reporters/human.d.cts +1 -1
  214. package/dist/reporters/human.d.cts.map +1 -1
  215. package/dist/reporters/human.d.ts +1 -1
  216. package/dist/reporters/human.d.ts.map +1 -1
  217. package/dist/reporters/human.js +3 -41
  218. package/dist/reporters/human.js.map +1 -1
  219. package/dist/reporters/json.cjs +5 -4
  220. package/dist/reporters/json.cjs.map +1 -1
  221. package/dist/reporters/json.d.cts +1 -1
  222. package/dist/reporters/json.d.cts.map +1 -1
  223. package/dist/reporters/json.d.ts +1 -1
  224. package/dist/reporters/json.d.ts.map +1 -1
  225. package/dist/reporters/json.js +4 -3
  226. package/dist/reporters/json.js.map +1 -1
  227. package/dist/reporters/simple.cjs +3 -3
  228. package/dist/reporters/simple.cjs.map +1 -1
  229. package/dist/reporters/simple.d.cts +1 -1
  230. package/dist/reporters/simple.d.cts.map +1 -1
  231. package/dist/reporters/simple.d.ts +1 -1
  232. package/dist/reporters/simple.d.ts.map +1 -1
  233. package/dist/reporters/simple.js +2 -2
  234. package/dist/reporters/simple.js.map +1 -1
  235. package/dist/{config/manager.cjs → services/config-manager.cjs} +10 -4
  236. package/dist/services/config-manager.cjs.map +1 -0
  237. package/dist/{config/manager.d.cts → services/config-manager.d.cts} +1 -1
  238. package/dist/services/config-manager.d.cts.map +1 -0
  239. package/dist/{config/manager.d.ts → services/config-manager.d.ts} +1 -1
  240. package/dist/services/config-manager.d.ts.map +1 -0
  241. package/dist/{config/manager.js → services/config-manager.js} +10 -4
  242. package/dist/services/config-manager.js.map +1 -0
  243. package/dist/{core/loader.cjs → services/file-loader.cjs} +18 -7
  244. package/dist/services/file-loader.cjs.map +1 -0
  245. package/dist/{core/loader.d.cts → services/file-loader.d.cts} +1 -1
  246. package/dist/services/file-loader.d.cts.map +1 -0
  247. package/dist/{core/loader.d.ts → services/file-loader.d.ts} +1 -1
  248. package/dist/services/file-loader.d.ts.map +1 -0
  249. package/dist/{core/loader.js → services/file-loader.js} +18 -7
  250. package/dist/services/file-loader.js.map +1 -0
  251. package/dist/services/history/comparison.cjs +124 -0
  252. package/dist/services/history/comparison.cjs.map +1 -0
  253. package/dist/services/history/comparison.d.cts +18 -0
  254. package/dist/services/history/comparison.d.cts.map +1 -0
  255. package/dist/services/history/comparison.d.ts +18 -0
  256. package/dist/services/history/comparison.d.ts.map +1 -0
  257. package/dist/services/history/comparison.js +120 -0
  258. package/dist/services/history/comparison.js.map +1 -0
  259. package/dist/services/history/models.cjs +9 -0
  260. package/dist/services/history/models.cjs.map +1 -0
  261. package/dist/services/history/models.d.cts +139 -0
  262. package/dist/services/history/models.d.cts.map +1 -0
  263. package/dist/services/history/models.d.ts +139 -0
  264. package/dist/services/history/models.d.ts.map +1 -0
  265. package/dist/services/history/models.js +8 -0
  266. package/dist/services/history/models.js.map +1 -0
  267. package/dist/services/history/query.cjs +97 -0
  268. package/dist/services/history/query.cjs.map +1 -0
  269. package/dist/services/history/query.d.cts +38 -0
  270. package/dist/services/history/query.d.cts.map +1 -0
  271. package/dist/services/history/query.d.ts +38 -0
  272. package/dist/services/history/query.d.ts.map +1 -0
  273. package/dist/services/history/query.js +92 -0
  274. package/dist/services/history/query.js.map +1 -0
  275. package/dist/services/history/trend-analysis.cjs +187 -0
  276. package/dist/services/history/trend-analysis.cjs.map +1 -0
  277. package/dist/services/history/trend-analysis.d.cts +34 -0
  278. package/dist/services/history/trend-analysis.d.cts.map +1 -0
  279. package/dist/services/history/trend-analysis.d.ts +34 -0
  280. package/dist/services/history/trend-analysis.d.ts.map +1 -0
  281. package/dist/services/history/trend-analysis.js +179 -0
  282. package/dist/services/history/trend-analysis.js.map +1 -0
  283. package/dist/{storage/history.cjs → services/history-storage.cjs} +33 -12
  284. package/dist/services/history-storage.cjs.map +1 -0
  285. package/dist/{storage/history.d.cts → services/history-storage.d.cts} +1 -1
  286. package/dist/services/history-storage.d.cts.map +1 -0
  287. package/dist/{storage/history.d.ts → services/history-storage.d.ts} +1 -1
  288. package/dist/services/history-storage.d.ts.map +1 -0
  289. package/dist/{storage/history.js → services/history-storage.js} +33 -12
  290. package/dist/services/history-storage.js.map +1 -0
  291. package/dist/{progress/manager.cjs → services/progress-manager.cjs} +1 -1
  292. package/dist/services/progress-manager.cjs.map +1 -0
  293. package/dist/{progress/manager.d.cts → services/progress-manager.d.cts} +1 -1
  294. package/dist/services/progress-manager.d.cts.map +1 -0
  295. package/dist/{progress/manager.d.ts → services/progress-manager.d.ts} +1 -1
  296. package/dist/services/progress-manager.d.ts.map +1 -0
  297. package/dist/{progress/manager.js → services/progress-manager.js} +1 -1
  298. package/dist/services/progress-manager.js.map +1 -0
  299. package/dist/{reporters/registry.cjs → services/reporter-registry.cjs} +4 -3
  300. package/dist/services/reporter-registry.cjs.map +1 -0
  301. package/dist/{reporters/registry.d.cts → services/reporter-registry.d.cts} +1 -1
  302. package/dist/services/reporter-registry.d.cts.map +1 -0
  303. package/dist/{reporters/registry.d.ts → services/reporter-registry.d.ts} +1 -1
  304. package/dist/services/reporter-registry.d.ts.map +1 -0
  305. package/dist/{reporters/registry.js → services/reporter-registry.js} +4 -3
  306. package/dist/services/reporter-registry.js.map +1 -0
  307. package/dist/types/cli.d.cts +3 -0
  308. package/dist/types/cli.d.cts.map +1 -1
  309. package/dist/types/cli.d.ts +3 -0
  310. package/dist/types/cli.d.ts.map +1 -1
  311. package/dist/types/interfaces.d.cts +1 -34
  312. package/dist/types/interfaces.d.cts.map +1 -1
  313. package/dist/types/interfaces.d.ts +1 -34
  314. package/dist/types/interfaces.d.ts.map +1 -1
  315. package/dist/utils/ansi.cjs +61 -0
  316. package/dist/utils/ansi.cjs.map +1 -0
  317. package/dist/utils/ansi.d.cts +53 -0
  318. package/dist/utils/ansi.d.cts.map +1 -0
  319. package/dist/utils/ansi.d.ts +53 -0
  320. package/dist/utils/ansi.d.ts.map +1 -0
  321. package/dist/utils/ansi.js +57 -0
  322. package/dist/utils/ansi.js.map +1 -0
  323. package/package.json +10 -8
  324. package/src/bootstrap.ts +5 -7
  325. package/src/cli/commands/history.ts +195 -341
  326. package/src/cli/commands/init.ts +14 -4
  327. package/src/cli/commands/run.ts +52 -7
  328. package/src/cli/index.ts +393 -119
  329. package/src/constants.ts +60 -0
  330. package/src/core/engine.ts +40 -48
  331. package/src/core/engines/accurate-engine.ts +4 -1
  332. package/src/core/engines/tinybench-engine.ts +12 -5
  333. package/src/core/output-path-resolver.ts +38 -0
  334. package/src/errors/base.ts +152 -0
  335. package/src/errors/cli.ts +59 -0
  336. package/src/errors/configuration.ts +45 -0
  337. package/src/errors/execution.ts +62 -0
  338. package/src/errors/file.ts +53 -0
  339. package/src/errors/index.ts +71 -0
  340. package/src/errors/reporter.ts +35 -0
  341. package/src/errors/storage.ts +52 -0
  342. package/src/errors/validation.ts +35 -0
  343. package/src/formatters/history/base.ts +28 -0
  344. package/src/formatters/history/compare.ts +186 -0
  345. package/src/formatters/history/list.ts +101 -0
  346. package/src/formatters/history/show.ts +155 -0
  347. package/src/formatters/history/trends.ts +281 -0
  348. package/src/formatters/history/visualization.ts +93 -0
  349. package/src/index.ts +10 -14
  350. package/src/reporters/csv.ts +5 -3
  351. package/src/reporters/human.ts +3 -43
  352. package/src/reporters/json.ts +5 -3
  353. package/src/reporters/simple.ts +2 -2
  354. package/src/{config/manager.ts → services/config-manager.ts} +13 -3
  355. package/src/{core/loader.ts → services/file-loader.ts} +28 -6
  356. package/src/services/history/comparison.ts +130 -0
  357. package/src/services/history/models.ts +148 -0
  358. package/src/services/history/query.ts +116 -0
  359. package/src/services/history/trend-analysis.ts +238 -0
  360. package/src/{storage/history.ts → services/history-storage.ts} +58 -11
  361. package/src/{reporters/registry.ts → services/reporter-registry.ts} +9 -2
  362. package/src/types/cli.ts +3 -0
  363. package/src/types/interfaces.ts +0 -43
  364. package/src/utils/ansi.ts +59 -0
  365. package/dist/config/manager.cjs.map +0 -1
  366. package/dist/config/manager.d.cts.map +0 -1
  367. package/dist/config/manager.d.ts.map +0 -1
  368. package/dist/config/manager.js.map +0 -1
  369. package/dist/core/error-manager.cjs +0 -303
  370. package/dist/core/error-manager.cjs.map +0 -1
  371. package/dist/core/error-manager.d.cts +0 -77
  372. package/dist/core/error-manager.d.cts.map +0 -1
  373. package/dist/core/error-manager.d.ts +0 -77
  374. package/dist/core/error-manager.d.ts.map +0 -1
  375. package/dist/core/error-manager.js +0 -299
  376. package/dist/core/error-manager.js.map +0 -1
  377. package/dist/core/loader.cjs.map +0 -1
  378. package/dist/core/loader.d.cts.map +0 -1
  379. package/dist/core/loader.d.ts.map +0 -1
  380. package/dist/core/loader.js.map +0 -1
  381. package/dist/progress/manager.cjs.map +0 -1
  382. package/dist/progress/manager.d.cts.map +0 -1
  383. package/dist/progress/manager.d.ts.map +0 -1
  384. package/dist/progress/manager.js.map +0 -1
  385. package/dist/reporters/registry.cjs.map +0 -1
  386. package/dist/reporters/registry.d.cts.map +0 -1
  387. package/dist/reporters/registry.d.ts.map +0 -1
  388. package/dist/reporters/registry.js.map +0 -1
  389. package/dist/storage/history.cjs.map +0 -1
  390. package/dist/storage/history.d.cts.map +0 -1
  391. package/dist/storage/history.d.ts.map +0 -1
  392. package/dist/storage/history.js.map +0 -1
  393. package/src/core/error-manager.ts +0 -372
  394. /package/src/{progress/manager.ts → services/progress-manager.ts} +0 -0
package/src/cli/index.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env node
2
+
2
3
  /**
3
4
  * ModestBench CLI Entry Point
4
5
  *
@@ -16,7 +17,6 @@ import { hideBin } from 'yargs/helpers';
16
17
  import type {
17
18
  BenchmarkEngine,
18
19
  ConfigurationManager,
19
- ErrorManager,
20
20
  HistoryStorage,
21
21
  ProgressManager,
22
22
  ReporterRegistry,
@@ -24,6 +24,7 @@ import type {
24
24
 
25
25
  import { bootstrap } from '../bootstrap.js';
26
26
  import { AccurateEngine, TinybenchEngine } from '../core/engines/index.js';
27
+ import { isModestBenchError, UnknownError } from '../errors/index.js';
27
28
  import {
28
29
  CsvReporter,
29
30
  HumanReporter,
@@ -31,7 +32,14 @@ import {
31
32
  SimpleReporter,
32
33
  } from '../reporters/index.js';
33
34
  // Import commands
34
- import { handleHistoryCommand as historyCommand } from './commands/history.js';
35
+ import {
36
+ handleCleanCommand,
37
+ handleCompareCommand,
38
+ handleExportCommand,
39
+ handleListCommand,
40
+ handleShowCommand,
41
+ handleTrendsCommand,
42
+ } from './commands/history.js';
35
43
  import { handleInitCommand as initCommand } from './commands/init.js';
36
44
  import { handleRunCommand as runCommand } from './commands/run.js';
37
45
 
@@ -42,7 +50,6 @@ export interface CliContext {
42
50
  readonly abortController: AbortController;
43
51
  readonly configManager: ConfigurationManager;
44
52
  readonly engine: BenchmarkEngine;
45
- readonly errorManager: ErrorManager;
46
53
  readonly historyStorage: HistoryStorage;
47
54
  readonly options: GlobalOptions;
48
55
  readonly progressManager: ProgressManager;
@@ -104,6 +111,7 @@ export const main = async (
104
111
 
105
112
  // Configure global options and commands
106
113
  await cli
114
+ .scriptName('modestbench')
107
115
  .option('config', {
108
116
  alias: 'c',
109
117
  description: 'Path to configuration file',
@@ -137,6 +145,7 @@ export const main = async (
137
145
  })
138
146
  .option('cwd', {
139
147
  default: process.cwd(),
148
+ defaultDescription: '.',
140
149
  description: 'Working directory',
141
150
  global: true,
142
151
  type: 'string',
@@ -187,6 +196,13 @@ export const main = async (
187
196
  description: 'Output directory for reports',
188
197
  type: 'string',
189
198
  })
199
+ .option('output-file', {
200
+ alias: 'of',
201
+ description:
202
+ 'Custom filename for reporter output (use with single reporter only)',
203
+ requiresArg: true,
204
+ type: 'string',
205
+ })
190
206
  .option('iterations', {
191
207
  alias: 'i',
192
208
  description: 'Number of iterations per benchmark',
@@ -301,6 +317,7 @@ export const main = async (
301
317
  json: argv.json,
302
318
  noColor: argv.noColor,
303
319
  outputDir: argv.output,
320
+ outputFile: argv['output-file'],
304
321
  pattern: argv.pattern,
305
322
  progress: argv.progress,
306
323
  quiet: argv.quiet,
@@ -314,111 +331,349 @@ export const main = async (
314
331
  process.exit(exitCode);
315
332
  },
316
333
  )
317
- .command(
318
- 'history <subcommand> [args..]',
319
- 'View and manage benchmark history',
320
- (yargs) => {
321
- return yargs
322
- .positional('subcommand', {
323
- choices: [
324
- 'list',
325
- 'show',
326
- 'compare',
327
- 'trends',
328
- 'clean',
329
- 'export',
330
- ] as const,
331
- demandOption: true,
332
- describe: 'History subcommand',
333
- type: 'string',
334
- })
335
- .positional('args', {
336
- array: true,
337
- describe: 'Additional arguments for the subcommand',
338
- type: 'string',
339
- })
340
- .option('since', {
341
- description:
342
- 'Show runs since date (ISO 8601 or relative like "1 week ago")',
343
- type: 'string',
344
- })
345
- .option('until', {
346
- description:
347
- 'Show runs until date (ISO 8601 or relative like "1 day ago")',
348
- type: 'string',
349
- })
350
- .option('pattern', {
351
- description: 'Filter by benchmark name pattern',
352
- type: 'string',
353
- })
354
- .option('tags', {
355
- description: 'Filter by tags',
356
- type: 'array',
357
- })
358
- .option('limit', {
359
- default: 10,
360
- description: 'Maximum number of results',
361
- type: 'number',
362
- })
363
- .option('format', {
364
- choices: ['human', 'json', 'csv'] as const,
365
- default: 'human' as const,
366
- description: 'Output format',
367
- type: 'string',
368
- })
369
- .option('maxAge', {
370
- description: 'Maximum age in days for cleanup',
371
- type: 'number',
372
- })
373
- .option('maxRuns', {
374
- description: 'Maximum number of runs to keep',
375
- type: 'number',
376
- })
377
- .option('maxSize', {
378
- description: 'Maximum storage size in bytes',
379
- type: 'number',
380
- })
381
- .option('confirm', {
382
- default: false,
383
- description: 'Confirm cleanup operations',
384
- type: 'boolean',
385
- })
386
- .option('output', {
387
- description: 'Output file path',
388
- type: 'string',
389
- })
390
- .example([
391
- ['$0 history list', 'List recent benchmark runs'],
392
- ['$0 history show <run-id>', 'Show detailed results for run'],
393
- ['$0 history compare <run-id1> <run-id2>', 'Compare two runs'],
394
- ['$0 history trends [pattern]', 'Show performance trends'],
395
- ['$0 history clean --max-runs 50', 'Keep only latest 50 runs'],
396
- ['$0 history export --format csv', 'Export to CSV'],
397
- ]);
398
- },
399
- async (argv) => {
400
- const context = await createCliContext(argv, abortController!);
401
- const exitCode = await historyCommand(context, {
402
- args: argv.args,
403
- confirm: argv.confirm,
404
- cwd: argv.cwd,
405
- format: argv.format,
406
- limit: argv.limit,
407
- maxAge: argv.maxAge,
408
- maxRuns: argv.maxRuns,
409
- maxSize: argv.maxSize,
410
- outputDir: argv.output,
411
- pattern: argv.pattern,
412
- quiet: Boolean(argv.quiet),
413
- since: argv.since,
414
- subcommand: argv.subcommand,
415
- tags: argv.tags as string[] | undefined,
416
- until: argv.until,
417
- verbose: argv.verbose,
418
- });
419
- process.exit(exitCode);
420
- },
421
- )
334
+ .command('history', 'View and manage benchmark history', (yargs) => {
335
+ return yargs
336
+ .command(
337
+ 'list',
338
+ 'List recent benchmark runs',
339
+ (yargs) => {
340
+ return yargs
341
+ .option('since', {
342
+ description:
343
+ 'Show runs since date (ISO 8601 or relative like "1 week ago")',
344
+ type: 'string',
345
+ })
346
+ .option('until', {
347
+ description:
348
+ 'Show runs until date (ISO 8601 or relative like "1 day ago")',
349
+ type: 'string',
350
+ })
351
+ .option('pattern', {
352
+ description: 'Filter by benchmark name pattern',
353
+ type: 'string',
354
+ })
355
+ .option('tags', {
356
+ description: 'Filter by tags (comma-separated)',
357
+ type: 'array',
358
+ })
359
+ .option('limit', {
360
+ default: 10,
361
+ description: 'Maximum number of results',
362
+ type: 'number',
363
+ })
364
+ .option('format', {
365
+ choices: ['human', 'json', 'csv'] as const,
366
+ default: 'human' as const,
367
+ description: 'Output format',
368
+ type: 'string',
369
+ })
370
+ .example([
371
+ ['$0 history list', 'List recent benchmark runs'],
372
+ [
373
+ '$0 history list --since "1 week ago"',
374
+ 'List runs from last week',
375
+ ],
376
+ ['$0 history list --limit 20', 'List 20 most recent runs'],
377
+ ['$0 history list --format json', 'List runs in JSON format'],
378
+ ]);
379
+ },
380
+ async (argv) => {
381
+ const context = await createCliContext(argv, abortController!);
382
+ const exitCode = await handleListCommand(context, {
383
+ cwd: argv.cwd,
384
+ format: argv.format,
385
+ limit: argv.limit,
386
+ pattern: argv.pattern,
387
+ quiet: Boolean(argv.quiet),
388
+ since: argv.since,
389
+ tags: argv.tags as string[] | undefined,
390
+ until: argv.until,
391
+ verbose: argv.verbose,
392
+ });
393
+ process.exit(exitCode);
394
+ },
395
+ )
396
+ .command(
397
+ 'show <run-id>',
398
+ 'Show detailed results for a specific run',
399
+ (yargs) => {
400
+ return yargs
401
+ .positional('run-id', {
402
+ describe: 'ID of the benchmark run to show',
403
+ type: 'string',
404
+ })
405
+ .option('format', {
406
+ choices: ['human', 'json', 'csv'] as const,
407
+ default: 'human' as const,
408
+ description: 'Output format',
409
+ type: 'string',
410
+ })
411
+ .example([
412
+ [
413
+ '$0 history show abc123',
414
+ 'Show detailed results for run abc123',
415
+ ],
416
+ [
417
+ '$0 history show abc123 --format json',
418
+ 'Show run in JSON format',
419
+ ],
420
+ ]);
421
+ },
422
+ async (argv) => {
423
+ const context = await createCliContext(argv, abortController!);
424
+ const exitCode = await handleShowCommand(context, {
425
+ cwd: argv.cwd,
426
+ format: argv.format,
427
+ quiet: Boolean(argv.quiet),
428
+ runId: String(argv['run-id']),
429
+ verbose: argv.verbose,
430
+ });
431
+ process.exit(exitCode);
432
+ },
433
+ )
434
+ .command(
435
+ 'compare <run-id1> <run-id2>',
436
+ 'Compare two benchmark runs',
437
+ (yargs) => {
438
+ return yargs
439
+ .positional('run-id1', {
440
+ describe: 'ID of the first benchmark run',
441
+ type: 'string',
442
+ })
443
+ .positional('run-id2', {
444
+ describe: 'ID of the second benchmark run',
445
+ type: 'string',
446
+ })
447
+ .option('format', {
448
+ choices: ['human', 'json'] as const,
449
+ default: 'human' as const,
450
+ description: 'Output format',
451
+ type: 'string',
452
+ })
453
+ .example([
454
+ ['$0 history compare abc123 def456', 'Compare two runs'],
455
+ [
456
+ '$0 history compare abc123 def456 --format json',
457
+ 'Compare in JSON format',
458
+ ],
459
+ ]);
460
+ },
461
+ async (argv) => {
462
+ const context = await createCliContext(argv, abortController!);
463
+ const exitCode = await handleCompareCommand(context, {
464
+ cwd: argv.cwd,
465
+ format: argv.format,
466
+ quiet: Boolean(argv.quiet),
467
+ runId1: String(argv['run-id1']),
468
+ runId2: String(argv['run-id2']),
469
+ verbose: argv.verbose,
470
+ });
471
+ process.exit(exitCode);
472
+ },
473
+ )
474
+ .command(
475
+ 'trends [pattern]',
476
+ 'Show performance trends over time',
477
+ (yargs) => {
478
+ return yargs
479
+ .positional('pattern', {
480
+ describe: 'Filter by benchmark name pattern',
481
+ type: 'string',
482
+ })
483
+ .option('since', {
484
+ description:
485
+ 'Show trends since date (ISO 8601 or relative like "1 week ago")',
486
+ type: 'string',
487
+ })
488
+ .option('until', {
489
+ description:
490
+ 'Show trends until date (ISO 8601 or relative like "1 day ago")',
491
+ type: 'string',
492
+ })
493
+ .option('tags', {
494
+ description: 'Filter by tags (comma-separated)',
495
+ type: 'array',
496
+ })
497
+ .option('limit', {
498
+ description: 'Maximum number of runs to analyze',
499
+ type: 'number',
500
+ })
501
+ .option('all', {
502
+ alias: 'a',
503
+ default: false,
504
+ description: 'Analyze all runs (ignore limit)',
505
+ type: 'boolean',
506
+ })
507
+ .option('format', {
508
+ choices: ['human', 'json'] as const,
509
+ default: 'human' as const,
510
+ description: 'Output format',
511
+ type: 'string',
512
+ })
513
+ .example([
514
+ [
515
+ '$0 history trends',
516
+ 'Show performance trends for all benchmarks',
517
+ ],
518
+ [
519
+ '$0 history trends --since "1 month ago"',
520
+ 'Show trends from last month',
521
+ ],
522
+ [
523
+ '$0 history trends "array-*"',
524
+ 'Show trends for array benchmarks',
525
+ ],
526
+ [
527
+ '$0 history trends --format json',
528
+ 'Output trends in JSON format',
529
+ ],
530
+ ]);
531
+ },
532
+ async (argv) => {
533
+ const context = await createCliContext(argv, abortController!);
534
+ const exitCode = await handleTrendsCommand(context, {
535
+ all: Boolean(argv.all),
536
+ cwd: argv.cwd,
537
+ format: argv.format,
538
+ limit: argv.limit,
539
+ pattern: argv.pattern,
540
+ quiet: Boolean(argv.quiet),
541
+ since: argv.since,
542
+ tags: argv.tags as string[] | undefined,
543
+ until: argv.until,
544
+ verbose: argv.verbose,
545
+ });
546
+ process.exit(exitCode);
547
+ },
548
+ )
549
+ .command(
550
+ 'clean',
551
+ 'Clean up old benchmark history',
552
+ (yargs) => {
553
+ return yargs
554
+ .option('max-age', {
555
+ description: 'Remove runs older than this many days',
556
+ type: 'number',
557
+ })
558
+ .option('max-runs', {
559
+ description: 'Keep only this many most recent runs',
560
+ type: 'number',
561
+ })
562
+ .option('max-size', {
563
+ description: 'Keep history under this size in bytes',
564
+ type: 'number',
565
+ })
566
+ .option('confirm', {
567
+ default: false,
568
+ description: 'Confirm cleanup without prompting',
569
+ type: 'boolean',
570
+ })
571
+ .check((argv) => {
572
+ if (
573
+ !argv['max-age'] &&
574
+ !argv['max-runs'] &&
575
+ !argv['max-size']
576
+ ) {
577
+ throw new Error(
578
+ 'At least one cleanup criterion must be specified (--max-age, --max-runs, or --max-size)',
579
+ );
580
+ }
581
+ return true;
582
+ })
583
+ .example([
584
+ [
585
+ '$0 history clean --max-runs 50 --confirm',
586
+ 'Keep only latest 50 runs',
587
+ ],
588
+ [
589
+ '$0 history clean --max-age 30',
590
+ 'Preview removing runs older than 30 days',
591
+ ],
592
+ [
593
+ '$0 history clean --max-size 10485760',
594
+ 'Keep history under 10MB',
595
+ ],
596
+ ]);
597
+ },
598
+ async (argv) => {
599
+ const context = await createCliContext(argv, abortController!);
600
+ const exitCode = await handleCleanCommand(context, {
601
+ confirm: argv.confirm,
602
+ cwd: argv.cwd,
603
+ maxAge: argv['max-age'],
604
+ maxRuns: argv['max-runs'],
605
+ maxSize: argv['max-size'],
606
+ quiet: Boolean(argv.quiet),
607
+ verbose: argv.verbose,
608
+ });
609
+ process.exit(exitCode);
610
+ },
611
+ )
612
+ .command(
613
+ 'export',
614
+ 'Export benchmark history to a file',
615
+ (yargs) => {
616
+ return yargs
617
+ .option('format', {
618
+ choices: ['json', 'csv'] as const,
619
+ default: 'json' as const,
620
+ description: 'Export format',
621
+ type: 'string',
622
+ })
623
+ .option('output', {
624
+ alias: 'o',
625
+ demandOption: true,
626
+ description: 'Output file path',
627
+ type: 'string',
628
+ })
629
+ .option('since', {
630
+ description: 'Export runs since date',
631
+ type: 'string',
632
+ })
633
+ .option('until', {
634
+ description: 'Export runs until date',
635
+ type: 'string',
636
+ })
637
+ .example([
638
+ [
639
+ '$0 history export -o history.json',
640
+ 'Export all history to JSON',
641
+ ],
642
+ [
643
+ '$0 history export -o history.csv --format csv',
644
+ 'Export to CSV',
645
+ ],
646
+ [
647
+ '$0 history export -o recent.json --since "1 week ago"',
648
+ 'Export recent runs',
649
+ ],
650
+ ]);
651
+ },
652
+ async (argv) => {
653
+ const context = await createCliContext(argv, abortController!);
654
+ const exitCode = await handleExportCommand(context, {
655
+ cwd: argv.cwd,
656
+ format: argv.format,
657
+ outputPath: argv.output,
658
+ quiet: Boolean(argv.quiet),
659
+ since: argv.since,
660
+ until: argv.until,
661
+ verbose: argv.verbose,
662
+ });
663
+ process.exit(exitCode);
664
+ },
665
+ )
666
+ .demandCommand(1, 'You must specify a history subcommand')
667
+ .strict()
668
+ .example([
669
+ ['$0 history list', 'List recent benchmark runs'],
670
+ ['$0 history show <run-id>', 'Show detailed results'],
671
+ ['$0 history compare <run-id1> <run-id2>', 'Compare two runs'],
672
+ ['$0 history trends', 'Show performance trends'],
673
+ ['$0 history clean --max-runs 50', 'Keep only latest 50 runs'],
674
+ ['$0 history export -o data.json', 'Export history'],
675
+ ]);
676
+ })
422
677
  .command(
423
678
  'init [type]',
424
679
  'Initialize a new benchmark project',
@@ -571,7 +826,6 @@ const createCliContext = async (
571
826
  abortController,
572
827
  configManager: engine.configManager,
573
828
  engine,
574
- errorManager: engine.errorManager,
575
829
  historyStorage: engine.historyStorage,
576
830
  options,
577
831
  progressManager: engine.progressManager,
@@ -596,9 +850,7 @@ const setupSignalHandlers = (abortController: AbortController): void => {
596
850
  if (abortRequested) {
597
851
  // Second signal, force exit
598
852
  console.log(`\nReceived ${signal} again, forcing exit...`);
599
- process.exit(
600
- 128 + (signal === 'SIGINT' ? 2 : signal === 'SIGQUIT' ? 3 : 15),
601
- );
853
+ process.exit(computeExitCode(signal));
602
854
  }
603
855
 
604
856
  console.log(`\nReceived ${signal}, aborting benchmarks...`);
@@ -608,9 +860,7 @@ const setupSignalHandlers = (abortController: AbortController): void => {
608
860
  // Give a short grace period for cleanup, then exit
609
861
  setTimeout(() => {
610
862
  console.log('\nBenchmark aborted.');
611
- process.exit(
612
- 128 + (signal === 'SIGINT' ? 2 : signal === 'SIGQUIT' ? 3 : 15),
613
- );
863
+ process.exit(computeExitCode(signal));
614
864
  }, 100);
615
865
  };
616
866
 
@@ -618,13 +868,27 @@ const setupSignalHandlers = (abortController: AbortController): void => {
618
868
  process.on('SIGQUIT', () => handleSignal('SIGQUIT'));
619
869
  process.on('SIGTERM', () => handleSignal('SIGTERM'));
620
870
 
621
- process.on('uncaughtException', (error) => {
622
- console.error('Uncaught exception:', error);
871
+ process.once('uncaughtException', (error) => {
872
+ // Wrap non-ModestBench errors with UnknownError
873
+ const wrappedError: Error = isModestBenchError(error)
874
+ ? error
875
+ : new UnknownError(
876
+ error instanceof Error ? error.message : String(error),
877
+ { cause: error },
878
+ );
879
+ console.error(wrappedError.toString());
623
880
  process.exit(ExitCodes.RUNTIME_ERROR);
624
881
  });
625
882
 
626
- process.on('unhandledRejection', (reason, promise) => {
627
- console.error('Unhandled rejection at:', promise, 'reason:', reason);
883
+ process.once('unhandledRejection', (reason) => {
884
+ // Wrap non-ModestBench errors with UnknownError
885
+ const wrappedError: Error = isModestBenchError(reason)
886
+ ? (reason as Error)
887
+ : new UnknownError(
888
+ reason instanceof Error ? reason.message : String(reason),
889
+ { cause: reason },
890
+ );
891
+ console.error(wrappedError.toString());
628
892
  process.exit(ExitCodes.RUNTIME_ERROR);
629
893
  });
630
894
  };
@@ -647,3 +911,13 @@ try {
647
911
  cli();
648
912
  }
649
913
  }
914
+
915
+ /**
916
+ * Compute the exit code based on the signal
917
+ *
918
+ * @param signal - The signal that caused the exit
919
+ * @returns The exit code
920
+ */
921
+ const computeExitCode = (signal: string): number => {
922
+ return 128 + (signal === 'SIGINT' ? 2 : signal === 'SIGQUIT' ? 3 : 15);
923
+ };
package/src/constants.ts CHANGED
@@ -19,3 +19,63 @@ export const BENCHMARK_FILE_PATTERN = `.bench.{${Array.from(
19
19
  )
20
20
  .map((ext) => ext.slice(1))
21
21
  .join(',')}}`;
22
+
23
+ /**
24
+ * Error codes for all ModestBench errors
25
+ *
26
+ * Use these constants to check error types instead of instanceof checks.
27
+ */
28
+ export const ErrorCodes = {
29
+ //#region cli-errors
30
+ CLI_INVALID_ARGUMENT: 'ERR_MB_CLI_INVALID_ARGUMENT',
31
+ CLI_INVALID_DATE_FORMAT: 'ERR_MB_CLI_INVALID_DATE_FORMAT',
32
+ //#endregion
33
+
34
+ //#region config-errors
35
+ CONFIG_LOAD_FAILED: 'ERR_MB_CONFIG_LOAD_FAILED',
36
+ CONFIG_NOT_FOUND: 'ERR_MB_CONFIG_NOT_FOUND',
37
+ CONFIG_UNSUPPORTED_FORMAT: 'ERR_MB_CONFIG_UNSUPPORTED_FORMAT',
38
+ CONFIG_VALIDATION_FAILED: 'ERR_MB_CONFIG_VALIDATION_FAILED',
39
+ //#endregion
40
+
41
+ //#region execution-errors
42
+ EXECUTION_BENCHMARK_FAILED: 'ERR_MB_EXECUTION_BENCHMARK_FAILED',
43
+ EXECUTION_SETUP_FAILED: 'ERR_MB_EXECUTION_SETUP_FAILED',
44
+ EXECUTION_TASK_FAILED: 'ERR_MB_EXECUTION_TASK_FAILED',
45
+ EXECUTION_TEARDOWN_FAILED: 'ERR_MB_EXECUTION_TEARDOWN_FAILED',
46
+ EXECUTION_TIMEOUT: 'ERR_MB_EXECUTION_TIMEOUT',
47
+ EXECUTION_TOO_FAST: 'ERR_MB_EXECUTION_TOO_FAST',
48
+ //#endregion
49
+
50
+ //#region file-errors
51
+ FILE_DISCOVERY_FAILED: 'ERR_MB_FILE_DISCOVERY_FAILED',
52
+ FILE_LOAD_FAILED: 'ERR_MB_FILE_LOAD_FAILED',
53
+ FILE_NOT_FOUND: 'ERR_MB_FILE_NOT_FOUND',
54
+ FILE_PERMISSION_DENIED: 'ERR_MB_FILE_PERMISSION_DENIED',
55
+ FILE_UNSUPPORTED_EXTENSION: 'ERR_MB_FILE_UNSUPPORTED_EXTENSION',
56
+ //#endregion
57
+
58
+ //#region reporter-errors
59
+ REPORTER_ALREADY_REGISTERED: 'ERR_MB_REPORTER_ALREADY_REGISTERED',
60
+ REPORTER_OUTPUT_FAILED: 'ERR_MB_REPORTER_OUTPUT_FAILED',
61
+ REPORTER_UNKNOWN: 'ERR_MB_REPORTER_UNKNOWN',
62
+ //#endregion
63
+
64
+ //#region storage-errors
65
+ STORAGE_CORRUPTION: 'ERR_MB_STORAGE_CORRUPTION',
66
+ STORAGE_EXPORT_UNSUPPORTED: 'ERR_MB_STORAGE_EXPORT_UNSUPPORTED',
67
+ STORAGE_FAILED: 'ERR_MB_STORAGE_FAILED',
68
+ STORAGE_INDEX_CORRUPTION: 'ERR_MB_STORAGE_INDEX_CORRUPTION',
69
+ STORAGE_INSUFFICIENT_SPACE: 'ERR_MB_STORAGE_INSUFFICIENT_SPACE',
70
+ //#endregion
71
+
72
+ //#region misc-errors
73
+ UNKNOWN: 'ERR_MB_UNKNOWN',
74
+ //#endregion
75
+
76
+ //#region validation-errors
77
+ VALIDATION_SCHEMA_FAILED: 'ERR_MB_VALIDATION_SCHEMA_FAILED',
78
+ VALIDATION_STRUCTURE_INVALID: 'ERR_MB_VALIDATION_STRUCTURE_INVALID',
79
+ VALIDATION_TYPE_FAILED: 'ERR_MB_VALIDATION_TYPE_FAILED',
80
+ //#endregion
81
+ } as const;