chenglou/pretext · error · Error

Unsupported browser ${browser}

Error message

Unsupported browser ${browser}

What it means

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.

Source

Thrown at scripts/keep-all-check.ts:70

  const raw = parseStringFlag(name)
  if (raw === null) return fallback
  const parsed = Number.parseInt(raw, 10)
  if (!Number.isFinite(parsed)) throw new Error(`Invalid value for --${name}: ${raw}`)
  return parsed
}

function parseBrowsers(value: string | null): AutomationBrowserKind[] {
  const raw = (value ?? 'chrome,safari').trim()
  if (raw.length === 0) return ['chrome', 'safari']

  const browsers = raw
    .split(',')
    .map(part => part.trim().toLowerCase())
    .filter(Boolean)

  for (const browser of browsers) {
    if (browser !== 'chrome' && browser !== 'safari' && browser !== 'firefox') {
      throw new Error(`Unsupported browser ${browser}`)
    }
  }

  return browsers as AutomationBrowserKind[]
}

const requestedPort = parseNumberFlag('port', 0)
const browsers = parseBrowsers(parseStringFlag('browser'))
const timeoutMs = parseNumberFlag('timeout', 60_000)

function printCaseResult(browser: AutomationBrowserKind, testCase: ProbeOracleCase, report: ProbeReport): void {
  if (report.status === 'error') {
    console.log(`${browser} | ${testCase.label}: error: ${report.message ?? 'unknown error'}`)
    return
  }

  const sensitivity =
    report.extractorSensitivity === null || report.extractorSensitivity === undefined

View on GitHub (pinned to ac49b09b7d)

Solutions

  1. Use only chrome, safari, or firefox (case-insensitive), comma-separated, e.g. `--browser=chrome,safari`.
  2. Omit `--browser` entirely to get the default chrome,safari.

Example fix

# before
bun run keep-all-check -- --browser=chromium

# after
bun run keep-all-check -- --browser=chrome
Defensive patterns

Strategy: type-guard

Validate before calling

const SUPPORTED = new Set(['chrome', 'safari', 'firefox'])
function parseBrowsers(value: string | null): ('chrome' | 'safari' | 'firefox')[] {
  const parts = (value ?? 'chrome,safari').split(',').map(p => p.trim().toLowerCase()).filter(Boolean)
  const bad = parts.filter(p => !SUPPORTED.has(p))
  if (bad.length) {
    console.error(`Unsupported browser(s): ${bad.join(', ')}. Supported: chrome, safari, firefox`)
    process.exit(2)
  }
  return parts as ('chrome' | 'safari' | 'firefox')[]
}

Type guard

const isSupportedBrowser = (v: string): v is 'chrome' | 'safari' | 'firefox' =>
  v === 'chrome' || v === 'safari' || v === 'firefox'

Prevention

When it happens

Trigger: Passing `--browser=ie`, `--browser=edge`, `--browser=Chrome` after case-folding issues (note the code lowercases, so case is fine), or `--browser=chrome,brave`.

Common situations: Copy-pasting a browser list from another tool that supports a wider set, or assuming Chromium-family names like 'chromium' or 'edge' are accepted.

Related errors


AI-assisted analysis of chenglou/pretext@ac49b09b7d (2026-08-12). Data as JSON: /api/errors/5e53fe389242ecf3. Report an issue: GitHub.