import { linearGraphql } from './client.ts' import type { LinearAuthInput } from './types.ts' import { optionalString, requireRecord } from './types.ts' import { requireAuthMode } from './auth.ts' export type LinearViewer = { id: string name: string | null organizationId: string | null organizationUrlKey: string | null } export type ViewerInput = LinearAuthInput /** * Return the authenticated Linear viewer (no email). * @example * import getViewer from 'kody:@kody/linear/viewer' * const viewer = await getViewer() */ export async function getViewer(input: ViewerInput = {}): Promise { const result = await linearGraphql<{ viewer: { id: string name?: string organization?: { id?: string; urlKey?: string } } }>({ ...input, operation: 'query', query: `query Viewer { viewer { id name organization { id urlKey } } }`, }) const viewer = result.data.viewer return { id: viewer.id, name: typeof viewer.name === 'string' ? viewer.name : null, organizationId: viewer.organization?.id ?? null, organizationUrlKey: viewer.organization?.urlKey ?? null, } } /** * Return the authenticated Linear viewer (no email). * @example * import getViewer from 'kody:@kody/linear/viewer' * const viewer = await getViewer({ integrationName: 'linear-work' }) */ export default async function viewerEntrypoint( params: ViewerInput & Record = {}, ) { const input = requireRecord(params, 'viewer') return getViewer({ integrationName: optionalString(input.integrationName, 'integrationName'), integration: optionalString(input.integration, 'integration'), account: optionalString(input.account, 'account'), secretName: optionalString(input.secretName, 'secretName'), auth: requireAuthMode(input.auth), }) }