{"record":{"id":"b00a105ac979d644","repo":"chenglou/pretext","slug":"unsupported-browser-browser-b00a10","errorCode":null,"errorMessage":"Unsupported browser ${browser}","messagePattern":"Unsupported browser (.+?)","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"scripts/letter-spacing-check.ts","lineNumber":117,"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)\nconst output = parseStringFlag('output')\n\nfunction materializeCase(testCase: LetterSpacingOracleCase): OracleSnapshot['cases'][number] & { text: string } {\n  const dir = testCase.dir ?? 'ltr'\n  return {\n    label: testCase.label,\n    text: testCase.text,\n    width: testCase.width,\n    font: testCase.font,","sourceCodeStart":99,"sourceCodeEnd":135,"githubUrl":"https://github.com/chenglou/pretext/blob/ac49b09b7d83ede19581fa94a8b892b07d309baf/scripts/letter-spacing-check.ts#L99-L135","documentation":"parseBrowsers() in letter-spacing-check.ts validates each `--browser=` entry against {chrome, safari, firefox} and throws on any other name. It is the same input-validation guard used across the oracle check scripts.","triggerScenarios":"Passing `--browser=edge`, `--browser=chromium`, or any token outside the accepted trio.","commonSituations":"Assuming a Chromium-family alias is supported, or pasting a browser list from a different tool.","solutions":["Use only chrome, safari, or firefox (case-insensitive), e.g. `--browser=chrome,safari`.","Omit `--browser` to get the default chrome,safari."],"exampleFix":"# before\nbun run letter-spacing-check -- --browser=edge\n\n# after\nbun run letter-spacing-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.","Document the accepted set in each check script."],"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"}