{"record":{"id":"e7282ffa0adb1f92","repo":"chenglou/pretext","slug":"unsupported-method-requestedmethod-expected","errorCode":null,"errorMessage":"Unsupported --method ${requestedMethod}; expected span or range","messagePattern":"Unsupported --method (.+?); expected span or range","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"scripts/corpus-check.ts","lineNumber":285,"sourceCode":"      const summary = mismatch.oursSegments\n        .map(segment => `${JSON.stringify(segment.text)}@${segment.width.toFixed(2)}/${segment.domWidth.toFixed(2)}${segment.isSpace ? ':space' : ''}`)\n        .join(' | ')\n      console.log(`  ours segments: ${summary}`)\n    }\n  } else if (report.firstMismatch !== null && report.firstMismatch !== undefined) {\n    console.log(`  first mismatch L${report.firstMismatch.line}`)\n    console.log(`  ours:    ${JSON.stringify(report.firstMismatch.ours.slice(0, 120))}`)\n    console.log(`  browser: ${JSON.stringify(report.firstMismatch.browser.slice(0, 120))}`)\n  }\n}\n\nlet serverProcess: ChildProcess | null = null\nconst browser = parseBrowser(parseStringFlag('browser'))\nconst requestedPort = parseNumberFlag('port', Number.parseInt(process.env['CORPUS_CHECK_PORT'] ?? '0', 10))\nconst timeoutMs = parseNumberFlag('timeout', Number.parseInt(process.env['CORPUS_CHECK_TIMEOUT_MS'] ?? '180000', 10))\nconst requestedMethod = parseStringFlag('method')\nif (requestedMethod !== null && requestedMethod !== 'span' && requestedMethod !== 'range') {\n  throw new Error(`Unsupported --method ${requestedMethod}; expected span or range`)\n}\nconst overrideOptions: CorpusOverrideOptions = {\n  font: parseStringFlag('font'),\n  lineHeight: parseOptionalNumberFlag('lineHeight'),\n  method: requestedMethod as 'span' | 'range' | null,\n  sliceStart: parseOptionalNumberFlag('sliceStart'),\n  sliceEnd: parseOptionalNumberFlag('sliceEnd'),\n}\nconst sources = await loadSources()\nconst id = parseStringFlag('id')\n\nif (id === null) {\n  throw new Error(`Missing --id. Available corpora: ${sources.map(source => source.id).join(', ')}`)\n}\n\nconst meta = sources.find(source => source.id === id)\nif (meta === undefined) {\n  throw new Error(`Unknown corpus ${id}. Available corpora: ${sources.map(source => source.id).join(', ')}`)","sourceCodeStart":267,"sourceCodeEnd":303,"githubUrl":"https://github.com/chenglou/pretext/blob/ac49b09b7d83ede19581fa94a8b892b07d309baf/scripts/corpus-check.ts#L267-L303","documentation":"Thrown at module top-level of corpus-check.ts after parsing --method. The diagnostic extractor used by corpus-check has exactly two modes — 'span' (wrap each line in a span and read offsets) and 'range' (use Range objects to walk the DOM). Any other value is rejected before any browser work starts. Per AGENTS.md, span is the default and range is the cross-check, especially on Safari around preserved spaces.","triggerScenarios":"parseStringFlag('method') returns a non-null string that is neither 'span' nor 'range'. Triggers on `--method=div`, `--method=text`, `--method=SPAN` (case-sensitive — uppercase is rejected), or a copy-paste from documentation describing a different tool's extraction modes.","commonSituations":"Confusing this with a different tool's method names; passing uppercase (the check is case-sensitive, unlike parseBrowser which lowercases); typo from a shell variable.","solutions":["Use `--method=span` (default, fastest, preferred) or `--method=range` (cross-check, recommended for Safari preserved-space diagnostics).","Omit --method entirely to take the default span path.","Match the casing exactly — the comparison is strict equality, no lowercasing."],"exampleFix":"// before\nbun run scripts/corpus-check.ts --id=ja-kumo-no-ito --method=SPAN\n// after\nbun run scripts/corpus-check.ts --id=ja-kumo-no-ito --method=span","handlingStrategy":"validation","validationCode":"const CORPUS_METHODS = new Set(['span', 'range'])\nfunction normalizeMethod(raw: string | null): 'span' | 'range' | null {\n  if (raw === null) return null\n  if (!CORPUS_METHODS.has(raw)) {\n    throw new Error(`Unsupported --method ${raw}; expected one of ${[...CORPUS_METHODS].join(', ')}`)\n  }\n  return raw as 'span' | 'range'\n}","typeGuard":"function isCorpusMethod(value: string): value is 'span' | 'range' {\n  return value === 'span' || value === 'range'\n}","tryCatchPattern":null,"preventionTips":["Use `--method=span` (default) or `--method=range` exactly — the check is case-sensitive.","Omit --method to take span by default.","On Safari preserved-space / pre-wrap diagnostics, prefer range per AGENTS.md."],"tags":["cli","validation","args","corpus-check","diagnostics"],"backgroundTag":null,"analyzedSha":"ac49b09b7d83ede19581fa94a8b892b07d309baf","analyzedAt":"2026-08-12T17:03:16.263Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}