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,55 @@
1
+ /**
2
+ * ModestBench File Loader
3
+ *
4
+ * Handles discovery, loading, and validation of benchmark files. Supports glob
5
+ * pattern matching and file structure validation.
6
+ */
7
+ import type { BenchmarkFile, FileLoader, ValidationResult } from "../types/index.js";
8
+ /**
9
+ * File change notification for watch functionality
10
+ */
11
+ interface FileChange {
12
+ readonly filePath: string;
13
+ readonly timestamp: Date;
14
+ readonly type: 'added' | 'deleted' | 'modified';
15
+ }
16
+ /**
17
+ * File watcher interface
18
+ */
19
+ interface FileWatcher {
20
+ close(): void;
21
+ }
22
+ /**
23
+ * Implementation of FileLoader for benchmark files
24
+ */
25
+ export declare class BenchmarkFileLoader implements FileLoader {
26
+ private readonly supportedExtensions;
27
+ /**
28
+ * Discover benchmark files using glob patterns or explicit file paths
29
+ */
30
+ discover(pattern: string | string[], exclude?: string[]): Promise<string[]>;
31
+ /**
32
+ * Load a single benchmark file
33
+ */
34
+ load(filePath: string): Promise<BenchmarkFile>;
35
+ /**
36
+ * Load multiple files in parallel
37
+ */
38
+ loadAll(filePaths: string[]): Promise<BenchmarkFile[]>;
39
+ /**
40
+ * Validate benchmark file (basic checks only - file existence and extension)
41
+ * Structure validation happens after loading in the load() method
42
+ */
43
+ validate(filePath: string): Promise<ValidationResult>;
44
+ /**
45
+ * Watch for file changes (placeholder implementation)
46
+ */
47
+ watch(_pattern: string, _callback: (changes: FileChange[]) => void): FileWatcher;
48
+ /**
49
+ * Validate the structure of loaded exports using Zod schema Returns the
50
+ * transformed/normalized data if validation succeeds
51
+ */
52
+ private validateExports;
53
+ }
54
+ export {};
55
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/core/loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAEV,aAAa,EACb,UAAU,EAEV,gBAAgB,EAEjB,0BAA0B;AAQ3B;;GAEG;AACH,UAAU,UAAU;IAClB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;CACjD;AAED;;GAEG;AACH,UAAU,WAAW;IACnB,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;GAEG;AACH,qBAAa,mBAAoB,YAAW,UAAU;IACpD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA6B;IAEjE;;OAEG;IACG,QAAQ,CACZ,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,GAAE,MAAM,EAAO,GACrB,OAAO,CAAC,MAAM,EAAE,CAAC;IA4DpB;;OAEG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA4EpD;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAW5D;;;OAGG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAoD3D;;OAEG;IACH,KAAK,CACH,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,IAAI,GACzC,WAAW;IAUd;;;OAGG;IACH,OAAO,CAAC,eAAe;CAwCxB"}
@@ -0,0 +1,250 @@
1
+ /**
2
+ * ModestBench File Loader
3
+ *
4
+ * Handles discovery, loading, and validation of benchmark files. Supports glob
5
+ * pattern matching and file structure validation.
6
+ */
7
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
8
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
9
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
10
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
11
+ });
12
+ }
13
+ return path;
14
+ };
15
+ import { glob } from 'glob';
16
+ import { access, readFile, stat } from 'node:fs/promises';
17
+ import { extname } from 'node:path';
18
+ import { BENCHMARK_FILE_EXTENSIONS, BENCHMARK_FILE_PATTERN, } from "../constants.js";
19
+ import { benchmarkFileSchema } from "./benchmark-schema.js";
20
+ /**
21
+ * Implementation of FileLoader for benchmark files
22
+ */
23
+ export class BenchmarkFileLoader {
24
+ supportedExtensions = BENCHMARK_FILE_EXTENSIONS;
25
+ /**
26
+ * Discover benchmark files using glob patterns or explicit file paths
27
+ */
28
+ async discover(pattern, exclude = []) {
29
+ try {
30
+ let patterns = Array.isArray(pattern) ? pattern : [pattern];
31
+ // Handle empty patterns - use sensible defaults
32
+ if (patterns.length === 0) {
33
+ patterns = [
34
+ `*${BENCHMARK_FILE_PATTERN}`, // top-level current directory
35
+ `bench/*${BENCHMARK_FILE_PATTERN}`, // top-level bench/ directory
36
+ ];
37
+ }
38
+ // Expand directory paths to recursive glob patterns
39
+ const expandedPatterns = [];
40
+ for (const p of patterns) {
41
+ try {
42
+ const stats = await stat(p);
43
+ if (stats.isDirectory()) {
44
+ // Directory: search recursively
45
+ expandedPatterns.push(`${p}/**/*${BENCHMARK_FILE_PATTERN}`);
46
+ }
47
+ else {
48
+ // File or doesn't exist: use as-is (glob will handle it)
49
+ expandedPatterns.push(p);
50
+ }
51
+ }
52
+ catch {
53
+ // Path doesn't exist, treat as glob pattern
54
+ expandedPatterns.push(p);
55
+ }
56
+ }
57
+ const allFiles = new Set();
58
+ // Process each pattern
59
+ for (const p of expandedPatterns) {
60
+ const files = await glob(p, {
61
+ absolute: true,
62
+ ignore: exclude,
63
+ nodir: true,
64
+ });
65
+ // Add discovered files to the set (automatic deduplication)
66
+ for (const file of files) {
67
+ allFiles.add(file);
68
+ }
69
+ }
70
+ // Filter to supported file extensions
71
+ const supportedFiles = Array.from(allFiles).filter((file) => {
72
+ const ext = extname(file);
73
+ return this.supportedExtensions.has(ext);
74
+ });
75
+ return supportedFiles.sort();
76
+ }
77
+ catch (error) {
78
+ throw new Error(`File discovery failed: ${error instanceof Error ? error.message : String(error)}`);
79
+ }
80
+ }
81
+ /**
82
+ * Load a single benchmark file
83
+ */
84
+ async load(filePath) {
85
+ try {
86
+ // Basic file checks (existence, extension)
87
+ const basicValidation = await this.validate(filePath);
88
+ if (!basicValidation.valid) {
89
+ throw new Error(`Invalid benchmark file: ${basicValidation.errors.map((e) => e.message).join(', ')}`);
90
+ }
91
+ // Read file content
92
+ const content = await readFile(filePath, 'utf-8');
93
+ // Get file stats for metadata
94
+ const stats = await stat(filePath);
95
+ // Load the module using dynamic import
96
+ const ext = extname(filePath);
97
+ let module;
98
+ if (ext === '.ts' || ext === '.mts' || ext === '.cts') {
99
+ // For TypeScript files, use cosmiconfig-typescript-loader
100
+ const { TypeScriptLoader: createTypeScriptLoader } = await import('cosmiconfig-typescript-loader');
101
+ const loader = createTypeScriptLoader();
102
+ module = (await loader(filePath, content));
103
+ }
104
+ else {
105
+ // Use native dynamic import for JavaScript files with cache busting
106
+ // Add timestamp to prevent module caching issues across multiple loads
107
+ const timestamp = Date.now();
108
+ module = (await import(__rewriteRelativeImportExtension(`${filePath}?t=${timestamp}`)));
109
+ }
110
+ const exports = module.default || module;
111
+ // Validate the loaded exports structure with Zod
112
+ const structureValidation = this.validateExports(filePath, exports);
113
+ if (!structureValidation.valid || !structureValidation.data) {
114
+ throw new Error(`Invalid benchmark structure: ${structureValidation.errors.map((e) => e.message).join(', ')}`);
115
+ }
116
+ // Use the transformed/normalized data from Zod
117
+ // (this ensures shorthand functions are properly wrapped)
118
+ const normalizedExports = structureValidation.data;
119
+ // Analyze exports for metadata (simplified - structure already validated)
120
+ const hasDefaultExport = module.default !== undefined;
121
+ const exportNames = Object.keys(module);
122
+ return {
123
+ content,
124
+ exports: normalizedExports,
125
+ filePath,
126
+ metadata: {
127
+ exportNames,
128
+ hasDefaultExport,
129
+ mtime: stats.mtime,
130
+ size: stats.size,
131
+ },
132
+ };
133
+ }
134
+ catch (error) {
135
+ throw new Error(`Failed to load file ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
136
+ }
137
+ }
138
+ /**
139
+ * Load multiple files in parallel
140
+ */
141
+ async loadAll(filePaths) {
142
+ try {
143
+ const loadPromises = filePaths.map((filePath) => this.load(filePath));
144
+ return await Promise.all(loadPromises);
145
+ }
146
+ catch (error) {
147
+ throw new Error(`Failed to load files: ${error instanceof Error ? error.message : String(error)}`);
148
+ }
149
+ }
150
+ /**
151
+ * Validate benchmark file (basic checks only - file existence and extension)
152
+ * Structure validation happens after loading in the load() method
153
+ */
154
+ async validate(filePath) {
155
+ const errors = [];
156
+ const warnings = [];
157
+ try {
158
+ // Check file existence
159
+ try {
160
+ await access(filePath);
161
+ }
162
+ catch {
163
+ errors.push({
164
+ code: 'FILE_NOT_FOUND',
165
+ file: filePath,
166
+ message: 'File does not exist',
167
+ severity: 'error',
168
+ });
169
+ return { errors, files: [], valid: false, warnings };
170
+ }
171
+ // Check file extension
172
+ const ext = extname(filePath);
173
+ if (!this.supportedExtensions.has(ext)) {
174
+ errors.push({
175
+ code: 'UNSUPPORTED_EXTENSION',
176
+ file: filePath,
177
+ message: `Unsupported file extension: ${ext}. Supported extensions: ${Array.from(this.supportedExtensions).join(', ')}`,
178
+ severity: 'error',
179
+ });
180
+ }
181
+ return {
182
+ errors,
183
+ files: [filePath],
184
+ valid: errors.length === 0,
185
+ warnings,
186
+ };
187
+ }
188
+ catch (error) {
189
+ errors.push({
190
+ code: 'VALIDATION_ERROR',
191
+ file: filePath,
192
+ message: `Validation failed: ${error instanceof Error ? error.message : String(error)}`,
193
+ severity: 'error',
194
+ });
195
+ return {
196
+ errors,
197
+ files: [filePath],
198
+ valid: false,
199
+ warnings,
200
+ };
201
+ }
202
+ }
203
+ /**
204
+ * Watch for file changes (placeholder implementation)
205
+ */
206
+ watch(_pattern, _callback) {
207
+ // TODO: Implement file watching with chokidar or similar
208
+ // For now, return a no-op watcher
209
+ return {
210
+ close() {
211
+ // No-op
212
+ },
213
+ };
214
+ }
215
+ /**
216
+ * Validate the structure of loaded exports using Zod schema Returns the
217
+ * transformed/normalized data if validation succeeds
218
+ */
219
+ validateExports(filePath, exports) {
220
+ const errors = [];
221
+ const warnings = [];
222
+ try {
223
+ const result = benchmarkFileSchema.safeParse(exports);
224
+ if (!result.success) {
225
+ for (const issue of result.error.issues) {
226
+ const path = issue.path.length > 0 ? `${issue.path.join('.')}: ` : '';
227
+ errors.push({
228
+ code: 'INVALID_STRUCTURE',
229
+ file: filePath,
230
+ message: `${path}${issue.message}`,
231
+ severity: 'error',
232
+ });
233
+ }
234
+ return { errors, valid: false, warnings };
235
+ }
236
+ // Return the transformed data (with shorthand functions normalized)
237
+ return { data: result.data, errors, valid: true, warnings };
238
+ }
239
+ catch (error) {
240
+ errors.push({
241
+ code: 'VALIDATION_ERROR',
242
+ file: filePath,
243
+ message: `Structure validation failed: ${error instanceof Error ? error.message : String(error)}`,
244
+ severity: 'error',
245
+ });
246
+ return { errors, valid: false, warnings };
247
+ }
248
+ }
249
+ }
250
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/core/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ /**
3
+ * Statistical utility functions for benchmark result analysis
4
+ *
5
+ * Provides IQR-based outlier removal and comprehensive statistics calculation
6
+ * adapted from bench-node's StatisticalHistogram.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.removeOutliersIQR = exports.calculateStatistics = void 0;
10
+ /**
11
+ * Calculate comprehensive statistics from samples
12
+ *
13
+ * Adapted from bench-node's StatisticalHistogram. Assumes samples are already
14
+ * sorted (e.g., from removeOutliersIQR output).
15
+ *
16
+ * @param samples - Sample values (should be sorted for accurate percentiles)
17
+ * @returns Computed statistics
18
+ */
19
+ const calculateStatistics = (samples) => {
20
+ if (samples.length === 0) {
21
+ return {
22
+ cv: 0,
23
+ marginOfError: 0,
24
+ max: 0,
25
+ mean: 0,
26
+ min: 0,
27
+ p95: 0,
28
+ p99: 0,
29
+ stdDev: 0,
30
+ variance: 0,
31
+ };
32
+ }
33
+ // Min/Max (samples are already sorted from removeOutliersIQR)
34
+ const min = samples[0];
35
+ const max = samples[samples.length - 1];
36
+ // Mean
37
+ const mean = samples.length === 1
38
+ ? samples[0]
39
+ : samples.reduce((acc, v) => Math.min(Number.MAX_SAFE_INTEGER, acc + v), 0) / samples.length;
40
+ // Standard deviation and variance
41
+ let stdDev = 0;
42
+ let variance = 0;
43
+ if (samples.length >= 2) {
44
+ variance =
45
+ samples.reduce((acc, v) => acc + Math.pow(v - mean, 2), 0) /
46
+ (samples.length - 1);
47
+ stdDev = Math.sqrt(variance);
48
+ }
49
+ // Coefficient of Variation
50
+ const cv = mean === 0 || samples.length < 2 ? 0 : (stdDev / mean) * 100;
51
+ // Margin of Error (95% confidence)
52
+ const Z = 1.96;
53
+ const marginOfError = samples.length === 0 ? 0 : (Z * stdDev) / Math.sqrt(samples.length);
54
+ // Percentiles (using standard formula: floor((n-1) * p))
55
+ const p95 = samples[Math.floor((samples.length - 1) * 0.95)] ?? 0;
56
+ const p99 = samples[Math.floor((samples.length - 1) * 0.99)] ?? 0;
57
+ return { cv, marginOfError, max, mean, min, p95, p99, stdDev, variance };
58
+ };
59
+ exports.calculateStatistics = calculateStatistics;
60
+ /**
61
+ * Remove outliers using Interquartile Range (IQR) method
62
+ *
63
+ * Adapted from bench-node's StatisticalHistogram.removeOutliers. Filters values
64
+ * outside [Q1 - 1.5×IQR, Q3 + 1.5×IQR] range.
65
+ *
66
+ * @param samples - Raw sample values (will be sorted internally)
67
+ * @returns Filtered samples with outliers removed
68
+ */
69
+ const removeOutliersIQR = (samples) => {
70
+ if (samples.length < 4) {
71
+ return samples;
72
+ }
73
+ const sorted = samples.slice().sort((a, b) => a - b);
74
+ // Calculate Q1 and Q3
75
+ let q1;
76
+ let q3;
77
+ const size = sorted.length;
78
+ if (((size - 1) / 4) % 1 === 0 || (size / 4) % 1 === 0) {
79
+ q1 =
80
+ (1 / 2) *
81
+ (sorted[Math.floor(size / 4) - 1] + sorted[Math.floor(size / 4)]);
82
+ q3 =
83
+ (1 / 2) *
84
+ (sorted[Math.ceil((size * 3) / 4) - 1] +
85
+ sorted[Math.ceil((size * 3) / 4)]);
86
+ }
87
+ else {
88
+ q1 = sorted[Math.floor(size / 4)];
89
+ q3 = sorted[Math.floor((size * 3) / 4)];
90
+ }
91
+ // Calculate IQR and bounds
92
+ const iqr = q3 - q1;
93
+ const minValue = q1 - iqr * 1.5;
94
+ const maxValue = q3 + iqr * 1.5;
95
+ // Filter outliers
96
+ return sorted.filter((value) => value <= maxValue && value >= minValue);
97
+ };
98
+ exports.removeOutliersIQR = removeOutliersIQR;
99
+ //# sourceMappingURL=stats-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats-utils.js","sourceRoot":"","sources":["../../src/core/stats-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Statistical utility functions for benchmark result analysis
3
+ *
4
+ * Provides IQR-based outlier removal and comprehensive statistics calculation
5
+ * adapted from bench-node's StatisticalHistogram.
6
+ */
7
+ /**
8
+ * Statistics computed from sample data
9
+ */
10
+ export interface SampleStatistics {
11
+ /** Coefficient of variation (stdDev/mean × 100) */
12
+ readonly cv: number;
13
+ /** Margin of error at 95% confidence */
14
+ readonly marginOfError: number;
15
+ /** Maximum value */
16
+ readonly max: number;
17
+ /** Mean (average) value */
18
+ readonly mean: number;
19
+ /** Minimum value */
20
+ readonly min: number;
21
+ /** 95th percentile */
22
+ readonly p95: number;
23
+ /** 99th percentile */
24
+ readonly p99: number;
25
+ /** Standard deviation */
26
+ readonly stdDev: number;
27
+ /** Variance */
28
+ readonly variance: number;
29
+ }
30
+ /**
31
+ * Calculate comprehensive statistics from samples
32
+ *
33
+ * Adapted from bench-node's StatisticalHistogram. Assumes samples are already
34
+ * sorted (e.g., from removeOutliersIQR output).
35
+ *
36
+ * @param samples - Sample values (should be sorted for accurate percentiles)
37
+ * @returns Computed statistics
38
+ */
39
+ export declare const calculateStatistics: (samples: number[]) => SampleStatistics;
40
+ /**
41
+ * Remove outliers using Interquartile Range (IQR) method
42
+ *
43
+ * Adapted from bench-node's StatisticalHistogram.removeOutliers. Filters values
44
+ * outside [Q1 - 1.5×IQR, Q3 + 1.5×IQR] range.
45
+ *
46
+ * @param samples - Raw sample values (will be sorted internally)
47
+ * @returns Filtered samples with outliers removed
48
+ */
49
+ export declare const removeOutliersIQR: (samples: number[]) => number[];
50
+ //# sourceMappingURL=stats-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats-utils.d.ts","sourceRoot":"","sources":["../../src/core/stats-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,mDAAmD;IACnD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,oBAAoB;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,2BAA2B;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,oBAAoB;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,sBAAsB;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,sBAAsB;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,eAAe;IACf,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,GAAI,SAAS,MAAM,EAAE,KAAG,gBAmDvD,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,GAAI,SAAS,MAAM,EAAE,KAAG,MAAM,EAgC3D,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Statistical utility functions for benchmark result analysis
3
+ *
4
+ * Provides IQR-based outlier removal and comprehensive statistics calculation
5
+ * adapted from bench-node's StatisticalHistogram.
6
+ */
7
+ /**
8
+ * Statistics computed from sample data
9
+ */
10
+ export interface SampleStatistics {
11
+ /** Coefficient of variation (stdDev/mean × 100) */
12
+ readonly cv: number;
13
+ /** Margin of error at 95% confidence */
14
+ readonly marginOfError: number;
15
+ /** Maximum value */
16
+ readonly max: number;
17
+ /** Mean (average) value */
18
+ readonly mean: number;
19
+ /** Minimum value */
20
+ readonly min: number;
21
+ /** 95th percentile */
22
+ readonly p95: number;
23
+ /** 99th percentile */
24
+ readonly p99: number;
25
+ /** Standard deviation */
26
+ readonly stdDev: number;
27
+ /** Variance */
28
+ readonly variance: number;
29
+ }
30
+ /**
31
+ * Calculate comprehensive statistics from samples
32
+ *
33
+ * Adapted from bench-node's StatisticalHistogram. Assumes samples are already
34
+ * sorted (e.g., from removeOutliersIQR output).
35
+ *
36
+ * @param samples - Sample values (should be sorted for accurate percentiles)
37
+ * @returns Computed statistics
38
+ */
39
+ export declare const calculateStatistics: (samples: number[]) => SampleStatistics;
40
+ /**
41
+ * Remove outliers using Interquartile Range (IQR) method
42
+ *
43
+ * Adapted from bench-node's StatisticalHistogram.removeOutliers. Filters values
44
+ * outside [Q1 - 1.5×IQR, Q3 + 1.5×IQR] range.
45
+ *
46
+ * @param samples - Raw sample values (will be sorted internally)
47
+ * @returns Filtered samples with outliers removed
48
+ */
49
+ export declare const removeOutliersIQR: (samples: number[]) => number[];
50
+ //# sourceMappingURL=stats-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats-utils.d.ts","sourceRoot":"","sources":["../../src/core/stats-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,mDAAmD;IACnD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,oBAAoB;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,2BAA2B;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,oBAAoB;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,sBAAsB;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,sBAAsB;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,eAAe;IACf,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,GAAI,SAAS,MAAM,EAAE,KAAG,gBAmDvD,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,GAAI,SAAS,MAAM,EAAE,KAAG,MAAM,EAgC3D,CAAC"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Statistical utility functions for benchmark result analysis
3
+ *
4
+ * Provides IQR-based outlier removal and comprehensive statistics calculation
5
+ * adapted from bench-node's StatisticalHistogram.
6
+ */
7
+ /**
8
+ * Calculate comprehensive statistics from samples
9
+ *
10
+ * Adapted from bench-node's StatisticalHistogram. Assumes samples are already
11
+ * sorted (e.g., from removeOutliersIQR output).
12
+ *
13
+ * @param samples - Sample values (should be sorted for accurate percentiles)
14
+ * @returns Computed statistics
15
+ */
16
+ export const calculateStatistics = (samples) => {
17
+ if (samples.length === 0) {
18
+ return {
19
+ cv: 0,
20
+ marginOfError: 0,
21
+ max: 0,
22
+ mean: 0,
23
+ min: 0,
24
+ p95: 0,
25
+ p99: 0,
26
+ stdDev: 0,
27
+ variance: 0,
28
+ };
29
+ }
30
+ // Min/Max (samples are already sorted from removeOutliersIQR)
31
+ const min = samples[0];
32
+ const max = samples[samples.length - 1];
33
+ // Mean
34
+ const mean = samples.length === 1
35
+ ? samples[0]
36
+ : samples.reduce((acc, v) => Math.min(Number.MAX_SAFE_INTEGER, acc + v), 0) / samples.length;
37
+ // Standard deviation and variance
38
+ let stdDev = 0;
39
+ let variance = 0;
40
+ if (samples.length >= 2) {
41
+ variance =
42
+ samples.reduce((acc, v) => acc + Math.pow(v - mean, 2), 0) /
43
+ (samples.length - 1);
44
+ stdDev = Math.sqrt(variance);
45
+ }
46
+ // Coefficient of Variation
47
+ const cv = mean === 0 || samples.length < 2 ? 0 : (stdDev / mean) * 100;
48
+ // Margin of Error (95% confidence)
49
+ const Z = 1.96;
50
+ const marginOfError = samples.length === 0 ? 0 : (Z * stdDev) / Math.sqrt(samples.length);
51
+ // Percentiles (using standard formula: floor((n-1) * p))
52
+ const p95 = samples[Math.floor((samples.length - 1) * 0.95)] ?? 0;
53
+ const p99 = samples[Math.floor((samples.length - 1) * 0.99)] ?? 0;
54
+ return { cv, marginOfError, max, mean, min, p95, p99, stdDev, variance };
55
+ };
56
+ /**
57
+ * Remove outliers using Interquartile Range (IQR) method
58
+ *
59
+ * Adapted from bench-node's StatisticalHistogram.removeOutliers. Filters values
60
+ * outside [Q1 - 1.5×IQR, Q3 + 1.5×IQR] range.
61
+ *
62
+ * @param samples - Raw sample values (will be sorted internally)
63
+ * @returns Filtered samples with outliers removed
64
+ */
65
+ export const removeOutliersIQR = (samples) => {
66
+ if (samples.length < 4) {
67
+ return samples;
68
+ }
69
+ const sorted = samples.slice().sort((a, b) => a - b);
70
+ // Calculate Q1 and Q3
71
+ let q1;
72
+ let q3;
73
+ const size = sorted.length;
74
+ if (((size - 1) / 4) % 1 === 0 || (size / 4) % 1 === 0) {
75
+ q1 =
76
+ (1 / 2) *
77
+ (sorted[Math.floor(size / 4) - 1] + sorted[Math.floor(size / 4)]);
78
+ q3 =
79
+ (1 / 2) *
80
+ (sorted[Math.ceil((size * 3) / 4) - 1] +
81
+ sorted[Math.ceil((size * 3) / 4)]);
82
+ }
83
+ else {
84
+ q1 = sorted[Math.floor(size / 4)];
85
+ q3 = sorted[Math.floor((size * 3) / 4)];
86
+ }
87
+ // Calculate IQR and bounds
88
+ const iqr = q3 - q1;
89
+ const minValue = q1 - iqr * 1.5;
90
+ const maxValue = q3 + iqr * 1.5;
91
+ // Filter outliers
92
+ return sorted.filter((value) => value <= maxValue && value >= minValue);
93
+ };
94
+ //# sourceMappingURL=stats-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats-utils.js","sourceRoot":"","sources":["../../src/core/stats-utils.ts"],"names":[],"mappings":"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"}