import { linearGraphql } from './client.ts'
import {
COMMENT_FIELDS,
mapComment,
nodesFromConnection,
pageInfoFromConnection,
PAGE_INFO_FIELDS,
} from './models.ts'
import type {
LinearAuthInput,
LinearCommentSummary,
LinearPageInfo,
} from './types.ts'
import { clampInt, optionalBoolean, optionalString, requireRecord, requireString } from './types.ts'
import { requireAuthMode } from './auth.ts'
export type ListCommentsInput = LinearAuthInput & {
/** Issue UUID or identifier (`ENG-123`). */
issueId: string
first?: number
after?: string
includeArchived?: boolean
}
export type ListCommentsResult = {
issueId: string
issueIdentifier: string | null
items: Array<LinearCommentSummary>
pageInfo: LinearPageInfo
}
/**
* List comments on a Linear issue.
* @example
* import listComments from 'kody:@kody/linear/list-comments'
* const { items } = await listComments({ issueId: 'ENG-123' })
*/
export async function listComments(input: ListCommentsInput): Promise<ListCommentsResult> {
const issueId = requireString(input.issueId, 'issueId')
const first = clampInt(input.first, 1, 50, 25)
const result = await linearGraphql<{
issue: {
id?: string
identifier?: string
comments?: unknown
} | null
}>({
...input,
operation: 'query',
query: `query ListComments($id: String!, $first: Int!, $after: String, $includeArchived: Boolean) {
issue(id: $id) {
id
identifier
comments(first: $first, after: $after, includeArchived: $includeArchived) {
${PAGE_INFO_FIELDS}
nodes { ${COMMENT_FIELDS} }
}
}
}`,
variables: {
id: issueId,
first,
after: optionalString(input.after, 'after') ?? null,
includeArchived: optionalBoolean(input.includeArchived, 'includeArchived') ?? false,
},
})
if (!result.data.issue) throw new Error(`Linear issue not found: ${issueId}`)
return {
issueId: result.data.issue.id || issueId,
issueIdentifier: result.data.issue.identifier ?? null,
items: nodesFromConnection(result.data.issue.comments).map(mapComment),
pageInfo: pageInfoFromConnection(result.data.issue.comments),
}
}
/**
* List comments on a Linear issue.
* @example
* import listComments from 'kody:@kody/linear/list-comments'
* const result = await listComments({ issueId: 'ENG-123' })
*/
export default async function listCommentsEntrypoint(
params: Partial<ListCommentsInput> & Record<string, unknown> = {},
) {
const input = requireRecord(params, 'list-comments')
return listComments({
issueId: requireString(input.issueId, 'issueId'),
first: input.first as number | undefined,
after: optionalString(input.after, 'after'),
includeArchived: optionalBoolean(input.includeArchived, 'includeArchived'),
integrationName: optionalString(input.integrationName, 'integrationName'),
integration: optionalString(input.integration, 'integration'),
account: optionalString(input.account, 'account'),
secretName: optionalString(input.secretName, 'secretName'),
auth: requireAuthMode(input.auth),
})
}