{"record":{"id":"027dcf9bffd3eaf4","repo":"chenglou/pretext","slug":"unsupported-browser-browser-expected-chrome-or-027dcf","errorCode":null,"errorMessage":"Unsupported browser ${browser}; expected chrome or safari","messagePattern":"Unsupported browser (.+?); expected chrome or safari","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"scripts/corpus-check.ts","lineNumber":137,"sourceCode":"  const prefix = `--${name}=`\n  const arg = process.argv.find(value => value.startsWith(prefix))\n  return arg === undefined ? null : arg.slice(prefix.length)\n}\n\nfunction parseNumberFlag(name: string, fallback: number): number {\n  const raw = parseStringFlag(name)\n  if (raw === null) return fallback\n  const parsed = Number.parseInt(raw, 10)\n  if (!Number.isFinite(parsed)) {\n    throw new Error(`Invalid value for --${name}: ${raw}`)\n  }\n  return parsed\n}\n\nfunction parseBrowser(value: string | null): BrowserKind {\n  const browser = (value ?? process.env['CORPUS_CHECK_BROWSER'] ?? 'chrome').toLowerCase()\n  if (browser !== 'chrome' && browser !== 'safari') {\n    throw new Error(`Unsupported browser ${browser}; expected chrome or safari`)\n  }\n  return browser\n}\n\nfunction parseOptionalNumberFlag(name: string): number | null {\n  const raw = parseStringFlag(name)\n  if (raw === null) return null\n  const parsed = Number.parseInt(raw, 10)\n  if (!Number.isFinite(parsed)) {\n    throw new Error(`Invalid value for --${name}: ${raw}`)\n  }\n  return parsed\n}\n\nfunction hasFlag(name: string): boolean {\n  return process.argv.includes(`--${name}`)\n}\n","sourceCodeStart":119,"sourceCodeEnd":155,"githubUrl":"https://github.com/chenglou/pretext/blob/ac49b09b7d83ede19581fa94a8b892b07d309baf/scripts/corpus-check.ts#L119-L155","documentation":"Thrown by parseBrowser in corpus-check.ts. The browser selector resolves from `--browser=<value>`, else `CORPUS_CHECK_BROWSER`, else the literal default 'chrome', then lowercases. corpus-check supports only chrome and safari (Firefox corpus support is intentionally absent), so any other value throws, listing the two allowed options.","triggerScenarios":"parseBrowser(value) sees a string that is not 'chrome' or 'safari' after lowercasing. Triggers on `--browser=firefox`, `--browser=Chrome ` (trailing space survives lowercasing — 'chrome ' !== 'chrome'), `--browser=webkit`, `--browser=canary`, or `CORPUS_CHECK_BROWSER=firefox` exported in the shell.","commonSituations":"Assuming corpus-check accepts Firefox because the wider browser-automation stack does (BrowserKind includes 'firefox'); exporting CORPUS_CHECK_BROWSER globally for a different script and forgetting it; passing a Chrome variant name (canary, chromium) expecting it to map to chrome; whitespace from shell quoting (`--browser=\"chrome \"`).","solutions":["Pass exactly `--browser=chrome` or `--browser=safari` (no whitespace, no variants).","Unset or correct `CORPUS_CHECK_BROWSER` in your environment if a global export is leaking in.","If you genuinely need Firefox corpus coverage, that is a feature gap — use the accuracy sweep or extend parseBrowser's allowlist and the corpus page's browser branches."],"exampleFix":"// before\nCORPUS_CHECK_BROWSER=firefox bun run scripts/corpus-check.ts --id=ja-kumo-no-ito\n// after\nbun run scripts/corpus-check.ts --id=ja-kumo-no-ito --browser=safari","handlingStrategy":"validation","validationCode":"const ALLOWED_CORPUS_BROWSERS = new Set(['chrome', 'safari'])\nfunction normalizeBrowser(raw: string | null, env: string | undefined): 'chrome' | 'safari' {\n  const value = (raw ?? env ?? 'chrome').trim().toLowerCase()\n  if (!ALLOWED_CORPUS_BROWSERS.has(value)) {\n    throw new Error(`Unsupported browser ${value}; expected one of ${[...ALLOWED_CORPUS_BROWSERS].join(', ')}`)\n  }\n  return value as 'chrome' | 'safari'\n}","typeGuard":"function isCorpusBrowser(value: string): value is 'chrome' | 'safari' {\n  return value === 'chrome' || value === 'safari'\n}","tryCatchPattern":null,"preventionTips":["Use exactly `chrome` or `safari` (lowercase, no whitespace) for corpus-check.","Unset CORPUS_CHECK_BROWSER if a global export from another workflow could leak in.","Do not pass Chrome variants (canary, chromium); they are not aliased to chrome."],"tags":["cli","validation","browser","corpus-check"],"backgroundTag":null,"analyzedSha":"ac49b09b7d83ede19581fa94a8b892b07d309baf","analyzedAt":"2026-08-12T17:03:16.263Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}