Skip to content
← Public packages

@kentcdodds/sentry

Inspect Sentry organizations, projects, issues, and event summaries.

src/summarize-issue-event.ts

50 lines · 1.7 KB · TypeScript
import {
  type IssueInput,
  type JsonRecord,
  type SentryEvent,
  type SummarizeIssueEventOptions,
  getLatestIssueEvent,
  requireRecord,
  requireStringOrNumber,
  summarizeIssueEvent,
} from './client.ts'

type WrappedInput = {
  event: SentryEvent
  options?: SummarizeIssueEventOptions
}

type SummarizeLatestInput = IssueInput & {
  latest?: boolean
  options?: SummarizeIssueEventOptions
}

/**
 * Summarize a Sentry event object, or fetch and summarize an issue's latest event.
 *
 * @param params.event - Raw Sentry event, or `{ event, options }` wrapper.
 * @param params.issueId - With `latest: true` (or alone), fetch the issue's latest event first.
 * @returns Truncated summary with exceptions, breadcrumbs, and tags.
 * @example
 * import summarizeEvent from 'kody:@kentcdodds/sentry/summarize-issue-event'
 * const summary = summarizeEvent({ event: { title: 'TypeError', entries: [] } })
 * // => { title: 'TypeError', exceptions: [...], breadcrumbs: [...] }
 */
export default async function summarizeIssueEventEntrypoint(params: unknown) {
  const input = requireRecord(params, 'summarize-issue-event')

  if (input.latest === true || (input.issueId !== undefined && !('event' in input))) {
    requireStringOrNumber(input, 'issueId', 'summarize-issue-event')
    const latestInput = input as SummarizeLatestInput
    const event = await getLatestIssueEvent(latestInput)
    return summarizeIssueEvent(event, latestInput.options)
  }

  const typedInput = input as WrappedInput | SentryEvent
  if ('event' in typedInput) {
    const wrappedInput = typedInput as WrappedInput
    return summarizeIssueEvent(wrappedInput.event, wrappedInput.options)
  }

  return summarizeIssueEvent(typedInput as JsonRecord as SentryEvent)
}