chenglou/pretext · error · Error

Invalid value for --${name}: ${raw}

Error message

Invalid value for --${name}: ${raw}

What it means

Thrown by parseNumberFlag in corpus-check.ts when a `--name=value` CLI argument is present but Number.parseInt(value, 10) returns NaN. Used for required numeric flags (port, timeout). The thrown name and raw value are interpolated so the offender is identifiable. This is pure input validation at module top-level — the script aborts before doing any browser work.

Source

Thrown at scripts/corpus-check.ts:129

      domWidth: number
      isSpace: boolean
    }>
  } | null
  message?: string
}

function parseStringFlag(name: string): string | null {
  const prefix = `--${name}=`
  const arg = process.argv.find(value => value.startsWith(prefix))
  return arg === undefined ? null : arg.slice(prefix.length)
}

function parseNumberFlag(name: string, fallback: number): number {
  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 parseBrowser(value: string | null): BrowserKind {
  const browser = (value ?? process.env['CORPUS_CHECK_BROWSER'] ?? 'chrome').toLowerCase()
  if (browser !== 'chrome' && browser !== 'safari') {
    throw new Error(`Unsupported browser ${browser}; expected chrome or safari`)
  }
  return browser
}

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

View on GitHub (pinned to ac49b09b7d)

Solutions

  1. Pass a bare base-10 integer: `--port=8765`, `--timeout=180000`.
  2. If sourcing from an env var, default it explicitly: `--port=${CORPUS_CHECK_PORT:-0}` so an unset variable does not yield `--port=`.
  3. Remember parseInt is permissive — `--port=12abc` will NOT throw (it parses as 12); if you need strict validation, augment parseNumberFlag with a full-string regex.
  4. For units (s, ms), convert before passing: `--timeout=$(( 30 * 1000 ))`.

Example fix

// before
bun run scripts/corpus-check.ts --id=ja-kumo-no-ito --port=8765tcp
// after
bun run scripts/corpus-check.ts --id=ja-kumo-no-ito --port=8765
Defensive patterns

Strategy: validation

Validate before calling

// Validate numeric CLI args before the script's own parse runs
function assertIntFlag(name: string, value: string | undefined): number {
  if (value === undefined) return NaN
  if (!/^-?\d+$/.test(value)) {
    throw new Error(`--${name} expects a base-10 integer, got ${JSON.stringify(value)}`)
  }
  return Number.parseInt(value, 10)
}

Type guard

function isIntegerArg(value: string): boolean {
  return /^-?\d+$/.test(value)
}

Prevention

When it happens

Trigger: parseStringFlag('port') finds an arg starting with `--port=`; parseNumberFlag slices the value after `=` and Number.parseInts it. Throw on `--port=abc`, `--port=8080tcp`, `--port=` (empty), `--timeout=30s`. Note parseInt('1.5',10) returns 1 (finite, no throw) — only truly non-numeric prefixes trigger this.

Common situations: Copy-pasting a port with a unit suffix; passing an env-var that was empty and got wrapped in `--port=`; quoting mishaps in a CI yaml that turn `--port=$PORT` into `--port=` when PORT is unset; misunderstanding that parseInt is prefix-based so `--port=12abc` parses as 12 silently.

Related errors


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