Parse a small flag set without pulling benchmark-only dependencies into the app.
(argv: string[])
| 62 | |
| 63 | /** Parse a small flag set without pulling benchmark-only dependencies into the app. */ |
| 64 | function parseArgs(argv: string[]): CliOptions { |
| 65 | const options = { ...defaultOptions }; |
| 66 | |
| 67 | for (let index = 0; index < argv.length; index += 1) { |
| 68 | const arg = argv[index]!; |
| 69 | if (arg === "--help" || arg === "-h") { |
| 70 | console.log( |
| 71 | `Usage: bun run benchmarks/navigation-memory.ts [options]\n\nOptions:\n --navigations <n> Key-driven hunk navigations (default ${defaultOptions.navigations})\n --warmup-navigations <n> Navigations ignored for trend analysis (default ${defaultOptions.warmupNavigations})\n --sample-every <n> Sample every N navigations (default ${defaultOptions.sampleEvery})\n --file-count <n> One-hunk files in the synthetic review (default ${defaultOptions.fileCount})\n --lines-per-file <n> Lines per synthetic file (default ${defaultOptions.linesPerFile})\n --width <n> Test renderer width (default ${defaultOptions.width})\n --height <n> Test renderer height (default ${defaultOptions.height})\n --mode <bounce|forward> Bounce avoids end-of-review no-ops (default ${defaultOptions.mode})\n --no-gc Do not force Bun.gc before samples\n --max-heap-growth-mb <n> Fail if post-warmup heap grows beyond this (default ${defaultOptions.maxHeapGrowthMb})\n --max-heap-slope-kb <n> Fail if post-warmup heap slope exceeds this per navigation (default ${defaultOptions.maxHeapSlopeKb})\n --max-rss-growth-mb <n> Fail if post-warmup RSS grows beyond this (default ${defaultOptions.maxRssGrowthMb})\n --json-out <path> Write full sample summary JSON\n`, |
| 72 | ); |
| 73 | process.exit(0); |
| 74 | } |
| 75 | |
| 76 | const next = () => argv[++index]; |
| 77 | switch (arg) { |
| 78 | case "--navigations": |
| 79 | options.navigations = parseNumberOption(arg, next()); |
| 80 | break; |
| 81 | case "--warmup-navigations": |
| 82 | options.warmupNavigations = parseNumberOption(arg, next()); |
| 83 | break; |
| 84 | case "--sample-every": |
| 85 | options.sampleEvery = parseNumberOption(arg, next()); |
| 86 | break; |
| 87 | case "--file-count": |
| 88 | options.fileCount = parseNumberOption(arg, next()); |
| 89 | break; |
| 90 | case "--lines-per-file": |
| 91 | options.linesPerFile = parseNumberOption(arg, next()); |
| 92 | break; |
| 93 | case "--width": |
| 94 | options.width = parseNumberOption(arg, next()); |
| 95 | break; |
| 96 | case "--height": |
| 97 | options.height = parseNumberOption(arg, next()); |
| 98 | break; |
| 99 | case "--mode": { |
| 100 | const mode = next(); |
| 101 | if (mode !== "bounce" && mode !== "forward") { |
| 102 | throw new Error("Expected --mode to be either bounce or forward."); |
| 103 | } |
| 104 | options.mode = mode; |
| 105 | break; |
| 106 | } |
| 107 | case "--no-gc": |
| 108 | options.gc = false; |
| 109 | break; |
| 110 | case "--max-heap-growth-mb": |
| 111 | options.maxHeapGrowthMb = parseNumberOption(arg, next()); |
| 112 | break; |
| 113 | case "--max-heap-slope-kb": |
| 114 | options.maxHeapSlopeKb = parseNumberOption(arg, next()); |
| 115 | break; |
| 116 | case "--max-rss-growth-mb": |
| 117 | options.maxRssGrowthMb = parseNumberOption(arg, next()); |
| 118 | break; |
| 119 | case "--json-out": |
| 120 | options.jsonOut = next(); |
| 121 | if (!options.jsonOut) { |
no test coverage detected