@knpkv/codecommit-core 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AwsClient/getDifferences.d.ts +16 -0
- package/dist/AwsClient/getDifferences.d.ts.map +1 -0
- package/dist/AwsClient/getDifferences.js +22 -0
- package/dist/AwsClient/getDifferences.js.map +1 -0
- package/dist/AwsClient/getPullRequest.d.ts.map +1 -1
- package/dist/AwsClient/getPullRequest.js +26 -5
- package/dist/AwsClient/getPullRequest.js.map +1 -1
- package/dist/AwsClient/getPullRequests.d.ts.map +1 -1
- package/dist/AwsClient/getPullRequests.js +29 -11
- package/dist/AwsClient/getPullRequests.js.map +1 -1
- package/dist/AwsClient/index.d.ts +21 -13
- package/dist/AwsClient/index.d.ts.map +1 -1
- package/dist/AwsClient/index.js +3 -1
- package/dist/AwsClient/index.js.map +1 -1
- package/dist/AwsClient/internal.d.ts +23 -0
- package/dist/AwsClient/internal.d.ts.map +1 -1
- package/dist/AwsClient/internal.js +4 -1
- package/dist/AwsClient/internal.js.map +1 -1
- package/dist/CacheService/Database.d.ts.map +1 -1
- package/dist/CacheService/Database.js +9 -1
- package/dist/CacheService/Database.js.map +1 -1
- package/dist/CacheService/index.d.ts +3 -2
- package/dist/CacheService/index.d.ts.map +1 -1
- package/dist/CacheService/index.js +2 -1
- package/dist/CacheService/index.js.map +1 -1
- package/dist/CacheService/migrations/0007_stats_columns.d.ts +5 -0
- package/dist/CacheService/migrations/0007_stats_columns.d.ts.map +1 -0
- package/dist/CacheService/migrations/0007_stats_columns.js +13 -0
- package/dist/CacheService/migrations/0007_stats_columns.js.map +1 -0
- package/dist/CacheService/migrations/0008_merged_by.d.ts +5 -0
- package/dist/CacheService/migrations/0008_merged_by.d.ts.map +1 -0
- package/dist/CacheService/migrations/0008_merged_by.js +4 -0
- package/dist/CacheService/migrations/0008_merged_by.js.map +1 -0
- package/dist/CacheService/migrations/0009_approved_by.d.ts +5 -0
- package/dist/CacheService/migrations/0009_approved_by.d.ts.map +1 -0
- package/dist/CacheService/migrations/0009_approved_by.js +4 -0
- package/dist/CacheService/migrations/0009_approved_by.js.map +1 -0
- package/dist/CacheService/migrations/0010_commented_by.d.ts +5 -0
- package/dist/CacheService/migrations/0010_commented_by.d.ts.map +1 -0
- package/dist/CacheService/migrations/0010_commented_by.js +4 -0
- package/dist/CacheService/migrations/0010_commented_by.js.map +1 -0
- package/dist/CacheService/repos/PullRequestRepo/index.d.ts +132 -0
- package/dist/CacheService/repos/PullRequestRepo/index.d.ts.map +1 -0
- package/dist/CacheService/repos/PullRequestRepo/index.js +35 -0
- package/dist/CacheService/repos/PullRequestRepo/index.js.map +1 -0
- package/dist/CacheService/repos/PullRequestRepo/internal.d.ts +72 -0
- package/dist/CacheService/repos/PullRequestRepo/internal.d.ts.map +1 -0
- package/dist/CacheService/repos/PullRequestRepo/internal.js +69 -0
- package/dist/CacheService/repos/PullRequestRepo/internal.js.map +1 -0
- package/dist/CacheService/repos/PullRequestRepo/mutations.d.ts +24 -0
- package/dist/CacheService/repos/PullRequestRepo/mutations.d.ts.map +1 -0
- package/dist/CacheService/repos/PullRequestRepo/mutations.js +94 -0
- package/dist/CacheService/repos/PullRequestRepo/mutations.js.map +1 -0
- package/dist/CacheService/repos/PullRequestRepo/queries.d.ts +113 -0
- package/dist/CacheService/repos/PullRequestRepo/queries.d.ts.map +1 -0
- package/dist/CacheService/repos/PullRequestRepo/queries.js +89 -0
- package/dist/CacheService/repos/PullRequestRepo/queries.js.map +1 -0
- package/dist/CacheService/repos/StatsRepo/index.d.ts +93 -0
- package/dist/CacheService/repos/StatsRepo/index.d.ts.map +1 -0
- package/dist/CacheService/repos/StatsRepo/index.js +41 -0
- package/dist/CacheService/repos/StatsRepo/index.js.map +1 -0
- package/dist/CacheService/repos/StatsRepo/internal.d.ts +120 -0
- package/dist/CacheService/repos/StatsRepo/internal.d.ts.map +1 -0
- package/dist/CacheService/repos/StatsRepo/internal.js +34 -0
- package/dist/CacheService/repos/StatsRepo/internal.js.map +1 -0
- package/dist/CacheService/repos/StatsRepo/queries.d.ts +42 -0
- package/dist/CacheService/repos/StatsRepo/queries.d.ts.map +1 -0
- package/dist/CacheService/repos/StatsRepo/queries.js +182 -0
- package/dist/CacheService/repos/StatsRepo/queries.js.map +1 -0
- package/dist/CacheService/repos/StatsRepo/reviewerData.d.ts +47 -0
- package/dist/CacheService/repos/StatsRepo/reviewerData.d.ts.map +1 -0
- package/dist/CacheService/repos/StatsRepo/reviewerData.js +172 -0
- package/dist/CacheService/repos/StatsRepo/reviewerData.js.map +1 -0
- package/dist/DateUtils.d.ts +28 -0
- package/dist/DateUtils.d.ts.map +1 -1
- package/dist/DateUtils.js +69 -1
- package/dist/DateUtils.js.map +1 -1
- package/dist/Domain.d.ts +13 -3
- package/dist/Domain.d.ts.map +1 -1
- package/dist/Domain.js +6 -5
- package/dist/Domain.js.map +1 -1
- package/dist/PRService/index.d.ts +3 -3
- package/dist/PRService/index.d.ts.map +1 -1
- package/dist/PRService/index.js +1 -1
- package/dist/PRService/index.js.map +1 -1
- package/dist/PRService/internal.d.ts +24 -2
- package/dist/PRService/internal.d.ts.map +1 -1
- package/dist/PRService/internal.js +23 -8
- package/dist/PRService/internal.js.map +1 -1
- package/dist/PRService/refresh.d.ts +1 -1
- package/dist/PRService/refresh.d.ts.map +1 -1
- package/dist/PRService/refresh.js +2 -0
- package/dist/PRService/refresh.js.map +1 -1
- package/dist/PRService/refreshDiffs.d.ts +16 -0
- package/dist/PRService/refreshDiffs.d.ts.map +1 -0
- package/dist/PRService/refreshDiffs.js +54 -0
- package/dist/PRService/refreshDiffs.js.map +1 -0
- package/dist/PRService/refreshEnrich.d.ts +1 -1
- package/dist/PRService/refreshEnrich.d.ts.map +1 -1
- package/dist/PRService/refreshEnrich.js +3 -1
- package/dist/PRService/refreshEnrich.js.map +1 -1
- package/dist/PRService/refreshFetch.d.ts +1 -1
- package/dist/PRService/refreshFetch.d.ts.map +1 -1
- package/dist/PRService/refreshFetch.js +12 -3
- package/dist/PRService/refreshFetch.js.map +1 -1
- package/dist/PRService/refreshHistory.d.ts +19 -0
- package/dist/PRService/refreshHistory.d.ts.map +1 -0
- package/dist/PRService/refreshHistory.js +110 -0
- package/dist/PRService/refreshHistory.js.map +1 -0
- package/dist/PRService/refreshResolve.d.ts +1 -1
- package/dist/PRService/refreshResolve.d.ts.map +1 -1
- package/dist/PRService/refreshResolve.js +1 -1
- package/dist/PRService/refreshResolve.js.map +1 -1
- package/dist/PRService/refreshScore.d.ts +1 -1
- package/dist/PRService/refreshScore.d.ts.map +1 -1
- package/dist/PRService/refreshScore.js +1 -1
- package/dist/PRService/refreshScore.js.map +1 -1
- package/dist/PRService/refreshSinglePR.d.ts +1 -1
- package/dist/PRService/refreshSinglePR.d.ts.map +1 -1
- package/dist/PRService/refreshSinglePR.js +4 -3
- package/dist/PRService/refreshSinglePR.js.map +1 -1
- package/dist/StatsService/WeeklyStats.d.ts +174 -0
- package/dist/StatsService/WeeklyStats.d.ts.map +1 -0
- package/dist/StatsService/WeeklyStats.js +110 -0
- package/dist/StatsService/WeeklyStats.js.map +1 -0
- package/dist/StatsService/index.d.ts +45 -0
- package/dist/StatsService/index.d.ts.map +1 -0
- package/dist/StatsService/index.js +145 -0
- package/dist/StatsService/index.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/CacheService/repos/PullRequestRepo.d.ts +0 -112
- package/dist/CacheService/repos/PullRequestRepo.d.ts.map +0 -1
- package/dist/CacheService/repos/PullRequestRepo.js +0 -146
- package/dist/CacheService/repos/PullRequestRepo.js.map +0 -1
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { cacheError, whereFilters } from "./internal.js";
|
|
3
|
+
const fmtDate = (iso) => iso.slice(0, 16).replace("T", " ");
|
|
4
|
+
export const weeklyVolume = (sql) => (weekStart, weekEnd, filters) => {
|
|
5
|
+
const f = whereFilters(sql, filters);
|
|
6
|
+
return sql `
|
|
7
|
+
SELECT
|
|
8
|
+
COUNT(CASE WHEN creation_date >= ${weekStart} AND creation_date < ${weekEnd} THEN 1 END) as prs_created,
|
|
9
|
+
COUNT(CASE WHEN status = 'MERGED' AND COALESCE(closed_at, last_modified_date) >= ${weekStart} AND COALESCE(closed_at, last_modified_date) < ${weekEnd} THEN 1 END) as prs_merged,
|
|
10
|
+
COUNT(CASE WHEN status = 'CLOSED' AND COALESCE(closed_at, last_modified_date) >= ${weekStart} AND COALESCE(closed_at, last_modified_date) < ${weekEnd} THEN 1 END) as prs_closed
|
|
11
|
+
FROM pull_requests
|
|
12
|
+
WHERE (creation_date >= ${weekStart} OR COALESCE(closed_at, last_modified_date) >= ${weekStart})
|
|
13
|
+
${f.repo} ${f.author} ${f.account}
|
|
14
|
+
`.pipe(Effect.map((rows) => rows[0] ?? { prsCreated: 0, prsMerged: 0, prsClosed: 0 }), cacheError("weeklyVolume"));
|
|
15
|
+
};
|
|
16
|
+
export const topContributors = (sql) => (weekStart, weekEnd, filters, limit = 10) => {
|
|
17
|
+
const f = whereFilters(sql, filters);
|
|
18
|
+
return sql `
|
|
19
|
+
SELECT author, COUNT(*) as pr_count
|
|
20
|
+
FROM pull_requests
|
|
21
|
+
WHERE creation_date >= ${weekStart} AND creation_date < ${weekEnd}
|
|
22
|
+
AND status != 'CLOSED'
|
|
23
|
+
${f.repo} ${f.author} ${f.account}
|
|
24
|
+
GROUP BY author
|
|
25
|
+
ORDER BY pr_count DESC
|
|
26
|
+
LIMIT ${limit}
|
|
27
|
+
`.pipe(cacheError("topContributors"));
|
|
28
|
+
};
|
|
29
|
+
export const mostActivePRs = (sql) => (weekStart, weekEnd, filters, limit = 10) => {
|
|
30
|
+
const f = whereFilters(sql, filters);
|
|
31
|
+
return sql `
|
|
32
|
+
SELECT id, title, author, repository_name, comment_count, aws_account_id
|
|
33
|
+
FROM pull_requests
|
|
34
|
+
WHERE COALESCE(closed_at, last_modified_date) >= ${weekStart} AND COALESCE(closed_at, last_modified_date) < ${weekEnd}
|
|
35
|
+
AND comment_count > 0
|
|
36
|
+
AND status != 'CLOSED'
|
|
37
|
+
${f.repo} ${f.author} ${f.account}
|
|
38
|
+
ORDER BY comment_count DESC
|
|
39
|
+
LIMIT ${limit}
|
|
40
|
+
`.pipe(cacheError("mostActivePRs"));
|
|
41
|
+
};
|
|
42
|
+
export const prSizeDistribution = (sql) => (weekStart, weekEnd, filters) => {
|
|
43
|
+
const f = whereFilters(sql, filters);
|
|
44
|
+
return sql `
|
|
45
|
+
SELECT
|
|
46
|
+
COUNT(CASE WHEN COALESCE(files_added,0)+COALESCE(files_modified,0)+COALESCE(files_deleted,0) < 5 THEN 1 END) as small,
|
|
47
|
+
COUNT(CASE WHEN COALESCE(files_added,0)+COALESCE(files_modified,0)+COALESCE(files_deleted,0) BETWEEN 5 AND 15 THEN 1 END) as medium,
|
|
48
|
+
COUNT(CASE WHEN COALESCE(files_added,0)+COALESCE(files_modified,0)+COALESCE(files_deleted,0) BETWEEN 16 AND 30 THEN 1 END) as large,
|
|
49
|
+
COUNT(CASE WHEN COALESCE(files_added,0)+COALESCE(files_modified,0)+COALESCE(files_deleted,0) > 30 THEN 1 END) as extra_large
|
|
50
|
+
FROM pull_requests
|
|
51
|
+
WHERE creation_date >= ${weekStart} AND creation_date < ${weekEnd}
|
|
52
|
+
AND files_added IS NOT NULL
|
|
53
|
+
AND status != 'CLOSED'
|
|
54
|
+
${f.repo} ${f.author} ${f.account}
|
|
55
|
+
`.pipe(Effect.map((rows) => rows[0] ?? { small: 0, medium: 0, large: 0, extraLarge: 0 }), cacheError("prSizeDistribution"));
|
|
56
|
+
};
|
|
57
|
+
export const avgDiffSize = (sql) => (weekStart, weekEnd, filters) => {
|
|
58
|
+
const f = whereFilters(sql, filters);
|
|
59
|
+
return sql `
|
|
60
|
+
SELECT
|
|
61
|
+
AVG(files_added) as avg_added,
|
|
62
|
+
AVG(files_modified) as avg_modified,
|
|
63
|
+
AVG(files_deleted) as avg_deleted
|
|
64
|
+
FROM pull_requests
|
|
65
|
+
WHERE creation_date >= ${weekStart} AND creation_date < ${weekEnd}
|
|
66
|
+
AND files_added IS NOT NULL
|
|
67
|
+
AND status != 'CLOSED'
|
|
68
|
+
${f.repo} ${f.author} ${f.account}
|
|
69
|
+
`.pipe(Effect.map((rows) => {
|
|
70
|
+
const r = rows[0];
|
|
71
|
+
if (!r || r.avgAdded == null)
|
|
72
|
+
return null;
|
|
73
|
+
return { filesAdded: r.avgAdded, filesModified: r.avgModified ?? 0, filesDeleted: r.avgDeleted ?? 0 };
|
|
74
|
+
}), cacheError("avgDiffSize"));
|
|
75
|
+
};
|
|
76
|
+
export const diffSizeByContributor = (sql) => (weekStart, weekEnd, filters, limit = 10) => {
|
|
77
|
+
const f = whereFilters(sql, filters);
|
|
78
|
+
return sql `
|
|
79
|
+
SELECT
|
|
80
|
+
author,
|
|
81
|
+
AVG(COALESCE(files_added,0)+COALESCE(files_modified,0)+COALESCE(files_deleted,0)) as avg_files_changed,
|
|
82
|
+
COUNT(*) as pr_count
|
|
83
|
+
FROM pull_requests
|
|
84
|
+
WHERE creation_date >= ${weekStart} AND creation_date < ${weekEnd}
|
|
85
|
+
AND files_added IS NOT NULL
|
|
86
|
+
AND status != 'CLOSED'
|
|
87
|
+
${f.repo} ${f.author} ${f.account}
|
|
88
|
+
GROUP BY author
|
|
89
|
+
ORDER BY avg_files_changed DESC
|
|
90
|
+
LIMIT ${limit}
|
|
91
|
+
`.pipe(cacheError("diffSizeByContributor"));
|
|
92
|
+
};
|
|
93
|
+
export const stalePRs = (sql) => (nowISO, filters, limit = 10) => {
|
|
94
|
+
const f = whereFilters(sql, filters);
|
|
95
|
+
return sql `
|
|
96
|
+
SELECT
|
|
97
|
+
id, title, author, repository_name, aws_account_id,
|
|
98
|
+
CAST((julianday(${nowISO}) - julianday(last_modified_date)) AS INTEGER) as days_since_activity
|
|
99
|
+
FROM pull_requests
|
|
100
|
+
WHERE status = 'OPEN'
|
|
101
|
+
AND julianday(${nowISO}) - julianday(last_modified_date) > 7
|
|
102
|
+
${f.repo} ${f.author} ${f.account}
|
|
103
|
+
ORDER BY days_since_activity DESC
|
|
104
|
+
LIMIT ${limit}
|
|
105
|
+
`.pipe(cacheError("stalePRs"));
|
|
106
|
+
};
|
|
107
|
+
export const healthIndicators = (sql) => (weekStart, weekEnd, filters) => {
|
|
108
|
+
const f = whereFilters(sql, filters);
|
|
109
|
+
return sql `
|
|
110
|
+
SELECT
|
|
111
|
+
COUNT(*) as total,
|
|
112
|
+
COUNT(CASE WHEN comment_count > 0 THEN 1 END) as with_comments,
|
|
113
|
+
COUNT(CASE WHEN is_approved = 1 THEN 1 END) as approved
|
|
114
|
+
FROM pull_requests
|
|
115
|
+
WHERE creation_date >= ${weekStart} AND creation_date < ${weekEnd}
|
|
116
|
+
AND status != 'CLOSED'
|
|
117
|
+
${f.repo} ${f.author} ${f.account}
|
|
118
|
+
`.pipe(Effect.map((rows) => rows[0] ?? { total: 0, withComments: 0, approved: 0 }), cacheError("healthIndicators"));
|
|
119
|
+
};
|
|
120
|
+
export const filterOptions = (sql) => () => sql `
|
|
121
|
+
SELECT
|
|
122
|
+
GROUP_CONCAT(DISTINCT repository_name) as repos,
|
|
123
|
+
GROUP_CONCAT(DISTINCT author) as authors,
|
|
124
|
+
GROUP_CONCAT(DISTINCT aws_account_id) as accounts
|
|
125
|
+
FROM pull_requests
|
|
126
|
+
`.pipe(Effect.map((rows) => {
|
|
127
|
+
const r = rows[0];
|
|
128
|
+
const sorted = (s) => s?.split(",").filter(Boolean).sort() ?? [];
|
|
129
|
+
return {
|
|
130
|
+
repos: sorted(r?.repos),
|
|
131
|
+
authors: sorted(r?.authors),
|
|
132
|
+
accounts: sorted(r?.accounts)
|
|
133
|
+
};
|
|
134
|
+
}), cacheError("filterOptions"));
|
|
135
|
+
export const totalComments = (sql) => (weekStart, weekEnd, filters) => {
|
|
136
|
+
const f = whereFilters(sql, filters);
|
|
137
|
+
return sql `
|
|
138
|
+
SELECT COALESCE(SUM(comment_count), 0) as total
|
|
139
|
+
FROM pull_requests
|
|
140
|
+
WHERE COALESCE(closed_at, last_modified_date) >= ${weekStart} AND COALESCE(closed_at, last_modified_date) < ${weekEnd}
|
|
141
|
+
AND status != 'CLOSED'
|
|
142
|
+
${f.repo} ${f.author} ${f.account}
|
|
143
|
+
`.pipe(Effect.map((rows) => rows[0]?.total ?? 0), cacheError("totalComments"));
|
|
144
|
+
};
|
|
145
|
+
export const mergeTimeDetails = (sql) => (weekStart, weekEnd, filters) => {
|
|
146
|
+
const f = whereFilters(sql, filters);
|
|
147
|
+
return sql `
|
|
148
|
+
SELECT id, title, author, repository_name, aws_account_id, creation_date,
|
|
149
|
+
COALESCE(closed_at, last_modified_date) as last_modified_date,
|
|
150
|
+
CAST((julianday(COALESCE(closed_at, last_modified_date)) - julianday(creation_date)) * 86400000 AS INTEGER) as duration_ms
|
|
151
|
+
FROM pull_requests
|
|
152
|
+
WHERE status = 'MERGED'
|
|
153
|
+
AND COALESCE(closed_at, last_modified_date) >= ${weekStart} AND COALESCE(closed_at, last_modified_date) < ${weekEnd}
|
|
154
|
+
${f.repo} ${f.author} ${f.account}
|
|
155
|
+
ORDER BY COALESCE(closed_at, last_modified_date) DESC
|
|
156
|
+
`.pipe(Effect.map((rows) => rows.map((r) => ({
|
|
157
|
+
prId: r.id,
|
|
158
|
+
prTitle: r.title,
|
|
159
|
+
author: r.author,
|
|
160
|
+
repositoryName: r.repositoryName,
|
|
161
|
+
awsAccountId: r.awsAccountId,
|
|
162
|
+
durationMs: r.durationMs,
|
|
163
|
+
fromLabel: fmtDate(r.creationDate),
|
|
164
|
+
toLabel: fmtDate(r.lastModifiedDate)
|
|
165
|
+
}))), cacheError("mergeTimeDetails"));
|
|
166
|
+
};
|
|
167
|
+
export const avgTimeToMerge = (sql) => (weekStart, weekEnd, filters) => {
|
|
168
|
+
const f = whereFilters(sql, filters);
|
|
169
|
+
return sql `
|
|
170
|
+
SELECT AVG(
|
|
171
|
+
CAST((julianday(COALESCE(closed_at, last_modified_date)) - julianday(creation_date)) * 86400000 AS INTEGER)
|
|
172
|
+
) as avg_ms
|
|
173
|
+
FROM pull_requests
|
|
174
|
+
WHERE status = 'MERGED'
|
|
175
|
+
AND COALESCE(closed_at, last_modified_date) >= ${weekStart} AND COALESCE(closed_at, last_modified_date) < ${weekEnd}
|
|
176
|
+
${f.repo} ${f.author} ${f.account}
|
|
177
|
+
`.pipe(Effect.map((rows) => rows[0]?.avgMs ?? null), cacheError("avgTimeToMerge"));
|
|
178
|
+
};
|
|
179
|
+
export const dataAvailableSince = (sql) => () => sql `
|
|
180
|
+
SELECT MIN(creation_date) as earliest FROM pull_requests
|
|
181
|
+
`.pipe(Effect.map((rows) => rows[0]?.earliest ?? null), cacheError("dataAvailableSince"));
|
|
182
|
+
//# sourceMappingURL=queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../../src/CacheService/repos/StatsRepo/queries.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAGL,UAAU,EAWV,YAAY,EACb,MAAM,eAAe,CAAA;AAEtB,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;AAEnE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAwB,EAAE,EAAE,CAAC,CAAC,SAAiB,EAAE,OAAe,EAAE,OAAgB,EAAE,EAAE;IACjH,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACpC,OAAO,GAAG,CAAW;;2CAEoB,SAAS,wBAAwB,OAAO;2FACQ,SAAS,kDAAkD,OAAO;2FAClE,SAAS,kDAAkD,OAAO;;gCAE7H,SAAS,kDAAkD,SAAS;UAC1F,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO;KACpC,CAAC,IAAI,CACN,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAC9E,UAAU,CAAC,cAAc,CAAC,CAC3B,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAC1B,CAAC,GAAwB,EAAE,EAAE,CAAC,CAAC,SAAiB,EAAE,OAAe,EAAE,OAAgB,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE;IACjG,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACpC,OAAO,GAAG,CAAgB;;;+BAGC,SAAS,wBAAwB,OAAO;;UAE7D,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO;;;cAG3B,KAAK;KACd,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAA;AACvC,CAAC,CAAA;AAEH,MAAM,CAAC,MAAM,aAAa,GACxB,CAAC,GAAwB,EAAE,EAAE,CAAC,CAAC,SAAiB,EAAE,OAAe,EAAE,OAAgB,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE;IACjG,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACpC,OAAO,GAAG,CAAa;;;yDAG8B,SAAS,kDAAkD,OAAO;;;UAGjH,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO;;cAE3B,KAAK;KACd,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAA;AACrC,CAAC,CAAA;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAC7B,CAAC,GAAwB,EAAE,EAAE,CAAC,CAAC,SAAiB,EAAE,OAAe,EAAE,OAAgB,EAAE,EAAE;IACrF,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACpC,OAAO,GAAG,CAAqB;;;;;;;+BAOJ,SAAS,wBAAwB,OAAO;;;UAG7D,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO;KACpC,CAAC,IAAI,CACJ,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,EACjF,UAAU,CAAC,oBAAoB,CAAC,CACjC,CAAA;AACH,CAAC,CAAA;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAwB,EAAE,EAAE,CAAC,CAAC,SAAiB,EAAE,OAAe,EAAE,OAAgB,EAAE,EAAE;IAChH,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACpC,OAAO,GAAG,CAAY;;;;;;+BAMO,SAAS,wBAAwB,OAAO;;;UAG7D,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO;KACpC,CAAC,IAAI,CACN,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAClB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,IAAI;YAAE,OAAO,IAAI,CAAA;QACzC,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC,WAAW,IAAI,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,UAAU,IAAI,CAAC,EAAE,CAAA;IACvG,CAAC,CAAC,EACF,UAAU,CAAC,aAAa,CAAC,CAC1B,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAChC,CAAC,GAAwB,EAAE,EAAE,CAAC,CAAC,SAAiB,EAAE,OAAe,EAAE,OAAgB,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE;IACjG,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACpC,OAAO,GAAG,CAAsB;;;;;;+BAML,SAAS,wBAAwB,OAAO;;;UAG7D,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO;;;cAG3B,KAAK;KACd,CAAC,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC,CAAA;AAC7C,CAAC,CAAA;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAwB,EAAE,EAAE,CAAC,CAAC,MAAc,EAAE,OAAgB,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE;IACrG,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACpC,OAAO,GAAG,CAAY;;;0BAGE,MAAM;;;wBAGR,MAAM;UACpB,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO;;cAE3B,KAAK;KACd,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAA;AAClC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAC3B,CAAC,GAAwB,EAAE,EAAE,CAAC,CAAC,SAAiB,EAAE,OAAe,EAAE,OAAgB,EAAE,EAAE;IACrF,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACpC,OAAO,GAAG,CAAW;;;;;;+BAMM,SAAS,wBAAwB,OAAO;;UAE7D,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO;KACpC,CAAC,IAAI,CACJ,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAC3E,UAAU,CAAC,kBAAkB,CAAC,CAC/B,CAAA;AACH,CAAC,CAAA;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAwB,EAAE,EAAE,CAAC,GAAG,EAAE,CAC9D,GAAG,CAAkB;;;;;;KAMlB,CAAC,IAAI,CACN,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;IAClB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,MAAM,MAAM,GAAG,CAAC,CAAqB,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAA;IACpF,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC;QACvB,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC;QAC3B,QAAQ,EAAE,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC;KAC9B,CAAA;AACH,CAAC,CAAC,EACF,UAAU,CAAC,eAAe,CAAC,CAC5B,CAAA;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAwB,EAAE,EAAE,CAAC,CAAC,SAAiB,EAAE,OAAe,EAAE,OAAgB,EAAE,EAAE;IAClH,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACpC,OAAO,GAAG,CAAmB;;;yDAG0B,SAAS,kDAAkD,OAAO;;UAEjH,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO;KACpC,CAAC,IAAI,CACN,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,EACzC,UAAU,CAAC,eAAe,CAAC,CAC5B,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAC3B,CAAC,GAAwB,EAAE,EAAE,CAAC,CAAC,SAAiB,EAAE,OAAe,EAAE,OAAgB,EAAE,EAAE;IACrF,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACpC,OAAO,GAAG,CAAoB;;;;;;yDAMuB,SAAS,kDAAkD,OAAO;UACjH,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO;;KAEpC,CAAC,IAAI,CACJ,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAClB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACf,IAAI,EAAE,CAAC,CAAC,EAAE;QACV,OAAO,EAAE,CAAC,CAAC,KAAK;QAChB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,cAAc,EAAE,CAAC,CAAC,cAAc;QAChC,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;QAClC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC;KACrC,CAAC,CAAC,CACJ,EACD,UAAU,CAAC,kBAAkB,CAAC,CAC/B,CAAA;AACH,CAAC,CAAA;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAwB,EAAE,EAAE,CAAC,CAAC,SAAiB,EAAE,OAAe,EAAE,OAAgB,EAAE,EAAE;IACnH,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACpC,OAAO,GAAG,CAA0B;;;;;;yDAMmB,SAAS,kDAAkD,OAAO;UACjH,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO;KACpC,CAAC,IAAI,CACN,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,EAC5C,UAAU,CAAC,gBAAgB,CAAC,CAC7B,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAwB,EAAE,EAAE,CAAC,GAAG,EAAE,CACnE,GAAG,CAAa;;KAEb,CAAC,IAAI,CACN,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,IAAI,CAAC,EAC/C,UAAU,CAAC,oBAAoB,CAAC,CACjC,CAAA"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module StatsRepo/reviewerData
|
|
3
|
+
*
|
|
4
|
+
* Hybrid SQL + in-memory computation for reviewer/approver analytics.
|
|
5
|
+
* Fetches PR metadata and comment JSON, then computes reviewer rankings,
|
|
6
|
+
* approval counts, and time-to-first-review metrics in-memory because
|
|
7
|
+
* the nested comment structure can't be flattened in SQL.
|
|
8
|
+
*
|
|
9
|
+
* @category CacheService
|
|
10
|
+
*/
|
|
11
|
+
import type * as SqlClient from "@effect/sql/SqlClient";
|
|
12
|
+
import { Effect } from "effect";
|
|
13
|
+
import { type Filters } from "./internal.js";
|
|
14
|
+
export declare const reviewerData: (sql: SqlClient.SqlClient) => (weekStart: string, weekEnd: string, filters: Filters) => Effect.Effect<{
|
|
15
|
+
topReviewers: {
|
|
16
|
+
author: string;
|
|
17
|
+
commentCount: number;
|
|
18
|
+
}[];
|
|
19
|
+
topApprovers: {
|
|
20
|
+
author: string;
|
|
21
|
+
approvalCount: number;
|
|
22
|
+
}[];
|
|
23
|
+
avgTimeToFirstReview: number | null;
|
|
24
|
+
avgTimeToMerge: number | null;
|
|
25
|
+
avgTimeToAddressFeedback: number | null;
|
|
26
|
+
firstReviewDetails: {
|
|
27
|
+
prId: string;
|
|
28
|
+
prTitle: string;
|
|
29
|
+
author: string;
|
|
30
|
+
repositoryName: string;
|
|
31
|
+
awsAccountId: string;
|
|
32
|
+
durationMs: number;
|
|
33
|
+
fromLabel: string;
|
|
34
|
+
toLabel: string;
|
|
35
|
+
}[];
|
|
36
|
+
feedbackDetails: {
|
|
37
|
+
prId: string;
|
|
38
|
+
prTitle: string;
|
|
39
|
+
author: string;
|
|
40
|
+
repositoryName: string;
|
|
41
|
+
awsAccountId: string;
|
|
42
|
+
durationMs: number;
|
|
43
|
+
fromLabel: string;
|
|
44
|
+
toLabel: string;
|
|
45
|
+
}[];
|
|
46
|
+
}, import("../../CacheError.ts").CacheError, never>;
|
|
47
|
+
//# sourceMappingURL=reviewerData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewerData.d.ts","sourceRoot":"","sources":["../../../../src/CacheService/repos/StatsRepo/reviewerData.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,KAAK,SAAS,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAA;AACvC,OAAO,EAIL,KAAK,OAAO,EAIb,MAAM,eAAe,CAAA;AAEtB,eAAO,MAAM,YAAY,GAAI,KAAK,SAAS,CAAC,SAAS,MAAM,WAAW,MAAM,EAAE,SAAS,MAAM,EAAE,SAAS,OAAO;;;;;;;;;;oBA6L7E,MAAM,GAAG,IAAI;;;cAlI/B,MAAM;iBACH,MAAM;gBACP,MAAM;wBACE,MAAM;sBACR,MAAM;oBACR,MAAM;mBACP,MAAM;iBACR,MAAM;;;cAPT,MAAM;iBACH,MAAM;gBACP,MAAM;wBACE,MAAM;sBACR,MAAM;oBACR,MAAM;mBACP,MAAM;iBACR,MAAM;;mDAoIxB,CAAA"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { Effect, Schema } from "effect";
|
|
2
|
+
import { cacheError, extractComments, LocationsFromJson, whereFilters } from "./internal.js";
|
|
3
|
+
export const reviewerData = (sql) => (weekStart, weekEnd, filters) => {
|
|
4
|
+
const f = whereFilters(sql, filters);
|
|
5
|
+
const fJoin = whereFilters(sql, filters, "p");
|
|
6
|
+
return Effect.all({
|
|
7
|
+
prs: sql `
|
|
8
|
+
SELECT id, title, author, aws_account_id, repository_name, creation_date, closed_at,
|
|
9
|
+
COALESCE(closed_at, last_modified_date) as last_modified_date, is_approved, status, merged_by, approved_by
|
|
10
|
+
FROM pull_requests
|
|
11
|
+
WHERE COALESCE(closed_at, last_modified_date) >= ${weekStart} AND COALESCE(closed_at, last_modified_date) < ${weekEnd}
|
|
12
|
+
AND status != 'CLOSED'
|
|
13
|
+
${f.repo} ${f.author} ${f.account}
|
|
14
|
+
`,
|
|
15
|
+
comments: sql `
|
|
16
|
+
SELECT c.pull_request_id, c.aws_account_id, c.locations_json
|
|
17
|
+
FROM pr_comments c
|
|
18
|
+
INNER JOIN pull_requests p ON p.id = c.pull_request_id AND p.aws_account_id = c.aws_account_id
|
|
19
|
+
WHERE COALESCE(p.closed_at, p.last_modified_date) >= ${weekStart} AND COALESCE(p.closed_at, p.last_modified_date) < ${weekEnd}
|
|
20
|
+
AND p.status != 'CLOSED'
|
|
21
|
+
${fJoin.repo} ${fJoin.author} ${fJoin.account}
|
|
22
|
+
`
|
|
23
|
+
}).pipe(Effect.flatMap(({ comments, prs }) => Effect.gen(function* () {
|
|
24
|
+
const prAuthors = new Map(prs.map((p) => [
|
|
25
|
+
`${p.awsAccountId}:${p.id}`,
|
|
26
|
+
{
|
|
27
|
+
id: p.id,
|
|
28
|
+
title: p.title,
|
|
29
|
+
author: p.author,
|
|
30
|
+
repositoryName: p.repositoryName,
|
|
31
|
+
awsAccountId: p.awsAccountId,
|
|
32
|
+
creationDate: new Date(p.creationDate),
|
|
33
|
+
closedAt: p.closedAt ? new Date(p.closedAt) : null,
|
|
34
|
+
lastModifiedDate: new Date(p.lastModifiedDate),
|
|
35
|
+
isApproved: p.isApproved === 1,
|
|
36
|
+
isMerged: p.status === "MERGED",
|
|
37
|
+
mergedBy: p.mergedBy,
|
|
38
|
+
approvedBy: p.approvedBy
|
|
39
|
+
? p.approvedBy.split(",").map((s) => s.trim()).filter((s) => s && s !== p.author)
|
|
40
|
+
: []
|
|
41
|
+
}
|
|
42
|
+
]));
|
|
43
|
+
// Top approvers — from approved_by column (comma-separated names)
|
|
44
|
+
const approverCounts = new Map();
|
|
45
|
+
for (const p of prs) {
|
|
46
|
+
if (p.approvedBy) {
|
|
47
|
+
for (const name of p.approvedBy.split(",")) {
|
|
48
|
+
const trimmed = name.trim();
|
|
49
|
+
if (trimmed && trimmed !== p.author) {
|
|
50
|
+
approverCounts.set(trimmed, (approverCounts.get(trimmed) ?? 0) + 1);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const reviewerCounts = new Map();
|
|
56
|
+
const firstReviewDeltas = [];
|
|
57
|
+
const firstReviewDetails = [];
|
|
58
|
+
const feedbackDeltas = [];
|
|
59
|
+
const feedbackDetails = [];
|
|
60
|
+
const prsWithCommentReview = new Set();
|
|
61
|
+
const wsMs = new Date(weekStart).getTime();
|
|
62
|
+
const weMs = new Date(weekEnd).getTime();
|
|
63
|
+
const fmtTs = (d) => d.toISOString().slice(0, 16).replace("T", " ");
|
|
64
|
+
for (const row of comments) {
|
|
65
|
+
const key = `${row.awsAccountId}:${row.pullRequestId}`;
|
|
66
|
+
const prInfo = prAuthors.get(key);
|
|
67
|
+
if (!prInfo)
|
|
68
|
+
continue;
|
|
69
|
+
const parsed = yield* Schema.decodeUnknown(LocationsFromJson)(row.locationsJson).pipe(Effect.catchAll(() => Effect.succeed([])));
|
|
70
|
+
const allComments = extractComments(parsed);
|
|
71
|
+
const sorted = [...allComments].sort((a, b) => a.creationDate.getTime() - b.creationDate.getTime());
|
|
72
|
+
// Filter to week range
|
|
73
|
+
const inWeek = sorted.filter((c) => c.creationDate.getTime() >= wsMs && c.creationDate.getTime() < weMs);
|
|
74
|
+
// Top reviewers — comments in this week (exclude self-reviews)
|
|
75
|
+
for (const c of inWeek) {
|
|
76
|
+
if (c.author !== prInfo.author) {
|
|
77
|
+
reviewerCounts.set(c.author, (reviewerCounts.get(c.author) ?? 0) + 1);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// (mergedBy-based approver counting moved above comment loop)
|
|
81
|
+
// Time to first review (comment action)
|
|
82
|
+
const firstReview = sorted.find((c) => c.author !== prInfo.author);
|
|
83
|
+
if (firstReview) {
|
|
84
|
+
prsWithCommentReview.add(key);
|
|
85
|
+
const durationMs = firstReview.creationDate.getTime() - prInfo.creationDate.getTime();
|
|
86
|
+
firstReviewDeltas.push(durationMs);
|
|
87
|
+
firstReviewDetails.push({
|
|
88
|
+
prId: prInfo.id,
|
|
89
|
+
prTitle: prInfo.title,
|
|
90
|
+
author: prInfo.author,
|
|
91
|
+
repositoryName: prInfo.repositoryName,
|
|
92
|
+
awsAccountId: prInfo.awsAccountId,
|
|
93
|
+
durationMs,
|
|
94
|
+
fromLabel: fmtTs(prInfo.creationDate),
|
|
95
|
+
toLabel: `${fmtTs(firstReview.creationDate)} (${firstReview.author})`
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
// Time to address feedback (review comment → next author reply)
|
|
99
|
+
const prFeedbackDeltas = [];
|
|
100
|
+
let firstFeedbackFrom;
|
|
101
|
+
let lastFeedbackTo;
|
|
102
|
+
for (let i = 0; i < sorted.length; i++) {
|
|
103
|
+
if (sorted[i].author !== prInfo.author) {
|
|
104
|
+
const nextAuthorReply = sorted.slice(i + 1).find((c) => c.author === prInfo.author);
|
|
105
|
+
if (nextAuthorReply) {
|
|
106
|
+
const dMs = nextAuthorReply.creationDate.getTime() - sorted[i].creationDate.getTime();
|
|
107
|
+
feedbackDeltas.push(dMs);
|
|
108
|
+
prFeedbackDeltas.push(dMs);
|
|
109
|
+
if (!firstFeedbackFrom)
|
|
110
|
+
firstFeedbackFrom = sorted[i].creationDate;
|
|
111
|
+
lastFeedbackTo = nextAuthorReply.creationDate;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (prFeedbackDeltas.length > 0) {
|
|
116
|
+
const avgMs = prFeedbackDeltas.reduce((a, b) => a + b, 0) / prFeedbackDeltas.length;
|
|
117
|
+
feedbackDetails.push({
|
|
118
|
+
prId: prInfo.id,
|
|
119
|
+
prTitle: prInfo.title,
|
|
120
|
+
author: prInfo.author,
|
|
121
|
+
repositoryName: prInfo.repositoryName,
|
|
122
|
+
awsAccountId: prInfo.awsAccountId,
|
|
123
|
+
durationMs: avgMs,
|
|
124
|
+
fromLabel: `${fmtTs(firstFeedbackFrom)} (${prFeedbackDeltas.length} rounds)`,
|
|
125
|
+
toLabel: fmtTs(lastFeedbackTo)
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Approve-only first review: PRs approved by non-author but without non-author comments
|
|
130
|
+
for (const [key, prInfo] of prAuthors) {
|
|
131
|
+
if (prsWithCommentReview.has(key))
|
|
132
|
+
continue;
|
|
133
|
+
if (prInfo.approvedBy.length === 0)
|
|
134
|
+
continue;
|
|
135
|
+
// Use closed_at (merge time) as proxy for approval time
|
|
136
|
+
const reviewDate = prInfo.closedAt ?? prInfo.lastModifiedDate;
|
|
137
|
+
const durationMs = reviewDate.getTime() - prInfo.creationDate.getTime();
|
|
138
|
+
if (durationMs <= 0)
|
|
139
|
+
continue;
|
|
140
|
+
firstReviewDeltas.push(durationMs);
|
|
141
|
+
firstReviewDetails.push({
|
|
142
|
+
prId: prInfo.id,
|
|
143
|
+
prTitle: prInfo.title,
|
|
144
|
+
author: prInfo.author,
|
|
145
|
+
repositoryName: prInfo.repositoryName,
|
|
146
|
+
awsAccountId: prInfo.awsAccountId,
|
|
147
|
+
durationMs,
|
|
148
|
+
fromLabel: fmtTs(prInfo.creationDate),
|
|
149
|
+
toLabel: `${fmtTs(reviewDate)} (approved: ${prInfo.approvedBy[0]})`
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
const topReviewers = [...reviewerCounts.entries()]
|
|
153
|
+
.map(([author, commentCount]) => ({ author, commentCount }))
|
|
154
|
+
.sort((a, b) => b.commentCount - a.commentCount)
|
|
155
|
+
.slice(0, 10);
|
|
156
|
+
const topApprovers = [...approverCounts.entries()]
|
|
157
|
+
.map(([author, approvalCount]) => ({ author, approvalCount }))
|
|
158
|
+
.sort((a, b) => b.approvalCount - a.approvalCount)
|
|
159
|
+
.slice(0, 10);
|
|
160
|
+
const avg = (arr) => arr.length > 0 ? arr.reduce((a, b) => a + b, 0) / arr.length : null;
|
|
161
|
+
return {
|
|
162
|
+
topReviewers,
|
|
163
|
+
topApprovers,
|
|
164
|
+
avgTimeToFirstReview: avg(firstReviewDeltas),
|
|
165
|
+
avgTimeToMerge: null, // computed separately from PR dates
|
|
166
|
+
avgTimeToAddressFeedback: avg(feedbackDeltas),
|
|
167
|
+
firstReviewDetails,
|
|
168
|
+
feedbackDetails
|
|
169
|
+
};
|
|
170
|
+
}).pipe(Effect.withSpan("StatsRepo.reviewerData.compute"))), cacheError("reviewerData"));
|
|
171
|
+
};
|
|
172
|
+
//# sourceMappingURL=reviewerData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewerData.js","sourceRoot":"","sources":["../../../../src/CacheService/repos/StatsRepo/reviewerData.ts"],"names":[],"mappings":"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"}
|
package/dist/DateUtils.d.ts
CHANGED
|
@@ -1,4 +1,32 @@
|
|
|
1
|
+
import { Option } from "effect";
|
|
1
2
|
export declare const formatDate: (date: Date) => string;
|
|
2
3
|
export declare const formatDateTime: (date: Date) => string;
|
|
3
4
|
export declare const formatRelativeTime: (date: Date, now: Date, prefix?: string) => string;
|
|
5
|
+
export interface WeekRange {
|
|
6
|
+
readonly week: string;
|
|
7
|
+
readonly start: Date;
|
|
8
|
+
readonly end: Date;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Parse an ISO week string (e.g. "2026-W09") into a date range.
|
|
12
|
+
* Returns None if the string is malformed.
|
|
13
|
+
*/
|
|
14
|
+
export declare const parseISOWeek: (week: string) => Option.Option<WeekRange>;
|
|
15
|
+
/**
|
|
16
|
+
* Get the ISO week string for a given date.
|
|
17
|
+
*/
|
|
18
|
+
export declare const toISOWeek: (date: Date) => string;
|
|
19
|
+
/**
|
|
20
|
+
* Format a week range as a human-readable label.
|
|
21
|
+
* e.g. "W09 2026 · Feb 24 – Mar 2"
|
|
22
|
+
*/
|
|
23
|
+
export declare const formatWeekLabel: (range: WeekRange) => string;
|
|
24
|
+
/**
|
|
25
|
+
* Format duration in milliseconds to a human-readable string.
|
|
26
|
+
*/
|
|
27
|
+
export declare const formatDuration: (ms: number) => string;
|
|
28
|
+
/**
|
|
29
|
+
* Compute the median of a numeric array. Returns null for empty arrays.
|
|
30
|
+
*/
|
|
31
|
+
export declare const median: (arr: ReadonlyArray<number>) => number | null;
|
|
4
32
|
//# sourceMappingURL=DateUtils.d.ts.map
|
package/dist/DateUtils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateUtils.d.ts","sourceRoot":"","sources":["../src/DateUtils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DateUtils.d.ts","sourceRoot":"","sources":["../src/DateUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEhD,eAAO,MAAM,UAAU,GAAI,MAAM,IAAI,KAAG,MAKvC,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,MAAM,IAAI,KAAG,MAI3C,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,MAAM,IAAI,EAAE,KAAK,IAAI,EAAE,eAAkB,KAAG,MAS9E,CAAA;AAMD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAA;IACpB,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAA;CACnB;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAclE,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,GAAI,MAAM,IAAI,KAAG,MAOtC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,SAAS,KAAG,MAUlD,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,IAAI,MAAM,KAAG,MAO3C,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,MAAM,GAAI,KAAK,aAAa,CAAC,MAAM,CAAC,KAAG,MAAM,GAAG,IAK5D,CAAA"}
|
package/dist/DateUtils.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Match } from "effect";
|
|
1
|
+
import { Duration, Match, Option } from "effect";
|
|
2
2
|
export const formatDate = (date) => {
|
|
3
3
|
const d = date.getDate().toString().padStart(2, "0");
|
|
4
4
|
const m = (date.getMonth() + 1).toString().padStart(2, "0");
|
|
@@ -14,4 +14,72 @@ export const formatRelativeTime = (date, now, prefix = "Updated") => {
|
|
|
14
14
|
const seconds = Math.max(0, Math.floor((now.getTime() - date.getTime()) / 1000));
|
|
15
15
|
return Match.value(seconds).pipe(Match.when((s) => s < 60, (s) => `${prefix} ${s}s ago`), Match.when((s) => s < 3600, (s) => `${prefix} ${Math.floor(s / 60)}m ago`), Match.when((s) => s < 86400, (s) => `${prefix} ${Math.floor(s / 3600)}h ago`), Match.orElse(() => `${prefix} on ${formatDate(date)}`));
|
|
16
16
|
};
|
|
17
|
+
/**
|
|
18
|
+
* Parse an ISO week string (e.g. "2026-W09") into a date range.
|
|
19
|
+
* Returns None if the string is malformed.
|
|
20
|
+
*/
|
|
21
|
+
export const parseISOWeek = (week) => {
|
|
22
|
+
const match = /^(\d{4})-W(\d{2})$/.exec(week);
|
|
23
|
+
if (!match)
|
|
24
|
+
return Option.none();
|
|
25
|
+
const year = parseInt(match[1], 10);
|
|
26
|
+
const weekNum = parseInt(match[2], 10);
|
|
27
|
+
if (weekNum < 1 || weekNum > 53)
|
|
28
|
+
return Option.none();
|
|
29
|
+
// Jan 4 is always in week 1 (ISO 8601)
|
|
30
|
+
const jan4 = new Date(Date.UTC(year, 0, 4));
|
|
31
|
+
const dayOfWeek = jan4.getUTCDay() || 7; // Monday=1 ... Sunday=7
|
|
32
|
+
const monday = new Date(jan4.getTime() + ((weekNum - 1) * 7 - (dayOfWeek - 1)) * 86400000);
|
|
33
|
+
const nextMonday = new Date(monday.getTime() + 7 * 86400000);
|
|
34
|
+
return Option.some({ week, start: monday, end: nextMonday });
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Get the ISO week string for a given date.
|
|
38
|
+
*/
|
|
39
|
+
export const toISOWeek = (date) => {
|
|
40
|
+
const d = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()));
|
|
41
|
+
const dayNum = d.getUTCDay() || 7;
|
|
42
|
+
d.setUTCDate(d.getUTCDate() + 4 - dayNum); // Thursday of the week
|
|
43
|
+
const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));
|
|
44
|
+
const weekNum = Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);
|
|
45
|
+
return `${d.getUTCFullYear()}-W${weekNum.toString().padStart(2, "0")}`;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Format a week range as a human-readable label.
|
|
49
|
+
* e.g. "W09 2026 · Feb 24 – Mar 2"
|
|
50
|
+
*/
|
|
51
|
+
export const formatWeekLabel = (range) => {
|
|
52
|
+
const w = range.week.split("-W");
|
|
53
|
+
const startMonth = range.start.toLocaleString("en-US", { month: "short", timeZone: "UTC" });
|
|
54
|
+
const endMonth = range.end.toLocaleString("en-US", { month: "short", timeZone: "UTC" });
|
|
55
|
+
const startDay = range.start.getUTCDate();
|
|
56
|
+
const endDay = range.end.getUTCDate();
|
|
57
|
+
const datePart = startMonth === endMonth
|
|
58
|
+
? `${startMonth} ${startDay} – ${endDay}`
|
|
59
|
+
: `${startMonth} ${startDay} – ${endMonth} ${endDay}`;
|
|
60
|
+
return `W${w[1]} ${w[0]} · ${datePart}`;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Format duration in milliseconds to a human-readable string.
|
|
64
|
+
*/
|
|
65
|
+
export const formatDuration = (ms) => {
|
|
66
|
+
const d = Duration.millis(ms);
|
|
67
|
+
const hours = Duration.toHours(d);
|
|
68
|
+
if (hours < 1)
|
|
69
|
+
return `${Math.round(hours * 60)}m`;
|
|
70
|
+
if (hours < 24)
|
|
71
|
+
return `${Math.floor(hours)}h`;
|
|
72
|
+
const days = Math.round(hours / 24 * 10) / 10;
|
|
73
|
+
return `${days}d`;
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Compute the median of a numeric array. Returns null for empty arrays.
|
|
77
|
+
*/
|
|
78
|
+
export const median = (arr) => {
|
|
79
|
+
if (arr.length === 0)
|
|
80
|
+
return null;
|
|
81
|
+
const sorted = [...arr].sort((a, b) => a - b);
|
|
82
|
+
const mid = Math.floor(sorted.length / 2);
|
|
83
|
+
return sorted.length % 2 !== 0 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2;
|
|
84
|
+
};
|
|
17
85
|
//# sourceMappingURL=DateUtils.js.map
|
package/dist/DateUtils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateUtils.js","sourceRoot":"","sources":["../src/DateUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"DateUtils.js","sourceRoot":"","sources":["../src/DateUtils.ts"],"names":[],"mappings":"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"}
|
package/dist/Domain.d.ts
CHANGED
|
@@ -119,6 +119,9 @@ declare const PullRequest_base: Schema.Class<PullRequest, {
|
|
|
119
119
|
commentCount: Schema.optional<typeof Schema.Number>;
|
|
120
120
|
healthScore: Schema.optional<typeof Schema.Number>;
|
|
121
121
|
fetchedAt: Schema.optional<typeof Schema.DateFromSelf>;
|
|
122
|
+
approvedBy: Schema.Array$<typeof Schema.String>;
|
|
123
|
+
commentedBy: Schema.Array$<typeof Schema.String>;
|
|
124
|
+
filesChanged: Schema.optional<typeof Schema.Number>;
|
|
122
125
|
}, Schema.Struct.Encoded<{
|
|
123
126
|
id: Schema.brand<typeof Schema.String, "PullRequestId">;
|
|
124
127
|
title: typeof Schema.String;
|
|
@@ -137,6 +140,9 @@ declare const PullRequest_base: Schema.Class<PullRequest, {
|
|
|
137
140
|
commentCount: Schema.optional<typeof Schema.Number>;
|
|
138
141
|
healthScore: Schema.optional<typeof Schema.Number>;
|
|
139
142
|
fetchedAt: Schema.optional<typeof Schema.DateFromSelf>;
|
|
143
|
+
approvedBy: Schema.Array$<typeof Schema.String>;
|
|
144
|
+
commentedBy: Schema.Array$<typeof Schema.String>;
|
|
145
|
+
filesChanged: Schema.optional<typeof Schema.Number>;
|
|
140
146
|
}>, never, {
|
|
141
147
|
readonly link: string;
|
|
142
148
|
} & {
|
|
@@ -171,6 +177,12 @@ declare const PullRequest_base: Schema.Class<PullRequest, {
|
|
|
171
177
|
readonly healthScore?: number | undefined;
|
|
172
178
|
} & {
|
|
173
179
|
readonly fetchedAt?: Date | undefined;
|
|
180
|
+
} & {
|
|
181
|
+
readonly approvedBy: readonly string[];
|
|
182
|
+
} & {
|
|
183
|
+
readonly commentedBy: readonly string[];
|
|
184
|
+
} & {
|
|
185
|
+
readonly filesChanged?: number | undefined;
|
|
174
186
|
}, {}, {}>;
|
|
175
187
|
/**
|
|
176
188
|
* CodeCommit pull request.
|
|
@@ -178,11 +190,9 @@ declare const PullRequest_base: Schema.Class<PullRequest, {
|
|
|
178
190
|
* @category Domain
|
|
179
191
|
*/
|
|
180
192
|
export declare class PullRequest extends PullRequest_base {
|
|
181
|
-
/**
|
|
182
|
-
* AWS Console URL for this pull request.
|
|
183
|
-
*/
|
|
184
193
|
get consoleUrl(): string;
|
|
185
194
|
}
|
|
195
|
+
export declare const codecommitConsoleUrl: (region: string, repo: string, prId: string) => string;
|
|
186
196
|
declare const Sandbox_base: Schema.Class<Sandbox, {
|
|
187
197
|
id: Schema.brand<typeof Schema.String, "SandboxId">;
|
|
188
198
|
pullRequestId: Schema.brand<typeof Schema.String, "PullRequestId">;
|
package/dist/Domain.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Domain.d.ts","sourceRoot":"","sources":["../src/Domain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAMrC;;;;GAIG;AACH,eAAO,MAAM,aAAa,qDAAoD,CAAA;AAC9E,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,IAAI,CAAA;AAErD;;;;GAIG;AACH,eAAO,MAAM,cAAc,sDAAqD,CAAA;AAChF,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,IAAI,CAAA;AAEvD;;;;GAIG;AACH,eAAO,MAAM,cAAc,sDAAqD,CAAA;AAChF,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,IAAI,CAAA;AAEvD;;;;GAIG;AACH,eAAO,MAAM,SAAS,iDAAgD,CAAA;AACtE,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,IAAI,CAAA;AAE7C;;;;GAIG;AACH,eAAO,MAAM,SAAS,iDAAgD,CAAA;AACtE,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,IAAI,CAAA;AAE7C;;;;GAIG;AACH,eAAO,MAAM,SAAS,iDAAgD,CAAA;AACtE,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,IAAI,CAAA;AAM7C;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,8CAA6C,CAAA;AAC3E,MAAM,MAAM,iBAAiB,GAAG,OAAO,iBAAiB,CAAC,IAAI,CAAA;AAE7D;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,yDAAwD,CAAA;AACrF,MAAM,MAAM,gBAAgB,GAAG,OAAO,gBAAgB,CAAC,IAAI,CAAA;AAE3D;;;;GAIG;AACH,eAAO,MAAM,SAAS,8CAA6C,CAAA;AACnE,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,IAAI,CAAA;AAE7C;;;;GAIG;AACH,eAAO,MAAM,aAAa,gGAQzB,CAAA;AACD,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,IAAI,CAAA;;;;;;;;;;;;;;;;AAMrD;;;;GAIG;AACH,qBAAa,OAAQ,SAAQ,YAI3B;CAAG
|
|
1
|
+
{"version":3,"file":"Domain.d.ts","sourceRoot":"","sources":["../src/Domain.ts"],"names":[],"mappings":"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"}
|