src/github/api/queries.ts (342 lines of code) (raw):
// GraphQL queries for GitHub data
export const PULL_REQUEST_QUERY = `
query($owner: String!, $repo: String!, $number: Int!) {
repository(owner: $owner, name: $repo) {
pullRequest(number: $number) {
number
title
body
bodyHTML
state
url
author {
login
}
baseRefName
headRefName
headRefOid
baseRefOid
additions
deletions
changedFiles
createdAt
updatedAt
lastEditedAt
# Commits
commits(first: 100) {
totalCount
nodes {
commit {
oid
messageHeadline
message
committedDate
}
}
}
# Changed files
files(first: 100) {
nodes {
path
additions
deletions
changeType
}
}
# Timeline events (comments, cross-references, etc)
timelineItems(first: 100, itemTypes: [ISSUE_COMMENT, CROSS_REFERENCED_EVENT, REFERENCED_EVENT]) {
nodes {
__typename
... on IssueComment {
id
databaseId
body
author {
login
}
createdAt
lastEditedAt
url
}
... on CrossReferencedEvent {
source {
... on Issue {
number
title
url
}
... on PullRequest {
number
title
url
}
}
createdAt
}
... on ReferencedEvent {
commit {
oid
message
}
createdAt
}
}
}
# Reviews with their comments
reviews(first: 100) {
nodes {
id
databaseId
author {
login
}
body
state
submittedAt
lastEditedAt
url
# Review comments (threads)
comments(first: 100) {
nodes {
id
databaseId
body
path
position
diffHunk
author {
login
}
createdAt
lastEditedAt
url
replyTo {
id
}
}
}
}
}
}
}
}
`;
export const ISSUE_QUERY = `
query($owner: String!, $repo: String!, $number: Int!) {
repository(owner: $owner, name: $repo) {
issue(number: $number) {
number
title
body
bodyHTML
state
url
author {
login
}
createdAt
updatedAt
lastEditedAt
# Timeline events
timelineItems(first: 100, itemTypes: [ISSUE_COMMENT, CROSS_REFERENCED_EVENT, REFERENCED_EVENT]) {
nodes {
__typename
... on IssueComment {
id
databaseId
body
author {
login
}
createdAt
lastEditedAt
url
}
... on CrossReferencedEvent {
source {
... on Issue {
number
title
url
}
... on PullRequest {
number
title
url
}
}
createdAt
}
... on ReferencedEvent {
commit {
oid
message
}
createdAt
}
}
}
}
}
}
`;
export interface GraphQLUser {
login: string;
}
export interface GraphQLCommit {
oid: string;
message?: string;
messageHeadline?: string;
committedDate?: string;
}
export interface GraphQLIssueCommentNode {
__typename: "IssueComment";
id: string;
databaseId: number;
body: string;
author: GraphQLUser | null;
createdAt: string;
lastEditedAt: string | null;
url: string;
}
export interface GraphQLReferencedEventNode {
__typename: "ReferencedEvent";
commit: GraphQLCommit | null;
createdAt: string;
}
export interface GraphQLCrossReferencedSource {
__typename: "PullRequest" | "Issue";
number: number;
title: string;
url: string;
}
export interface GraphQLCrossReferencedEventNode {
__typename: "CrossReferencedEvent";
source: GraphQLCrossReferencedSource | null;
createdAt: string;
}
export type GraphQLTimelineItemNode =
| GraphQLIssueCommentNode
| GraphQLReferencedEventNode
| GraphQLCrossReferencedEventNode;
export interface GraphQLTimelineItems {
nodes: GraphQLTimelineItemNode[];
}
export interface GraphQLFileNode {
path: string;
additions: number;
deletions: number;
changeType: string;
}
export interface GraphQLFiles {
nodes: GraphQLFileNode[];
}
export interface GraphQLCommitNode {
commit: GraphQLCommit;
}
export interface GraphQLCommits {
totalCount: number;
nodes: GraphQLCommitNode[];
}
export interface GraphQLReviewCommentNode {
id: string;
databaseId: number;
body: string;
path: string;
position: number | null;
diffHunk: string;
author: GraphQLUser | null;
createdAt: string;
lastEditedAt: string | null;
url: string;
replyTo: { id: string } | null;
}
export interface GraphQLReviewComments {
nodes: GraphQLReviewCommentNode[];
}
export interface GraphQLReviewNode {
id: string;
databaseId: number;
author: GraphQLUser | null;
body: string;
state: string;
submittedAt: string;
lastEditedAt: string | null;
url: string;
comments: GraphQLReviewComments;
}
export interface GraphQLReviews {
nodes: GraphQLReviewNode[];
}
export interface GraphQLPullRequest {
number: number;
title: string;
body: string;
bodyHTML: string;
state: string;
url: string;
author: GraphQLUser | null;
baseRefName: string;
headRefName: string;
headRefOid: string;
baseRefOid: string;
additions: number;
deletions: number;
changedFiles: number;
createdAt: string;
updatedAt: string;
lastEditedAt: string | null;
commits: GraphQLCommits;
files: GraphQLFiles;
timelineItems: GraphQLTimelineItems;
reviews: GraphQLReviews;
}
export interface GraphQLIssue {
number: number;
title: string;
body: string;
bodyHTML: string;
state: string;
url: string;
author: GraphQLUser | null;
createdAt: string;
updatedAt: string;
lastEditedAt: string | null;
timelineItems: GraphQLTimelineItems;
}
export interface PullRequestQueryResponse {
repository: {
pullRequest: GraphQLPullRequest;
};
}
export interface IssueQueryResponse {
repository: {
issue: GraphQLIssue;
};
}
// Type guards for timeline items
export function isIssueCommentNode(node: GraphQLTimelineItemNode): node is GraphQLIssueCommentNode {
return node.__typename === "IssueComment";
}
export function isReferencedEventNode(node: GraphQLTimelineItemNode): node is GraphQLReferencedEventNode {
return node.__typename === "ReferencedEvent";
}
export function isCrossReferencedEventNode(node: GraphQLTimelineItemNode): node is GraphQLCrossReferencedEventNode {
return node.__typename === "CrossReferencedEvent";
}
// Query to get current authenticated user/bot information
// Works for both PATs and GitHub App tokens
export const VIEWER_QUERY = `
query {
viewer {
login
databaseId
}
}
`;
export interface ViewerQueryResponse {
viewer: {
login: string;
databaseId: number;
};
}
export interface FetchedData {
pullRequest?: GraphQLPullRequest;
issue?: GraphQLIssue;
}