@sentry/junior-github 0.111.0 → 0.112.0
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/index.js +29 -142
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1643,30 +1643,23 @@ var DAY_MS = 24 * 60 * 60 * 1e3;
|
|
|
1643
1643
|
var WINDOWS = [7, 30, 90];
|
|
1644
1644
|
var pullRequestStatsSchema = z10.object({
|
|
1645
1645
|
closed: z10.number().int().nonnegative(),
|
|
1646
|
-
compositionUnknown: z10.number().int().nonnegative(),
|
|
1647
1646
|
created: z10.number().int().nonnegative(),
|
|
1648
1647
|
days: z10.number().int().positive(),
|
|
1649
|
-
juniorOnly: z10.number().int().nonnegative(),
|
|
1650
1648
|
medianMergeTimeMs: z10.number().nonnegative().nullable(),
|
|
1651
|
-
merged: z10.number().int().nonnegative()
|
|
1652
|
-
mixed: z10.number().int().nonnegative()
|
|
1649
|
+
merged: z10.number().int().nonnegative()
|
|
1653
1650
|
}).strict().transform((row) => {
|
|
1654
1651
|
const terminal = row.merged + row.closed;
|
|
1655
|
-
const classified = row.juniorOnly + row.mixed;
|
|
1656
1652
|
return {
|
|
1657
1653
|
...row,
|
|
1658
1654
|
medianMergeTimeMs: row.medianMergeTimeMs ?? void 0,
|
|
1659
|
-
mergeRate: terminal > 0 ? row.merged / terminal : void 0
|
|
1660
|
-
juniorOnlyRate: classified > 0 ? row.juniorOnly / classified : void 0
|
|
1655
|
+
mergeRate: terminal > 0 ? row.merged / terminal : void 0
|
|
1661
1656
|
};
|
|
1662
1657
|
});
|
|
1663
1658
|
var pullRequestRepositoryStatsSchema = z10.object({
|
|
1664
1659
|
closed: z10.number().int().nonnegative(),
|
|
1665
|
-
compositionUnknown: z10.number().int().nonnegative(),
|
|
1666
1660
|
created: z10.number().int().nonnegative(),
|
|
1667
1661
|
juniorOnly: z10.number().int().nonnegative(),
|
|
1668
1662
|
merged: z10.number().int().nonnegative(),
|
|
1669
|
-
mixed: z10.number().int().nonnegative(),
|
|
1670
1663
|
repository: z10.string().min(1)
|
|
1671
1664
|
}).strict().transform((row) => {
|
|
1672
1665
|
const terminal = row.merged + row.closed;
|
|
@@ -1688,16 +1681,10 @@ var issueStatsSchema = z10.object({
|
|
|
1688
1681
|
medianCloseTimeMs: row.medianCloseTimeMs ?? void 0
|
|
1689
1682
|
}));
|
|
1690
1683
|
var pullRequestDaySchema = z10.object({
|
|
1691
|
-
closed: z10.number().int().nonnegative(),
|
|
1692
1684
|
created: z10.number().int().nonnegative(),
|
|
1693
|
-
date: z10.string().date()
|
|
1694
|
-
merged: z10.number().int().nonnegative()
|
|
1685
|
+
date: z10.string().date()
|
|
1695
1686
|
}).strict();
|
|
1696
1687
|
var issueDaySchema = z10.object({
|
|
1697
|
-
closedCompleted: z10.number().int().nonnegative(),
|
|
1698
|
-
closedDuplicate: z10.number().int().nonnegative(),
|
|
1699
|
-
closedNotPlanned: z10.number().int().nonnegative(),
|
|
1700
|
-
closedUnknown: z10.number().int().nonnegative(),
|
|
1701
1688
|
created: z10.number().int().nonnegative(),
|
|
1702
1689
|
date: z10.string().date()
|
|
1703
1690
|
}).strict();
|
|
@@ -1731,7 +1718,6 @@ async function aggregatePullRequestWindows(args) {
|
|
|
1731
1718
|
SELECT
|
|
1732
1719
|
${table.pullRequestId},
|
|
1733
1720
|
${table.state},
|
|
1734
|
-
${table.commitComposition},
|
|
1735
1721
|
${table.openedAt},
|
|
1736
1722
|
${table.mergedAt},
|
|
1737
1723
|
${table.closedAt}
|
|
@@ -1755,24 +1741,6 @@ async function aggregatePullRequestWindows(args) {
|
|
|
1755
1741
|
WHERE recent_pull_requests.state = 'closed_unmerged'
|
|
1756
1742
|
AND recent_pull_requests.closed_at >= windows.start_at
|
|
1757
1743
|
)::integer AS "closed",
|
|
1758
|
-
count(recent_pull_requests.pull_request_id)
|
|
1759
|
-
FILTER (
|
|
1760
|
-
WHERE recent_pull_requests.state = 'merged'
|
|
1761
|
-
AND recent_pull_requests.merged_at >= windows.start_at
|
|
1762
|
-
AND recent_pull_requests.commit_composition = 'junior_only'
|
|
1763
|
-
)::integer AS "juniorOnly",
|
|
1764
|
-
count(recent_pull_requests.pull_request_id)
|
|
1765
|
-
FILTER (
|
|
1766
|
-
WHERE recent_pull_requests.state = 'merged'
|
|
1767
|
-
AND recent_pull_requests.merged_at >= windows.start_at
|
|
1768
|
-
AND recent_pull_requests.commit_composition = 'mixed'
|
|
1769
|
-
)::integer AS "mixed",
|
|
1770
|
-
count(recent_pull_requests.pull_request_id)
|
|
1771
|
-
FILTER (
|
|
1772
|
-
WHERE recent_pull_requests.state = 'merged'
|
|
1773
|
-
AND recent_pull_requests.merged_at >= windows.start_at
|
|
1774
|
-
AND recent_pull_requests.commit_composition IS NULL
|
|
1775
|
-
)::integer AS "compositionUnknown",
|
|
1776
1744
|
(
|
|
1777
1745
|
percentile_cont(0.5) WITHIN GROUP (
|
|
1778
1746
|
ORDER BY extract(
|
|
@@ -1803,38 +1771,17 @@ async function aggregatePullRequestDays(args) {
|
|
|
1803
1771
|
date_trunc('day', ${end}::timestamptz AT TIME ZONE 'UTC'),
|
|
1804
1772
|
interval '1 day'
|
|
1805
1773
|
) AS day
|
|
1806
|
-
),
|
|
1774
|
+
), daily AS (
|
|
1807
1775
|
SELECT
|
|
1808
1776
|
date_trunc('day', ${table.openedAt} AT TIME ZONE 'UTC') AS day,
|
|
1809
|
-
|
|
1777
|
+
count(*)::integer AS created
|
|
1810
1778
|
FROM ${table}
|
|
1811
1779
|
WHERE ${table.openedAt} >= ${start}
|
|
1812
|
-
|
|
1813
|
-
SELECT
|
|
1814
|
-
date_trunc('day', ${table.mergedAt} AT TIME ZONE 'UTC') AS day,
|
|
1815
|
-
'merged' AS kind
|
|
1816
|
-
FROM ${table}
|
|
1817
|
-
WHERE ${table.state} = 'merged' AND ${table.mergedAt} >= ${start}
|
|
1818
|
-
UNION ALL
|
|
1819
|
-
SELECT
|
|
1820
|
-
date_trunc('day', ${table.closedAt} AT TIME ZONE 'UTC') AS day,
|
|
1821
|
-
'closed' AS kind
|
|
1822
|
-
FROM ${table}
|
|
1823
|
-
WHERE ${table.state} = 'closed_unmerged' AND ${table.closedAt} >= ${start}
|
|
1824
|
-
), daily AS (
|
|
1825
|
-
SELECT
|
|
1826
|
-
events.day,
|
|
1827
|
-
count(*) FILTER (WHERE events.kind = 'created')::integer AS created,
|
|
1828
|
-
count(*) FILTER (WHERE events.kind = 'merged')::integer AS merged,
|
|
1829
|
-
count(*) FILTER (WHERE events.kind = 'closed')::integer AS closed
|
|
1830
|
-
FROM events
|
|
1831
|
-
GROUP BY events.day
|
|
1780
|
+
GROUP BY date_trunc('day', ${table.openedAt} AT TIME ZONE 'UTC')
|
|
1832
1781
|
)
|
|
1833
1782
|
SELECT
|
|
1834
1783
|
to_char(days.day, 'YYYY-MM-DD') AS "date",
|
|
1835
|
-
coalesce(daily.created, 0)::integer AS "created"
|
|
1836
|
-
coalesce(daily.merged, 0)::integer AS "merged",
|
|
1837
|
-
coalesce(daily.closed, 0)::integer AS "closed"
|
|
1784
|
+
coalesce(daily.created, 0)::integer AS "created"
|
|
1838
1785
|
FROM days
|
|
1839
1786
|
LEFT JOIN daily ON daily.day = days.day
|
|
1840
1787
|
ORDER BY days.day
|
|
@@ -1860,17 +1807,7 @@ async function aggregatePullRequestRepositories(args) {
|
|
|
1860
1807
|
WHERE ${table.state} = 'merged'
|
|
1861
1808
|
AND ${table.mergedAt} >= ${start}
|
|
1862
1809
|
AND ${table.commitComposition} = 'junior_only'
|
|
1863
|
-
)::integer AS "juniorOnly"
|
|
1864
|
-
count(*) FILTER (
|
|
1865
|
-
WHERE ${table.state} = 'merged'
|
|
1866
|
-
AND ${table.mergedAt} >= ${start}
|
|
1867
|
-
AND ${table.commitComposition} = 'mixed'
|
|
1868
|
-
)::integer AS "mixed",
|
|
1869
|
-
count(*) FILTER (
|
|
1870
|
-
WHERE ${table.state} = 'merged'
|
|
1871
|
-
AND ${table.mergedAt} >= ${start}
|
|
1872
|
-
AND ${table.commitComposition} IS NULL
|
|
1873
|
-
)::integer AS "compositionUnknown"
|
|
1810
|
+
)::integer AS "juniorOnly"
|
|
1874
1811
|
FROM ${table}
|
|
1875
1812
|
WHERE ${table.openedAt} >= ${start}
|
|
1876
1813
|
OR ${table.mergedAt} >= ${start}
|
|
@@ -1961,40 +1898,17 @@ async function aggregateIssueDays(args) {
|
|
|
1961
1898
|
date_trunc('day', ${end}::timestamptz AT TIME ZONE 'UTC'),
|
|
1962
1899
|
interval '1 day'
|
|
1963
1900
|
) AS day
|
|
1964
|
-
),
|
|
1901
|
+
), daily AS (
|
|
1965
1902
|
SELECT
|
|
1966
1903
|
date_trunc('day', ${table.openedAt} AT TIME ZONE 'UTC') AS day,
|
|
1967
|
-
|
|
1904
|
+
count(*)::integer AS created
|
|
1968
1905
|
FROM ${table}
|
|
1969
1906
|
WHERE ${table.openedAt} >= ${start}
|
|
1970
|
-
|
|
1971
|
-
SELECT
|
|
1972
|
-
date_trunc('day', ${table.closedAt} AT TIME ZONE 'UTC') AS day,
|
|
1973
|
-
coalesce(${table.stateReason}, 'unknown') AS kind
|
|
1974
|
-
FROM ${table}
|
|
1975
|
-
WHERE ${table.state} = 'closed' AND ${table.closedAt} >= ${start}
|
|
1976
|
-
), daily AS (
|
|
1977
|
-
SELECT
|
|
1978
|
-
events.day,
|
|
1979
|
-
count(*) FILTER (WHERE events.kind = 'created')::integer AS created,
|
|
1980
|
-
count(*) FILTER (WHERE events.kind = 'completed')::integer
|
|
1981
|
-
AS closed_completed,
|
|
1982
|
-
count(*) FILTER (WHERE events.kind = 'duplicate')::integer
|
|
1983
|
-
AS closed_duplicate,
|
|
1984
|
-
count(*) FILTER (WHERE events.kind = 'not_planned')::integer
|
|
1985
|
-
AS closed_not_planned,
|
|
1986
|
-
count(*) FILTER (WHERE events.kind = 'unknown')::integer
|
|
1987
|
-
AS closed_unknown
|
|
1988
|
-
FROM events
|
|
1989
|
-
GROUP BY events.day
|
|
1907
|
+
GROUP BY date_trunc('day', ${table.openedAt} AT TIME ZONE 'UTC')
|
|
1990
1908
|
)
|
|
1991
1909
|
SELECT
|
|
1992
1910
|
to_char(days.day, 'YYYY-MM-DD') AS "date",
|
|
1993
|
-
coalesce(daily.created, 0)::integer AS "created"
|
|
1994
|
-
coalesce(daily.closed_completed, 0)::integer AS "closedCompleted",
|
|
1995
|
-
coalesce(daily.closed_duplicate, 0)::integer AS "closedDuplicate",
|
|
1996
|
-
coalesce(daily.closed_not_planned, 0)::integer AS "closedNotPlanned",
|
|
1997
|
-
coalesce(daily.closed_unknown, 0)::integer AS "closedUnknown"
|
|
1911
|
+
coalesce(daily.created, 0)::integer AS "created"
|
|
1998
1912
|
FROM days
|
|
1999
1913
|
LEFT JOIN daily ON daily.day = days.day
|
|
2000
1914
|
ORDER BY days.day
|
|
@@ -2048,9 +1962,6 @@ function formatDuration(value) {
|
|
|
2048
1962
|
if (hours < 24) return `${Math.round(hours * 10) / 10}h`;
|
|
2049
1963
|
return `${Math.round(hours / 24 * 10) / 10}d`;
|
|
2050
1964
|
}
|
|
2051
|
-
function formatCommitComposition(stats) {
|
|
2052
|
-
return `${stats.juniorOnly} Junior-only \xB7 ${stats.mixed} mixed \xB7 ${stats.compositionUnknown} unknown`;
|
|
2053
|
-
}
|
|
2054
1965
|
function startOfUtcDay(timestampMs) {
|
|
2055
1966
|
const date = new Date(timestampMs);
|
|
2056
1967
|
date.setUTCHours(0, 0, 0, 0);
|
|
@@ -2076,70 +1987,46 @@ async function buildGitHubOutcomeReport(args) {
|
|
|
2076
1987
|
const issueThirtyDays = issueWindows.find((window) => window.days === 30);
|
|
2077
1988
|
return {
|
|
2078
1989
|
generatedAt: new Date(args.nowMs).toISOString(),
|
|
2079
|
-
title: "GitHub
|
|
1990
|
+
title: "GitHub activity",
|
|
2080
1991
|
metrics: [
|
|
2081
1992
|
{
|
|
2082
|
-
label: "
|
|
2083
|
-
value: formatPercent(thirtyDays.juniorOnlyRate)
|
|
2084
|
-
},
|
|
2085
|
-
{
|
|
2086
|
-
label: "PR merge rate \xB7 30d",
|
|
1993
|
+
label: "PR closure merge rate \xB7 30d",
|
|
2087
1994
|
value: formatPercent(thirtyDays.mergeRate)
|
|
2088
1995
|
},
|
|
2089
1996
|
{
|
|
2090
|
-
label: "
|
|
1997
|
+
label: "Median PR merge time \xB7 merged in 30d",
|
|
2091
1998
|
value: formatDuration(thirtyDays.medianMergeTimeMs)
|
|
2092
1999
|
},
|
|
2093
2000
|
{
|
|
2094
|
-
label: "
|
|
2001
|
+
label: "Median issue close time \xB7 closed in 30d",
|
|
2095
2002
|
value: formatDuration(issueThirtyDays.medianCloseTimeMs)
|
|
2096
2003
|
}
|
|
2097
2004
|
],
|
|
2098
2005
|
widgets: [
|
|
2099
2006
|
{
|
|
2100
|
-
id: "pull-
|
|
2007
|
+
id: "pull-requests-created",
|
|
2101
2008
|
type: "bar_chart",
|
|
2102
|
-
title: "Pull
|
|
2103
|
-
description: "
|
|
2009
|
+
title: "Pull requests created",
|
|
2010
|
+
description: "Junior-owned pull requests opened per day",
|
|
2104
2011
|
timeRangeDays: [...WINDOWS],
|
|
2105
|
-
series: [
|
|
2106
|
-
{ key: "created", label: "Created" },
|
|
2107
|
-
{ key: "merged", label: "Merged", tone: "good" },
|
|
2108
|
-
{ key: "closed", label: "Closed unmerged", tone: "danger" }
|
|
2109
|
-
],
|
|
2012
|
+
series: [{ key: "created", label: "Created" }],
|
|
2110
2013
|
categories: pullRequestDays.map((stats) => ({
|
|
2111
2014
|
id: stats.date,
|
|
2112
2015
|
label: stats.date,
|
|
2113
|
-
values: {
|
|
2114
|
-
created: stats.created,
|
|
2115
|
-
merged: stats.merged,
|
|
2116
|
-
closed: stats.closed
|
|
2117
|
-
}
|
|
2016
|
+
values: { created: stats.created }
|
|
2118
2017
|
}))
|
|
2119
2018
|
},
|
|
2120
2019
|
{
|
|
2121
|
-
id: "
|
|
2020
|
+
id: "issues-created",
|
|
2122
2021
|
type: "bar_chart",
|
|
2123
|
-
title: "
|
|
2124
|
-
description: "
|
|
2022
|
+
title: "Issues created",
|
|
2023
|
+
description: "Junior-owned issues opened per day",
|
|
2125
2024
|
timeRangeDays: [...WINDOWS],
|
|
2126
|
-
series: [
|
|
2127
|
-
{ key: "created", label: "Created" },
|
|
2128
|
-
{ key: "completed", label: "Completed", tone: "good" },
|
|
2129
|
-
{ key: "duplicate", label: "Duplicate", tone: "warning" },
|
|
2130
|
-
{ key: "notPlanned", label: "Not planned", tone: "danger" },
|
|
2131
|
-
{ key: "unknown", label: "Unknown" }
|
|
2132
|
-
],
|
|
2025
|
+
series: [{ key: "created", label: "Created" }],
|
|
2133
2026
|
categories: issueDays.map((stats) => ({
|
|
2134
2027
|
id: stats.date,
|
|
2135
2028
|
label: stats.date,
|
|
2136
|
-
values: {
|
|
2137
|
-
created: stats.created,
|
|
2138
|
-
completed: stats.closedCompleted,
|
|
2139
|
-
duplicate: stats.closedDuplicate,
|
|
2140
|
-
notPlanned: stats.closedNotPlanned,
|
|
2141
|
-
unknown: stats.closedUnknown
|
|
2142
|
-
}
|
|
2029
|
+
values: { created: stats.created }
|
|
2143
2030
|
}))
|
|
2144
2031
|
}
|
|
2145
2032
|
],
|
|
@@ -2150,10 +2037,10 @@ async function buildGitHubOutcomeReport(args) {
|
|
|
2150
2037
|
fields: [
|
|
2151
2038
|
{ key: "repository", label: "Repository" },
|
|
2152
2039
|
{ key: "created", label: "Created" },
|
|
2040
|
+
{ key: "juniorOnly", label: "Junior-only merges" },
|
|
2153
2041
|
{ key: "merged", label: "Merged" },
|
|
2154
2042
|
{ key: "closed", label: "Closed unmerged" },
|
|
2155
|
-
{ key: "
|
|
2156
|
-
{ key: "mergeRate", label: "Merge rate" }
|
|
2043
|
+
{ key: "mergeRate", label: "Closure merge rate" }
|
|
2157
2044
|
],
|
|
2158
2045
|
records: repositories.map(({ repository, ...stats }) => ({
|
|
2159
2046
|
id: repository,
|
|
@@ -2162,7 +2049,7 @@ async function buildGitHubOutcomeReport(args) {
|
|
|
2162
2049
|
created: String(stats.created),
|
|
2163
2050
|
merged: String(stats.merged),
|
|
2164
2051
|
closed: String(stats.closed),
|
|
2165
|
-
|
|
2052
|
+
juniorOnly: String(stats.juniorOnly),
|
|
2166
2053
|
mergeRate: formatPercent(stats.mergeRate)
|
|
2167
2054
|
}
|
|
2168
2055
|
}))
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sentry/junior-github",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.112.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"@sinclair/typebox": "^0.34.49",
|
|
32
32
|
"drizzle-orm": "^0.45.2",
|
|
33
33
|
"zod": "^4.4.3",
|
|
34
|
-
"@sentry/junior-plugin-api": "0.
|
|
34
|
+
"@sentry/junior-plugin-api": "0.112.0"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@types/node": "^25.9.1",
|