@@ -70,16 +70,11 @@ async function graphqlRequest<T>(
7070 return json . data as T
7171}
7272
73- function toDateString ( date : Date ) : string {
74- return date . toISOString ( ) . slice ( 0 , 10 )
75- }
76-
7773function buildDateWindows ( ) : {
7874 since12m : Date
75+ since6m : Date
7976 since12mIso : string
8077 since6mIso : string
81- since12mDate : string
82- since6mDate : string
8378} {
8479 const now = new Date ( )
8580
@@ -91,10 +86,9 @@ function buildDateWindows(): {
9186
9287 return {
9388 since12m,
89+ since6m,
9490 since12mIso : since12m . toISOString ( ) ,
9591 since6mIso : since6m . toISOString ( ) ,
96- since12mDate : toDateString ( since12m ) ,
97- since6mDate : toDateString ( since6m ) ,
9892 }
9993}
10094
@@ -104,10 +98,6 @@ interface RateLimit {
10498 resetAt : string
10599}
106100
107- interface IssueCount {
108- issueCount : number
109- }
110-
111101interface CommitHistory {
112102 totalCount : number
113103}
@@ -127,14 +117,8 @@ interface SummaryQueryResult {
127117 commitsPrior6m ?: CommitHistory
128118 }
129119 }
120+ openIssues : { totalCount : number }
130121 }
131- prsOpened : IssueCount
132- prsMerged : IssueCount
133- prsClosedUnmerged : IssueCount
134- issuesOpened : IssueCount
135- issuesClosed : IssueCount
136- issuesOpened6m : IssueCount
137- issuesOpenNow : IssueCount
138122}
139123
140124interface PrPageQueryResult {
@@ -158,14 +142,7 @@ interface IssuePageQueryResult {
158142}
159143
160144const SUMMARY_QUERY = `
161- query(
162- $owner: String!, $name: String!,
163- $since12m: GitTimestamp!, $since6m: GitTimestamp!,
164- $searchPrsOpened: String!, $searchPrsMerged: String!,
165- $searchPrsClosedUnmerged: String!,
166- $searchIssuesOpened: String!, $searchIssuesClosed: String!,
167- $searchIssuesOpened6m: String!, $searchIssuesOpenNow: String!
168- ) {
145+ query($owner: String!, $name: String!, $since12m: GitTimestamp!, $since6m: GitTimestamp!) {
169146 rateLimit { cost remaining resetAt }
170147 repository(owner: $owner, name: $name) {
171148 defaultBranchRef {
@@ -177,14 +154,8 @@ const SUMMARY_QUERY = `
177154 }
178155 }
179156 }
157+ openIssues: issues(states: OPEN) { totalCount }
180158 }
181- prsOpened: search(query: $searchPrsOpened, type: ISSUE) { issueCount }
182- prsMerged: search(query: $searchPrsMerged, type: ISSUE) { issueCount }
183- prsClosedUnmerged: search(query: $searchPrsClosedUnmerged, type: ISSUE) { issueCount }
184- issuesOpened: search(query: $searchIssuesOpened, type: ISSUE) { issueCount }
185- issuesClosed: search(query: $searchIssuesClosed, type: ISSUE) { issueCount }
186- issuesOpened6m: search(query: $searchIssuesOpened6m, type: ISSUE) { issueCount }
187- issuesOpenNow: search(query: $searchIssuesOpenNow, type: ISSUE) { issueCount }
188159 }
189160`
190161
@@ -197,6 +168,7 @@ const PR_PAGE_QUERY = `
197168 nodes {
198169 createdAt
199170 mergedAt
171+ closedAt
200172 author { login }
201173 comments(first: ${ RESPONSES_PER_NODE } ) { nodes { createdAt author { login } } }
202174 reviews(first: ${ RESPONSES_PER_NODE } ) { nodes { createdAt author { login } } }
@@ -325,24 +297,11 @@ export async function fetchActivitySnapshot(
325297 token : string ,
326298 timeoutMs : number ,
327299) : Promise < RepoActivitySnapshot > {
328- const { since12m, since12mIso, since6mIso, since12mDate, since6mDate } = buildDateWindows ( )
329- const repoFilter = `repo:${ owner } /${ name } `
300+ const { since12m, since6m, since12mIso, since6mIso } = buildDateWindows ( )
330301
331302 const summaryData = await graphqlRequest < SummaryQueryResult > (
332303 SUMMARY_QUERY ,
333- {
334- owner,
335- name,
336- since12m : since12mIso ,
337- since6m : since6mIso ,
338- searchPrsOpened : `${ repoFilter } is:pr created:>=${ since12mDate } ` ,
339- searchPrsMerged : `${ repoFilter } is:pr is:merged created:>=${ since12mDate } ` ,
340- searchPrsClosedUnmerged : `${ repoFilter } is:pr is:unmerged is:closed created:>=${ since12mDate } ` ,
341- searchIssuesOpened : `${ repoFilter } is:issue created:>=${ since12mDate } ` ,
342- searchIssuesClosed : `${ repoFilter } is:issue is:closed created:>=${ since12mDate } ` ,
343- searchIssuesOpened6m : `${ repoFilter } is:issue created:>=${ since6mDate } ` ,
344- searchIssuesOpenNow : `${ repoFilter } is:issue is:open` ,
345- } ,
304+ { owner, name, since12m : since12mIso , since6m : since6mIso } ,
346305 token ,
347306 timeoutMs ,
348307 )
@@ -378,6 +337,9 @@ export async function fetchActivitySnapshot(
378337
379338 const prMedians = computePrMedians ( prResult . nodes )
380339 const issueMedians = computeIssueMedians ( issueResult . nodes )
340+ const issuesOpenedLast6m = issueResult . nodes . filter (
341+ ( n ) => new Date ( n . createdAt ) >= since6m ,
342+ ) . length
381343
382344 // Lowest remaining across all requests — remaining only decreases within a reset window
383345 const lastRateLimit = [ summaryData . rateLimit , prResult . rateLimit , issueResult . rateLimit ]
@@ -391,17 +353,16 @@ export async function fetchActivitySnapshot(
391353 commitsLast12m,
392354 commitsLast6m,
393355 commitsPrior6m,
394- prsOpenedLast12m : summaryData . prsOpened . issueCount ,
395- prsMergedLast12m : summaryData . prsMerged . issueCount ,
396- prsClosedUnmerged12m : summaryData . prsClosedUnmerged . issueCount ,
356+ prsOpenedLast12m : prResult . nodes . length ,
357+ prsMergedLast12m : prResult . nodes . filter ( ( n ) => n . mergedAt ) . length ,
358+ prsClosedUnmerged12m : prResult . nodes . filter ( ( n ) => n . closedAt && ! n . mergedAt ) . length ,
397359 prMedianTimeToMergeHours : prMedians . medianTimeToMergeHours ,
398360 prMedianTimeToFirstResponseHours : prMedians . medianTimeToFirstResponseHours ,
399- issuesOpenedLast12m : summaryData . issuesOpened . issueCount ,
400- issuesClosedLast12m : summaryData . issuesClosed . issueCount ,
401- issuesOpenedLast6m : summaryData . issuesOpened6m . issueCount ,
402- issuesOpenedPrior6m :
403- summaryData . issuesOpened . issueCount - summaryData . issuesOpened6m . issueCount ,
404- issuesOpenNow : summaryData . issuesOpenNow . issueCount ,
361+ issuesOpenedLast12m : issueResult . nodes . length ,
362+ issuesClosedLast12m : issueResult . nodes . filter ( ( n ) => n . closedAt ) . length ,
363+ issuesOpenedLast6m,
364+ issuesOpenedPrior6m : issueResult . nodes . length - issuesOpenedLast6m ,
365+ issuesOpenNow : summaryData . repository . openIssues . totalCount ,
405366 issueMedianTimeToCloseHours : issueMedians . medianTimeToCloseHours ,
406367 issueMedianTimeToFirstResponseHours : issueMedians . medianTimeToFirstResponseHours ,
407368 httpRequestCount : totalHttpRequests ,
0 commit comments