{"record":{"id":"5e53fe389242ecf3","repo":"chenglou/pretext","slug":"unsupported-browser-browser","errorCode":null,"errorMessage":"Unsupported browser ${browser}","messagePattern":"Unsupported browser (.+?)","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"scripts/keep-all-check.ts","lineNumber":70,"sourceCode":"  const raw = parseStringFlag(name)\n  if (raw === null) return fallback\n  const parsed = Number.parseInt(raw, 10)\n  if (!Number.isFinite(parsed)) throw new Error(`Invalid value for --${name}: ${raw}`)\n  return parsed\n}\n\nfunction parseBrowsers(value: string | null): AutomationBrowserKind[] {\n  const raw = (value ?? 'chrome,safari').trim()\n  if (raw.length === 0) return ['chrome', 'safari']\n\n  const browsers = raw\n    .split(',')\n    .map(part => part.trim().toLowerCase())\n    .filter(Boolean)\n\n  for (const browser of browsers) {\n    if (browser !== 'chrome' && browser !== 'safari' && browser !== 'firefox') {\n      throw new Error(`Unsupported browser ${browser}`)\n    }\n  }\n\n  return browsers as AutomationBrowserKind[]\n}\n\nconst requestedPort = parseNumberFlag('port', 0)\nconst browsers = parseBrowsers(parseStringFlag('browser'))\nconst timeoutMs = parseNumberFlag('timeout', 60_000)\n\nfunction printCaseResult(browser: AutomationBrowserKind, testCase: ProbeOracleCase, report: ProbeReport): void {\n  if (report.status === 'error') {\n    console.log(`${browser} | ${testCase.label}: error: ${report.message ?? 'unknown error'}`)\n    return\n  }\n\n  const sensitivity =\n    report.extractorSensitivity === null || report.extractorSensitivity === undefined","sourceCodeStart":52,"sourceCodeEnd":88,"githubUrl":"https://github.com/chenglou/pretext/blob/ac49b09b7d83ede19581fa94a8b892b07d309baf/scripts/keep-all-check.ts#L52-L88","documentation":"parseBrowsers() in keep-all-check.ts validates each comma-separated entry from `--browser=` against the fixed set {chrome, safari, firefox} and throws on anything else. This is an input-validation guard at the CLI boundary; the value never reaches the browser automation layer if it is unknown.","triggerScenarios":"Passing `--browser=ie`, `--browser=edge`, `--browser=Chrome` after case-folding issues (note the code lowercases, so case is fine), or `--browser=chrome,brave`.","commonSituations":"Copy-pasting a browser list from another tool that supports a wider set, or assuming Chromium-family names like 'chromium' or 'edge' are accepted.","solutions":["Use only chrome, safari, or firefox (case-insensitive), comma-separated, e.g. `--browser=chrome,safari`.","Omit `--browser` entirely to get the default chrome,safari."],"exampleFix":"# before\nbun run keep-all-check -- --browser=chromium\n\n# after\nbun run keep-all-check -- --browser=chrome","handlingStrategy":"type-guard","validationCode":"const SUPPORTED = new Set(['chrome', 'safari', 'firefox'])\nfunction parseBrowsers(value: string | null): ('chrome' | 'safari' | 'firefox')[] {\n  const parts = (value ?? 'chrome,safari').split(',').map(p => p.trim().toLowerCase()).filter(Boolean)\n  const bad = parts.filter(p => !SUPPORTED.has(p))\n  if (bad.length) {\n    console.error(`Unsupported browser(s): ${bad.join(', ')}. Supported: chrome, safari, firefox`)\n    process.exit(2)\n  }\n  return parts as ('chrome' | 'safari' | 'firefox')[]\n}","typeGuard":"const isSupportedBrowser = (v: string): v is 'chrome' | 'safari' | 'firefox' =>\n  v === 'chrome' || v === 'safari' || v === 'firefox'","tryCatchPattern":null,"preventionTips":["Omit `--browser` to use the curated default rather than hand-typing names.","Document the accepted set at the top of each check script so contributors don't guess."],"tags":["cli","browser-automation","argument-parsing"],"backgroundTag":null,"analyzedSha":"ac49b09b7d83ede19581fa94a8b892b07d309baf","analyzedAt":"2026-08-12T17:03:16.263Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}