πŸ“„ File detail

utils/github/ghAuthStatus.ts

🧩 .tsπŸ“ 30 linesπŸ’Ύ 942 bytesπŸ“ text
← Back to All Files

🎯 Use case

This file lives under β€œutils/”, which covers cross-cutting helpers (shell, tempfiles, settings, messages, process input, …). On the API surface it exposes GhAuthStatus and getGhAuthStatus β€” mainly functions, hooks, or classes. Dependencies touch child processes. It composes internal code from which (relative imports).

Generated from folder role, exports, dependency roots, and inline comments β€” not hand-reviewed for every path.

🧠 Inline summary

import { execa } from 'execa' import { which } from '../which.js' export type GhAuthStatus = | 'authenticated'

πŸ“€ Exports (heuristic)

  • GhAuthStatus
  • getGhAuthStatus

πŸ“š External import roots

Package roots from from "…" (relative paths omitted).

  • execa

πŸ–₯️ Source preview

import { execa } from 'execa'
import { which } from '../which.js'

export type GhAuthStatus =
  | 'authenticated'
  | 'not_authenticated'
  | 'not_installed'

/**
 * Returns gh CLI install + auth status for telemetry.
 * Uses which() first (Bun.which β€” no subprocess) to detect install, then
 * exit code of `gh auth token` to detect auth. Uses `auth token` instead of
 * `auth status` because the latter makes a network request to GitHub's API,
 * while `auth token` only reads local config/keyring. Spawns with
 * stdout: 'ignore' so the token never enters this process.
 */
export async function getGhAuthStatus(): Promise<GhAuthStatus> {
  const ghPath = await which('gh')
  if (!ghPath) {
    return 'not_installed'
  }
  const { exitCode } = await execa('gh', ['auth', 'token'], {
    stdout: 'ignore',
    stderr: 'ignore',
    timeout: 5000,
    reject: false,
  })
  return exitCode === 0 ? 'authenticated' : 'not_authenticated'
}