benchforge 0.1.11 → 0.2.4
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.
- package/LICENSE +20 -0
- package/README.md +99 -294
- package/bin/benchforge +1 -2
- package/dist/AnalyzeArchive-8NCJhmhS.mjs +145 -0
- package/dist/AnalyzeArchive-8NCJhmhS.mjs.map +1 -0
- package/dist/BenchMatrix-BZVrBB_h.mjs +1050 -0
- package/dist/BenchMatrix-BZVrBB_h.mjs.map +1 -0
- package/dist/{BenchRunner-BzyUfiyB.d.mts → BenchRunner-DglX1NOn.d.mts} +119 -66
- package/dist/CoverageSampler-D5T9DRqe.mjs +27 -0
- package/dist/CoverageSampler-D5T9DRqe.mjs.map +1 -0
- package/dist/Formatters-BWj3d4sv.mjs +95 -0
- package/dist/Formatters-BWj3d4sv.mjs.map +1 -0
- package/dist/{HeapSampler-B8dtKHn1.mjs → HeapSampler-Dq-hpXem.mjs} +4 -4
- package/dist/HeapSampler-Dq-hpXem.mjs.map +1 -0
- package/dist/RunBenchCLI-C17DrJz8.mjs +3075 -0
- package/dist/RunBenchCLI-C17DrJz8.mjs.map +1 -0
- package/dist/StatisticalUtils-BD92crgM.mjs +255 -0
- package/dist/StatisticalUtils-BD92crgM.mjs.map +1 -0
- package/dist/TimeSampler-Ds8n7l2B.mjs +29 -0
- package/dist/TimeSampler-Ds8n7l2B.mjs.map +1 -0
- package/dist/ViewerServer-BJhdnxlN.mjs +639 -0
- package/dist/ViewerServer-BJhdnxlN.mjs.map +1 -0
- package/dist/ViewerServer-CuMNdNBz.mjs +2 -0
- package/dist/bin/benchforge.mjs +4 -5
- package/dist/bin/benchforge.mjs.map +1 -1
- package/dist/index.d.mts +711 -558
- package/dist/index.mjs +98 -3
- package/dist/index.mjs.map +1 -0
- package/dist/runners/WorkerScript.d.mts +12 -4
- package/dist/runners/WorkerScript.mjs +77 -105
- package/dist/runners/WorkerScript.mjs.map +1 -1
- package/dist/viewer/assets/CIPlot-BkOvMoMa.js +1 -0
- package/dist/viewer/assets/HistogramKde-CmSyUFY0.js +1 -0
- package/dist/viewer/assets/LegendUtils-BJpbn_jr.js +55 -0
- package/dist/viewer/assets/SampleTimeSeries-C4VBhXr3.js +1 -0
- package/dist/viewer/assets/index-Br9bp_cX.js +153 -0
- package/dist/viewer/assets/index-NzXXe_CC.css +1 -0
- package/dist/viewer/index.html +19 -0
- package/dist/viewer/speedscope/LICENSE +21 -0
- package/dist/viewer/speedscope/SourceCodePro-Regular.ttf-ILST5JV6.woff2 +0 -0
- package/dist/viewer/speedscope/favicon-16x16-V2DMIAZS.js +2 -0
- package/dist/viewer/speedscope/favicon-16x16-V2DMIAZS.js.map +7 -0
- package/dist/viewer/speedscope/favicon-16x16-VSI62OPJ.png +0 -0
- package/dist/viewer/speedscope/favicon-32x32-3EB2YCUY.png +0 -0
- package/dist/viewer/speedscope/favicon-32x32-THY3JDJL.js +2 -0
- package/dist/viewer/speedscope/favicon-32x32-THY3JDJL.js.map +7 -0
- package/dist/viewer/speedscope/favicon-FOKUP5Y5.ico +0 -0
- package/dist/viewer/speedscope/favicon-M34RF7BI.js +2 -0
- package/dist/viewer/speedscope/favicon-M34RF7BI.js.map +7 -0
- package/dist/viewer/speedscope/file-format-schema.json +274 -0
- package/dist/viewer/speedscope/index.html +19 -0
- package/dist/viewer/speedscope/jfrview_bg-BLJXNNQB.wasm +0 -0
- package/dist/viewer/speedscope/perf-vertx-stacks-01-collapsed-all-ZNUIGAJL.txt +199 -0
- package/dist/viewer/speedscope/release.txt +3 -0
- package/dist/viewer/speedscope/source-code-pro.LICENSE.md +93 -0
- package/dist/viewer/speedscope/speedscope-GHPHNKXC.css +2 -0
- package/dist/viewer/speedscope/speedscope-GHPHNKXC.css.map +7 -0
- package/dist/viewer/speedscope/speedscope-QZFMJ7VP.js +212 -0
- package/dist/viewer/speedscope/speedscope-QZFMJ7VP.js.map +7 -0
- package/package.json +52 -27
- package/src/bin/benchforge.ts +2 -2
- package/src/cli/AnalyzeArchive.ts +232 -0
- package/src/cli/BrowserBench.ts +322 -0
- package/src/cli/CliArgs.ts +164 -51
- package/src/cli/CliExport.ts +179 -0
- package/src/cli/CliOptions.ts +147 -0
- package/src/cli/CliReport.ts +197 -0
- package/src/cli/FilterBenchmarks.ts +18 -30
- package/src/cli/RunBenchCLI.ts +132 -866
- package/src/cli/SuiteRunner.ts +160 -0
- package/src/cli/ViewerServer.ts +282 -0
- package/src/export/AllocExport.ts +121 -0
- package/src/export/ArchiveExport.ts +146 -0
- package/src/export/ArchiveFormat.ts +50 -0
- package/src/export/CoverageExport.ts +148 -0
- package/src/export/EditorUri.ts +10 -0
- package/src/export/PerfettoExport.ts +64 -99
- package/src/export/SpeedscopeTypes.ts +98 -0
- package/src/export/TimeExport.ts +115 -0
- package/src/index.ts +86 -67
- package/src/matrix/BenchMatrix.ts +230 -0
- package/src/matrix/CaseLoader.ts +8 -6
- package/src/matrix/MatrixDirRunner.ts +153 -0
- package/src/matrix/MatrixFilter.ts +49 -47
- package/src/matrix/MatrixInlineRunner.ts +50 -0
- package/src/matrix/MatrixReport.ts +90 -250
- package/src/matrix/VariantLoader.ts +5 -5
- package/src/profiling/browser/BenchLoop.ts +51 -0
- package/src/profiling/browser/BrowserCDP.ts +133 -0
- package/src/profiling/browser/BrowserGcStats.ts +33 -0
- package/src/profiling/browser/BrowserProfiler.ts +160 -0
- package/src/profiling/browser/CdpClient.ts +82 -0
- package/src/profiling/browser/CdpPage.ts +138 -0
- package/src/profiling/browser/ChromeLauncher.ts +158 -0
- package/src/profiling/browser/ChromeTraceEvent.ts +28 -0
- package/src/profiling/browser/PageLoadMode.ts +61 -0
- package/src/profiling/node/CoverageSampler.ts +27 -0
- package/src/profiling/node/CoverageTypes.ts +23 -0
- package/src/profiling/node/HeapSampleReport.ts +261 -0
- package/src/{heap-sample → profiling/node}/HeapSampler.ts +1 -2
- package/src/{heap-sample → profiling/node}/ResolvedProfile.ts +18 -9
- package/src/profiling/node/TimeSampler.ts +57 -0
- package/src/report/BenchmarkReport.ts +146 -0
- package/src/report/Colors.ts +9 -0
- package/src/report/Formatters.ts +110 -0
- package/src/report/GcSections.ts +151 -0
- package/src/{GitUtils.ts → report/GitUtils.ts} +18 -19
- package/src/report/HtmlReport.ts +223 -0
- package/src/report/ParseStats.ts +73 -0
- package/src/report/StandardSections.ts +147 -0
- package/src/report/ViewerSections.ts +286 -0
- package/src/report/text/TableReport.ts +253 -0
- package/src/report/text/TextReport.ts +123 -0
- package/src/runners/AdaptiveWrapper.ts +116 -236
- package/src/runners/BenchRunner.ts +20 -15
- package/src/{Benchmark.ts → runners/BenchmarkSpec.ts} +5 -6
- package/src/runners/CreateRunner.ts +5 -7
- package/src/runners/GcStats.ts +47 -50
- package/src/{MeasuredResults.ts → runners/MeasuredResults.ts} +43 -37
- package/src/runners/MergeBatches.ts +123 -0
- package/src/{NodeGC.ts → runners/NodeGC.ts} +2 -3
- package/src/runners/RunnerOrchestrator.ts +127 -243
- package/src/runners/RunnerUtils.ts +75 -1
- package/src/runners/SampleStats.ts +100 -0
- package/src/runners/TimingRunner.ts +244 -0
- package/src/runners/TimingUtils.ts +3 -2
- package/src/runners/WorkerScript.ts +135 -151
- package/src/stats/BootstrapDifference.ts +282 -0
- package/src/{PermutationTest.ts → stats/PermutationTest.ts} +8 -17
- package/src/stats/StatisticalUtils.ts +445 -0
- package/src/{tests → test}/AdaptiveConvergence.test.ts +10 -10
- package/src/test/AdaptiveRunner.test.ts +39 -41
- package/src/{tests → test}/AdaptiveSampling.test.ts +9 -9
- package/src/test/AdaptiveStatistics.integration.ts +2 -2
- package/src/{tests → test}/BenchMatrix.test.ts +19 -16
- package/src/test/BenchmarkReport.test.ts +63 -13
- package/src/test/BrowserBench.e2e.test.ts +186 -17
- package/src/test/BrowserBench.test.ts +10 -5
- package/src/test/BuildTimeSection.test.ts +130 -0
- package/src/test/CapSamples.test.ts +82 -0
- package/src/test/CoverageExport.test.ts +115 -0
- package/src/test/CoverageSampler.test.ts +33 -0
- package/src/test/HeapAttribution.test.ts +14 -14
- package/src/{tests → test}/MatrixFilter.test.ts +1 -1
- package/src/{tests → test}/MatrixReport.test.ts +1 -1
- package/src/test/PermutationTest.test.ts +1 -1
- package/src/{tests → test}/RealDataValidation.test.ts +6 -6
- package/src/test/RunBenchCLI.test.ts +39 -38
- package/src/test/RunnerOrchestrator.test.ts +12 -12
- package/src/test/StatisticalUtils.test.ts +48 -12
- package/src/{table-util/test → test}/TableReport.test.ts +2 -2
- package/src/test/TestUtils.ts +12 -7
- package/src/test/TimeExport.test.ts +139 -0
- package/src/test/TimeSampler.test.ts +37 -0
- package/src/test/ViewerLive.e2e.test.ts +159 -0
- package/src/test/ViewerStatic.static.e2e.test.ts +137 -0
- package/src/{tests → test}/fixtures/baseline/impl.ts +1 -1
- package/src/{tests → test}/fixtures/bevy30-samples.ts +3 -1
- package/src/test/fixtures/cases/asyncCases.ts +9 -0
- package/src/{tests → test}/fixtures/cases/cases.ts +5 -2
- package/src/test/fixtures/cases/variants/product.ts +2 -0
- package/src/test/fixtures/cases/variants/sum.ts +2 -0
- package/src/test/fixtures/discover/fast.ts +1 -0
- package/src/{tests → test}/fixtures/discover/slow.ts +1 -1
- package/src/test/fixtures/invalid/bad.ts +1 -0
- package/src/test/fixtures/loader/fast.ts +1 -0
- package/src/{tests → test}/fixtures/loader/slow.ts +1 -1
- package/src/test/fixtures/loader/stateful.ts +2 -0
- package/src/test/fixtures/stateful/stateful.ts +2 -0
- package/src/test/fixtures/variants/extra.ts +1 -0
- package/src/test/fixtures/variants/impl.ts +1 -0
- package/src/test/fixtures/worker/fast.ts +1 -0
- package/src/{tests → test}/fixtures/worker/slow.ts +1 -1
- package/src/viewer/DateFormat.ts +30 -0
- package/src/viewer/Helpers.ts +23 -0
- package/src/viewer/LineData.ts +120 -0
- package/src/viewer/Providers.ts +191 -0
- package/src/viewer/ReportData.ts +123 -0
- package/src/viewer/State.ts +49 -0
- package/src/viewer/Theme.ts +15 -0
- package/src/viewer/components/App.tsx +73 -0
- package/src/viewer/components/DropZone.tsx +71 -0
- package/src/viewer/components/LazyPlot.ts +33 -0
- package/src/viewer/components/SamplesPanel.tsx +214 -0
- package/src/viewer/components/Shell.tsx +26 -0
- package/src/viewer/components/SourcePanel.tsx +216 -0
- package/src/viewer/components/SummaryPanel.tsx +332 -0
- package/src/viewer/components/TabBar.tsx +131 -0
- package/src/viewer/components/TabContent.tsx +46 -0
- package/src/viewer/components/ThemeToggle.tsx +50 -0
- package/src/viewer/index.html +20 -0
- package/src/viewer/main.tsx +4 -0
- package/src/viewer/plots/CIPlot.ts +313 -0
- package/src/{html/browser → viewer/plots}/HistogramKde.ts +33 -38
- package/src/viewer/plots/LegendUtils.ts +134 -0
- package/src/viewer/plots/PlotTypes.ts +85 -0
- package/src/viewer/plots/RenderPlots.ts +230 -0
- package/src/viewer/plots/SampleTimeSeries.ts +306 -0
- package/src/viewer/plots/SvgHelpers.ts +136 -0
- package/src/viewer/plots/TimeSeriesMarks.ts +319 -0
- package/src/viewer/report.css +427 -0
- package/src/viewer/shell.css +357 -0
- package/src/viewer/tsconfig.json +11 -0
- package/dist/BrowserHeapSampler-B6asLKWQ.mjs +0 -202
- package/dist/BrowserHeapSampler-B6asLKWQ.mjs.map +0 -1
- package/dist/GcStats-wX7Xyblu.mjs +0 -77
- package/dist/GcStats-wX7Xyblu.mjs.map +0 -1
- package/dist/HeapSampler-B8dtKHn1.mjs.map +0 -1
- package/dist/TimingUtils-DwOwkc8G.mjs +0 -597
- package/dist/TimingUtils-DwOwkc8G.mjs.map +0 -1
- package/dist/browser/index.js +0 -914
- package/dist/src-B-DDaCa9.mjs +0 -3108
- package/dist/src-B-DDaCa9.mjs.map +0 -1
- package/src/BenchMatrix.ts +0 -380
- package/src/BenchmarkReport.ts +0 -161
- package/src/HtmlDataPrep.ts +0 -148
- package/src/StandardSections.ts +0 -261
- package/src/StatisticalUtils.ts +0 -175
- package/src/TypeUtil.ts +0 -8
- package/src/browser/BrowserGcStats.ts +0 -44
- package/src/browser/BrowserHeapSampler.ts +0 -271
- package/src/export/JsonExport.ts +0 -103
- package/src/export/JsonFormat.ts +0 -91
- package/src/export/SpeedscopeExport.ts +0 -202
- package/src/heap-sample/HeapSampleReport.ts +0 -269
- package/src/html/HtmlReport.ts +0 -131
- package/src/html/HtmlTemplate.ts +0 -284
- package/src/html/Types.ts +0 -88
- package/src/html/browser/CIPlot.ts +0 -287
- package/src/html/browser/LegendUtils.ts +0 -163
- package/src/html/browser/RenderPlots.ts +0 -263
- package/src/html/browser/SampleTimeSeries.ts +0 -389
- package/src/html/browser/Types.ts +0 -96
- package/src/html/browser/index.ts +0 -1
- package/src/html/index.ts +0 -17
- package/src/runners/BasicRunner.ts +0 -364
- package/src/table-util/ConvergenceFormatters.ts +0 -19
- package/src/table-util/Formatters.ts +0 -157
- package/src/table-util/README.md +0 -70
- package/src/table-util/TableReport.ts +0 -293
- package/src/tests/fixtures/cases/asyncCases.ts +0 -7
- package/src/tests/fixtures/cases/variants/product.ts +0 -2
- package/src/tests/fixtures/cases/variants/sum.ts +0 -2
- package/src/tests/fixtures/discover/fast.ts +0 -1
- package/src/tests/fixtures/invalid/bad.ts +0 -1
- package/src/tests/fixtures/loader/fast.ts +0 -1
- package/src/tests/fixtures/loader/stateful.ts +0 -2
- package/src/tests/fixtures/stateful/stateful.ts +0 -2
- package/src/tests/fixtures/variants/extra.ts +0 -1
- package/src/tests/fixtures/variants/impl.ts +0 -1
- package/src/tests/fixtures/worker/fast.ts +0 -1
- /package/src/{table-util/test → test}/TableValueExtractor.test.ts +0 -0
- /package/src/{table-util/test → test}/TableValueExtractor.ts +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RunBenchCLI-C17DrJz8.mjs","names":["defaultSections","yellow"],"sources":["../src/cli/CliArgs.ts","../src/export/CoverageExport.ts","../src/export/EditorUri.ts","../src/export/PerfettoExport.ts","../src/export/TimeExport.ts","../src/profiling/node/HeapSampleReport.ts","../src/report/GcSections.ts","../src/report/ParseStats.ts","../src/report/StandardSections.ts","../src/report/ViewerSections.ts","../src/report/HtmlReport.ts","../src/cli/CliOptions.ts","../src/report/text/TableReport.ts","../src/report/text/TextReport.ts","../src/matrix/MatrixReport.ts","../src/cli/CliReport.ts","../src/cli/CliExport.ts","../src/matrix/MatrixFilter.ts","../src/profiling/browser/BrowserGcStats.ts","../src/profiling/browser/BrowserCDP.ts","../src/profiling/browser/BenchLoop.ts","../src/profiling/browser/CdpClient.ts","../src/profiling/browser/CdpPage.ts","../src/profiling/browser/ChromeLauncher.ts","../src/profiling/browser/PageLoadMode.ts","../src/profiling/browser/BrowserProfiler.ts","../src/cli/BrowserBench.ts","../src/cli/FilterBenchmarks.ts","../src/cli/SuiteRunner.ts","../src/cli/RunBenchCLI.ts"],"sourcesContent":["import type { Argv, InferredOptionTypes } from \"yargs\";\nimport yargs from \"yargs\";\n\nexport type Configure<T> = (yargs: Argv) => Argv<T>;\n\n/** CLI args type inferred from cliOptions, plus optional file positional. */\nexport type DefaultCliArgs = InferredOptionTypes<typeof cliOptions> & {\n file?: string;\n};\n\n// biome-ignore format: compact option definitions\nconst cliOptions = {\n duration: { type: \"number\", requiresArg: true, describe: \"duration per batch in seconds (default: 0.642)\" },\n iterations: { type: \"number\", requiresArg: true, describe: \"iterations per batch (page loads for page-load mode, inner loop for bench)\" },\n warmup: { type: \"number\", default: 0, describe: \"warmup iterations before measurement\" },\n filter: { type: \"string\", requiresArg: true, describe: \"filter by name/regex. Matrix: case/variant, case/, /variant\" },\n all: { type: \"boolean\", default: false, describe: \"run all cases (ignore defaultCases)\" },\n list: { type: \"boolean\", default: false, describe: \"list available benchmarks (or matrix cases/variants)\" },\n worker: { type: \"boolean\", default: true, describe: \"run in worker process for isolation (default: true)\" },\n batches: { type: \"number\", default: 1, describe: \"divide time into N batches, alternating baseline/current order\" },\n \"warmup-batch\": { type: \"boolean\", default: false, describe: \"include first batch in results (normally dropped to avoid OS cache warmup)\" },\n \"equiv-margin\": { type: \"number\", default: 2, describe: \"equivalence margin % for baseline comparison (0 to disable)\" },\n \"no-batch-trim\": { type: \"boolean\", default: false, describe: \"disable Tukey trimming of outlier batches\" },\n \"pause-first\": { type: \"number\", describe: \"iterations before first pause (then pause-interval applies)\" },\n \"pause-interval\": { type: \"number\", default: 0, describe: \"iterations between pauses for V8 optimization (0 to disable)\" },\n \"pause-duration\": { type: \"number\", default: 100, describe: \"pause duration in ms for V8 optimization\" },\n \"gc-stats\": { type: \"boolean\", default: false, describe: \"collect GC statistics (Node: --trace-gc-nvp, browser: CDP tracing)\" },\n \"gc-force\": { type: \"boolean\", default: false, describe: \"force GC after each iteration\" },\n adaptive: { type: \"boolean\", default: false, describe: \"adaptive sampling (experimental)\" },\n \"min-time\": { type: \"number\", default: 1, describe: \"minimum time before adaptive convergence can stop\" },\n convergence: { type: \"number\", default: 95, describe: \"adaptive confidence threshold (0-100)\" },\n alloc: { type: \"boolean\", default: false, describe: \"allocation sampling attribution (includes garbage)\" },\n \"alloc-interval\": { type: \"number\", default: 32768, describe: \"allocation sampling interval in bytes\" },\n \"alloc-depth\": { type: \"number\", default: 64, describe: \"allocation sampling stack depth\" },\n \"alloc-rows\": { type: \"number\", default: 20, describe: \"top allocation sites to show\" },\n \"alloc-stack\": { type: \"number\", default: 3, describe: \"call stack depth to display\" },\n \"alloc-verbose\": { type: \"boolean\", default: false, describe: \"verbose output with file:// paths and line numbers\" },\n \"alloc-raw\": { type: \"boolean\", default: false, describe: \"dump every raw allocation sample (ordinal, size, stack)\" },\n \"alloc-user-only\":{ type: \"boolean\", default: false, describe: \"filter to user code only (hide node internals)\" },\n profile: { type: \"boolean\", default: false, alias: \"time-sample\", describe: \"V8 CPU time sampling profiler\" },\n \"profile-interval\":{ type: \"number\", default: 1000, alias: \"time-interval\", describe: \"CPU sampling interval in microseconds\" },\n \"call-counts\": { type: \"boolean\", default: false, describe: \"collect per-function execution counts via V8 precise coverage\" },\n stats: { type: \"string\", default: \"mean,p50,p99\", describe: \"timing columns: mean|median|min|max|p<N> (e.g. mean,p70,p99)\" },\n view: { type: \"boolean\", default: false, alias: \"html\", describe: \"open viewer in browser\" },\n \"view-serve\": { type: \"boolean\", default: false, describe: \"start viewer server without opening browser (reload an existing tab)\" },\n \"export-perfetto\":{ type: \"string\", requiresArg: true, describe: \"export Perfetto trace file (view at ui.perfetto.dev)\" },\n \"export-profile\": { type: \"string\", requiresArg: true, alias: \"export-time\", describe: \"export CPU profile as .cpuprofile (V8/Chrome DevTools format)\" },\n archive: { type: \"string\", describe: \"archive profile + sources to .benchforge file\" },\n editor: { type: \"string\", default: \"vscode\", describe: \"editor for source links: vscode, cursor, or custom://scheme\" },\n inspect: { type: \"boolean\", default: false, describe: \"run once for external profiler attach\" },\n \"trace-opt\": { type: \"boolean\", default: false, describe: \"trace V8 optimization tiers (requires --allow-natives-syntax)\" },\n \"pause-warmup\": { type: \"number\", default: 0, requiresArg: true, describe: \"post-warmup settle time in ms for V8 background compilation (0 to skip)\" },\n url: { type: \"string\", requiresArg: true, describe: \"page URL for browser profiling (enables browser mode)\" },\n \"page-load\": { type: \"boolean\", default: false, describe: \"passive page-load profiling (no __bench needed)\" },\n \"wait-for\": { type: \"string\", requiresArg: true, describe: \"page-load completion: CSS selector, JS expression, 'load', or 'domcontentloaded'\" },\n headless: { type: \"boolean\", default: false, describe: \"run browser in headless mode (default: headed)\" },\n timeout: { type: \"number\", default: 60, describe: \"browser page timeout in seconds\" },\n chrome: { type: \"string\", requiresArg: true, describe: \"Chrome binary path (default: auto-detect or CHROME_PATH)\" },\n \"chrome-profile\": { type: \"string\", requiresArg: true, describe: \"Chrome user profile directory (default: temp profile)\" },\n \"baseline-url\": { type: \"string\", requiresArg: true, describe: \"baseline URL for A/B comparison (fresh tab per batch)\" },\n \"chrome-args\": { type: \"string\", array: true, requiresArg: true, describe: \"extra Chromium flags\" },\n} as const;\n\nexport const defaultDuration = 0.642;\nexport const defaultAdaptiveMaxTime = 20;\n\n/** Default values for all CLI options, including alias keys for yargs filtering. */\nexport const cliDefaults: Record<string, unknown> = Object.fromEntries(\n Object.entries(cliOptions)\n .filter(([, opt]) => \"default\" in opt)\n .flatMap(([key, opt]) => {\n const o = opt as Record<string, unknown>;\n const entries: [string, unknown][] = [[key, o.default]];\n if (o.alias) entries.push([o.alias as string, o.default]);\n return entries;\n }),\n);\n\nconst optionGroups = {\n \"Run:\": [\"duration\", \"iterations\"],\n \"Batching:\": [\"batches\", \"warmup-batch\", \"no-batch-trim\"],\n \"Node:\": [\"worker\", \"inspect\"],\n \"Browser:\": [\n \"url\",\n \"baseline-url\",\n \"page-load\",\n \"wait-for\",\n \"headless\",\n \"timeout\",\n \"chrome\",\n \"chrome-profile\",\n \"chrome-args\",\n ],\n \"GC:\": [\"gc-stats\", \"gc-force\"],\n \"Allocation Profiling:\": [\n \"alloc\",\n \"alloc-interval\",\n \"alloc-depth\",\n \"alloc-rows\",\n \"alloc-stack\",\n \"alloc-verbose\",\n \"alloc-raw\",\n \"alloc-user-only\",\n ],\n \"CPU Profiling:\": [\"profile\", \"profile-interval\", \"call-counts\"],\n \"Output:\": [\n \"stats\",\n \"view\",\n \"view-serve\",\n \"equiv-margin\",\n \"archive\",\n \"export-perfetto\",\n \"export-profile\",\n \"editor\",\n ],\n \"Selecting Benchmarks:\": [\"filter\", \"all\", \"list\"],\n \"V8 Tuning:\": [\n \"warmup\",\n \"trace-opt\",\n \"pause-first\",\n \"pause-interval\",\n \"pause-duration\",\n \"pause-warmup\",\n ],\n \"Adaptive:\": [\"adaptive\", \"min-time\", \"convergence\"],\n} as const;\n\nconst { url: _url, ...browserOnlyOptions } = cliOptions;\n\n/** Parse command line arguments with optional custom yargs configuration. */\nexport function parseCliArgs<T = DefaultCliArgs>(\n args: string[],\n configure: Configure<T> = defaultCliArgs as Configure<T>,\n): T {\n return configure(yargs(args)).parseSync() as T;\n}\n\n/** Configure yargs for browser benchmarking with url as a required positional. */\nexport function browserCliArgs(yargsInstance: Argv): Argv<DefaultCliArgs> {\n return applyGroups(\n yargsInstance\n .command(\"$0 <url>\", \"run browser benchmarks\", y => {\n y.positional(\"url\", {\n type: \"string\",\n describe: \"page URL for browser profiling\",\n });\n })\n .options(browserOnlyOptions)\n .help()\n .strict(),\n ) as Argv<DefaultCliArgs>;\n}\n\n/** Configure yargs with standard benchmark options and file positional. */\nexport function defaultCliArgs(yargsInstance: Argv): Argv<DefaultCliArgs> {\n return applyGroups(\n yargsInstance\n .command(\"$0 [file]\", \"run benchmarks\", y => {\n y.positional(\"file\", {\n type: \"string\",\n describe: \"benchmark file to run\",\n });\n })\n .options(cliOptions)\n .help()\n .strict(),\n ) as Argv<DefaultCliArgs>;\n}\n\n/** Strip yargs internals (`_`, `$0`) and undefined values, converting kebab-case to camelCase. */\nexport function cleanCliArgs(args: DefaultCliArgs): Record<string, unknown> {\n const skip = new Set([\"_\", \"$0\"]);\n const camel = (k: string) =>\n k.replace(/-([a-z])/g, (_, l: string) => l.toUpperCase());\n return Object.fromEntries(\n Object.entries(args)\n .filter(([k, v]) => v !== undefined && v !== null && !skip.has(k))\n .map(([k, v]) => [camel(k), v]),\n );\n}\n\n/** Assign options to their labeled groups in yargs help output. */\nfunction applyGroups(y: Argv): Argv {\n return Object.entries(optionGroups).reduce(\n (acc, [label, keys]) => acc.group(keys as unknown as string[], label),\n y,\n );\n}\n","/** Line-level coverage maps from V8/CDP coverage data and frame annotation with execution counts. */\n\nimport type { CoverageData } from \"../profiling/node/CoverageTypes.ts\";\n\n/** Per-function execution count at a specific source line. */\nexport interface LineCoverage {\n /** 1-indexed line number of the function start */\n startLine: number;\n /** Function name (empty string for anonymous top-level) */\n functionName: string;\n /** Number of times the function was invoked */\n count: number;\n}\n\n/** Map from source URL to per-function execution counts. */\nexport type CoverageMap = Map<string, LineCoverage[]>;\n\n/** Coverage data: per-URL entries and a name-only fallback lookup. */\nexport interface CoverageResult {\n /** Per-URL coverage entries (for frames with matching file URLs) */\n map: CoverageMap;\n /** Name ==> count lookup across all scripts (for frames without file URLs) */\n byName: Map<string, number>;\n}\n\n/** Build coverage data from raw CDP/inspector coverage and source texts. */\nexport function buildCoverageMap(\n coverage: CoverageData,\n sources: Record<string, string>,\n): CoverageResult {\n const map: CoverageMap = new Map();\n const byName = new Map<string, number>();\n\n for (const script of coverage.scripts) {\n processScript(script, sources, map, byName);\n }\n\n return { map, byName };\n}\n\n/** Annotate speedscope frame names with execution counts (e.g. \"fn [1.2K]\"). */\nexport function annotateFramesWithCounts(\n frames: { name: string; file?: string; line?: number }[],\n coverage: CoverageResult,\n): void {\n for (const frame of frames) {\n const entries = frame.file ? coverage.map.get(frame.file) : undefined;\n const count = entries && findCount(frame.name, frame.line, entries);\n const isAnon = frame.name.startsWith(\"(anonymous\");\n const resolved =\n count ?? (isAnon ? undefined : coverage.byName.get(frame.name));\n if (resolved !== undefined && resolved > 0)\n frame.name = `${frame.name} [${formatCount(resolved)}]`;\n }\n}\n\n/** Extract per-function coverage entries from a single script. */\nfunction processScript(\n script: CoverageData[\"scripts\"][number],\n sources: Record<string, string>,\n map: CoverageMap,\n byName: Map<string, number>,\n): void {\n const { url, functions } = script;\n const source = url ? sources[url] : undefined;\n const lineOffsets = source ? buildLineOffsets(source) : undefined;\n const entries: LineCoverage[] = [];\n\n for (const fn of functions) {\n const range = fn.ranges[0];\n if (!range) continue;\n\n if (lineOffsets && url) {\n entries.push({\n startLine: offsetToLine(range.startOffset, lineOffsets),\n functionName: fn.functionName,\n count: range.count,\n });\n }\n\n if (fn.functionName && range.count > 0) {\n const prev = byName.get(fn.functionName) ?? 0;\n byName.set(fn.functionName, prev + range.count);\n }\n }\n\n if (entries.length > 0 && url) map.set(url, entries);\n}\n\n/** Match a frame to a coverage entry by function name (or closest line for anonymous). */\nfunction findCount(\n frameName: string,\n frameLine: number | undefined,\n entries: LineCoverage[],\n): number | undefined {\n const isAnon =\n frameName === \"(anonymous)\" || frameName.startsWith(\"(anonymous \");\n\n if (isAnon) {\n if (!frameLine) return undefined;\n const anonymous = entries.filter(e => e.functionName === \"\");\n return closestByLine(anonymous, frameLine)?.count;\n }\n\n const nameMatches = entries.filter(e => e.functionName === frameName);\n if (nameMatches.length === 0) return undefined;\n if (nameMatches.length === 1) return nameMatches[0].count;\n if (frameLine) return closestByLine(nameMatches, frameLine)?.count;\n return nameMatches[0].count;\n}\n\n/** Format a count for display (e.g. 1234567 ==> \"1.2M\"). */\nfunction formatCount(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 10_000) return `${(n / 1_000).toFixed(1)}K`;\n return String(n);\n}\n\n/** Build array where index i is the character offset where line (i+1) starts. */\nfunction buildLineOffsets(source: string): number[] {\n const offsets = [0]; // line 1 starts at offset 0\n for (let i = 0; i < source.length; i++) {\n if (source[i] === \"\\n\") offsets.push(i + 1);\n }\n return offsets;\n}\n\n/** Convert character offset to 1-indexed line number via binary search. */\nfunction offsetToLine(offset: number, lineOffsets: number[]): number {\n let lo = 0;\n let hi = lineOffsets.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (lineOffsets[mid] <= offset) lo = mid;\n else hi = mid - 1;\n }\n return lo + 1; // 1-indexed\n}\n\n/** Find the entry whose startLine is closest to the given line. */\nfunction closestByLine(\n entries: LineCoverage[],\n line: number,\n): LineCoverage | undefined {\n if (!entries.length) return undefined;\n const dist = (e: LineCoverage) => Math.abs(e.startLine - line);\n return entries.reduce((best, e) => (dist(e) < dist(best) ? e : best));\n}\n","const presets: Record<string, string> = {\n vscode: \"vscode://file\",\n cursor: \"cursor://file\",\n};\n\n/** Resolve editor name or custom URI to a prefix.\n * Links are formatted as `{prefix}{absolutePath}:{line}:{col}` */\nexport function resolveEditorUri(editor: string): string {\n return presets[editor] ?? editor;\n}\n","/** Export benchmark samples to Chrome Trace Event format for viewing in Perfetto. */\n\nimport { spawn } from \"node:child_process\";\nimport { readdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { cleanCliArgs, type DefaultCliArgs } from \"../cli/CliArgs.ts\";\nimport type { TraceEvent } from \"../profiling/browser/ChromeTraceEvent.ts\";\nimport type { ReportGroup } from \"../report/BenchmarkReport.ts\";\nimport type { MeasuredResults } from \"../runners/MeasuredResults.ts\";\n\ninterface TraceFile {\n traceEvents: TraceEvent[];\n}\n\ntype Args = Record<string, unknown>;\n\nconst pid = 1;\nconst tid = 1;\n\n/** Export benchmark results to Perfetto-compatible trace file */\nexport function exportPerfettoTrace(\n groups: ReportGroup[],\n outputPath: string,\n args: DefaultCliArgs,\n): void {\n const absPath = resolve(outputPath);\n const events = buildTraceEvents(groups, args);\n\n const merged = mergeV8Trace(events);\n const traceFile: TraceFile = { traceEvents: merged };\n writeFileSync(absPath, JSON.stringify(traceFile));\n console.log(`Perfetto trace exported to: ${outputPath}`);\n\n scheduleDeferredMerge(absPath);\n}\n\nfunction buildTraceEvents(\n groups: ReportGroup[],\n cliArgs: DefaultCliArgs,\n): TraceEvent[] {\n const metadata: TraceEvent[] = [\n meta(\"process_name\", { name: \"wesl-bench\" }),\n meta(\"thread_name\", { name: \"MainThread\" }),\n meta(\"bench_settings\", cleanCliArgs(cliArgs)),\n ];\n\n const benchEvents = groups.flatMap(group =>\n group.reports.flatMap(report =>\n buildBenchmarkEvents(report.measuredResults as MeasuredResults),\n ),\n );\n\n return [...metadata, ...benchEvents];\n}\n\nfunction mergeV8Trace(events: TraceEvent[]): TraceEvent[] {\n const v8TracePath = readdirSync(\".\").find(\n f => f.startsWith(\"node_trace.\") && f.endsWith(\".log\"),\n );\n const v8Events = loadV8Events(v8TracePath);\n const merged = v8Events ? [...v8Events, ...events] : events;\n normalizeTimestamps(merged);\n return merged;\n}\n\n/** V8 writes trace files after process exit, so we spawn a deferred merge. */\nfunction scheduleDeferredMerge(outputPath: string): void {\n const cwd = process.cwd();\n const mergeScript = `\n const { readdirSync, readFileSync, writeFileSync } = require('fs');\n function normalize(events) {\n let min = Infinity;\n for (const e of events) if (e.ts > 0 && e.ts < min) min = e.ts;\n if (min === Infinity) return;\n for (const e of events) if (e.ts > 0) e.ts -= min;\n }\n setTimeout(() => {\n const traceFiles = readdirSync('.').filter(f => f.startsWith('node_trace.') && f.endsWith('.log'));\n if (traceFiles.length === 0) process.exit(0);\n try {\n const v8Data = JSON.parse(readFileSync(traceFiles[0], 'utf-8'));\n const ourData = JSON.parse(readFileSync('${outputPath}', 'utf-8'));\n const allEvents = [...v8Data.traceEvents, ...ourData.traceEvents];\n normalize(allEvents);\n writeFileSync('${outputPath}', JSON.stringify({ traceEvents: allEvents }));\n console.log('Merged ' + v8Data.traceEvents.length + ' V8 events into ' + '${outputPath}');\n } catch (e) { console.error('Merge failed:', e.message); }\n }, 100);\n `;\n\n process.on(\"exit\", () => {\n const opts = { detached: true, stdio: \"inherit\" as const, cwd };\n spawn(\"node\", [\"-e\", mergeScript], opts).unref();\n });\n}\n\nfunction meta(name: string, args: Args): TraceEvent {\n return { ph: \"M\", ts: 0, pid, tid, name, args };\n}\n\n/** Build events for a single benchmark run, deriving timestamps from cumulative sample durations. */\nfunction buildBenchmarkEvents(results: MeasuredResults): TraceEvent[] {\n const { samples, heapSamples, pausePoints, startTime = 0 } = results;\n if (!samples?.length) return [];\n\n const timestamps = cumulativeTimestamps(samples, startTime);\n const events: TraceEvent[] = [];\n for (let i = 0; i < samples.length; i++) {\n const ts = timestamps[i];\n const ms = Math.round(samples[i] * 100) / 100;\n events.push(instant(ts, results.name, { n: i, ms }));\n events.push(counter(ts, \"duration\", { ms }));\n if (heapSamples?.[i] !== undefined) {\n const mb = Math.round((heapSamples[i] / 1024 / 1024) * 10) / 10;\n events.push(counter(ts, \"heap\", { MB: mb }));\n }\n }\n\n for (const pause of pausePoints ?? []) {\n const ts = timestamps[pause.sampleIndex];\n if (ts) events.push(instant(ts, \"pause\", { ms: pause.durationMs }));\n }\n return events;\n}\n\nfunction loadV8Events(\n v8TracePath: string | undefined,\n): TraceEvent[] | undefined {\n if (!v8TracePath) return undefined;\n try {\n const v8Data = JSON.parse(readFileSync(v8TracePath, \"utf-8\")) as TraceFile;\n const { traceEvents } = v8Data;\n console.log(`Merged ${traceEvents.length} V8 events from ${v8TracePath}`);\n return traceEvents;\n } catch {\n console.warn(`Could not parse V8 trace file: ${v8TracePath}`);\n return undefined;\n }\n}\n\n/** Normalize timestamps so events start at 0 */\nfunction normalizeTimestamps(events: TraceEvent[]): void {\n let min = Number.POSITIVE_INFINITY;\n for (const e of events) if (e.ts > 0 && e.ts < min) min = e.ts;\n if (min === Number.POSITIVE_INFINITY) return;\n for (const e of events) if (e.ts > 0) e.ts -= min;\n}\n\n/** Derive μs timestamps from cumulative sample durations (ms), offset by startTime. */\nfunction cumulativeTimestamps(samples: number[], offset = 0): number[] {\n const timestamps = new Array<number>(samples.length);\n let cumulative = 0;\n for (let i = 0; i < samples.length; i++) {\n cumulative += samples[i];\n timestamps[i] = offset + Math.round(cumulative * 1000); // ms ==> μs\n }\n return timestamps;\n}\n\n/** Create a thread-scoped instant event */\nfunction instant(ts: number, name: string, args: Args): TraceEvent {\n return { ph: \"i\", ts, pid, tid, cat: \"bench\", name, s: \"t\", args };\n}\n\n/** Create a counter event (shown as a time-series chart in Perfetto) */\nfunction counter(ts: number, name: string, args: Args): TraceEvent {\n return { ph: \"C\", ts, pid, tid, cat: \"bench\", name, args };\n}\n","/** CPU time profile conversion to Speedscope sampled format. */\n\nimport { resolveCallFrame } from \"../profiling/node/ResolvedProfile.ts\";\nimport type {\n TimeProfile,\n TimeProfileNode,\n} from \"../profiling/node/TimeSampler.ts\";\nimport {\n type FrameContext,\n frameContext,\n internFrame,\n type SpeedscopeFile,\n type SpeedscopeTimeProfile,\n speedscopeFile,\n} from \"./SpeedscopeTypes.ts\";\n\n/** Convert a TimeProfile to speedscope format */\nexport function timeProfileToSpeedscope(\n name: string,\n profile: TimeProfile,\n): SpeedscopeFile {\n const ctx = frameContext();\n const p = buildTimeProfile(name, profile, ctx);\n return speedscopeFile(ctx, [p]);\n}\n\n/** Build a SpeedscopeFile from multiple named time profiles (shared frames). */\nexport function buildTimeSpeedscopeFile(\n entries: { name: string; profile: TimeProfile }[],\n): SpeedscopeFile | undefined {\n if (entries.length === 0) return undefined;\n\n const ctx = frameContext();\n const profiles = entries.map(e => buildTimeProfile(e.name, e.profile, ctx));\n return speedscopeFile(ctx, profiles);\n}\n\n/** Build a speedscope profile from a V8 TimeProfile */\nfunction buildTimeProfile(\n name: string,\n profile: TimeProfile,\n ctx: FrameContext,\n): SpeedscopeTimeProfile {\n const { samples: sampleIds, timeDeltas, nodes } = profile;\n\n if (!sampleIds?.length || !timeDeltas) {\n return {\n type: \"sampled\",\n name,\n unit: \"microseconds\",\n startValue: 0,\n endValue: 0,\n samples: [],\n weights: [],\n };\n }\n\n const nodeMap = new Map<number, TimeProfileNode>(nodes.map(n => [n.id, n]));\n const parentMap = new Map<number, number>(); // childId -> parentId\n for (const node of nodes) {\n for (const childId of node.children ?? []) {\n parentMap.set(childId, node.id);\n }\n }\n\n const cache = new Map<number, number[]>();\n const resolve = (id: number) =>\n resolveStack(id, nodeMap, parentMap, cache, ctx);\n\n const samples = sampleIds.map(resolve);\n const total = timeDeltas.reduce((sum, w) => sum + w, 0);\n return {\n type: \"sampled\",\n name,\n unit: \"microseconds\",\n startValue: 0,\n endValue: total,\n samples,\n weights: timeDeltas,\n };\n}\n\n/** Walk from node to root, building a stack of frame indices (root-first) */\nfunction resolveStack(\n nodeId: number,\n nodeMap: Map<number, TimeProfileNode>,\n parentMap: Map<number, number>,\n cache: Map<number, number[]>,\n ctx: FrameContext,\n): number[] {\n const cached = cache.get(nodeId);\n if (cached) return cached;\n\n const path: number[] = [];\n let current: number | undefined = nodeId;\n while (current !== undefined) {\n path.push(current);\n current = parentMap.get(current);\n }\n\n // Reverse to root-first order\n const stack: number[] = [];\n for (let i = path.length - 1; i >= 0; i--) {\n const node = nodeMap.get(path[i]);\n if (!node) continue;\n const { functionName, url, lineNumber } = node.callFrame;\n // Skip the synthetic (root) node\n if (!functionName && !url && lineNumber <= 0) continue;\n const frame = resolveCallFrame(node.callFrame);\n stack.push(internFrame(frame.name, frame.url, frame.line, frame.col, ctx));\n }\n\n cache.set(nodeId, stack);\n return stack;\n}\n","import colors from \"../../report/Colors.ts\";\nimport { formatBytes } from \"../../report/Formatters.ts\";\nimport type { HeapProfile, HeapSample } from \"./HeapSampler.ts\";\nimport {\n type ResolvedFrame,\n type ResolvedProfile,\n resolveProfile,\n} from \"./ResolvedProfile.ts\";\n\n/** An allocation site with byte totals, call stack, and optional raw samples */\nexport interface HeapSite {\n name: string;\n url: string;\n /** 1-indexed */\n line: number;\n col?: number;\n bytes: number;\n /** Call stack from root to this frame */\n stack?: ResolvedFrame[];\n /** Individual allocation samples at this site */\n samples?: HeapSample[];\n /** Distinct caller paths with byte weights (populated by {@link aggregateSites}) */\n callers?: { stack: ResolvedFrame[]; bytes: number }[];\n}\n\n/** Predicate that returns true for user code (vs. runtime internals) */\nexport type UserCodeFilter = (site: ResolvedFrame) => boolean;\n\n/** Options for {@link formatHeapReport} */\nexport interface HeapReportOptions {\n /** Max sites to display */\n topN: number;\n /** Caller stack frames to show per site (default 3) */\n stackDepth?: number;\n /** Multi-line format with file paths (default false) */\n verbose?: boolean;\n /** Dump every raw sample */\n raw?: boolean;\n /** Filter to user code only, hiding runtime internals */\n userOnly?: boolean;\n /** Predicate for user vs internal code (default {@link isNodeUserCode}) */\n isUserCode?: UserCodeFilter;\n /** Total bytes across all nodes (before filtering) */\n totalAll?: number;\n /** Total bytes for user code only */\n totalUserCode?: number;\n /** Number of samples taken */\n sampleCount?: number;\n}\n\n/** Sum selfSize across all nodes in profile (before any filtering) */\nexport function totalProfileBytes(profile: HeapProfile): number {\n return resolveProfile(profile).totalBytes;\n}\n\n/** Flatten resolved profile into sorted list of allocation sites with call stacks.\n * When raw samples are available, attaches them to corresponding sites. */\nexport function flattenProfile(resolved: ResolvedProfile): HeapSite[] {\n const sites: HeapSite[] = [];\n const nodeIdToSites = new Map<number, HeapSite[]>();\n\n for (const node of resolved.allocationNodes) {\n const site: HeapSite = {\n ...node.frame,\n bytes: node.selfSize,\n stack: node.stack,\n };\n sites.push(site);\n const bucket = nodeIdToSites.get(node.nodeId) ?? [];\n if (!bucket.length) nodeIdToSites.set(node.nodeId, bucket);\n bucket.push(site);\n }\n\n for (const sample of resolved.sortedSamples ?? []) {\n const matchingSites = nodeIdToSites.get(sample.nodeId);\n if (!matchingSites) continue;\n for (const site of matchingSites) {\n if (!site.samples) site.samples = [];\n site.samples.push(sample);\n }\n }\n\n return sites.sort((a, b) => b.bytes - a.bytes);\n}\n\n/** Return true if the call frame is user code (excludes node: and internal/ URLs) */\nexport function isNodeUserCode(site: ResolvedFrame): boolean {\n const { url } = site;\n return (\n !!url &&\n !url.startsWith(\"node:\") &&\n !url.includes(\"(native)\") &&\n !url.includes(\"internal/\")\n );\n}\n\n/** Return true if the call frame is user code (excludes chrome-extension:// and devtools:// URLs) */\nexport function isBrowserUserCode(site: ResolvedFrame): boolean {\n const { url } = site;\n return (\n !!url &&\n !url.startsWith(\"chrome-extension://\") &&\n !url.startsWith(\"devtools://\") &&\n !url.includes(\"(native)\")\n );\n}\n\n/** Return only sites matching a user-code predicate (default: {@link isNodeUserCode}) */\nexport function filterSites(\n sites: HeapSite[],\n isUser: UserCodeFilter = isNodeUserCode,\n): HeapSite[] {\n return sites.filter(isUser);\n}\n\n/** Aggregate sites by location (combine same file:line:col).\n * Tracks distinct caller stacks with byte weights when merging. */\nexport function aggregateSites(sites: HeapSite[]): HeapSite[] {\n const byLocation = new Map<string, HeapSite>();\n\n for (const site of sites) {\n // When column is unknown, include name to avoid merging distinct sites\n const colKey = site.col != null ? `${site.col}` : `?:${site.name}`;\n const key = `${site.url}:${site.line}:${colKey}`;\n const existing = byLocation.get(key);\n if (existing) {\n existing.bytes += site.bytes;\n addCaller(existing, site);\n } else {\n const callers = site.stack\n ? [{ stack: site.stack, bytes: site.bytes }]\n : undefined;\n byLocation.set(key, { ...site, callers });\n }\n }\n\n for (const site of byLocation.values()) {\n if (!site.callers || site.callers.length <= 1) continue;\n site.callers.sort((a, b) => b.bytes - a.bytes);\n site.stack = site.callers[0].stack;\n }\n\n return [...byLocation.values()].sort((a, b) => b.bytes - a.bytes);\n}\n\n/** Format heap report for console output */\nexport function formatHeapReport(\n sites: HeapSite[],\n options: HeapReportOptions,\n): string {\n const { topN, stackDepth = 3, verbose = false } = options;\n const { totalAll, totalUserCode, sampleCount, isUserCode } = options;\n const isUser = isUserCode ?? isNodeUserCode;\n const formatSite = verbose ? formatVerboseSite : formatCompactSite;\n const lines: string[] = [];\n lines.push(`Heap allocation sites (top ${topN}, garbage included):`);\n\n for (const site of sites.slice(0, topN)) {\n formatSite(lines, site, stackDepth, isUser);\n }\n\n lines.push(\"\");\n if (totalAll !== undefined)\n lines.push(`Total (all): ${fmtBytes(totalAll)}`);\n if (totalUserCode !== undefined)\n lines.push(`Total (user-code): ${fmtBytes(totalUserCode)}`);\n if (sampleCount !== undefined)\n lines.push(`Samples: ${sampleCount.toLocaleString()}`);\n\n return lines.join(\"\\n\");\n}\n\n/** Sum bytes across all sites */\nexport function totalBytes(sites: HeapSite[]): number {\n return sites.reduce((sum, s) => sum + s.bytes, 0);\n}\n\n/** Format every raw sample as one line, ordered by ordinal (time).\n * Output is tab-separated for easy piping/grep/diff. */\nexport function formatRawSamples(resolved: ResolvedProfile): string {\n const { sortedSamples, nodeMap } = resolved;\n if (!sortedSamples || sortedSamples.length === 0)\n return \"No raw samples available.\";\n\n const header = \"ordinal\\tsize\\tfunction\\tlocation\";\n const rows = sortedSamples.map(s => {\n const frame = nodeMap.get(s.nodeId)?.frame;\n const fn = frame?.name || \"(unknown)\";\n const url = frame?.url || \"\";\n const loc = url ? fmtLoc(url, frame!.line, frame!.col) : \"(unknown)\";\n return `${s.ordinal}\\t${s.size}\\t${fn}\\t${loc}`;\n });\n return [header, ...rows].join(\"\\n\");\n}\n\n/** Add a caller stack to an aggregated site, merging if the same path exists */\nfunction addCaller(existing: HeapSite, site: HeapSite): void {\n if (!site.stack) return;\n existing.callers ??= [];\n const key = callerKey(site.stack);\n const match = existing.callers.find(c => callerKey(c.stack) === key);\n if (match) match.bytes += site.bytes;\n else existing.callers.push({ stack: site.stack, bytes: site.bytes });\n}\n\n/** Verbose multi-line format with file:// paths and line numbers */\nfunction formatVerboseSite(\n lines: string[],\n site: HeapSite,\n stackDepth: number,\n isUser: UserCodeFilter,\n): void {\n const bytes = fmtBytes(site.bytes).padStart(10);\n const loc = site.url ? fmtLoc(site.url, site.line, site.col) : \"(unknown)\";\n const style = isUser(site) ? (s: string) => s : colors.dim;\n lines.push(style(`${bytes} ${site.name} ${loc}`));\n\n const userCallers = callerFrames(site, stackDepth).filter(\n f => f.url && isUser(f),\n );\n for (const frame of userCallers) {\n const loc = fmtLoc(frame.url, frame.line, frame.col);\n lines.push(style(` <- ${frame.name} ${loc}`));\n }\n}\n\n/** Compact single-line format: `49 MB fn1 <- fn2 <- fn3` */\nfunction formatCompactSite(\n lines: string[],\n site: HeapSite,\n stackDepth: number,\n isUser: UserCodeFilter,\n): void {\n const bytes = fmtBytes(site.bytes).padStart(10);\n const callers = callerFrames(site, stackDepth)\n .filter(f => f.url && isUser(f))\n .map(f => f.name);\n const line = `${bytes} ${[site.name, ...callers].join(\" <- \")}`;\n lines.push(isUser(site) ? line : colors.dim(line));\n}\n\n/** Format bytes with a space separator, falling back to raw bytes */\nfunction fmtBytes(bytes: number): string {\n return formatBytes(bytes, { space: true }) ?? `${bytes} B`;\n}\n\n/** Format location, omitting column when unknown */\nfunction fmtLoc(url: string, line: number, col?: number): string {\n return col != null ? `${url}:${line}:${col}` : `${url}:${line}`;\n}\n\n/** Serialize a call stack for dedup comparison */\nfunction callerKey(stack: ResolvedFrame[]): string {\n return stack.map(f => `${f.url}:${f.line}:${f.col}`).join(\"|\");\n}\n\n/** Get caller frames (parent stack excluding self, reversed, truncated) */\nfunction callerFrames(site: HeapSite, depth: number): ResolvedFrame[] {\n if (!site.stack || site.stack.length <= 1) return [];\n return site.stack.slice(0, -1).reverse().slice(0, depth);\n}\n","import type { NavTiming } from \"../profiling/browser/BrowserProfiler.ts\";\nimport type { MeasuredResults } from \"../runners/MeasuredResults.ts\";\nimport { average, median, percentile } from \"../stats/StatisticalUtils.ts\";\nimport type { ReportSection } from \"./BenchmarkReport.ts\";\nimport { formatBytes, integer, percent, timeMs } from \"./Formatters.ts\";\n\n/** Report section: GC time as fraction of total benchmark time. */\nexport const gcSection: ReportSection = {\n title: \"gc\",\n columns: [\n {\n key: \"gc\",\n title: \"mean\",\n formatter: percent,\n comparable: true,\n value: (r: MeasuredResults) => {\n const { nodeGcTime, time, samples } = r;\n if (!nodeGcTime || !time?.avg) return undefined;\n const totalBenchTime = time.avg * samples.length;\n if (totalBenchTime <= 0) return undefined;\n const gcFraction = nodeGcTime.inRun / totalBenchTime;\n return gcFraction <= 1 ? gcFraction : undefined;\n },\n },\n ],\n};\n\n/** Report section: detailed GC stats from --trace-gc-nvp. */\nexport const gcStatsSection: ReportSection = {\n title: \"gc\",\n columns: [\n {\n key: \"allocPerIter\",\n title: \"alloc/iter\",\n formatter: formatBytes,\n comparable: true,\n value: (r: MeasuredResults) => {\n const { gcStats, samples } = r;\n if (!gcStats) return undefined;\n const alloc = gcStats.totalAllocated;\n return alloc != null ? alloc / (samples.length || 1) : undefined;\n },\n },\n {\n key: \"collected\",\n title: \"collected\",\n formatter: formatBytes,\n comparable: true,\n value: (r: MeasuredResults) => r.gcStats?.totalCollected || undefined,\n },\n {\n key: \"scavenges\",\n title: \"scav\",\n formatter: integer,\n comparable: true,\n value: (r: MeasuredResults) => r.gcStats?.scavenges,\n },\n {\n key: \"fullGCs\",\n title: \"full\",\n formatter: integer,\n comparable: true,\n value: (r: MeasuredResults) => r.gcStats?.markCompacts,\n },\n {\n key: \"promoPercent\",\n title: \"promo%\",\n formatter: percent,\n comparable: true,\n value: (r: MeasuredResults) => {\n const gs = r.gcStats;\n if (!gs) return undefined;\n const alloc = gs.totalAllocated;\n return alloc && alloc > 0 ? (gs.totalPromoted ?? 0) / alloc : undefined;\n },\n },\n {\n key: \"pausePerIter\",\n title: \"pause/iter\",\n formatter: timeMs,\n comparable: true,\n value: (r: MeasuredResults) => {\n const gs = r.gcStats;\n return gs ? gs.gcPauseTime / (r.samples.length || 1) : undefined;\n },\n },\n ],\n};\n\n/** Report section: browser GC stats from CDP tracing (subset of gcStatsSection). */\nexport const browserGcStatsSection: ReportSection = {\n title: \"gc\",\n columns: [\n gcStatsSection.columns.find(c => c.key === \"collected\")!,\n gcStatsSection.columns.find(c => c.key === \"scavenges\")!,\n gcStatsSection.columns.find(c => c.key === \"fullGCs\")!,\n {\n key: \"pausePerIter\",\n title: \"pause\",\n formatter: timeMs,\n comparable: true,\n value: gcStatsSection.columns.find(c => c.key === \"pausePerIter\")!.value!,\n },\n ],\n};\n\n/** Report sections: page-load stats (mean/p50/p99) across multiple iterations. */\nexport const pageLoadStatsSections: ReportSection[] = [\n pageLoadSection(\"DCL\", n => n.domContentLoaded || undefined),\n pageLoadSection(\"load\", n => n.loadEvent || undefined),\n pageLoadSection(\"LCP\", n => n.lcp),\n];\n\n/** @return GC stats sections if enabled by CLI flags */\nexport function gcSections(args: { \"gc-stats\"?: boolean }): ReportSection[] {\n return args[\"gc-stats\"] ? [gcStatsSection] : [];\n}\n\n/** Build a page-load section with mean/p50/p99 columns from NavTiming data */\nfunction pageLoadSection(\n title: string,\n extract: (n: NavTiming) => number | undefined,\n): ReportSection {\n const vals = (r: MeasuredResults) => navValues(r.navTimings, extract);\n const col = (suffix: string, stat: (v: number[]) => number) => ({\n key: `${title.toLowerCase()}${suffix}`,\n title: suffix.toLowerCase(),\n formatter: timeMs,\n value: (r: MeasuredResults) => {\n const v = vals(r);\n return v.length ? stat(v) : undefined;\n },\n });\n return {\n title,\n columns: [\n col(\"Mean\", average),\n col(\"P50\", median),\n col(\"P99\", v => percentile(v, 0.99)),\n ],\n };\n}\n\n/** Extract one field from all NavTimings, filtering undefineds. */\nfunction navValues(\n navs: NavTiming[] | undefined,\n fn: (n: NavTiming) => number | undefined,\n): number[] {\n if (!navs?.length) return [];\n return navs.map(fn).filter((v): v is number => v != null);\n}\n","import type { StatKind } from \"../stats/StatisticalUtils.ts\";\n\n/** Parsed spec for one timing column selected via --stats. */\nexport interface StatSpec {\n key: string;\n title: string;\n statKind: StatKind;\n}\n\n/** Parse --stats into column specs. Throws on empty/invalid tokens. */\nexport function parseStatsArg(stats: string): StatSpec[] {\n const tokens = stats\n .split(\",\")\n .map(t => t.trim())\n .filter(Boolean);\n if (tokens.length === 0) {\n throw new Error(\"--stats must list at least one column\");\n }\n const seen = new Set<string>();\n const specs: StatSpec[] = [];\n for (const token of tokens) {\n const spec = parseStatToken(token);\n if (seen.has(spec.key)) continue;\n seen.add(spec.key);\n specs.push(spec);\n }\n return specs;\n}\n\n/** @return stat spec for a single --stats token. Throws on invalid input. */\nfunction parseStatToken(token: string): StatSpec {\n const lower = token.toLowerCase();\n if (lower === \"mean\" || lower === \"avg\") {\n return { key: \"mean\", title: \"mean\", statKind: \"mean\" };\n }\n if (lower === \"median\") {\n return { key: \"p50\", title: \"p50\", statKind: { percentile: 0.5 } };\n }\n if (lower === \"min\") {\n return { key: \"min\", title: \"min\", statKind: \"min\" };\n }\n if (lower === \"max\") {\n return { key: \"max\", title: \"max\", statKind: \"max\" };\n }\n const m = lower.match(/^p(\\d+)$/);\n if (m) return parsePercentileToken(token, m[1]);\n throw new Error(\n `invalid --stats token \"${token}\": expected mean, median, min, max, or p<N> (e.g. p50, p99, p999)`,\n );\n}\n\n/** @return spec for a p<N> token, enforcing the 2-digit minimum and 9-prefix rule. */\nfunction parsePercentileToken(token: string, digits: string): StatSpec {\n if (digits.length < 2) {\n throw new Error(\n `invalid --stats token \"${token}\": percentile needs at least 2 digits (e.g. p05, p50, p99, p999)`,\n );\n }\n // 3+ digit tokens express sub-percentile precision (p999 = 99.9%,\n // p9999 = 99.99%). Require leading 9 so p100/p500 don't silently\n // map to 10%/50% — use 2-digit p10/p50 for those.\n if (digits.length > 2 && digits[0] !== \"9\") {\n throw new Error(\n `invalid --stats token \"${token}\": percentiles with 3+ digits must start with 9 (e.g. p999, p9999); otherwise use 2-digit form (e.g. p50)`,\n );\n }\n const q = Number(digits) / 10 ** digits.length;\n return {\n key: `p${digits}`,\n title: `p${digits}`,\n statKind: { percentile: q },\n };\n}\n","import type {\n MeasuredResults,\n OptStatusInfo,\n} from \"../runners/MeasuredResults.ts\";\nimport { isBootstrappable } from \"../stats/StatisticalUtils.ts\";\nimport type { ReportSection } from \"./BenchmarkReport.ts\";\nimport { formatConvergence, timeMs } from \"./Formatters.ts\";\nimport { gcSections } from \"./GcSections.ts\";\nimport { parseStatsArg } from \"./ParseStats.ts\";\n\n/** Default timing section: mean, p50, p99. */\nexport const timeSection: ReportSection = buildTimeSection();\n\n/** Report section: number of sample iterations. */\nexport const runsSection: ReportSection = {\n title: \"\",\n columns: [\n {\n key: \"runs\",\n title: \"runs\",\n formatter: v => String(v),\n value: (r: MeasuredResults) => r.samples.length,\n },\n ],\n};\n\n/** Report section: total sampling duration. */\nexport const totalTimeSection: ReportSection = {\n title: \"\",\n columns: [\n {\n key: \"totalTime\",\n title: \"time\",\n formatter: formatTotalTime,\n value: (r: MeasuredResults) => r.totalTime,\n },\n ],\n};\n\n/** Report sections: timing stats and convergence for adaptive mode. */\nexport const adaptiveSections: ReportSection[] = [\n {\n title: \"time\",\n columns: [\n {\n key: \"median\",\n title: \"median\",\n formatter: timeMs,\n comparable: true,\n statKind: { percentile: 0.5 },\n },\n {\n key: \"mean\",\n title: \"mean\",\n formatter: timeMs,\n comparable: true,\n statKind: \"mean\",\n },\n {\n key: \"p99\",\n title: \"p99\",\n formatter: timeMs,\n statKind: { percentile: 0.99 },\n },\n ],\n },\n {\n title: \"\",\n columns: [\n {\n key: \"convergence\",\n title: \"conv%\",\n formatter: formatConvergence,\n value: (r: MeasuredResults) => r.convergence?.confidence,\n },\n ],\n },\n];\n\n/** Report section: V8 optimization tier distribution and deopt count. */\nexport const optSection: ReportSection = {\n title: \"v8 opt\",\n columns: [\n {\n key: \"tiers\",\n title: \"tiers\",\n formatter: v => (typeof v === \"string\" ? v : \"\"),\n value: (r: MeasuredResults) => {\n const opt = r.optStatus;\n return opt ? formatTierSummary(opt) : undefined;\n },\n },\n {\n key: \"deopt\",\n title: \"deopt\",\n formatter: v => (typeof v === \"number\" ? String(v) : \"\"),\n value: (r: MeasuredResults) => {\n const opt = r.optStatus;\n return opt && opt.deoptCount > 0 ? opt.deoptCount : undefined;\n },\n },\n ],\n};\n\n/** Build a time section with user-chosen percentile/stat columns. */\nexport function buildTimeSection(stats = \"mean,p50,p99\"): ReportSection {\n const specs = parseStatsArg(stats);\n return {\n title: \"time\",\n columns: specs.map(s => ({\n key: s.key,\n title: s.title,\n formatter: timeMs,\n comparable: isBootstrappable(s.statKind),\n statKind: s.statKind,\n })),\n };\n}\n\n/** Format V8 tier distribution sorted by count (e.g. \"turbofan:85% sparkplug:15%\"). */\nexport function formatTierSummary(\n opt: OptStatusInfo,\n sep = \":\",\n glue = \" \",\n): string {\n const tiers = Object.entries(opt.byTier);\n const total = tiers.reduce((s, [, t]) => s + t.count, 0);\n const pct = (n: number) => `${((n / total) * 100).toFixed(0)}%`;\n return tiers\n .sort((a, b) => b[1].count - a[1].count)\n .map(([name, t]) => `${name}${sep}${pct(t.count)}`)\n .join(glue);\n}\n\n/** @return default report sections from CLI flags (GC stats if enabled, plus run count). */\nexport function buildGenericSections(args: {\n \"gc-stats\"?: boolean;\n alloc?: boolean;\n}): ReportSection[] {\n return [...gcSections(args), runsSection];\n}\n\n/** Format total time; brackets indicate >= 30s. */\nfunction formatTotalTime(v: unknown): string {\n if (typeof v !== \"number\") return \"\";\n return v >= 30 ? `[${v.toFixed(1)}s]` : `${v.toFixed(1)}s`;\n}\n","import type { MeasuredResults } from \"../runners/MeasuredResults.ts\";\nimport {\n type BlockDiffOptions,\n binBootstrapResult,\n diffCIs,\n} from \"../stats/BootstrapDifference.ts\";\nimport {\n type BootstrapResult,\n bootstrapCIs,\n type DifferenceCI,\n flipCI,\n isBootstrappable,\n type StatKind,\n swapDirection,\n} from \"../stats/StatisticalUtils.ts\";\nimport type {\n BootstrapCIData,\n ViewerEntry,\n ViewerRow,\n ViewerSection,\n} from \"../viewer/ReportData.ts\";\nimport {\n type ComparisonOptions,\n computeColumnValues,\n type ReportColumn,\n type ReportSection,\n type UnknownRecord,\n} from \"./BenchmarkReport.ts\";\n\n/** Context for building viewer rows within a column group */\ninterface RowContext {\n current: MeasuredResults;\n baseline?: MeasuredResults;\n curVals: Record<string, unknown>;\n baseVals?: Record<string, unknown>;\n currentMeta?: UnknownRecord;\n baselineMeta?: UnknownRecord;\n comparison?: ComparisonOptions;\n}\n\n/** Pre-computed bootstrap results for a single column */\ninterface ColCIs {\n cur?: BootstrapResult;\n base?: BootstrapResult;\n diff?: DifferenceCI;\n}\n\ninterface Annotatable {\n direction: string;\n label?: string;\n ciReliable?: boolean;\n ciLevel?: string;\n}\n\nexport const minBatches = 20;\n\n/** @return true if comparing with fewer than minBatches on either side */\nexport function hasLowBatchCount(\n baseline: MeasuredResults | undefined,\n current: MeasuredResults | undefined,\n): boolean {\n if (!baseline) return false;\n return batchCount(baseline) < minBatches || batchCount(current) < minBatches;\n}\n\n/** @return true if either side has no real batch structure */\nexport function isSingleBatch(\n baseline: MeasuredResults | undefined,\n current: MeasuredResults | undefined,\n): boolean {\n if (!baseline) return batchCount(current) < 2;\n return batchCount(baseline) < 2 || batchCount(current) < 2;\n}\n\n/** Add label, mark unreliable, and override direction when batch count is low */\nexport function annotateCI<T extends Annotatable | undefined>(\n ci: T,\n title?: string,\n lowBatches?: boolean,\n): T {\n if (!ci) return ci;\n if (lowBatches) ci.direction = \"uncertain\";\n ci.ciReliable = !lowBatches && ci.ciLevel !== \"sample\";\n if (title) ci.label = `${title} Δ%`;\n return ci;\n}\n\n/** Build ViewerSections from ReportSections, with bootstrap CIs for comparable columns */\nexport function buildViewerSections(\n sections: ReportSection[],\n base: Omit<RowContext, \"curVals\" | \"baseVals\">,\n): ViewerSection[] {\n const { current, baseline, currentMeta, baselineMeta } = base;\n return sections.flatMap(section => {\n const curVals = computeColumnValues(section, current, currentMeta);\n const baseVals = baseline\n ? computeColumnValues(section, baseline, baselineMeta)\n : undefined;\n const ctx: RowContext = { ...base, curVals, baseVals };\n const rows = buildGroupRows(section.columns as ReportColumn[], ctx);\n if (!rows.length) return [];\n return [{ title: section.title, rows } satisfies ViewerSection];\n });\n}\n\nfunction batchCount(m?: MeasuredResults): number {\n return m?.batchOffsets?.length ?? 0;\n}\n\n/** Build ViewerRow[] for a column group, using shared resampling for statKind columns */\nfunction buildGroupRows(columns: ReportColumn[], ctx: RowContext): ViewerRow[] {\n const ciMap = buildCIMap(columns, ctx);\n const rows: ViewerRow[] = [];\n for (const col of columns) {\n const key = (col.key ?? col.title) as string;\n const row = buildRow(col, key, ctx, ciMap.get(key));\n if (row) rows.push(row);\n }\n const first = rows.find(r => r.entries.some(e => e.bootstrapCI));\n if (first) first.primary = true;\n return rows;\n}\n\n/** Compute batched bootstrap CIs, returning a Map keyed by column key */\nfunction buildCIMap(\n columns: ReportColumn[],\n ctx: RowContext,\n): Map<string, ColCIs> {\n const ciCols = columns.filter(\n c => c.comparable && c.statKind && isBootstrappable(c.statKind),\n );\n const statKinds = ciCols.map(c => c.statKind!);\n const map = new Map<string, ColCIs>();\n if (statKinds.length === 0) return map;\n\n const curSamples = ctx.current.samples;\n const baseSamples = ctx.baseline?.samples;\n const curResults =\n curSamples?.length > 1\n ? bootstrapCIs(curSamples, ctx.current.batchOffsets, statKinds)\n : undefined;\n const baseResults =\n baseSamples?.length && baseSamples.length > 1\n ? bootstrapCIs(baseSamples, ctx.baseline!.batchOffsets, statKinds)\n : undefined;\n const diffResults = buildDiffResults(ciCols, statKinds, ctx);\n\n for (let i = 0; i < ciCols.length; i++) {\n const key = (ciCols[i].key ?? ciCols[i].title) as string;\n map.set(key, {\n cur: curResults?.[i],\n base: baseResults?.[i],\n diff: diffResults?.[i],\n });\n }\n return map;\n}\n\n/** Build a ViewerRow for a column, using pre-computed CIs if available */\nfunction buildRow(\n col: ReportColumn,\n key: string,\n ctx: RowContext,\n cis?: ColCIs,\n): ViewerRow | undefined {\n const curRaw = ctx.curVals[key];\n const baseRaw = ctx.baseVals?.[key];\n if (curRaw === undefined && baseRaw === undefined) return undefined;\n\n const format = (v: unknown) => {\n if (v === undefined) return \"\";\n return (col.formatter ? col.formatter(v) : String(v)) ?? \"\";\n };\n\n // Non-comparable: shared single value\n if (!col.comparable) {\n const value = format(curRaw ?? baseRaw);\n if (!value || value === \"—\") return undefined;\n return {\n label: col.title,\n entries: [{ runName: ctx.current.name, value }],\n shared: true,\n };\n }\n\n // Comparable: current + baseline entries, optional CI\n const curEntry = buildEntry(\n ctx.current.name,\n format(curRaw),\n col,\n cis?.cur,\n ctx.current.batchOffsets,\n ctx.currentMeta,\n );\n const entries: ViewerEntry[] = [curEntry];\n if (ctx.baseline && baseRaw !== undefined) {\n const baseEntry = buildEntry(\n \"baseline\",\n format(baseRaw),\n col,\n cis?.base,\n ctx.baseline.batchOffsets,\n ctx.baselineMeta,\n );\n entries.push(baseEntry);\n }\n return { label: col.title, entries, comparisonCI: cis?.diff };\n}\n\n/** Compute difference CIs with annotation and higher-is-better flip */\nfunction buildDiffResults(\n cols: ReportColumn[],\n stats: StatKind[],\n ctx: RowContext,\n): (DifferenceCI | undefined)[] | undefined {\n const { baseline, current, comparison } = ctx;\n if (!baseline?.samples?.length || !current.samples?.length) return undefined;\n\n const opts: BlockDiffOptions = {\n equivMargin: comparison?.equivMargin,\n noBatchTrim: comparison?.noBatchTrim,\n };\n const rawCIs = diffCIs(\n baseline.samples,\n baseline.batchOffsets,\n current.samples,\n current.batchOffsets,\n stats,\n opts,\n );\n const lowBatches = hasLowBatchCount(baseline, current);\n return rawCIs.map((ci, i) => {\n if (!ci) return undefined;\n const col = cols[i];\n const adjusted = col.higherIsBetter ? swapDirection(flipCI(ci)) : ci;\n return annotateCI(adjusted, col.title, lowBatches);\n });\n}\n\n/** Build a ViewerEntry, attaching bootstrap CI data if available */\nfunction buildEntry(\n runName: string,\n value: string,\n col: ReportColumn,\n result: BootstrapResult | undefined,\n batchOffsets: number[] | undefined,\n metadata?: UnknownRecord,\n): ViewerEntry {\n if (!result) return { runName, value };\n const bootstrapCI = formatBootstrapCI(col, result, batchOffsets, metadata);\n return { runName, value, bootstrapCI };\n}\n\n/** Format a BootstrapResult into display-domain BootstrapCIData */\nfunction formatBootstrapCI(\n col: ReportColumn,\n result: BootstrapResult,\n batchOffsets: number[] | undefined,\n metadata?: UnknownRecord,\n): BootstrapCIData {\n const toDisplay = col.toDisplay\n ? (v: number) => col.toDisplay!(v, metadata)\n : (v: number) => v;\n const formatValue = (v: number) =>\n (col.formatter ? col.formatter(v) : String(v)) ?? String(v);\n\n const binned = binBootstrapResult(result);\n const dLo = toDisplay(binned.ci[0]);\n const dHi = toDisplay(binned.ci[1]);\n const ci = (dLo <= dHi ? [dLo, dHi] : [dHi, dLo]) as [number, number];\n const histogram = binned.histogram.map(b => ({\n x: toDisplay(b.x),\n count: b.count,\n }));\n const ciLabels = [formatValue(ci[0]), formatValue(ci[1])] as [string, string];\n const nBatches = batchOffsets?.length ?? 0;\n const ciReliable = result.ciLevel === \"block\" && nBatches >= minBatches;\n return {\n estimate: toDisplay(binned.estimate),\n ci,\n histogram,\n ciLabels,\n ciLevel: result.ciLevel,\n ciReliable,\n };\n}\n","import { cliDefaults } from \"../cli/CliArgs.ts\";\nimport type { CoverageData } from \"../profiling/node/CoverageTypes.ts\";\nimport {\n filterSites,\n flattenProfile,\n totalBytes,\n} from \"../profiling/node/HeapSampleReport.ts\";\nimport type { HeapProfile } from \"../profiling/node/HeapSampler.ts\";\nimport { resolveProfile } from \"../profiling/node/ResolvedProfile.ts\";\nimport type { MeasuredResults } from \"../runners/MeasuredResults.ts\";\nimport type { DifferenceCI } from \"../stats/StatisticalUtils.ts\";\nimport type {\n BenchmarkEntry,\n BenchmarkGroup,\n CoverageSummary,\n HeapSummary,\n ReportData,\n ViewerSection,\n} from \"../viewer/ReportData.ts\";\nimport {\n type BenchmarkReport,\n type ComparisonOptions,\n hasField,\n type ReportGroup,\n type ReportSection,\n type UnknownRecord,\n} from \"./BenchmarkReport.ts\";\nimport { gcStatsSection } from \"./GcSections.ts\";\nimport type { GitVersion } from \"./GitUtils.ts\";\nimport {\n buildTimeSection,\n optSection,\n runsSection,\n} from \"./StandardSections.ts\";\nimport {\n buildViewerSections,\n hasLowBatchCount,\n isSingleBatch,\n minBatches,\n} from \"./ViewerSections.ts\";\n\n/** Options for prepareHtmlData: report sections, git versions, and CLI args */\nexport interface PrepareHtmlOptions extends ComparisonOptions {\n cliArgs?: Record<string, unknown>;\n sections?: ReportSection[];\n currentVersion?: GitVersion;\n baselineVersion?: GitVersion;\n}\n\n/** Context shared across reports in a group */\ninterface GroupContext {\n baseM?: MeasuredResults;\n baseMeta?: UnknownRecord;\n sections?: ReportSection[];\n comparison?: ComparisonOptions;\n lowBatches: boolean;\n}\n\n/** Convert benchmark results into a ReportData payload for the HTML viewer */\nexport function prepareHtmlData(\n groups: ReportGroup[],\n options: PrepareHtmlOptions,\n): ReportData {\n const { cliArgs, currentVersion, baselineVersion, equivMargin, noBatchTrim } =\n options;\n const comparison: ComparisonOptions = { equivMargin, noBatchTrim };\n const sections = options.sections ?? defaultSections(groups, cliArgs);\n return {\n groups: groups.map(g => prepareGroupData(g, sections, comparison)),\n metadata: {\n timestamp: new Date().toISOString(),\n bencherVersion: process.env.npm_package_version || \"unknown\",\n cliArgs,\n cliDefaults,\n gcTrackingEnabled: cliArgs?.[\"gc-stats\"] === true,\n currentVersion,\n baselineVersion,\n environment: {\n node: process.version,\n platform: process.platform,\n arch: process.arch,\n },\n },\n };\n}\n\n/** Build default sections when caller doesn't provide custom ones */\nfunction defaultSections(\n groups: ReportGroup[],\n cliArgs?: Record<string, unknown>,\n): ReportSection[] {\n const hasGc = cliArgs?.[\"gc-stats\"] === true;\n const hasOpt = hasField(groups, \"optStatus\");\n const stats = typeof cliArgs?.stats === \"string\" ? cliArgs.stats : undefined;\n return [\n buildTimeSection(stats),\n hasGc ? gcStatsSection : undefined,\n hasOpt ? optSection : undefined,\n runsSection,\n ].filter((s): s is ReportSection => s !== undefined);\n}\n\n/** @return group data with structured ViewerSections and bootstrap CIs */\nfunction prepareGroupData(\n group: ReportGroup,\n sections?: ReportSection[],\n comparison?: ComparisonOptions,\n): BenchmarkGroup {\n const base = group.baseline;\n const baseM = base?.measuredResults;\n const baseline = base\n ? { ...prepareBenchmarkData(base), comparisonCI: undefined }\n : undefined;\n const curM = group.reports[0]?.measuredResults;\n const singleBatch = isSingleBatch(baseM, curM);\n const lowBatches = hasLowBatchCount(baseM, curM);\n const baseMeta = base?.metadata;\n const ctx: GroupContext = {\n baseM,\n baseMeta,\n sections,\n comparison,\n lowBatches,\n };\n\n return {\n name: group.name,\n baseline,\n warnings: buildWarnings(singleBatch, lowBatches),\n benchmarks: group.reports.map(r => prepareReportEntry(r, ctx)),\n };\n}\n\n/** @return benchmark data with samples, stats, and profiling summaries */\nfunction prepareBenchmarkData(report: {\n name: string;\n measuredResults: MeasuredResults;\n metadata?: UnknownRecord;\n}): Omit<BenchmarkEntry, \"comparisonCI\" | \"sections\"> {\n const { measuredResults: m, name } = report;\n return {\n name,\n samples: m.samples,\n warmupSamples: m.warmupSamples,\n allocationSamples: m.allocationSamples,\n heapSamples: m.heapSamples,\n gcEvents: m.nodeGcTime?.events,\n optSamples: m.optSamples,\n pausePoints: m.pausePoints,\n batchOffsets: m.batchOffsets,\n stats: m.time,\n heapSize: m.heapSize,\n totalTime: m.totalTime,\n heapSummary: m.heapProfile ? summarizeHeap(m.heapProfile) : undefined,\n coverageSummary: m.coverage ? summarizeCoverage(m.coverage) : undefined,\n };\n}\n\nfunction buildWarnings(\n singleBatch: boolean,\n lowBatches: boolean,\n): string[] | undefined {\n const parts: string[] = [];\n const singleMsg =\n \"Confidence intervals may be too narrow (single batch). Use --batches for more accurate intervals.\";\n if (singleBatch) parts.push(singleMsg);\n if (lowBatches)\n parts.push(\n `Too few batches for reliable comparison (need ${minBatches}+).`,\n );\n return parts.length ? parts : undefined;\n}\n\n/** @return a single benchmark entry with sections and comparison CI */\nfunction prepareReportEntry(\n report: BenchmarkReport,\n ctx: GroupContext,\n): BenchmarkEntry {\n const m = report.measuredResults;\n const sectionCtx = {\n current: m,\n baseline: ctx.baseM,\n currentMeta: report.metadata,\n baselineMeta: ctx.baseMeta,\n comparison: ctx.comparison,\n };\n const sections = ctx.sections\n ? buildViewerSections(ctx.sections, sectionCtx)\n : undefined;\n // Primary CI comes from the first primary row's comparisonCI (avoids duplicate bootstrap)\n const comparisonCI = findPrimarySectionCI(sections);\n return { ...prepareBenchmarkData(report), sections, comparisonCI };\n}\n\n/** Compute heap allocation summary from profile */\nfunction summarizeHeap(profile: HeapProfile): HeapSummary {\n const resolved = resolveProfile(profile);\n const userSites = filterSites(flattenProfile(resolved));\n return { totalBytes: resolved.totalBytes, userBytes: totalBytes(userSites) };\n}\n\n/** Compute coverage summary from V8 coverage data */\nfunction summarizeCoverage(coverage: CoverageData): CoverageSummary {\n const fns = coverage.scripts.flatMap(s => s.functions);\n const called = fns.filter(\n fn => fn.ranges.length > 0 && fn.ranges[0].count > 0,\n );\n const totalCalls = called.reduce((sum, fn) => sum + fn.ranges[0].count, 0);\n return { functionCount: called.length, totalCalls };\n}\n\n/** Extract the comparison CI from the first primary row across all sections */\nfunction findPrimarySectionCI(\n sections: ViewerSection[] | undefined,\n): DifferenceCI | undefined {\n if (!sections) return undefined;\n for (const section of sections) {\n for (const row of section.rows) {\n if (row.primary && row.comparisonCI) return row.comparisonCI;\n }\n }\n return undefined;\n}\n","import type { RunMatrixOptions } from \"../matrix/BenchMatrix.ts\";\nimport type { HeapReportOptions } from \"../profiling/node/HeapSampleReport.ts\";\nimport type { ComparisonOptions } from \"../report/BenchmarkReport.ts\";\nimport { buildTimeSection } from \"../report/StandardSections.ts\";\nimport type { RunnerOptions } from \"../runners/BenchRunner.ts\";\nimport {\n type DefaultCliArgs,\n defaultAdaptiveMaxTime,\n defaultDuration,\n} from \"./CliArgs.ts\";\n\n/**\n * Resolve duration/iterations flags into runner limits.\n *\n * | Flags set | maxTime | maxIterations |\n * |-------------------|--------------------|---------------|\n * | neither | defaultDuration*1000 | undefined |\n * | --iterations only | undefined | N |\n * | --duration only | duration*1000 | undefined |\n * | both | duration*1000 | N |\n */\ntype Limits = {\n maxTime: number | undefined;\n maxIterations: number | undefined;\n};\n\n/** Convert CLI args to matrix runner options. */\nexport function cliToMatrixOptions(args: DefaultCliArgs): RunMatrixOptions {\n const { iterations, worker, batches } = args;\n const { maxTime } = resolveLimits(args);\n return {\n iterations,\n maxTime,\n useWorker: worker,\n batches,\n warmupBatch: args[\"warmup-batch\"],\n ...cliCommonOptions(args),\n };\n}\n\n/** Validate CLI argument combinations. */\nexport function validateArgs(args: DefaultCliArgs): void {\n if (args[\"gc-stats\"] && !args.worker && !args.url) {\n throw new Error(\n \"--gc-stats requires worker mode (the default). Remove --no-worker flag.\",\n );\n }\n // Eagerly validate --stats tokens so users see the error before running benchmarks.\n if (args.stats) buildTimeSection(args.stats);\n}\n\n/** Convert CLI args to benchmark runner options. */\nexport function cliToRunnerOptions(args: DefaultCliArgs): RunnerOptions {\n const { inspect, iterations, adaptive } = args;\n const gcForce = args[\"gc-force\"];\n if (inspect)\n return { maxIterations: iterations ?? 1, warmupTime: 0, gcForce };\n if (adaptive) return createAdaptiveOptions(args);\n return { ...resolveLimits(args), ...cliCommonOptions(args) };\n}\n\n/** Convert CLI args to heap report display options. */\nexport function cliHeapReportOptions(args: DefaultCliArgs): HeapReportOptions {\n return {\n topN: args[\"alloc-rows\"],\n stackDepth: args[\"alloc-stack\"],\n verbose: args[\"alloc-verbose\"],\n raw: args[\"alloc-raw\"],\n userOnly: args[\"alloc-user-only\"],\n };\n}\n\n/** True if any alloc-related flag implies allocation sampling. */\nexport function needsAlloc(args: DefaultCliArgs): boolean {\n return (\n args.alloc ||\n args.archive != null ||\n args[\"alloc-raw\"] ||\n args[\"alloc-verbose\"] ||\n args[\"alloc-user-only\"]\n );\n}\n\n/** True if any profiling flag implies CPU time sampling. */\nexport function needsProfile(args: DefaultCliArgs): boolean {\n return args.profile || !!args[\"export-profile\"];\n}\n\n/** Extract baseline comparison options from CLI args. */\nexport function cliComparisonOptions(args: DefaultCliArgs): ComparisonOptions {\n return {\n equivMargin: args[\"equiv-margin\"],\n noBatchTrim: args[\"no-batch-trim\"],\n };\n}\n\nexport function resolveLimits(args: {\n duration?: number;\n iterations?: number;\n}): Limits {\n const { duration, iterations } = args;\n if (duration == null && iterations == null)\n return { maxTime: defaultDuration * 1000, maxIterations: undefined };\n return {\n maxTime: duration != null ? duration * 1000 : undefined,\n maxIterations: iterations,\n };\n}\n\n/** Runner/matrix options shared across all CLI modes. */\nfunction cliCommonOptions(args: DefaultCliArgs) {\n const { warmup } = args;\n const { \"gc-force\": gcForce, \"gc-stats\": gcStats } = args;\n const { \"trace-opt\": traceOpt, \"call-counts\": callCounts } = args;\n const { \"pause-warmup\": pauseWarmup, \"pause-first\": pauseFirst } = args;\n const { \"pause-interval\": pauseInterval, \"pause-duration\": pauseDuration } =\n args;\n const { \"alloc-interval\": allocInterval, \"alloc-depth\": allocDepth } = args;\n const { \"profile-interval\": profileInterval } = args;\n return {\n gcForce,\n warmup,\n traceOpt,\n gcStats,\n callCounts,\n pauseWarmup,\n pauseFirst,\n pauseInterval,\n pauseDuration,\n alloc: needsAlloc(args),\n allocInterval,\n allocDepth,\n profile: needsProfile(args),\n profileInterval,\n };\n}\n\n/** Build runner options for adaptive sampling mode. */\nfunction createAdaptiveOptions(args: DefaultCliArgs): RunnerOptions {\n return {\n minTime: (args[\"min-time\"] ?? 1) * 1000,\n maxTime: defaultAdaptiveMaxTime * 1000,\n targetConfidence: args.convergence,\n adaptive: true,\n ...cliCommonOptions(args),\n } as any;\n}\n","import type { Alignment, SpanningCellConfig, TableUserConfig } from \"table\";\nimport { table } from \"table\";\nimport colors from \"../Colors.ts\";\nimport { diffPercent } from \"../Formatters.ts\";\n\n/** Named group of columns, rendered with an optional spanning header. */\nexport interface ColumnGroup<T> {\n groupTitle?: string;\n columns: AnyColumn<T>[];\n}\n\nexport type AnyColumn<T> = Column<T> | DiffColumn<T>;\n\n/** Table column with a value formatter (non-diff). */\nexport interface Column<T> extends ColumnFormat<T> {\n formatter?: (value: unknown) => string | null;\n diffKey?: undefined;\n}\n\n/** Pre-computed header rows and table config for the `table` library. */\nexport interface TableSetup {\n headerRows: string[][];\n config: TableUserConfig;\n}\n\n/** Group of result rows with an optional baseline for diff columns. */\nexport interface ResultGroup<T extends Record<string, any>> {\n results: T[];\n baseline?: T;\n}\n\ninterface DiffColumn<T> extends ColumnFormat<T> {\n diffFormatter?: (value: unknown, baseline: unknown) => string | null;\n formatter?: undefined;\n diffKey: keyof T;\n}\n\ninterface ColumnFormat<T> {\n key: keyof T;\n title: string;\n alignment?: Alignment;\n width?: number;\n}\n\ninterface Lines {\n drawHorizontalLine: (index: number, size: number) => boolean;\n drawVerticalLine: (index: number, size: number) => boolean;\n}\n\nconst { bold } = colors;\n\nconst ansiEscapeRegex = new RegExp(\n String.fromCharCode(27) + \"\\\\[[0-9;]*m\",\n \"g\",\n);\n\n/** Build formatted table with column groups and baseline diffs. */\nexport function buildTable<T extends Record<string, any>>(\n columnGroups: ColumnGroup<T>[],\n resultGroups: ResultGroup<T>[],\n nameKey: keyof T = \"name\" as keyof T,\n): string {\n const allRecords = flattenGroups(columnGroups, resultGroups, nameKey);\n return createTable(columnGroups, allRecords);\n}\n\n/** Convert records to string arrays for table rendering. */\nexport function toRows<T extends Record<string, any>>(\n records: T[],\n groups: ColumnGroup<T>[],\n): string[][] {\n const allColumns = groups.flatMap(group => group.columns);\n\n const rawRows = records.map(record =>\n allColumns.map(col => {\n const value = record[col.key];\n return col.formatter ? col.formatter(value) : value;\n }),\n );\n\n return rawRows.map(row => row.map(cell => cell ?? \" \"));\n}\n\n/** Flatten result groups into a single array, inserting blank separator rows. */\nfunction flattenGroups<T extends Record<string, any>>(\n groups: ColumnGroup<T>[],\n resultGroups: ResultGroup<T>[],\n nameKey: keyof T,\n): T[] {\n return resultGroups.flatMap((group, i) => {\n const records = addBaseline(groups, group, nameKey);\n const isLast = i === resultGroups.length - 1;\n return isLast ? records : [...records, {} as T];\n });\n}\n\n/** Render column groups and records into a formatted table string. */\nfunction createTable<T extends Record<string, any>>(\n groups: ColumnGroup<T>[],\n records: T[],\n): string {\n const dataRows = toRows(records, groups);\n const { headerRows, config } = buildTableConfig(groups, dataRows);\n const allRows = [...headerRows, ...dataRows];\n return table(allRows, config);\n}\n\n/** Append baseline row and inject diff values into result rows. */\nfunction addBaseline<T extends Record<string, any>>(\n groups: ColumnGroup<T>[],\n group: ResultGroup<T>,\n nameKey: keyof T,\n): T[] {\n const { results, baseline } = group;\n if (!baseline) return results;\n const diffResults = results.map(r => addComparisons(groups, r, baseline));\n const marked = { ...baseline, [nameKey]: `--> ${baseline[nameKey]}` };\n return [...diffResults, marked];\n}\n\n/** Build header rows, spanning cells, column widths, and border rules. */\nfunction buildTableConfig<T>(\n groups: ColumnGroup<T>[],\n dataRows: string[][],\n): TableSetup {\n const titles = getTitles(groups);\n const headerRows = [...createGroupHeaders(groups, titles.length), titles];\n const config: TableUserConfig = {\n spanningCells: createSectionSpans(groups),\n columns: calcColumnWidths(groups, titles, dataRows),\n ...createLines(groups),\n };\n return { headerRows, config };\n}\n\n/** Compute formatted diff values by comparing a row against baseline. */\nfunction addComparisons<T extends Record<string, any>>(\n groups: ColumnGroup<T>[],\n main: T,\n baseline: T,\n): T {\n const cols = groups\n .flatMap(g => g.columns)\n .filter((col): col is DiffColumn<T> => col.diffKey !== undefined);\n const diffs = Object.fromEntries(\n cols.map(col => {\n const fmt = col.diffFormatter ?? diffPercent;\n return [col.key, fmt(main[col.diffKey], baseline[col.diffKey])];\n }),\n );\n return { ...main, ...diffs };\n}\n\n/** @return bolded column title strings */\nfunction getTitles<T>(groups: ColumnGroup<T>[]): string[] {\n return groups.flatMap(g => g.columns.map(c => bold(c.title || \" \")));\n}\n\n/** @return header rows with group titles, or empty if no groups have titles. */\nfunction createGroupHeaders<T>(\n groups: ColumnGroup<T>[],\n numColumns: number,\n): string[][] {\n if (!groups.some(g => g.groupTitle)) return [];\n\n const sectionRow = groups.flatMap(g => {\n const title = g.groupTitle ? [bold(g.groupTitle)] : [];\n return padWithBlanks(title, g.columns.length);\n });\n const blankRow = padWithBlanks([], numColumns);\n return [sectionRow, blankRow];\n}\n\n/** @return spanning cell configs for group title headers */\nfunction createSectionSpans<T>(groups: ColumnGroup<T>[]): SpanningCellConfig[] {\n const offsets = groupOffsets(groups);\n return groups.map((g, i) => ({\n row: 0,\n col: offsets[i],\n colSpan: g.columns.length,\n alignment: \"center\" as Alignment,\n }));\n}\n\n/** Calculate column widths based on content, widening to fit group titles. */\nfunction calcColumnWidths<T>(\n groups: ColumnGroup<T>[],\n titles: string[],\n dataRows: unknown[][],\n): Record<number, { width: number; wrapWord: boolean }> {\n const maxData = (i: number) =>\n dataRows.reduce((m, row) => Math.max(m, cellWidth(row[i])), 0);\n const widths = titles.map((t, i) => Math.max(cellWidth(t), maxData(i)));\n\n // Widen columns so group titles fit (accounting for \" | \" separators)\n const offsets = groupOffsets(groups);\n for (const [i, group] of groups.entries()) {\n const titleWidth = cellWidth(group.groupTitle);\n if (titleWidth <= 0) continue;\n const col = offsets[i];\n const n = group.columns.length;\n const sepWidth = (n - 1) * 3;\n const curWidth = widths.slice(col, col + n).reduce((a, b) => a + b, 0);\n const needed = titleWidth - curWidth - sepWidth;\n if (needed > 0) widths[col + n - 1] += needed;\n }\n\n return Object.fromEntries(\n widths.map((w, i) => [i, { width: w, wrapWord: false }]),\n );\n}\n\n/** @return draw functions for horizontal/vertical table borders */\nfunction createLines<T>(groups: ColumnGroup<T>[]): Lines {\n const { sectionBorders, headerBottom } = calcBorders(groups);\n return {\n drawVerticalLine: (i, size) =>\n i === 0 || i === size || sectionBorders.includes(i),\n drawHorizontalLine: (i, size) =>\n i === 0 || i === size || i === headerBottom,\n };\n}\n\n/** @return array padded with blank strings to the given length */\nfunction padWithBlanks(arr: string[], length: number): string[] {\n if (arr.length >= length) return arr;\n return [...arr, ...Array(length - arr.length).fill(\" \")];\n}\n\n/** @return cumulative column offsets for each group boundary */\nfunction groupOffsets<T>(groups: ColumnGroup<T>[]): number[] {\n let offset = 0;\n return groups.map(g => {\n const start = offset;\n offset += g.columns.length;\n return start;\n });\n}\n\n/** @return visible length of a cell value, stripping ANSI escape codes. */\nfunction cellWidth(value: unknown): number {\n if (value == null) return 0;\n const str = String(value);\n return str.replace(ansiEscapeRegex, \"\").length;\n}\n\n/** @return vertical line positions between sections and header bottom row. */\nfunction calcBorders<T>(groups: ColumnGroup<T>[]) {\n const offsets = groupOffsets(groups);\n const sectionBorders = offsets.map((o, i) => o + groups[i].columns.length);\n const headerBottom = groups.length === 0 ? 1 : 3;\n return { sectionBorders, headerBottom };\n}\n","import {\n type BenchmarkReport,\n type ComparisonOptions,\n computeDiffCI,\n extractSectionValues,\n findPrimaryColumn,\n isHigherIsBetter,\n type ReportColumn,\n type ReportGroup,\n type ReportSection,\n} from \"../BenchmarkReport.ts\";\nimport { formatDiffWithCI, truncate } from \"../Formatters.ts\";\nimport {\n buildTable,\n type ColumnGroup,\n type ResultGroup,\n} from \"./TableReport.ts\";\n\n/** Options for text report rendering, including baseline comparison settings. */\nexport interface TextReportOptions extends ComparisonOptions {}\n\ntype Row = Record<string, unknown> & { name: string };\n\n/** Build a formatted text table from benchmark groups, with baseline diff columns when present. */\nexport function reportResults(\n groups: ReportGroup[],\n sections: ReportSection[],\n options?: TextReportOptions,\n): string {\n const primary = findPrimaryColumn(sections);\n const results = groups.map(g =>\n resultGroupValues(g, sections, primary, options),\n );\n const hasBaseline = results.some(g => g.baseline);\n const table = buildTable(sectionColumnGroups(sections, hasBaseline), results);\n const hasSampleCI = results.some(g =>\n g.results.some(r => r.diffCI && (r.diffCI as any).ciLevel === \"sample\"),\n );\n if (!hasSampleCI) return table;\n return (\n table +\n \"\\n* Confidence intervals may be too narrow (single batch).\" +\n \" Use --batches for more accurate intervals.\\n\"\n );\n}\n\n/** Extract stats from all sections into row objects for each report. */\nexport function valuesForReports(\n reports: BenchmarkReport[],\n sections: ReportSection[],\n): Row[] {\n return reports.map(r => ({\n name: truncate(r.name),\n ...extractSectionValues(r.measuredResults, sections, r.metadata),\n }));\n}\n\n/** Insert a \"delta% CI\" column after the first comparable column. */\nexport function injectDiffColumns(\n groups: ColumnGroup<Row>[],\n): ColumnGroup<Row>[] {\n const asSections = groups.map(g => ({\n title: g.groupTitle ?? \"\",\n columns: g.columns as ReportColumn[],\n }));\n const higher = isHigherIsBetter(asSections);\n const fmt = (v: unknown) => formatDiffWithCI(v, higher);\n const ciCol = { title: \"Δ% CI\", key: \"diffCI\" as keyof Row, formatter: fmt };\n\n let ciAdded = false;\n return groups.map(group => ({\n groupTitle: group.groupTitle,\n columns: group.columns.flatMap(col => {\n if ((col as ReportColumn).comparable && !ciAdded) {\n ciAdded = true;\n return [col, ciCol];\n }\n return [col];\n }),\n }));\n}\n\n/** Build table columns from sections, with name column and optional CI diff columns. */\nexport function sectionColumnGroups(\n sections: ReportSection[],\n hasBaseline: boolean,\n nameTitle = \"name\",\n): ColumnGroup<Row>[] {\n const nameCol: ColumnGroup<Row> = {\n columns: [{ key: \"name\" as keyof Row, title: nameTitle }],\n };\n const groups: ColumnGroup<Row>[] = sections.map(s => ({\n groupTitle: s.title || undefined,\n columns: s.columns.map(c => ({\n ...c,\n key: (c.key ?? c.title) as keyof Row,\n })),\n }));\n const cols = hasBaseline ? injectDiffColumns(groups) : groups;\n return [nameCol, ...cols];\n}\n\n/** Extract section stats and bootstrap CI diffs for all reports in a group. */\nfunction resultGroupValues(\n group: ReportGroup,\n sections: ReportSection[],\n primary?: ReportColumn,\n options?: TextReportOptions,\n): ResultGroup<Row> {\n const { reports, baseline } = group;\n const baseM = baseline?.measuredResults;\n const { statKind, higherIsBetter } = primary ?? {};\n const results = reports.map(r => {\n const { measuredResults: m, metadata } = r;\n const diffCI = statKind\n ? computeDiffCI(baseM, m, statKind, options, higherIsBetter)\n : undefined;\n const values = extractSectionValues(m, sections, metadata);\n return { name: truncate(r.name), ...values, ...(diffCI && { diffCI }) };\n });\n const baseRow = baseline && valuesForReports([baseline], sections)[0];\n return { results, baseline: baseRow };\n}\n","import {\n type ComparisonOptions,\n computeDiffCI,\n extractSectionValues,\n findPrimaryColumn,\n type ReportSection,\n} from \"../report/BenchmarkReport.ts\";\nimport { truncate } from \"../report/Formatters.ts\";\nimport { runsSection, timeSection } from \"../report/StandardSections.ts\";\nimport { buildTable } from \"../report/text/TableReport.ts\";\nimport { sectionColumnGroups } from \"../report/text/TextReport.ts\";\nimport type { MeasuredResults } from \"../runners/MeasuredResults.ts\";\nimport type {\n CaseResult,\n MatrixResults,\n VariantResult,\n} from \"./BenchMatrix.ts\";\n\n/** Options for {@link reportMatrixResults} */\nexport interface MatrixReportOptions {\n /** ReportSection sections (default: [timeSection, runsSection]) */\n sections?: ReportSection[];\n /** Custom title for the variant column (default: \"variant\") */\n variantTitle?: string;\n /** Comparison options (equivalence margin, batch trimming) */\n comparison?: ComparisonOptions;\n}\n\ninterface VariantCase {\n variant: VariantResult;\n cr: CaseResult;\n}\n\ntype Row = Record<string, unknown> & { name: string };\n\nconst defaultSections: ReportSection[] = [timeSection, runsSection];\n\n/** Format matrix results as text, with one table per case */\nexport function reportMatrixResults(\n results: MatrixResults,\n options?: MatrixReportOptions,\n): string {\n if (results.variants.length === 0) return `Matrix: ${results.name}`;\n\n // all variants have the same cases\n const caseIds = results.variants[0].cases.map(c => c.caseId);\n const tables = caseIds.map(caseId =>\n buildCaseTable(results, caseId, options),\n );\n return [`Matrix: ${results.name}`, ...tables].join(\"\\n\\n\");\n}\n\n/** Build table for a single case showing all variants */\nfunction buildCaseTable(\n results: MatrixResults,\n caseId: string,\n options?: MatrixReportOptions,\n): string {\n const title = formatCaseTitle(results, caseId);\n const sections = options?.sections ?? defaultSections;\n const variantTitle = options?.variantTitle ?? \"variant\";\n const primaryCol = findPrimaryColumn(sections);\n\n const caseResults = collectCaseResults(results, caseId);\n const shared = sharedBaseline(caseResults);\n\n const rows: Row[] = caseResults.flatMap(({ variant, cr }) => {\n const vals = extractSectionValues(cr.measured, sections, cr.metadata);\n const row: Row = { name: truncate(variant.id, 25), ...vals };\n if (cr.baseline && primaryCol?.statKind) {\n const { statKind, higherIsBetter } = primaryCol;\n row.diffCI = computeDiffCI(\n cr.baseline,\n cr.measured,\n statKind,\n options?.comparison,\n higherIsBetter,\n );\n }\n const out: Row[] = [row];\n if (cr.baseline && !shared)\n out.push({\n name: \" \\u21B3 baseline\",\n ...extractSectionValues(cr.baseline, sections, cr.metadata),\n });\n return out;\n });\n\n if (shared)\n rows.push({\n name: \"=> baseline\",\n ...extractSectionValues(shared, sections),\n });\n\n const hasDiff = rows.some(r => r.diffCI);\n const cols = sectionColumnGroups(sections, hasDiff, variantTitle);\n return `${title}\\n${buildTable(cols, [{ results: rows }])}`;\n}\n\n/** Format case title with metadata if available */\nfunction formatCaseTitle(results: MatrixResults, caseId: string): string {\n const caseResult = results.variants[0]?.cases.find(c => c.caseId === caseId);\n const metadata = caseResult?.metadata;\n\n if (!metadata || Object.keys(metadata).length === 0) return caseId;\n const meta = Object.entries(metadata)\n .map(([k, v]) => `${v} ${k}`)\n .join(\", \");\n return `${caseId} (${meta})`;\n}\n\n/** Collect (variant, caseResult) pairs for a given caseId */\nfunction collectCaseResults(\n results: MatrixResults,\n caseId: string,\n): VariantCase[] {\n return results.variants.flatMap(variant => {\n const cr = variant.cases.find(c => c.caseId === caseId);\n return cr ? [{ variant, cr }] : [];\n });\n}\n\n/** @return shared baseline if all variants reference the same one (baselineVariant mode) */\nfunction sharedBaseline(\n caseResults: VariantCase[],\n): MeasuredResults | undefined {\n const baselines = caseResults.map(({ cr }) => cr.baseline).filter(Boolean);\n if (baselines.length < 2) return undefined;\n return baselines.every(b => b === baselines[0]) ? baselines[0] : undefined;\n}\n","import type { MatrixResults } from \"../matrix/BenchMatrix.ts\";\nimport type { MatrixReportOptions } from \"../matrix/MatrixReport.ts\";\nimport { reportMatrixResults } from \"../matrix/MatrixReport.ts\";\nimport {\n aggregateSites,\n filterSites,\n flattenProfile,\n formatHeapReport,\n formatRawSamples,\n type HeapReportOptions,\n} from \"../profiling/node/HeapSampleReport.ts\";\nimport { resolveProfile } from \"../profiling/node/ResolvedProfile.ts\";\nimport type { ReportGroup, ReportSection } from \"../report/BenchmarkReport.ts\";\nimport { groupReports, hasField } from \"../report/BenchmarkReport.ts\";\nimport colors from \"../report/Colors.ts\";\nimport { gcStatsSection } from \"../report/GcSections.ts\";\nimport {\n adaptiveSections,\n buildTimeSection,\n formatTierSummary,\n optSection,\n runsSection,\n totalTimeSection,\n} from \"../report/StandardSections.ts\";\nimport { reportResults } from \"../report/text/TextReport.ts\";\nimport type { DefaultCliArgs } from \"./CliArgs.ts\";\nimport { cliComparisonOptions } from \"./CliOptions.ts\";\n\n/** Options for defaultReport: custom sections replace the CLI-derived defaults. */\nexport interface DefaultReportOptions {\n sections?: ReportSection[];\n}\n\nconst { yellow, dim } = colors;\n\n/** Show a transient status message on stderr, run a sync computation, then clear. */\nexport function withStatus<T>(msg: string, fn: () => T): T {\n process.stderr.write(`◊ ${msg}...\\r`);\n const result = fn();\n process.stderr.write(\"\\r\" + \" \".repeat(40) + \"\\r\");\n return result;\n}\n\n/** Generate text report table with standard sections based on CLI args. */\nexport function defaultReport(\n groups: ReportGroup[],\n args: DefaultCliArgs,\n opts?: DefaultReportOptions,\n): string {\n const sections = opts?.sections?.length\n ? opts.sections\n : cliDefaultSections(groups, args);\n return reportResults(groups, sections, cliComparisonOptions(args));\n}\n\n/** Log V8 optimization tier distribution and deoptimizations. */\nexport function reportOptStatus(groups: ReportGroup[]): void {\n const optData = groups.flatMap(group =>\n groupReports(group)\n .filter(r => r.measuredResults.optStatus)\n .map(({ name, measuredResults: m }) => ({\n name,\n opt: m.optStatus!,\n samples: m.samples.length,\n })),\n );\n if (optData.length === 0) return;\n\n console.log(dim(\"\\nV8 optimization:\"));\n for (const { name, opt, samples } of optData) {\n const tierParts = formatTierSummary(opt, \" \", \", \");\n console.log(` ${name}: ${tierParts} ${dim(`(${samples} samples)`)}`);\n }\n\n const totalDeopts = optData.reduce((sum, d) => sum + d.opt.deoptCount, 0);\n if (totalDeopts > 0) {\n const plural = totalDeopts > 1 ? \"s\" : \"\";\n console.log(yellow(` ⚠ ${totalDeopts} deoptimization${plural} detected`));\n }\n}\n\n/** Print heap allocation profiles for each benchmark in the report groups. */\nexport function printHeapReports(\n groups: ReportGroup[],\n options: HeapReportOptions,\n): void {\n for (const report of groups.flatMap(g => groupReports(g))) {\n const { heapProfile } = report.measuredResults;\n if (!heapProfile) continue;\n console.log(dim(`\\n─── Heap profile: ${report.name} ───`));\n const resolved = resolveProfile(heapProfile);\n const sites = flattenProfile(resolved);\n const userSites = filterSites(sites, options.isUserCode);\n const agg = aggregateSites(options.userOnly ? userSites : sites);\n const { totalBytes, sortedSamples } = resolved;\n const totalUserCode = userSites.reduce((sum, s) => sum + s.bytes, 0);\n const sampleCount = sortedSamples?.length;\n const heapOpts = {\n ...options,\n totalAll: totalBytes,\n totalUserCode,\n sampleCount,\n };\n console.log(formatHeapReport(agg, heapOpts));\n if (options.raw) {\n console.log(dim(`\\n─── Raw samples: ${report.name} ───`));\n console.log(formatRawSamples(resolved));\n }\n }\n}\n\n/** Format matrix benchmark results as text, applying default sections from CLI args. */\nexport function defaultMatrixReport(\n results: MatrixResults[],\n reportOptions?: MatrixReportOptions,\n args?: DefaultCliArgs,\n): string {\n const options = args\n ? mergeMatrixDefaults(reportOptions, args, results)\n : reportOptions;\n return results.map(r => reportMatrixResults(r, options)).join(\"\\n\\n\");\n}\n\n/** Convert MatrixResults to ReportGroup[] for the standard export pipeline. */\nexport function matrixToReportGroups(results: MatrixResults[]): ReportGroup[] {\n return results.flatMap(matrix =>\n matrix.variants.flatMap(variant =>\n variant.cases.map(c => caseToReportGroup(variant.id, c)),\n ),\n );\n}\n\n/** Assemble report sections from CLI flags. Under --adaptive, the\n * adaptive section provides its own time columns and `stats` is ignored. */\nexport function buildReportSections(\n adaptive: boolean,\n gcStats: boolean,\n hasOptData: boolean,\n stats?: string,\n): ReportSection[] {\n return [\n ...(adaptive\n ? [...adaptiveSections, totalTimeSection]\n : [buildTimeSection(stats)]),\n ...(gcStats ? [gcStatsSection] : []),\n ...(hasOptData ? [optSection] : []),\n runsSection,\n ];\n}\n\n/** Build sections from CLI feature flags (time/gc/opt/runs). */\nfunction cliDefaultSections(\n groups: ReportGroup[],\n args: DefaultCliArgs,\n): ReportSection[] {\n const { adaptive, \"gc-stats\": gcStats, \"trace-opt\": traceOpt, stats } = args;\n const hasOpt = hasField(groups, \"optStatus\");\n return buildReportSections(adaptive, gcStats, traceOpt && hasOpt, stats);\n}\n\n/** Apply default sections and extra columns for matrix reports. */\nfunction mergeMatrixDefaults(\n opts: MatrixReportOptions | undefined,\n args: DefaultCliArgs,\n results: MatrixResults[],\n): MatrixReportOptions {\n const merged: MatrixReportOptions = { ...opts };\n if (!merged.sections?.length) {\n const groups = matrixToReportGroups(results);\n const hasOpt = args[\"trace-opt\"] && hasField(groups, \"optStatus\");\n merged.sections = buildReportSections(\n args.adaptive,\n args[\"gc-stats\"],\n hasOpt,\n args.stats,\n );\n }\n if (!merged.comparison) merged.comparison = cliComparisonOptions(args);\n return merged;\n}\n\n/** Wrap a single matrix case and its optional baseline into a ReportGroup. */\nfunction caseToReportGroup(\n variantId: string,\n c: MatrixResults[\"variants\"][0][\"cases\"][0],\n): ReportGroup {\n const { metadata, baseline: baselineMeasured } = c;\n const report = { name: variantId, measuredResults: c.measured, metadata };\n const baseline = baselineMeasured\n ? {\n name: `${variantId} (baseline)`,\n measuredResults: baselineMeasured,\n metadata,\n }\n : undefined;\n return { name: `${variantId} / ${c.caseId}`, reports: [report], baseline };\n}\n","import { writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { buildSpeedscopeFile } from \"../export/AllocExport.ts\";\nimport { archiveBenchmark, collectSources } from \"../export/ArchiveExport.ts\";\nimport {\n annotateFramesWithCounts,\n buildCoverageMap,\n} from \"../export/CoverageExport.ts\";\nimport { resolveEditorUri } from \"../export/EditorUri.ts\";\nimport { exportPerfettoTrace } from \"../export/PerfettoExport.ts\";\nimport { buildTimeSpeedscopeFile } from \"../export/TimeExport.ts\";\nimport type { CoverageData } from \"../profiling/node/CoverageTypes.ts\";\nimport type { TimeProfile } from \"../profiling/node/TimeSampler.ts\";\nimport type { ReportGroup, ReportSection } from \"../report/BenchmarkReport.ts\";\nimport { groupReports } from \"../report/BenchmarkReport.ts\";\nimport type { GitVersion } from \"../report/GitUtils.ts\";\nimport { prepareHtmlData } from \"../report/HtmlReport.ts\";\nimport type { ReportData } from \"../viewer/ReportData.ts\";\nimport type { DefaultCliArgs } from \"./CliArgs.ts\";\nimport {\n cliComparisonOptions,\n cliHeapReportOptions,\n needsAlloc,\n} from \"./CliOptions.ts\";\nimport { printHeapReports, withStatus } from \"./CliReport.ts\";\nimport {\n optionalJson,\n startViewerServer,\n waitForCtrlC,\n} from \"./ViewerServer.ts\";\n\n/** Options for exporting benchmark results to various formats */\nexport interface ExportOptions {\n results: ReportGroup[];\n args: DefaultCliArgs;\n sections?: ReportSection[];\n currentVersion?: GitVersion;\n baselineVersion?: GitVersion;\n}\n\n/** Export options for matrix benchmarks (results/args supplied by the matrix pipeline). */\nexport interface MatrixExportOptions {\n sections?: ReportSection[];\n currentVersion?: GitVersion;\n baselineVersion?: GitVersion;\n}\n\ntype FrameContainer = {\n shared: { frames: { name: string; file?: string; line?: number }[] };\n};\n\n/** Export reports (JSON, Perfetto, archive, viewer) based on CLI args. */\nexport async function exportReports(options: ExportOptions): Promise<void> {\n const { results, args, sections, currentVersion, baselineVersion } = options;\n\n const wantViewer = args.view || args[\"view-serve\"] || args.archive != null;\n const comparison = cliComparisonOptions(args);\n const htmlOpts = {\n cliArgs: args,\n sections,\n currentVersion,\n baselineVersion,\n ...comparison,\n };\n const reportData = wantViewer\n ? withStatus(\"computing viewer data\", () =>\n prepareHtmlData(results, htmlOpts),\n )\n : undefined;\n\n exportFileFormats(results, args);\n\n const profileFile = buildSpeedscopeFile(results);\n const timeFile = buildAllTimeProfiles(results);\n const coverageData = await annotateCoverage(results, profileFile, timeFile);\n const timeData = timeFile ? JSON.stringify(timeFile) : undefined;\n\n if (args.archive != null) {\n const outputPath = args.archive || undefined;\n await archiveBenchmark({\n groups: results,\n reportData,\n timeProfileData: timeData,\n coverageData,\n outputPath,\n });\n }\n if (args.view || args[\"view-serve\"]) {\n await openViewer(profileFile, timeData, coverageData, reportData, args);\n }\n}\n\n/** Print heap reports (if enabled) and export results. */\nexport async function finishReports(\n results: ReportGroup[],\n args: DefaultCliArgs,\n exportOptions?: MatrixExportOptions,\n): Promise<void> {\n if (needsAlloc(args)) {\n printHeapReports(results, cliHeapReportOptions(args));\n }\n await exportReports({ results, args, ...exportOptions });\n}\n\n/** Write Perfetto and time profile files if requested by CLI args. */\nfunction exportFileFormats(results: ReportGroup[], args: DefaultCliArgs): void {\n if (args[\"export-perfetto\"])\n exportPerfettoTrace(results, args[\"export-perfetto\"], args);\n if (args[\"export-profile\"])\n exportTimeProfile(results, args[\"export-profile\"]);\n}\n\n/** Build combined Speedscope file from all time profiles in results. */\nfunction buildAllTimeProfiles(results: ReportGroup[]) {\n const entries = results.flatMap(group =>\n groupReports(group)\n .filter(r => r.measuredResults.timeProfile)\n .map(r => ({\n name: r.name,\n profile: r.measuredResults.timeProfile as TimeProfile,\n })),\n );\n return buildTimeSpeedscopeFile(entries);\n}\n\n/** Annotate speedscope frame names with coverage counts. Returns serialized coverage map. */\nasync function annotateCoverage(\n results: ReportGroup[],\n profileFile?: FrameContainer,\n timeFile?: FrameContainer,\n): Promise<string | undefined> {\n const coverage = mergeCoverage(results);\n if (!coverage) return undefined;\n\n const frames = coverage.scripts.map(s => ({ file: s.url }));\n const sources = await collectSources(frames);\n const covMap = buildCoverageMap(coverage, sources);\n if (profileFile) annotateFramesWithCounts(profileFile.shared.frames, covMap);\n if (timeFile) annotateFramesWithCounts(timeFile.shared.frames, covMap);\n return JSON.stringify(Object.fromEntries(covMap.map));\n}\n\n/** Start viewer server with profile data and block until Ctrl+C. */\nasync function openViewer(\n profileFile: ReturnType<typeof buildSpeedscopeFile>,\n timeData: string | undefined,\n coverageData: string | undefined,\n reportData: ReportData | undefined,\n args: DefaultCliArgs,\n): Promise<void> {\n const viewer = await startViewerServer({\n profileData: optionalJson(profileFile),\n timeProfileData: timeData,\n coverageData,\n reportData: optionalJson(reportData),\n editorUri: resolveEditorUri(args.editor),\n open: !args[\"view-serve\"],\n });\n await waitForCtrlC();\n viewer.close();\n}\n\n/** Export the first raw V8 TimeProfile to a JSON file. */\nfunction exportTimeProfile(results: ReportGroup[], path: string): void {\n const profile = results\n .flatMap(g => groupReports(g))\n .find(r => r.measuredResults.timeProfile)?.measuredResults.timeProfile;\n if (!profile) return void console.log(\"No time profiles to export.\");\n writeFileSync(resolve(path), JSON.stringify(profile));\n console.log(`Time profile exported to: ${path}`);\n}\n\n/** Merge coverage data from all results into a single CoverageData. */\nfunction mergeCoverage(results: ReportGroup[]): CoverageData | undefined {\n const scripts = results.flatMap(group =>\n groupReports(group).flatMap(r => r.measuredResults.coverage?.scripts ?? []),\n );\n return scripts.length > 0 ? { scripts } : undefined;\n}\n","import type { BenchMatrix } from \"./BenchMatrix.ts\";\nimport { loadCasesModule } from \"./CaseLoader.ts\";\nimport { discoverVariants } from \"./VariantLoader.ts\";\n\n/** Filter for matrix case/variant selection */\nexport interface MatrixFilter {\n case?: string;\n variant?: string;\n}\n\n/** Filtered matrix with explicit case and variant lists */\nexport interface FilteredMatrix<T = unknown> extends BenchMatrix<T> {\n filteredCases?: string[];\n filteredVariants?: string[];\n}\n\n/** Parse filter string: \"case/variant\", \"case/\", \"/variant\", or \"case\" */\nexport function parseMatrixFilter(filter: string): MatrixFilter {\n if (filter.includes(\"/\")) {\n const [casePart, varPart] = filter.split(\"/\", 2);\n return { case: casePart || undefined, variant: varPart || undefined };\n }\n return { case: filter };\n}\n\n/** Apply filter to a matrix, merging with existing filters via intersection */\nexport async function filterMatrix<T>(\n matrix: FilteredMatrix<T>,\n filter?: MatrixFilter,\n): Promise<FilteredMatrix<T>> {\n if (!filter || (!filter.case && !filter.variant)) return matrix;\n\n const caseList = await getFilteredCases(matrix, filter.case);\n const variantList = await getFilteredVariants(matrix, filter.variant);\n\n const filteredCases = intersectFilters(caseList, matrix.filteredCases);\n const filteredVariants = intersectFilters(\n variantList,\n matrix.filteredVariants,\n );\n\n return { ...matrix, filteredCases, filteredVariants };\n}\n\n/** Collect all case IDs from either casesModule or inline cases */\nexport async function resolveCaseIds<T>(\n matrix: BenchMatrix<T>,\n): Promise<string[] | undefined> {\n if (matrix.casesModule)\n return (await loadCasesModule(matrix.casesModule)).cases;\n return matrix.cases;\n}\n\n/** Collect all variant IDs from either inline variants or variantDir */\nexport async function resolveVariantIds<T>(\n matrix: BenchMatrix<T>,\n): Promise<string[]> {\n if (matrix.variants) return Object.keys(matrix.variants);\n if (matrix.variantDir) return discoverVariants(matrix.variantDir);\n throw new Error(\"BenchMatrix requires 'variants' or 'variantDir'\");\n}\n\n/** Return case IDs matching a substring pattern, or all if no pattern */\nasync function getFilteredCases<T>(\n matrix: BenchMatrix<T>,\n casePattern?: string,\n): Promise<string[] | undefined> {\n if (!casePattern) return undefined;\n const caseIds = await resolveCaseIds(matrix);\n if (!caseIds) return [\"default\"]; // implicit single case\n return filterByPattern(caseIds, casePattern, \"cases\");\n}\n\n/** Return variant IDs matching a substring pattern, or all if no pattern */\nasync function getFilteredVariants<T>(\n matrix: BenchMatrix<T>,\n variantPattern?: string,\n): Promise<string[] | undefined> {\n if (!variantPattern) return undefined;\n const allIds = await resolveVariantIds(matrix);\n return filterByPattern(allIds, variantPattern, \"variants\");\n}\n\n/** Intersect two optional filter lists: both present ==> intersection, otherwise the one that exists */\nfunction intersectFilters(a?: string[], b?: string[]): string[] | undefined {\n if (a && b) return a.filter(v => b.includes(v));\n return a ?? b;\n}\n\n/** Filter IDs by substring pattern, throwing if no matches */\nfunction filterByPattern(\n ids: string[],\n pattern: string,\n label: string,\n): string[] {\n const filtered = ids.filter(id => matchPattern(id, pattern));\n if (filtered.length === 0)\n throw new Error(`No ${label} match filter: \"${pattern}\"`);\n return filtered;\n}\n\n/** Case-insensitive substring match */\nfunction matchPattern(id: string, pattern: string): boolean {\n return id.toLowerCase().includes(pattern.toLowerCase());\n}\n","import {\n aggregateGcStats,\n type GcEvent,\n type GcStats,\n} from \"../../runners/GcStats.ts\";\nimport type { TraceEvent } from \"./ChromeTraceEvent.ts\";\n\n/** Convert MinorGC/MajorGC trace events into GcEvent[]. */\nexport function parseGcTraceEvents(traceEvents: TraceEvent[]): GcEvent[] {\n return traceEvents\n .filter(e => e.ph === \"X\" && gcType(e.name))\n .map(e => ({\n type: gcType(e.name)!,\n pauseMs: (e.dur ?? 0) / 1000,\n collected: Math.max(\n 0,\n Number(e.args?.usedHeapSizeBefore ?? 0) -\n Number(e.args?.usedHeapSizeAfter ?? 0),\n ),\n }));\n}\n\n/** Parse and aggregate CDP trace events into GcStats. */\nexport function browserGcStats(traceEvents: TraceEvent[]): GcStats {\n return aggregateGcStats(parseGcTraceEvents(traceEvents));\n}\n\n/** Map CDP event names (MinorGC/MajorGC) to GcEvent type. */\nfunction gcType(name: string): GcEvent[\"type\"] | undefined {\n if (name === \"MinorGC\") return \"scavenge\";\n if (name === \"MajorGC\") return \"mark-compact\";\n return undefined;\n}\n","import type { GcStats } from \"../../runners/GcStats.ts\";\nimport type { CoverageData, ScriptCoverage } from \"../node/CoverageTypes.ts\";\nimport type { HeapProfile } from \"../node/HeapSampler.ts\";\nimport type { TimeProfile } from \"../node/TimeSampler.ts\";\nimport { browserGcStats } from \"./BrowserGcStats.ts\";\nimport type { CdpClient } from \"./CdpClient.ts\";\nimport type { TraceEvent } from \"./ChromeTraceEvent.ts\";\n\n/** Options controlling which CDP instruments (heap, CPU, coverage) to enable. */\nexport interface InstrumentOpts {\n alloc: boolean;\n profile: boolean;\n callCounts: boolean;\n samplingInterval: number;\n profileInterval?: number;\n}\n\n/** Build InstrumentOpts from profile params and heap sampling interval. */\nexport function instrumentOpts(\n params: {\n alloc?: boolean;\n profile?: boolean;\n callCounts?: boolean;\n profileInterval?: number;\n },\n samplingInterval: number,\n): InstrumentOpts {\n const {\n alloc = false,\n profile = false,\n callCounts = false,\n profileInterval,\n } = params;\n return { alloc, profile, callCounts, samplingInterval, profileInterval };\n}\n\n/** Start CDP GC tracing; returns the mutable array that collects trace events. */\nexport async function startGcTracing(cdp: CdpClient): Promise<TraceEvent[]> {\n const events: TraceEvent[] = [];\n cdp.on(\"Tracing.dataCollected\", ({ value }) => {\n events.push(...(value as unknown as TraceEvent[]));\n });\n await cdp.send(\"Tracing.start\", {\n traceConfig: { includedCategories: [\"v8\", \"v8.gc\"] },\n });\n return events;\n}\n\n/** End CDP tracing and aggregate collected events into GcStats. */\nexport async function collectTracing(\n cdp: CdpClient,\n traceEvents: TraceEvent[],\n): Promise<GcStats> {\n const done = new Promise<void>(r =>\n cdp.once(\"Tracing.tracingComplete\", () => r()),\n );\n await cdp.send(\"Tracing.end\");\n await done;\n return browserGcStats(traceEvents);\n}\n\n/** Start CDP Profiler for CPU time sampling (caller manages Profiler.enable/disable) */\nexport async function startTimeProfiling(\n cdp: CdpClient,\n interval?: number,\n): Promise<void> {\n if (interval) await cdp.send(\"Profiler.setSamplingInterval\", { interval });\n await cdp.send(\"Profiler.start\");\n}\n\n/** Stop CDP CPU sampling and return the profile. */\nexport async function stopTimeProfiling(cdp: CdpClient): Promise<TimeProfile> {\n const { profile } = await cdp.send(\"Profiler.stop\");\n return profile as unknown as TimeProfile;\n}\n\n/** Start precise coverage (caller manages Profiler.enable/disable). */\nexport async function startCoverageCollection(cdp: CdpClient): Promise<void> {\n await cdp.send(\"Profiler.startPreciseCoverage\", {\n callCount: true,\n detailed: true,\n });\n}\n\n/** Collect precise coverage, filtering out browser-internal scripts. */\nexport async function collectCoverage(cdp: CdpClient): Promise<CoverageData> {\n const { result } = await cdp.send(\"Profiler.takePreciseCoverage\");\n await cdp.send(\"Profiler.stopPreciseCoverage\");\n const scripts = (result as unknown as ScriptCoverage[]).filter(isPageScript);\n return { scripts };\n}\n\n/** Stop active instruments and return collected profiles/coverage. */\nexport async function stopInstruments(\n cdp: CdpClient,\n opts: InstrumentOpts,\n): Promise<{\n heapProfile?: HeapProfile;\n timeProfile?: TimeProfile;\n coverage?: CoverageData;\n}> {\n const heapProfile = opts.alloc\n ? ((await cdp.send(\"HeapProfiler.stopSampling\")).profile as HeapProfile)\n : undefined;\n const timeProfile = opts.profile ? await stopTimeProfiling(cdp) : undefined;\n const coverage = opts.callCounts ? await collectCoverage(cdp) : undefined;\n if (opts.profile || opts.callCounts) await cdp.send(\"Profiler.disable\");\n return { heapProfile, timeProfile, coverage };\n}\n\n/** Start requested CDP instruments (heap, CPU, coverage). */\nexport async function startInstruments(\n cdp: CdpClient,\n opts: InstrumentOpts,\n): Promise<void> {\n if (opts.alloc) {\n await cdp.send(\"HeapProfiler.startSampling\", {\n samplingInterval: opts.samplingInterval,\n includeObjectsCollectedByMajorGC: true,\n includeObjectsCollectedByMinorGC: true,\n });\n }\n if (opts.profile || opts.callCounts) await cdp.send(\"Profiler.enable\");\n if (opts.profile) await startTimeProfiling(cdp, opts.profileInterval);\n if (opts.callCounts) await startCoverageCollection(cdp);\n}\n\n/** Exclude chrome:// and devtools:// internal scripts. */\nfunction isPageScript(s: ScriptCoverage): boolean {\n return (\n !!s.url && !s.url.startsWith(\"chrome\") && !s.url.startsWith(\"devtools\")\n );\n}\n","import {\n instrumentOpts,\n startInstruments,\n stopInstruments,\n} from \"./BrowserCDP.ts\";\nimport type { BrowserProfileResult, ProfileCtx } from \"./BrowserProfiler.ts\";\n\n/**\n * Bench function mode: run window.__bench in a timed iteration loop.\n *\n * Simplified vs TimingRunner because it runs inside page.evaluate()\n * where shared code, Node APIs, and V8 intrinsics are unavailable.\n *\n * Not feasible in browser page context:\n * - heap tracking (no getHeapStatistics)\n * - V8 opt status tracing (no %GetOptimizationStatus)\n * - explicit GC or pause-for-compilation\n */\nexport async function runBenchLoop(\n ctx: ProfileCtx,\n): Promise<BrowserProfileResult> {\n const { page, cdp, params, samplingInterval } = ctx;\n const maxTime = params.maxTime ?? Number.MAX_SAFE_INTEGER;\n const maxIter = params.maxIterations ?? Number.MAX_SAFE_INTEGER;\n const opts = instrumentOpts(params, samplingInterval);\n\n await startInstruments(cdp, opts);\n\n const { samples, totalMs } = await page.evaluate(\n async ({ maxTime, maxIter }) => {\n const bench = (globalThis as any).__bench;\n const estimated = Math.min(maxIter, Math.ceil(maxTime / 0.1));\n const samples = new Array<number>(estimated);\n let count = 0;\n const startAll = performance.now();\n const deadline = startAll + maxTime;\n for (let i = 0; i < maxIter && performance.now() < deadline; i++) {\n const t0 = performance.now();\n await bench();\n samples[count++] = performance.now() - t0;\n }\n samples.length = count;\n return { samples, totalMs: performance.now() - startAll };\n },\n { maxTime, maxIter },\n );\n\n const collected = await stopInstruments(cdp, opts);\n\n return { samples, wallTimeMs: totalMs, ...collected };\n}\n","/** Minimal CDP WebSocket client. */\nexport interface CdpClient {\n send(method: string, params?: Record<string, unknown>): Promise<any>;\n on(event: string, handler: (params: any) => void): void;\n once(event: string, handler: (params: any) => void): void;\n close(): void;\n}\n\n/** Connect to a CDP WebSocket endpoint and return a client. */\nexport async function connectCdp(wsUrl: string): Promise<CdpClient> {\n const ws = await openWebSocket(wsUrl);\n let nextId = 1;\n type Pending = { resolve: (v: any) => void; reject: (e: Error) => void };\n const pending = new Map<number, Pending>();\n const listeners = new Map<string, Set<(params: any) => void>>();\n\n ws.addEventListener(\"message\", event => {\n const msg = JSON.parse(String(event.data));\n if (\"id\" in msg) {\n const p = pending.get(msg.id);\n if (!p) return;\n pending.delete(msg.id);\n if (msg.error) p.reject(new Error(`CDP: ${msg.error.message}`));\n else p.resolve(msg.result ?? {});\n } else if (\"method\" in msg) {\n for (const h of listeners.get(msg.method) ?? []) h(msg.params ?? {});\n }\n });\n\n const client: CdpClient = {\n send(method, params) {\n return new Promise((resolve, reject) => {\n const id = nextId++;\n const timer = setTimeout(() => {\n if (pending.delete(id))\n reject(new Error(`CDP timeout after 60s: ${method}`));\n }, 60_000);\n const clear = () => clearTimeout(timer);\n pending.set(id, {\n resolve(v) {\n clear();\n resolve(v);\n },\n reject(e) {\n clear();\n reject(e);\n },\n });\n ws.send(JSON.stringify({ id, method, params }));\n });\n },\n on(event, handler) {\n const set = listeners.get(event) ?? new Set();\n listeners.set(event, set);\n set.add(handler);\n },\n once(event, handler) {\n const wrap = (params: any) => {\n listeners.get(event)?.delete(wrap);\n handler(params);\n };\n client.on(event, wrap);\n },\n close() {\n for (const [, p] of pending) p.reject(new Error(\"CDP connection closed\"));\n pending.clear();\n ws.close();\n },\n };\n return client;\n}\n\n/** Open a WebSocket connection, rejecting if the handshake fails. */\nasync function openWebSocket(wsUrl: string): Promise<WebSocket> {\n const ws = new WebSocket(wsUrl);\n const err = new Error(`CDP connect failed: ${wsUrl}`);\n await new Promise<void>((resolve, reject) => {\n ws.addEventListener(\"open\", () => resolve());\n ws.addEventListener(\"error\", () => reject(err));\n });\n return ws;\n}\n","import type { CdpClient } from \"./CdpClient.ts\";\n\n/** Page-level CDP abstraction for navigation, evaluation, and event handling. */\nexport interface CdpPage {\n navigate(\n url: string,\n opts?: { waitUntil?: \"load\" | \"domcontentloaded\" },\n ): Promise<void>;\n evaluate<R>(\n fn: (...args: any[]) => R | Promise<R>,\n arg?: unknown,\n ): Promise<Awaited<R>>;\n exposeFunction(name: string, fn: (...args: any[]) => any): Promise<void>;\n addInitScript(fn: () => void): Promise<void>;\n waitForSelector(selector: string): Promise<void>;\n waitForFunction(expression: string): Promise<void>;\n onPageError(handler: (message: string) => void): void;\n}\n\n/** Create a page abstraction over a CDP client connected to a page target. */\nexport async function createCdpPage(\n cdp: CdpClient,\n opts?: { timeout?: number },\n): Promise<CdpPage> {\n const timeout = opts?.timeout ?? 30_000;\n\n await cdp.send(\"Page.enable\");\n await cdp.send(\"Runtime.enable\");\n\n return {\n navigate: (url, navOpts) => cdpNavigate(cdp, url, navOpts),\n evaluate: (fn, arg) => cdpEvaluate(cdp, fn, arg),\n exposeFunction: (name, fn) => cdpExpose(cdp, name, fn),\n async addInitScript(fn) {\n await cdp.send(\"Page.addScriptToEvaluateOnNewDocument\", {\n source: `(${fn.toString()})()`,\n });\n },\n waitForSelector(sel) {\n const expr = `!!document.querySelector(${JSON.stringify(sel)})`;\n return pollEval(cdp, expr, timeout);\n },\n waitForFunction: expr => pollEval(cdp, expr, timeout),\n onPageError(handler) {\n cdp.on(\"Runtime.exceptionThrown\", ({ exceptionDetails: d }) => {\n handler(d.exception?.description || d.text);\n });\n },\n };\n}\n\n/** Navigate to a URL and wait for the specified load condition. */\nasync function cdpNavigate(\n cdp: CdpClient,\n url: string,\n navOpts?: { waitUntil?: \"load\" | \"domcontentloaded\" },\n): Promise<void> {\n const waitUntil = navOpts?.waitUntil ?? \"load\";\n const event =\n waitUntil === \"domcontentloaded\"\n ? \"Page.domContentEventFired\"\n : \"Page.loadEventFired\";\n const loaded = new Promise<void>(r => cdp.once(event, () => r()));\n await cdp.send(\"Page.navigate\", { url });\n await loaded;\n}\n\n/** Evaluate a function in the page and return the result. */\nasync function cdpEvaluate(\n cdp: CdpClient,\n fn: (...args: any[]) => any,\n arg?: unknown,\n): Promise<any> {\n const argStr = arg !== undefined ? JSON.stringify(arg) : \"\";\n const expression = `(${fn.toString()})(${argStr})`;\n const opts = { expression, awaitPromise: true, returnByValue: true };\n const { result, exceptionDetails: err } = await cdp.send(\n \"Runtime.evaluate\",\n opts,\n );\n if (err) throw new Error(err.exception?.description || err.text);\n return result.value;\n}\n\n/** Expose a Node function to the page via Runtime.addBinding. */\nasync function cdpExpose(\n cdp: CdpClient,\n name: string,\n fn: (...args: any[]) => any,\n): Promise<void> {\n const binding = `__cdp_${name}`;\n await cdp.send(\"Runtime.addBinding\", { name: binding });\n\n // Wrapper: page calls window[name](...) ==> binding fires ==> Node runs fn ==> resolve\n const wrapper = `(() => {\n const g = globalThis;\n if (!g.__cdpSeq) { g.__cdpSeq = 0; g.__cdpCbs = {}; }\n g[${JSON.stringify(name)}] = (...args) => new Promise((resolve, reject) => {\n const seq = ++g.__cdpSeq;\n g.__cdpCbs[seq] = { resolve, reject };\n g[${JSON.stringify(binding)}](JSON.stringify({ seq, args }));\n });\n })()`;\n\n await cdp.send(\"Page.addScriptToEvaluateOnNewDocument\", { source: wrapper });\n await cdp.send(\"Runtime.evaluate\", { expression: wrapper });\n\n const pageEval = (expr: string) =>\n cdp.send(\"Runtime.evaluate\", { expression: expr });\n cdp.on(\"Runtime.bindingCalled\", async params => {\n if (params.name !== binding) return;\n const { seq, args } = JSON.parse(params.payload);\n const cb = `globalThis.__cdpCbs[${seq}]`;\n try {\n const val = await fn(...args);\n await pageEval(`${cb}?.resolve(${JSON.stringify(val ?? null)})`);\n } catch (err: any) {\n const msg = JSON.stringify(String(err.message));\n await pageEval(`${cb}?.reject(new Error(${msg}))`);\n }\n });\n}\n\n/** Poll a JS expression until truthy, with timeout. */\nasync function pollEval(\n cdp: CdpClient,\n expression: string,\n timeout: number,\n): Promise<void> {\n const deadline = Date.now() + timeout;\n const evalOpts = { expression, returnByValue: true };\n while (Date.now() < deadline) {\n const { result } = await cdp.send(\"Runtime.evaluate\", evalOpts);\n if (result.value) return;\n await new Promise(r => setTimeout(r, 100));\n }\n throw new Error(`Timed out waiting for: ${expression}`);\n}\n","import { type ChildProcess, execFileSync, spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { mkdtemp, rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\n\n/** Handle for a running Chrome instance. */\nexport interface ChromeInstance {\n port: number;\n process: ChildProcess;\n close(): Promise<void>;\n}\n\n/** Flags to suppress background services irrelevant to benchmarking. */\nconst quietFlags = [\n \"--disable-background-networking\",\n \"--disable-client-side-phishing-detection\",\n \"--disable-component-update\",\n \"--disable-field-trial-config\",\n \"--disable-sync\",\n \"--disable-breakpad\",\n \"--noerrdialogs\",\n \"--disable-features=OptimizationHints,Translate,MediaRouter,DialMediaRouteProvider\",\n \"--disable-extensions\",\n \"--disable-component-extensions-with-background-pages\",\n \"--disable-default-apps\",\n \"--metrics-recording-only\",\n \"--no-service-autorun\",\n \"--password-store=basic\",\n \"--use-mock-keychain\",\n];\n\n/** Stderr patterns to suppress (irrelevant to benchmarking). */\nconst chromeNoise =\n /SharedImageManager|skia_output_device_buffer_queue|task_policy_set/;\n\n/** Launch Chrome with remote debugging and return instance handle. */\nexport async function launchChrome(opts: {\n headless?: boolean;\n chromePath?: string;\n chromeProfile?: string;\n args?: string[];\n}): Promise<ChromeInstance> {\n const { headless = false, chromeProfile, chromePath, args = [] } = opts;\n const chrome = chromePath || process.env.CHROME_PATH || findChrome();\n\n const tmpDir = chromeProfile\n ? undefined\n : await mkdtemp(join(tmpdir(), \"benchforge-\"));\n const userDataDir = chromeProfile ?? tmpDir!;\n\n const flags = [\n \"--remote-debugging-port=0\",\n `--user-data-dir=${userDataDir}`,\n \"--no-first-run\",\n \"--no-default-browser-check\",\n ...quietFlags,\n ...(headless ? [\"--headless=new\"] : []),\n ...args,\n ];\n\n const proc = spawn(chrome, flags, { stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n const wsUrlPromise = parseWsUrl(proc);\n pipeChromeOutput(proc);\n const wsUrl = await wsUrlPromise;\n const port = Number(new URL(wsUrl).port);\n\n return {\n port,\n process: proc,\n async close() {\n proc.kill();\n await new Promise<void>(r => proc.on(\"exit\", () => r()));\n if (tmpDir)\n await rm(tmpDir, { recursive: true, force: true }).catch(() => {});\n },\n };\n}\n\n/** Create a new browser tab and return its CDP WebSocket URL and target ID. */\nexport async function createTab(\n port: number,\n): Promise<{ wsUrl: string; targetId: string }> {\n const url = `http://127.0.0.1:${port}/json/new`;\n const resp = await fetch(url, { method: \"PUT\" });\n const text = await resp.text();\n try {\n const json = JSON.parse(text);\n return { wsUrl: json.webSocketDebuggerUrl, targetId: json.id };\n } catch {\n const msg = `Chrome /json/new returned non-JSON: ${text.slice(0, 200)}`;\n throw new Error(msg);\n }\n}\n\n/** Close a browser tab by target ID. */\nexport async function closeTab(port: number, targetId: string): Promise<void> {\n const url = `http://127.0.0.1:${port}/json/close/${targetId}`;\n await fetch(url).catch(() => {});\n}\n\n/** Find Chrome/Chromium on the system. */\nfunction findChrome(): string {\n if (process.platform === \"darwin\") {\n const path = \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\";\n if (existsSync(path)) return path;\n }\n if (process.platform === \"win32\") {\n for (const env of [\"ProgramFiles\", \"ProgramFiles(x86)\"] as const) {\n const base = process.env[env];\n if (!base) continue;\n const p = join(base, \"Google\", \"Chrome\", \"Application\", \"chrome.exe\");\n if (existsSync(p)) return p;\n }\n }\n for (const name of [\"google-chrome\", \"chromium-browser\", \"chromium\"]) {\n try {\n return execFileSync(\"which\", [name], { encoding: \"utf8\" }).trim();\n } catch {}\n }\n throw new Error(\n \"Chrome not found. Install Chrome or set CHROME_PATH, or use --chrome <path>.\",\n );\n}\n\n/** Parse the DevTools WebSocket URL from Chrome's stderr. */\nfunction parseWsUrl(proc: ChildProcess): Promise<string> {\n return new Promise((resolve, reject) => {\n const wsPattern = /DevTools listening on (ws:\\/\\/\\S+)/;\n const onData = (chunk: Buffer) => {\n const match = chunk.toString().match(wsPattern);\n if (match) {\n proc.stderr?.off(\"data\", onData);\n resolve(match[1]);\n }\n };\n proc.stderr?.on(\"data\", onData);\n proc.on(\"error\", reject);\n proc.on(\"exit\", code =>\n reject(new Error(`Chrome exited (code ${code}) before DevTools ready`)),\n );\n });\n}\n\n/** Forward Chrome stdout/stderr to terminal, filtering known noise. */\nfunction pipeChromeOutput(proc: ChildProcess): void {\n const forward = (stream: NodeJS.ReadableStream | null) =>\n stream?.on(\"data\", (chunk: Buffer) => {\n const lines = chunk\n .toString()\n .split(\"\\n\")\n .map(l => l.trim())\n .filter(l => l && !chromeNoise.test(l));\n for (const line of lines) process.stderr.write(`[chrome] ${line}\\n`);\n });\n forward(proc.stdout);\n forward(proc.stderr);\n}\n","import {\n instrumentOpts,\n startInstruments,\n stopInstruments,\n} from \"./BrowserCDP.ts\";\nimport type {\n BrowserProfileResult,\n NavTiming,\n ProfileCtx,\n} from \"./BrowserProfiler.ts\";\nimport type { CdpPage } from \"./CdpPage.ts\";\n\n/** Run passive page-load profiling: instrument ==> navigate ==> wait ==> collect. */\nexport async function runPageLoad(\n ctx: ProfileCtx,\n): Promise<BrowserProfileResult> {\n const { page, cdp, params, samplingInterval } = ctx;\n const opts = instrumentOpts(params, samplingInterval);\n await startInstruments(cdp, opts);\n\n // Observe LCP via PerformanceObserver (avoids deprecated getEntriesByType warning)\n await page.addInitScript(() => {\n const g = globalThis as any;\n g.__lcpTime = undefined;\n new PerformanceObserver(list => {\n const entries = list.getEntries();\n if (entries.length) g.__lcpTime = entries.at(-1)!.startTime;\n }).observe({ type: \"largest-contentful-paint\" as any, buffered: true });\n });\n\n const { url, waitFor } = params;\n\n const isBuiltinWait = waitFor === \"load\" || waitFor === \"domcontentloaded\";\n const waitUntil = isBuiltinWait ? waitFor : \"load\";\n await page.navigate(url, { waitUntil });\n\n if (waitFor && !isBuiltinWait) {\n if (/^[#.[]/.test(waitFor)) {\n await page.waitForSelector(waitFor);\n } else {\n await page.waitForFunction(waitFor);\n }\n }\n\n const navTiming = await readNavTiming(page);\n const collected = await stopInstruments(cdp, opts);\n return { ...collected, navTiming, wallTimeMs: navTiming.loadEvent };\n}\n\n/** Read navigation timing from the page via Performance API. */\nexport async function readNavTiming(page: CdpPage): Promise<NavTiming> {\n return page.evaluate(() => {\n const perf = performance as any;\n const nav = perf.getEntriesByType(\"navigation\")[0] ?? {};\n return {\n domContentLoaded: (nav.domContentLoadedEventEnd as number) ?? 0,\n loadEvent: (nav.loadEventEnd as number) ?? 0,\n lcp: (globalThis as any).__lcpTime as number | undefined,\n };\n });\n}\n","import type { GcStats } from \"../../runners/GcStats.ts\";\nimport type { CoverageData } from \"../node/CoverageTypes.ts\";\nimport type { HeapProfile, HeapSampleOptions } from \"../node/HeapSampler.ts\";\nimport type { TimeProfile } from \"../node/TimeSampler.ts\";\nimport { runBenchLoop } from \"./BenchLoop.ts\";\nimport { collectTracing, startGcTracing } from \"./BrowserCDP.ts\";\nimport { type CdpClient, connectCdp } from \"./CdpClient.ts\";\nimport { type CdpPage, createCdpPage } from \"./CdpPage.ts\";\nimport {\n type ChromeInstance,\n closeTab,\n createTab,\n launchChrome,\n} from \"./ChromeLauncher.ts\";\nimport { runPageLoad } from \"./PageLoadMode.ts\";\n\n/** Options for a browser benchmark run. */\nexport interface BrowserProfileParams {\n /** URL to benchmark */\n url: string;\n /** Enable heap allocation profiling */\n alloc?: boolean;\n /** Heap sampling options (interval, depth) */\n allocOptions?: HeapSampleOptions;\n /** Enable CPU time profiling */\n profile?: boolean;\n /** CPU profiling sample interval in microseconds (default 1000) */\n profileInterval?: number;\n /** Track function call counts via V8 coverage */\n callCounts?: boolean;\n /** Collect GC statistics via CDP tracing */\n gcStats?: boolean;\n /** Run Chrome in headless mode */\n headless?: boolean;\n /** Path to Chrome executable */\n chromePath?: string;\n /** Chrome user data directory for persistent profile */\n chromeProfile?: string;\n /** Extra Chrome launch arguments */\n chromeArgs?: string[];\n /** Page timeout in seconds */\n timeout?: number;\n /** Bench function iteration time limit in ms */\n maxTime?: number;\n /** Exact iteration count for bench function mode */\n maxIterations?: number;\n /** Passive page-load profiling mode */\n pageLoad?: boolean;\n /** Completion signal: CSS selector, JS expression, \"load\", or \"domcontentloaded\" */\n waitFor?: string;\n /** Reuse an existing Chrome instance (caller manages lifecycle) */\n chrome?: ChromeInstance;\n}\n\n/** Navigation timing metrics from the Performance API. */\nexport interface NavTiming {\n /** DOMContentLoaded time in ms */\n domContentLoaded: number;\n /** Load event time in ms */\n loadEvent: number;\n /** Largest Contentful Paint time in ms */\n lcp?: number;\n}\n\n/** Collected profiles, timing samples, and GC stats from a browser benchmark. */\nexport interface BrowserProfileResult {\n /** Heap allocation profile */\n heapProfile?: HeapProfile;\n /** CPU time profile */\n timeProfile?: TimeProfile;\n /** V8 code coverage data */\n coverage?: CoverageData;\n /** Garbage collection statistics */\n gcStats?: GcStats;\n /** Wall-clock ms for the entire bench loop or page load */\n wallTimeMs?: number;\n /** Per-iteration timing samples (ms) from bench function mode */\n samples?: number[];\n /** Navigation timing from page-load mode */\n navTiming?: NavTiming;\n}\n\n/** Shared context passed to bench/page-load mode runners. */\nexport interface ProfileCtx {\n page: CdpPage;\n cdp: CdpClient;\n params: BrowserProfileParams;\n samplingInterval: number;\n}\n\n/**\n * Run browser benchmark, auto-detecting mode:\n * - Bench function (window.__bench): CLI controls iteration and timing.\n * - Page load (no __bench, or --page-load): measures navigation timing.\n */\nexport async function profileBrowser(\n params: BrowserProfileParams,\n): Promise<BrowserProfileResult> {\n const {\n headless = false,\n chromePath,\n chromeProfile,\n chromeArgs: args,\n } = params;\n const owned = !params.chrome;\n const launch = { headless, chromePath, chromeProfile, args };\n const chrome = params.chrome ?? (await launchChrome(launch));\n try {\n const { wsUrl, targetId } = await createTab(chrome.port);\n const cdp = await connectCdp(wsUrl);\n try {\n const timeout = (params.timeout ?? 60) * 1000;\n const page = await createCdpPage(cdp, { timeout });\n return await runProfile(page, cdp, params);\n } finally {\n cdp.close();\n await closeTab(chrome.port, targetId);\n }\n } finally {\n if (owned) await chrome.close();\n }\n}\n\n/**\n * Run profiling on an open CDP page, auto-detecting mode:\n * - **bench**: page exports `window.__bench` ==> CLI iterates and times it\n * - **page-load**: no `__bench` found (or `--page-load` flag) ==> profile navigation\n *\n * When auto-detecting, navigates once to check for `__bench`. If not found,\n * reloads via `runPageLoad` which starts instruments before navigation.\n */\nasync function runProfile(\n page: CdpPage,\n cdp: CdpClient,\n params: BrowserProfileParams,\n): Promise<BrowserProfileResult> {\n const samplingInterval = params.allocOptions?.samplingInterval ?? 32768;\n const traceEvents = params.gcStats ? await startGcTracing(cdp) : [];\n const ctx = { page, cdp, params, samplingInterval };\n\n let result: BrowserProfileResult;\n if (params.pageLoad) {\n result = await runPageLoad(ctx);\n } else {\n await page.navigate(params.url, { waitUntil: \"load\" });\n const hasBench = await page.evaluate(\n () => typeof (globalThis as any).__bench === \"function\",\n );\n if (hasBench) {\n result = await runBenchLoop(ctx);\n } else {\n console.warn(\"No __bench found. Reloading in --page-load mode.\");\n result = await runPageLoad(ctx);\n }\n }\n\n if (params.gcStats)\n return { ...result, gcStats: await collectTracing(cdp, traceEvents) };\n return result;\n}\n","import {\n type BrowserProfileResult,\n type NavTiming,\n profileBrowser,\n} from \"../profiling/browser/BrowserProfiler.ts\";\nimport { launchChrome } from \"../profiling/browser/ChromeLauncher.ts\";\nimport { isBrowserUserCode } from \"../profiling/node/HeapSampleReport.ts\";\nimport type { ReportGroup, ReportSection } from \"../report/BenchmarkReport.ts\";\nimport colors from \"../report/Colors.ts\";\nimport {\n browserGcStatsSection,\n pageLoadStatsSections,\n} from \"../report/GcSections.ts\";\nimport { buildTimeSection, runsSection } from \"../report/StandardSections.ts\";\nimport { reportResults } from \"../report/text/TextReport.ts\";\nimport type { MeasuredResults } from \"../runners/MeasuredResults.ts\";\nimport {\n type BatchProgress,\n mergeGcStats,\n runBatched,\n} from \"../runners/MergeBatches.ts\";\nimport { computeStats } from \"../runners/SampleStats.ts\";\nimport type { DefaultCliArgs } from \"./CliArgs.ts\";\nimport { exportReports } from \"./CliExport.ts\";\nimport {\n cliHeapReportOptions,\n needsAlloc,\n needsProfile,\n resolveLimits,\n} from \"./CliOptions.ts\";\nimport { printHeapReports, withStatus } from \"./CliReport.ts\";\n\n/** State shared between makeTabRunner closures and runBatchedTabs. */\ntype TabRunnerState = {\n lastRaw?: BrowserProfileResult;\n detectedPageLoad: boolean;\n};\n\nconst { yellow } = colors;\n\n/** Run browser profiling via CDP and report with standard pipeline. */\nexport async function browserBenchExports(args: DefaultCliArgs): Promise<void> {\n warnBrowserFlags(args);\n const params = buildBrowserParams(args);\n const name = nameFromUrl(args.url!);\n const baselineUrl = args[\"baseline-url\"];\n\n const needsBatching =\n args.batches > 1 ||\n !!baselineUrl ||\n (args.iterations ?? 0) > 1 ||\n params.pageLoad;\n if (!needsBatching) {\n const result = await profileBrowser(params);\n const results = browserResultGroups(name, result);\n\n printBrowserReport(result, results, args);\n await exportReports({ results, args });\n return;\n }\n\n const { lastRaw, results } = await runBrowserBatches(params, name, args);\n printBrowserReport(lastRaw, results, args);\n await exportReports({ results, args });\n}\n\n/** Warn about Node-only flags ignored in browser mode. */\nfunction warnBrowserFlags(args: DefaultCliArgs): void {\n const checks: [boolean, string][] = [\n [!args.worker, \"--no-worker\"],\n [!!args[\"trace-opt\"], \"--trace-opt\"],\n [!!args[\"gc-force\"], \"--gc-force\"],\n [!!args.adaptive, \"--adaptive\"],\n ];\n const ignored = checks.filter(([active]) => active).map(([, flag]) => flag);\n if (ignored.length > 0)\n console.warn(yellow(`Ignored in browser mode: ${ignored.join(\", \")}`));\n}\n\n/** Convert CLI args to browser profiler parameters. */\nfunction buildBrowserParams(args: DefaultCliArgs) {\n const { maxTime, maxIterations } = resolveLimits(args);\n const chromeArgs = args[\"chrome-args\"]\n ?.flatMap(a => a.split(/\\s+/))\n .map(stripQuotes)\n .filter(Boolean);\n return {\n url: args.url!,\n pageLoad: args[\"page-load\"] || !!args[\"wait-for\"],\n maxTime,\n maxIterations,\n chromeArgs,\n allocOptions: {\n samplingInterval: args[\"alloc-interval\"],\n stackDepth: args[\"alloc-depth\"],\n },\n alloc: needsAlloc(args),\n profile: needsProfile(args),\n profileInterval: args[\"profile-interval\"],\n headless: args.headless,\n chromePath: args.chrome,\n chromeProfile: args[\"chrome-profile\"],\n timeout: args.timeout,\n gcStats: args[\"gc-stats\"],\n callCounts: args[\"call-counts\"],\n waitFor: args[\"wait-for\"],\n };\n}\n\n/** Extract a short name from a URL for report labels. */\nfunction nameFromUrl(url: string): string {\n return new URL(url).pathname.split(\"/\").pop() || \"browser\";\n}\n\n/** Wrap browser profile result as ReportGroup[] for the standard export pipeline. */\nfunction browserResultGroups(\n name: string,\n result: BrowserProfileResult,\n): ReportGroup[] {\n const measuredResults = toBrowserMeasured(name, result);\n return [{ name, reports: [{ name, measuredResults }] }];\n}\n\n/** Print text report and optional heap profile for browser results. */\nfunction printBrowserReport(\n result: BrowserProfileResult,\n results: ReportGroup[],\n args: DefaultCliArgs,\n): void {\n const mr = results[0]?.reports[0]?.measuredResults;\n const hasPageLoad = (mr?.navTimings?.length ?? 0) > 0 || !!result.navTiming;\n const hasIterSamples = !!result.samples?.length;\n const sections: ReportSection[] = [\n ...(hasPageLoad ? pageLoadStatsSections : []),\n ...(hasIterSamples ? [buildTimeSection(args.stats)] : []),\n ...(result.gcStats ? [browserGcStatsSection] : []),\n ...(hasPageLoad || hasIterSamples ? [runsSection] : []),\n ];\n if (sections.length > 0) {\n console.log(\n withStatus(\"computing report\", () => reportResults(results, sections)),\n );\n }\n if (!result.heapProfile) return;\n printHeapReports(results, {\n ...cliHeapReportOptions(args),\n isUserCode: isBrowserUserCode,\n });\n}\n\n/** Launch Chrome, run batched fresh tabs, merge results. */\nasync function runBrowserBatches(\n params: ReturnType<typeof buildBrowserParams>,\n name: string,\n args: DefaultCliArgs,\n): Promise<{ lastRaw: BrowserProfileResult; results: ReportGroup[] }> {\n const { headless, chrome: chromePath } = args;\n const chromeProfile = args[\"chrome-profile\"];\n const chrome = await launchChrome({\n headless,\n chromePath,\n chromeProfile,\n args: params.chromeArgs,\n });\n try {\n return await runBatchedTabs(params, name, args, chrome);\n } finally {\n await chrome.close();\n }\n}\n\n/** Strip surrounding quotes from a chrome-args token. */\nfunction stripQuotes(s: string): string {\n const bare = s.replace(/^(['\"])(.*)\\1$/s, \"$2\");\n return bare.replace(/^(-[^=]+=)(['\"])(.*)\\2$/s, \"$1$3\");\n}\n\n/** Convert a browser profile result into a MeasuredResults for the report pipeline. */\nfunction toBrowserMeasured(\n name: string,\n result: BrowserProfileResult,\n): MeasuredResults {\n const { gcStats, heapProfile, timeProfile, coverage, navTiming, samples } =\n result;\n const navTimings = navTiming ? [navTiming] : undefined;\n const base = {\n name,\n gcStats,\n heapProfile,\n timeProfile,\n coverage,\n navTimings,\n };\n\n if (samples?.length) {\n const totalTime = result.wallTimeMs ? result.wallTimeMs / 1000 : undefined;\n return { ...base, samples, time: computeStats(samples), totalTime };\n }\n const wallTime = result.wallTimeMs ?? 0;\n return { ...base, samples: [wallTime], time: computeStats([wallTime]) };\n}\n\n/** Execute batched browser tabs within an already-launched Chrome instance. */\nasync function runBatchedTabs(\n params: ReturnType<typeof buildBrowserParams>,\n name: string,\n args: DefaultCliArgs,\n chrome: any,\n): Promise<{ lastRaw: BrowserProfileResult; results: ReportGroup[] }> {\n const baselineUrl = args[\"baseline-url\"];\n const { maxTime, maxIterations } = params;\n const limits = { maxTime, maxIterations };\n const state: TabRunnerState = { detectedPageLoad: params.pageLoad };\n\n const warmup = !(args[\"warmup-batch\"] ?? false) && args.batches > 1;\n const mk = (url: string, label: string) =>\n makeTabRunner(params, chrome, limits, warmup, state, url, label);\n const runCurrent = mk(params.url, name);\n const runBaseline = baselineUrl\n ? mk(baselineUrl, nameFromUrl(baselineUrl))\n : undefined;\n\n const progress = (p: BatchProgress) => {\n const sec = (p.elapsed / 1000).toFixed(0);\n const msg = `\\r◊ batch ${p.batch + 1}/${p.batches} ${p.label} (${sec}s) `;\n process.stderr.write(msg);\n };\n\n const {\n results: [current],\n baseline,\n } = await runBatched(\n [runCurrent],\n runBaseline,\n Math.max(args.batches, 2),\n args[\"warmup-batch\"] ?? false,\n progress,\n );\n process.stderr.write(\"\\r\" + \" \".repeat(50) + \"\\r\");\n\n const baseName = baselineUrl ? nameFromUrl(baselineUrl) : undefined;\n const baselineEntry =\n baseline && baseName\n ? { name: baseName, measuredResults: baseline }\n : undefined;\n const reports = [{ name, measuredResults: current }];\n return {\n lastRaw: state.lastRaw!,\n results: [{ name, reports, baseline: baselineEntry }],\n };\n}\n\n/** Create a batch runner closure for a single URL (current or baseline). */\nfunction makeTabRunner(\n params: ReturnType<typeof buildBrowserParams>,\n chrome: any,\n limits: { maxTime?: number; maxIterations?: number },\n warmup: boolean,\n state: TabRunnerState,\n url: string,\n label: string,\n): () => Promise<MeasuredResults> {\n let firstCall = warmup;\n return async () => {\n const isWarmup = firstCall;\n firstCall = false;\n const p = { ...params, chrome, url };\n if (state.detectedPageLoad) {\n const batchLimits = isWarmup ? { maxIterations: 1 } : limits;\n const result = await runMultiPageLoad(\n { ...p, pageLoad: true },\n label,\n batchLimits,\n );\n state.lastRaw ??= {\n navTiming: result.navTimings?.[0],\n wallTimeMs: result.time.p50,\n };\n return result;\n }\n const raw = await profileBrowser(p);\n state.lastRaw = raw;\n // Probe: if no iteration samples and navTiming present, it's page-load mode\n if (!raw.samples?.length && raw.navTiming) state.detectedPageLoad = true;\n return toBrowserMeasured(label, raw);\n };\n}\n\n/** Run page loads until duration or iteration limit, collecting wallTimeMs as samples. */\nasync function runMultiPageLoad(\n params: any, // BrowserProfileParams with chrome attached by caller\n name: string,\n limits: { maxTime?: number; maxIterations?: number },\n): Promise<MeasuredResults> {\n const { maxTime, maxIterations } = limits;\n const raws: BrowserProfileResult[] = [];\n let accumulated = 0;\n for (let i = 0; ; i++) {\n if (maxIterations != null && i >= maxIterations) break;\n const raw = await profileBrowser(params);\n raws.push(raw);\n accumulated += raw.wallTimeMs ?? 0;\n if (maxTime != null && accumulated >= maxTime) break;\n }\n\n const samples = raws.map(r => r.wallTimeMs ?? 0);\n const navTimings = raws.map(r => r.navTiming).filter(Boolean) as NavTiming[];\n const { heapProfile, timeProfile, coverage } = raws[raws.length - 1];\n const totalTime = accumulated / 1000;\n const gcStats = mergeGcStats(raws);\n return {\n name,\n samples,\n time: computeStats(samples),\n totalTime,\n navTimings: navTimings.length ? navTimings : undefined,\n gcStats,\n heapProfile,\n timeProfile,\n coverage,\n };\n}\n","import type { BenchSuite } from \"../runners/BenchmarkSpec.ts\";\n\n/** Filter suite benchmarks by name pattern (substring or regex). */\nexport function filterBenchmarks(\n suite: BenchSuite,\n filter?: string,\n removeEmpty = true,\n): BenchSuite {\n if (!filter) return suite;\n const regex = createFilterRegex(filter);\n const groups = suite.groups\n .map(group => ({\n ...group,\n benchmarks: group.benchmarks.filter(bench =>\n regex.test(stripCaseSuffix(bench.name)),\n ),\n baseline:\n group.baseline && regex.test(stripCaseSuffix(group.baseline.name))\n ? group.baseline\n : undefined,\n }))\n .filter(group => !removeEmpty || group.benchmarks.length > 0);\n if (groups.every(g => g.benchmarks.length === 0)) {\n throw new Error(`No benchmarks match filter: \"${filter}\"`);\n }\n return { name: suite.name, groups };\n}\n\n/** Create regex from filter string. Uses literal prefix match unless the string looks like regex. */\nfunction createFilterRegex(filter: string): RegExp {\n const isSlashed = filter.startsWith(\"/\") && filter.endsWith(\"/\");\n const looksLikeRegex =\n isSlashed ||\n /[*?[|]/.test(filter) ||\n filter.startsWith(\"^\") ||\n filter.endsWith(\"$\");\n\n if (!looksLikeRegex) return new RegExp(\"^\" + escapeRegex(filter), \"i\");\n\n const pattern = isSlashed ? filter.slice(1, -1) : filter;\n try {\n return new RegExp(pattern, \"i\");\n } catch {\n return new RegExp(escapeRegex(filter), \"i\");\n }\n}\n\n/** Strip case suffix like \" [large]\" from benchmark name for filtering. */\nfunction stripCaseSuffix(name: string): string {\n return name.replace(/ \\[.*?\\]$/, \"\");\n}\n\n/** Escape special regex characters for literal matching. */\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import type {\n BenchmarkReport,\n ReportGroup,\n} from \"../report/BenchmarkReport.ts\";\nimport type {\n BenchGroup,\n BenchmarkSpec,\n BenchSuite,\n} from \"../runners/BenchmarkSpec.ts\";\nimport type { RunnerOptions } from \"../runners/BenchRunner.ts\";\nimport type { KnownRunner } from \"../runners/CreateRunner.ts\";\nimport { runBatched } from \"../runners/MergeBatches.ts\";\nimport { runBenchmark } from \"../runners/RunnerOrchestrator.ts\";\nimport type { DefaultCliArgs } from \"./CliArgs.ts\";\nimport { cliToRunnerOptions, validateArgs } from \"./CliOptions.ts\";\nimport { filterBenchmarks } from \"./FilterBenchmarks.ts\";\n\ntype RunParams = {\n runner: KnownRunner;\n options: RunnerOptions;\n useWorker: boolean;\n params: unknown;\n metadata?: Record<string, any>;\n};\n\ntype SuiteParams = {\n runner: KnownRunner;\n options: RunnerOptions;\n useWorker: boolean;\n batches: number;\n warmupBatch: boolean;\n};\n\n/** Run a benchmark suite with CLI arguments. */\nexport async function runBenchmarks(\n suite: BenchSuite,\n args: DefaultCliArgs,\n): Promise<ReportGroup[]> {\n validateArgs(args);\n const { filter, worker: useWorker, batches = 1 } = args;\n const warmupBatch = args[\"warmup-batch\"] ?? false;\n const options = cliToRunnerOptions(args);\n const filtered = filterBenchmarks(suite, filter);\n\n const runner = \"timing\";\n const suiteParams: SuiteParams = {\n runner,\n options,\n useWorker,\n batches,\n warmupBatch,\n };\n return serialMap(filtered.groups, g => runGroup(g, suiteParams));\n}\n\n/** Like Promise.all(arr.map(fn)) but runs one at a time. */\nasync function serialMap<T, R>(\n arr: T[],\n fn: (item: T) => Promise<R>,\n): Promise<R[]> {\n const results: R[] = [];\n for (const item of arr) {\n results.push(await fn(item));\n }\n return results;\n}\n\n/** Execute group with shared setup, optionally batching to reduce ordering bias. */\nasync function runGroup(\n group: BenchGroup,\n suiteParams: SuiteParams,\n): Promise<ReportGroup> {\n const { batches, warmupBatch, ...rest } = suiteParams;\n const { name, benchmarks, baseline, setup, metadata } = group;\n const setupParams = await setup?.();\n validateBenchmarkParameters(group);\n\n const runParams: RunParams = { ...rest, params: setupParams, metadata };\n if (batches === 1)\n return runSingleBatch(name, benchmarks, baseline, runParams);\n return runMultipleBatches(\n name,\n benchmarks,\n baseline,\n runParams,\n batches,\n warmupBatch,\n );\n}\n\n/** Warn if parameterized benchmarks lack a setup function. */\nfunction validateBenchmarkParameters(group: BenchGroup): void {\n if (group.setup) return;\n const { benchmarks, baseline } = group;\n const all = baseline ? [...benchmarks, baseline] : benchmarks;\n for (const bench of all.filter(b => b.fn.length > 0)) {\n console.warn(\n `Benchmark \"${bench.name}\" in group \"${group.name}\" expects parameters but no setup() provided.`,\n );\n }\n}\n\n/** Run benchmarks in a single batch. */\nasync function runSingleBatch(\n name: string,\n benchmarks: BenchmarkSpec[],\n baseline: BenchmarkSpec | undefined,\n runParams: RunParams,\n): Promise<ReportGroup> {\n const baselineReport = baseline\n ? await runSingleBenchmark(baseline, runParams)\n : undefined;\n const reports = await serialMap(benchmarks, b =>\n runSingleBenchmark(b, runParams),\n );\n return { name, reports, baseline: baselineReport };\n}\n\n/** Run benchmarks in multiple batches, alternating order to reduce bias. */\nasync function runMultipleBatches(\n name: string,\n benchmarks: BenchmarkSpec[],\n baseline: BenchmarkSpec | undefined,\n runParams: RunParams,\n batches: number,\n warmupBatch: boolean,\n): Promise<ReportGroup> {\n const { metadata } = runParams;\n const run = (spec: BenchmarkSpec) => async () =>\n (await runSingleBenchmark(spec, runParams)).measuredResults;\n const runners = benchmarks.map(run);\n const baselineFn = baseline ? run(baseline) : undefined;\n\n const batched = await runBatched(runners, baselineFn, batches, warmupBatch);\n const reports = benchmarks.map((b, i) => ({\n name: b.name,\n measuredResults: batched.results[i],\n metadata,\n }));\n const baselineReport =\n batched.baseline && baseline\n ? { name: baseline.name, measuredResults: batched.baseline, metadata }\n : undefined;\n return { name, reports, baseline: baselineReport };\n}\n\n/** Run single benchmark and create report. */\nasync function runSingleBenchmark(\n spec: BenchmarkSpec,\n { runner, options, useWorker, params, metadata }: RunParams,\n): Promise<BenchmarkReport> {\n const [result] = await runBenchmark({\n spec,\n runner,\n options,\n useWorker,\n params,\n });\n return { name: spec.name, measuredResults: result, metadata };\n}\n","import { basename, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { hideBin } from \"yargs/helpers\";\nimport type { MatrixResults, MatrixSuite } from \"../matrix/BenchMatrix.ts\";\nimport { runMatrix } from \"../matrix/BenchMatrix.ts\";\nimport { loadCasesModule } from \"../matrix/CaseLoader.ts\";\nimport {\n type FilteredMatrix,\n filterMatrix,\n type MatrixFilter,\n parseMatrixFilter,\n resolveCaseIds,\n resolveVariantIds,\n} from \"../matrix/MatrixFilter.ts\";\nimport type { MatrixReportOptions } from \"../matrix/MatrixReport.ts\";\nimport type { ReportSection } from \"../report/BenchmarkReport.ts\";\nimport type { BenchSuite } from \"../runners/BenchmarkSpec.ts\";\nimport { browserBenchExports } from \"./BrowserBench.ts\";\nimport {\n type Configure,\n type DefaultCliArgs,\n parseCliArgs,\n} from \"./CliArgs.ts\";\nimport { finishReports, type MatrixExportOptions } from \"./CliExport.ts\";\nimport { cliToMatrixOptions, validateArgs } from \"./CliOptions.ts\";\nimport {\n defaultMatrixReport,\n defaultReport,\n matrixToReportGroups,\n withStatus,\n} from \"./CliReport.ts\";\nimport { runBenchmarks } from \"./SuiteRunner.ts\";\n\n/** Options for running a BenchSuite: custom sections replace the CLI-derived defaults. */\nexport interface BenchExportsOptions {\n sections?: ReportSection[];\n}\n\n/** Top-level CLI dispatch: route to view, analyze, or default bench runner. */\nexport async function dispatchCli(): Promise<void> {\n const argv = hideBin(process.argv);\n const [command] = argv;\n\n if (command === \"view\") {\n const { viewArchive } = await import(\"./ViewerServer.ts\");\n return viewArchive(requireFile(argv[1], \"view\"));\n }\n if (command === \"analyze\") {\n const { analyzeArchive } = await import(\"./AnalyzeArchive.ts\");\n return analyzeArchive(requireFile(argv[1], \"analyze\"));\n }\n await runDefaultBench(undefined, undefined, argv);\n}\n\n/** Run benchmarks and display results. Suite is optional with --url (browser mode). */\nexport async function runDefaultBench(\n suite?: BenchSuite,\n configureArgs?: Configure<any>,\n argv?: string[],\n opts?: BenchExportsOptions,\n): Promise<void> {\n const args = parseBenchArgs(configureArgs, argv);\n if (args.url) return browserBenchExports(args);\n if (args.list && suite) return listSuite(suite);\n if (suite) return benchExports(suite, args, opts);\n if (args.file) return fileBenchExports(args.file, args);\n throw new Error(\n \"Provide a benchmark file, --url for browser mode, or pass a BenchSuite directly.\",\n );\n}\n\n/** Parse CLI args with optional custom yargs configuration. */\nexport function parseBenchArgs<T = DefaultCliArgs>(\n configureArgs?: Configure<T>,\n argv?: string[],\n): T & DefaultCliArgs {\n const args = argv ?? hideBin(process.argv);\n return parseCliArgs(args, configureArgs) as T & DefaultCliArgs;\n}\n\n/** Run a BenchSuite and print results with standard reporting. */\nexport async function benchExports(\n suite: BenchSuite,\n args: DefaultCliArgs,\n opts?: BenchExportsOptions,\n): Promise<void> {\n const results = await runBenchmarks(suite, args);\n console.log(\n withStatus(\"computing report\", () => defaultReport(results, args, opts)),\n );\n await finishReports(results, args, opts);\n}\n\n/** Run matrix suite with full CLI handling (parse, run, report, export). */\nexport async function runDefaultMatrixBench(\n suite: MatrixSuite,\n configureArgs?: Configure<any>,\n reportOptions?: MatrixReportOptions,\n): Promise<void> {\n const args = parseBenchArgs(configureArgs);\n await matrixBenchExports(suite, args, reportOptions);\n}\n\n/** Run a matrix suite, print results, and handle exports. */\nexport async function matrixBenchExports(\n suite: MatrixSuite,\n args: DefaultCliArgs,\n reportOptions?: MatrixReportOptions,\n exportOptions?: MatrixExportOptions,\n): Promise<void> {\n const results = await runMatrixSuite(suite, args);\n const report = withStatus(\"computing report\", () =>\n defaultMatrixReport(results, reportOptions, args),\n );\n console.log(report);\n\n const groups = matrixToReportGroups(results);\n await finishReports(groups, args, exportOptions);\n}\n\n/** Run matrix suite with CLI arguments. --filter narrows defaults, --all --filter narrows all. */\nexport async function runMatrixSuite(\n suite: MatrixSuite,\n args: DefaultCliArgs,\n): Promise<MatrixResults[]> {\n if (args.list) {\n await listMatrixSuite(suite);\n return [];\n }\n validateArgs(args);\n const filter = args.filter ? parseMatrixFilter(args.filter) : undefined;\n const options = cliToMatrixOptions(args);\n\n const results: MatrixResults[] = [];\n for (const matrix of suite.matrices) {\n const filtered = await applyMatrixFilters(matrix, args.all, filter);\n const { filteredCases, filteredVariants } = filtered;\n results.push(\n await runMatrix(filtered, {\n ...options,\n filteredCases,\n filteredVariants,\n }),\n );\n }\n return results;\n}\n\n/** Require a file argument for a subcommand, exiting with usage on missing. */\nfunction requireFile(filePath: string | undefined, subcommand: string): string {\n if (filePath) return filePath;\n console.error(`Usage: benchforge ${subcommand} <file.benchforge>`);\n process.exit(1);\n}\n\n/** Print available benchmarks in a suite for --list. */\nfunction listSuite(suite: BenchSuite): void {\n for (const group of suite.groups) {\n console.log(group.name);\n for (const bench of group.benchmarks) console.log(` ${bench.name}`);\n if (group.baseline) console.log(` ${group.baseline.name} (baseline)`);\n }\n}\n\n/** Import a file and run it as a benchmark based on what it exports. */\nasync function fileBenchExports(\n filePath: string,\n args: DefaultCliArgs,\n): Promise<void> {\n const fileUrl = pathToFileURL(resolve(filePath)).href;\n const { default: candidate } = await import(fileUrl);\n\n if (candidate && Array.isArray(candidate.matrices)) {\n if (args.list) return listMatrixSuite(candidate as MatrixSuite);\n return matrixBenchExports(candidate as MatrixSuite, args);\n }\n if (candidate && Array.isArray(candidate.groups)) {\n if (args.list) return listSuite(candidate as BenchSuite);\n return benchExports(candidate as BenchSuite, args);\n }\n if (typeof candidate === \"function\") {\n const name = basename(filePath).replace(/\\.[^.]+$/, \"\");\n const bench = { name, fn: candidate };\n const suite = { name, groups: [{ name, benchmarks: [bench] }] };\n return benchExports(suite, args);\n }\n}\n\n/** Print available cases and variants in a matrix suite for --list. */\nasync function listMatrixSuite(suite: MatrixSuite): Promise<void> {\n for (const matrix of suite.matrices) {\n console.log(matrix.name);\n const caseIds = await resolveCaseIds(matrix);\n if (caseIds) {\n console.log(\" cases:\");\n for (const id of caseIds) console.log(` ${id}`);\n }\n const variantIds = await resolveVariantIds(matrix);\n console.log(\" variants:\");\n for (const id of variantIds) console.log(` ${id}`);\n }\n}\n\n/** --filter bypasses defaults (implies --all for the filtered dimension). */\nasync function applyMatrixFilters(\n matrix: FilteredMatrix<any>,\n runAll: boolean,\n filter?: MatrixFilter,\n): Promise<FilteredMatrix<any>> {\n const mod = matrix.casesModule\n ? await loadCasesModule(matrix.casesModule)\n : undefined;\n let withDefaults = matrix;\n if (!runAll && !filter && mod) {\n const { defaultCases: filteredCases, defaultVariants: filteredVariants } =\n mod;\n withDefaults = { ...matrix, filteredCases, filteredVariants };\n }\n return filter ? filterMatrix(withDefaults, filter) : withDefaults;\n}\n"],"mappings":"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"}
|