@knpkv/codecommit-core 0.4.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 +28 -7
- package/dist/AwsClient/getPullRequest.js.map +1 -1
- package/dist/AwsClient/getPullRequests.d.ts.map +1 -1
- package/dist/AwsClient/getPullRequests.js +31 -13
- 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 +13 -1
- package/dist/CacheService/Database.js.map +1 -1
- package/dist/CacheService/EventsHub.d.ts +24 -4
- package/dist/CacheService/EventsHub.d.ts.map +1 -1
- package/dist/CacheService/EventsHub.js.map +1 -1
- package/dist/CacheService/index.d.ts +5 -2
- package/dist/CacheService/index.d.ts.map +1 -1
- package/dist/CacheService/index.js +3 -1
- package/dist/CacheService/index.js.map +1 -1
- package/dist/CacheService/migrations/0005_add_sandboxes.d.ts +5 -0
- package/dist/CacheService/migrations/0005_add_sandboxes.d.ts.map +1 -0
- package/dist/CacheService/migrations/0005_add_sandboxes.js +23 -0
- package/dist/CacheService/migrations/0005_add_sandboxes.js.map +1 -0
- package/dist/CacheService/migrations/0006_sandbox_logs.d.ts +5 -0
- package/dist/CacheService/migrations/0006_sandbox_logs.d.ts.map +1 -0
- package/dist/CacheService/migrations/0006_sandbox_logs.js +7 -0
- package/dist/CacheService/migrations/0006_sandbox_logs.js.map +1 -0
- 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/SandboxRepo.d.ts +116 -0
- package/dist/CacheService/repos/SandboxRepo.d.ts.map +1 -0
- package/dist/CacheService/repos/SandboxRepo.js +88 -0
- package/dist/CacheService/repos/SandboxRepo.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/ConfigService/index.d.ts +1 -1
- package/dist/ConfigService/index.d.ts.map +1 -1
- package/dist/ConfigService/index.js +1 -1
- package/dist/ConfigService/index.js.map +1 -1
- package/dist/ConfigService/internal.d.ts +98 -0
- package/dist/ConfigService/internal.d.ts.map +1 -1
- package/dist/ConfigService/internal.js +16 -1
- package/dist/ConfigService/internal.js.map +1 -1
- package/dist/ConfigService/load.d.ts +15 -0
- package/dist/ConfigService/load.d.ts.map +1 -1
- package/dist/ConfigService/load.js +10 -3
- package/dist/ConfigService/load.js.map +1 -1
- package/dist/ConfigService/reset.d.ts.map +1 -1
- package/dist/ConfigService/reset.js +3 -2
- package/dist/ConfigService/reset.js.map +1 -1
- 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 +87 -5
- package/dist/Domain.d.ts.map +1 -1
- package/dist/Domain.js +38 -5
- package/dist/Domain.js.map +1 -1
- package/dist/Errors.d.ts +28 -1
- package/dist/Errors.d.ts.map +1 -1
- package/dist/Errors.js +22 -1
- package/dist/Errors.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/SandboxService/DockerService.d.ts +57 -0
- package/dist/SandboxService/DockerService.d.ts.map +1 -0
- package/dist/SandboxService/DockerService.js +83 -0
- package/dist/SandboxService/DockerService.js.map +1 -0
- package/dist/SandboxService/PluginService.d.ts +38 -0
- package/dist/SandboxService/PluginService.d.ts.map +1 -0
- package/dist/SandboxService/PluginService.js +26 -0
- package/dist/SandboxService/PluginService.js.map +1 -0
- package/dist/SandboxService/SandboxService.d.ts +102 -0
- package/dist/SandboxService/SandboxService.d.ts.map +1 -0
- package/dist/SandboxService/SandboxService.js +272 -0
- package/dist/SandboxService/SandboxService.js.map +1 -0
- package/dist/SandboxService/index.d.ts +13 -0
- package/dist/SandboxService/index.d.ts.map +1 -0
- package/dist/SandboxService/index.js +10 -0
- package/dist/SandboxService/index.js.map +1 -0
- package/dist/SandboxService/plugins/ClaudeCodePlugin.d.ts +18 -0
- package/dist/SandboxService/plugins/ClaudeCodePlugin.d.ts.map +1 -0
- package/dist/SandboxService/plugins/ClaudeCodePlugin.js +24 -0
- package/dist/SandboxService/plugins/ClaudeCodePlugin.js.map +1 -0
- 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 +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -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 @@
|
|
|
1
|
+
{"version":3,"file":"SandboxRepo.js","sourceRoot":"","sources":["../../../src/CacheService/repos/SandboxRepo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module StatsRepo
|
|
3
|
+
*
|
|
4
|
+
* Read-only SQL projection layer for the statistics dashboard.
|
|
5
|
+
* Assembles query methods from `./queries` and `./reviewerData` into
|
|
6
|
+
* a single Effect.Service.
|
|
7
|
+
*
|
|
8
|
+
* @category CacheService
|
|
9
|
+
*/
|
|
10
|
+
import * as SqlClient from "@effect/sql/SqlClient";
|
|
11
|
+
import { Effect } from "effect";
|
|
12
|
+
declare const StatsRepo_base: Effect.Service.Class<StatsRepo, "StatsRepo", {
|
|
13
|
+
readonly dependencies: readonly [import("effect/Layer").Layer<SqlClient.SqlClient | import("@effect/sql-libsql/LibsqlClient").LibsqlClient, import("@effect/sql/SqlError").SqlError | import("effect/ConfigError").ConfigError | import("@effect/sql/Migrator").MigrationError, import("@effect/platform/FileSystem").FileSystem>];
|
|
14
|
+
readonly effect: Effect.Effect<{
|
|
15
|
+
readonly weeklyVolume: (weekStart: string, weekEnd: string, filters: import("./internal.ts").Filters) => Effect.Effect<import("./internal.ts").VolumeRow, import("../../CacheError.ts").CacheError, never>;
|
|
16
|
+
readonly topContributors: (weekStart: string, weekEnd: string, filters: import("./internal.ts").Filters, limit?: number) => Effect.Effect<readonly import("./internal.ts").ContributorRow[], import("../../CacheError.ts").CacheError, never>;
|
|
17
|
+
readonly mostActivePRs: (weekStart: string, weekEnd: string, filters: import("./internal.ts").Filters, limit?: number) => Effect.Effect<readonly import("./internal.ts").ActivePRRow[], import("../../CacheError.ts").CacheError, never>;
|
|
18
|
+
readonly prSizeDistribution: (weekStart: string, weekEnd: string, filters: import("./internal.ts").Filters) => Effect.Effect<import("./internal.ts").SizeDistributionRow, import("../../CacheError.ts").CacheError, never>;
|
|
19
|
+
readonly avgDiffSize: (weekStart: string, weekEnd: string, filters: import("./internal.ts").Filters) => Effect.Effect<{
|
|
20
|
+
filesAdded: number;
|
|
21
|
+
filesModified: number;
|
|
22
|
+
filesDeleted: number;
|
|
23
|
+
} | null, import("../../CacheError.ts").CacheError, never>;
|
|
24
|
+
readonly diffSizeByContributor: (weekStart: string, weekEnd: string, filters: import("./internal.ts").Filters, limit?: number) => Effect.Effect<readonly import("./internal.ts").DiffByContributorRow[], import("../../CacheError.ts").CacheError, never>;
|
|
25
|
+
readonly stalePRs: (nowISO: string, filters: import("./internal.ts").Filters, limit?: number) => Effect.Effect<readonly import("./internal.ts").StalePRRow[], import("../../CacheError.ts").CacheError, never>;
|
|
26
|
+
readonly healthIndicators: (weekStart: string, weekEnd: string, filters: import("./internal.ts").Filters) => Effect.Effect<import("./internal.ts").HealthRow, import("../../CacheError.ts").CacheError, never>;
|
|
27
|
+
readonly filterOptions: () => Effect.Effect<{
|
|
28
|
+
repos: string[];
|
|
29
|
+
authors: string[];
|
|
30
|
+
accounts: string[];
|
|
31
|
+
}, import("../../CacheError.ts").CacheError, never>;
|
|
32
|
+
readonly totalComments: (weekStart: string, weekEnd: string, filters: import("./internal.ts").Filters) => Effect.Effect<number, import("../../CacheError.ts").CacheError, never>;
|
|
33
|
+
readonly reviewerData: (weekStart: string, weekEnd: string, filters: import("./internal.ts").Filters) => Effect.Effect<{
|
|
34
|
+
topReviewers: {
|
|
35
|
+
author: string;
|
|
36
|
+
commentCount: number;
|
|
37
|
+
}[];
|
|
38
|
+
topApprovers: {
|
|
39
|
+
author: string;
|
|
40
|
+
approvalCount: number;
|
|
41
|
+
}[];
|
|
42
|
+
avgTimeToFirstReview: number | null;
|
|
43
|
+
avgTimeToMerge: number | null;
|
|
44
|
+
avgTimeToAddressFeedback: number | null;
|
|
45
|
+
firstReviewDetails: {
|
|
46
|
+
prId: string;
|
|
47
|
+
prTitle: string;
|
|
48
|
+
author: string;
|
|
49
|
+
repositoryName: string;
|
|
50
|
+
awsAccountId: string;
|
|
51
|
+
durationMs: number;
|
|
52
|
+
fromLabel: string;
|
|
53
|
+
toLabel: string;
|
|
54
|
+
}[];
|
|
55
|
+
feedbackDetails: {
|
|
56
|
+
prId: string;
|
|
57
|
+
prTitle: string;
|
|
58
|
+
author: string;
|
|
59
|
+
repositoryName: string;
|
|
60
|
+
awsAccountId: string;
|
|
61
|
+
durationMs: number;
|
|
62
|
+
fromLabel: string;
|
|
63
|
+
toLabel: string;
|
|
64
|
+
}[];
|
|
65
|
+
}, import("../../CacheError.ts").CacheError, never>;
|
|
66
|
+
readonly mergeTimeDetails: (weekStart: string, weekEnd: string, filters: import("./internal.ts").Filters) => Effect.Effect<{
|
|
67
|
+
prId: string;
|
|
68
|
+
prTitle: string;
|
|
69
|
+
author: string;
|
|
70
|
+
repositoryName: string;
|
|
71
|
+
awsAccountId: string;
|
|
72
|
+
durationMs: number;
|
|
73
|
+
fromLabel: string;
|
|
74
|
+
toLabel: string;
|
|
75
|
+
}[], import("../../CacheError.ts").CacheError, never>;
|
|
76
|
+
readonly avgTimeToMerge: (weekStart: string, weekEnd: string, filters: import("./internal.ts").Filters) => Effect.Effect<number | null, import("../../CacheError.ts").CacheError, never>;
|
|
77
|
+
readonly dataAvailableSince: () => Effect.Effect<string | null, import("../../CacheError.ts").CacheError, never>;
|
|
78
|
+
}, never, SqlClient.SqlClient>;
|
|
79
|
+
}>;
|
|
80
|
+
export declare class StatsRepo extends StatsRepo_base {
|
|
81
|
+
}
|
|
82
|
+
export declare namespace StatsRepo {
|
|
83
|
+
/**
|
|
84
|
+
* @category models
|
|
85
|
+
*/
|
|
86
|
+
interface Filters {
|
|
87
|
+
readonly repo?: string | undefined;
|
|
88
|
+
readonly author?: string | undefined;
|
|
89
|
+
readonly account?: string | undefined;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export {};
|
|
93
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/CacheService/repos/StatsRepo/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,SAAS,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAS/B,qBAAa,SAAU,SAAQ,cAsB7B;CAAG;AAEL,MAAM,CAAC,OAAO,WAAW,SAAS,CAAC;IACjC;;OAEG;IACH,UAAiB,OAAO;QACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KACtC;CACF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module StatsRepo
|
|
3
|
+
*
|
|
4
|
+
* Read-only SQL projection layer for the statistics dashboard.
|
|
5
|
+
* Assembles query methods from `./queries` and `./reviewerData` into
|
|
6
|
+
* a single Effect.Service.
|
|
7
|
+
*
|
|
8
|
+
* @category CacheService
|
|
9
|
+
*/
|
|
10
|
+
import * as SqlClient from "@effect/sql/SqlClient";
|
|
11
|
+
import { Effect } from "effect";
|
|
12
|
+
import { DatabaseLive } from "../../Database.js";
|
|
13
|
+
import * as Q from "./queries.js";
|
|
14
|
+
import { reviewerData } from "./reviewerData.js";
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Service
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
export class StatsRepo extends Effect.Service()("StatsRepo", {
|
|
19
|
+
dependencies: [DatabaseLive],
|
|
20
|
+
effect: Effect.gen(function* () {
|
|
21
|
+
const sql = yield* SqlClient.SqlClient;
|
|
22
|
+
return {
|
|
23
|
+
weeklyVolume: Q.weeklyVolume(sql),
|
|
24
|
+
topContributors: Q.topContributors(sql),
|
|
25
|
+
mostActivePRs: Q.mostActivePRs(sql),
|
|
26
|
+
prSizeDistribution: Q.prSizeDistribution(sql),
|
|
27
|
+
avgDiffSize: Q.avgDiffSize(sql),
|
|
28
|
+
diffSizeByContributor: Q.diffSizeByContributor(sql),
|
|
29
|
+
stalePRs: Q.stalePRs(sql),
|
|
30
|
+
healthIndicators: Q.healthIndicators(sql),
|
|
31
|
+
filterOptions: Q.filterOptions(sql),
|
|
32
|
+
totalComments: Q.totalComments(sql),
|
|
33
|
+
reviewerData: reviewerData(sql),
|
|
34
|
+
mergeTimeDetails: Q.mergeTimeDetails(sql),
|
|
35
|
+
avgTimeToMerge: Q.avgTimeToMerge(sql),
|
|
36
|
+
dataAvailableSince: Q.dataAvailableSince(sql)
|
|
37
|
+
};
|
|
38
|
+
})
|
|
39
|
+
}) {
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/CacheService/repos/StatsRepo/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,SAAS,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,MAAM,OAAO,SAAU,SAAQ,MAAM,CAAC,OAAO,EAAa,CAAC,WAAW,EAAE;IACtE,YAAY,EAAE,CAAC,YAAY,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC1B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAA;QAEtC,OAAO;YACL,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC;YACjC,eAAe,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC;YACvC,aAAa,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC;YACnC,kBAAkB,EAAE,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC;YAC7C,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC;YAC/B,qBAAqB,EAAE,CAAC,CAAC,qBAAqB,CAAC,GAAG,CAAC;YACnD,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;YACzB,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC;YACzC,aAAa,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC;YACnC,aAAa,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC;YACnC,YAAY,EAAE,YAAY,CAAC,GAAG,CAAC;YAC/B,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC;YACzC,cAAc,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC;YACrC,kBAAkB,EAAE,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC;SACrC,CAAA;IACZ,CAAC,CAAC;CACH,CAAC;CAAG"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module StatsRepo/internal
|
|
3
|
+
*
|
|
4
|
+
* Shared types, row interfaces, and helpers used across the StatsRepo query modules.
|
|
5
|
+
* Everything here is pure (no SQL dependency) except `whereFilters` which takes `sql`.
|
|
6
|
+
*
|
|
7
|
+
* @category CacheService
|
|
8
|
+
*/
|
|
9
|
+
import type * as SqlClient from "@effect/sql/SqlClient";
|
|
10
|
+
import { Effect, Schema } from "effect";
|
|
11
|
+
import { PRCommentLocationJson } from "../../../Domain.js";
|
|
12
|
+
import { CacheError } from "../../CacheError.js";
|
|
13
|
+
export interface VolumeRow {
|
|
14
|
+
readonly prsCreated: number;
|
|
15
|
+
readonly prsMerged: number;
|
|
16
|
+
readonly prsClosed: number;
|
|
17
|
+
}
|
|
18
|
+
export interface ContributorRow {
|
|
19
|
+
readonly author: string;
|
|
20
|
+
readonly prCount: number;
|
|
21
|
+
}
|
|
22
|
+
export interface ActivePRRow {
|
|
23
|
+
readonly id: string;
|
|
24
|
+
readonly title: string;
|
|
25
|
+
readonly author: string;
|
|
26
|
+
readonly repositoryName: string;
|
|
27
|
+
readonly commentCount: number | null;
|
|
28
|
+
readonly awsAccountId: string;
|
|
29
|
+
}
|
|
30
|
+
export interface SizeDistributionRow {
|
|
31
|
+
readonly small: number;
|
|
32
|
+
readonly medium: number;
|
|
33
|
+
readonly large: number;
|
|
34
|
+
readonly extraLarge: number;
|
|
35
|
+
}
|
|
36
|
+
export interface AvgDiffRow {
|
|
37
|
+
readonly avgAdded: number | null;
|
|
38
|
+
readonly avgModified: number | null;
|
|
39
|
+
readonly avgDeleted: number | null;
|
|
40
|
+
}
|
|
41
|
+
export interface DiffByContributorRow {
|
|
42
|
+
readonly author: string;
|
|
43
|
+
readonly avgFilesChanged: number;
|
|
44
|
+
readonly prCount: number;
|
|
45
|
+
}
|
|
46
|
+
export interface StalePRRow {
|
|
47
|
+
readonly id: string;
|
|
48
|
+
readonly title: string;
|
|
49
|
+
readonly author: string;
|
|
50
|
+
readonly repositoryName: string;
|
|
51
|
+
readonly daysSinceActivity: number;
|
|
52
|
+
readonly awsAccountId: string;
|
|
53
|
+
}
|
|
54
|
+
export interface HealthRow {
|
|
55
|
+
readonly total: number;
|
|
56
|
+
readonly withComments: number;
|
|
57
|
+
readonly approved: number;
|
|
58
|
+
}
|
|
59
|
+
export interface FilterOptionsRow {
|
|
60
|
+
readonly repos: string;
|
|
61
|
+
readonly authors: string;
|
|
62
|
+
readonly accounts: string;
|
|
63
|
+
}
|
|
64
|
+
export interface CommentRow {
|
|
65
|
+
readonly pullRequestId: string;
|
|
66
|
+
readonly awsAccountId: string;
|
|
67
|
+
readonly locationsJson: string;
|
|
68
|
+
}
|
|
69
|
+
export interface PRForReviewRow {
|
|
70
|
+
readonly id: string;
|
|
71
|
+
readonly title: string;
|
|
72
|
+
readonly approvedBy: string | null;
|
|
73
|
+
readonly author: string;
|
|
74
|
+
readonly awsAccountId: string;
|
|
75
|
+
readonly creationDate: string;
|
|
76
|
+
readonly closedAt: string | null;
|
|
77
|
+
readonly lastModifiedDate: string;
|
|
78
|
+
readonly isApproved: number;
|
|
79
|
+
readonly mergedBy: string | null;
|
|
80
|
+
readonly repositoryName: string;
|
|
81
|
+
readonly status: string;
|
|
82
|
+
}
|
|
83
|
+
export interface MergeTimeDetailRow {
|
|
84
|
+
readonly id: string;
|
|
85
|
+
readonly title: string;
|
|
86
|
+
readonly author: string;
|
|
87
|
+
readonly repositoryName: string;
|
|
88
|
+
readonly awsAccountId: string;
|
|
89
|
+
readonly creationDate: string;
|
|
90
|
+
readonly lastModifiedDate: string;
|
|
91
|
+
readonly durationMs: number;
|
|
92
|
+
}
|
|
93
|
+
export interface EarliestRow {
|
|
94
|
+
readonly earliest: string | null;
|
|
95
|
+
}
|
|
96
|
+
export interface CommentInfo {
|
|
97
|
+
readonly author: string;
|
|
98
|
+
readonly creationDate: Date;
|
|
99
|
+
}
|
|
100
|
+
export declare const LocationsFromJson: Schema.transform<Schema.SchemaClass<unknown, string, never>, Schema.Array$<Schema.Struct<{
|
|
101
|
+
filePath: Schema.optional<typeof Schema.String>;
|
|
102
|
+
beforeCommitId: Schema.optional<typeof Schema.String>;
|
|
103
|
+
afterCommitId: Schema.optional<typeof Schema.String>;
|
|
104
|
+
comments: Schema.Array$<Schema.Schema<import("../../../Domain.js").CommentThreadJsonEncoded, import("../../../Domain.js").CommentThreadJsonEncoded, never>>;
|
|
105
|
+
}>>>;
|
|
106
|
+
export declare const cacheError: (op: string) => <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, CacheError, Exclude<R, import("effect/Tracer").ParentSpan>>;
|
|
107
|
+
export declare const extractComments: (locations: ReadonlyArray<typeof PRCommentLocationJson.Type>) => ReadonlyArray<CommentInfo>;
|
|
108
|
+
export declare const parseFilter: (v?: string) => ReadonlyArray<string> | undefined;
|
|
109
|
+
/** @see StatsRepo.Filters */
|
|
110
|
+
export type Filters = {
|
|
111
|
+
readonly repo?: string | undefined;
|
|
112
|
+
readonly author?: string | undefined;
|
|
113
|
+
readonly account?: string | undefined;
|
|
114
|
+
};
|
|
115
|
+
export declare const whereFilters: (sql: SqlClient.SqlClient, filters: Filters, table?: string) => {
|
|
116
|
+
repo: import("@effect/sql/Statement").Statement<import("@effect/sql/SqlConnection").Row>;
|
|
117
|
+
author: import("@effect/sql/Statement").Statement<import("@effect/sql/SqlConnection").Row>;
|
|
118
|
+
account: import("@effect/sql/Statement").Statement<import("@effect/sql/SqlConnection").Row>;
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=internal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../../../src/CacheService/repos/StatsRepo/internal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Effect, Schema } from "effect";
|
|
2
|
+
import { PRCommentLocationJson } from "../../../Domain.js";
|
|
3
|
+
import { CacheError } from "../../CacheError.js";
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Helpers
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
export const LocationsFromJson = Schema.parseJson(Schema.Array(PRCommentLocationJson));
|
|
8
|
+
export const cacheError = (op) => (effect) => effect.pipe(Effect.mapError((cause) => new CacheError({ operation: `StatsRepo.${op}`, cause })), Effect.withSpan(`StatsRepo.${op}`, { captureStackTrace: false }));
|
|
9
|
+
export const extractComments = (locations) => {
|
|
10
|
+
const result = [];
|
|
11
|
+
const walk = (threads) => {
|
|
12
|
+
for (const t of threads) {
|
|
13
|
+
result.push({ author: t.root.author, creationDate: new Date(t.root.creationDate) });
|
|
14
|
+
walk(t.replies);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
for (const loc of locations) {
|
|
18
|
+
walk(loc.comments);
|
|
19
|
+
}
|
|
20
|
+
return result;
|
|
21
|
+
};
|
|
22
|
+
export const parseFilter = (v) => v ? v.split(",").map((s) => s.trim()).filter(Boolean) : undefined;
|
|
23
|
+
export const whereFilters = (sql, filters, table) => {
|
|
24
|
+
const repos = parseFilter(filters.repo);
|
|
25
|
+
const authors = parseFilter(filters.author);
|
|
26
|
+
const accounts = parseFilter(filters.account);
|
|
27
|
+
const t = table ? `${table}.` : "";
|
|
28
|
+
return {
|
|
29
|
+
repo: repos ? sql `AND ${sql.unsafe(`${t}repository_name`)} IN ${sql.in(repos)}` : sql ``,
|
|
30
|
+
author: authors ? sql `AND ${sql.unsafe(`${t}author`)} IN ${sql.in(authors)}` : sql ``,
|
|
31
|
+
account: accounts ? sql `AND ${sql.unsafe(`${t}aws_account_id`)} IN ${sql.in(accounts)}` : sql ``
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=internal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.js","sourceRoot":"","sources":["../../../../src/CacheService/repos/StatsRepo/internal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module StatsRepo/queries
|
|
3
|
+
*
|
|
4
|
+
* Simple SQL query methods. Each function takes `sql` (SqlClient) and returns
|
|
5
|
+
* the method implementation for the StatsRepo service.
|
|
6
|
+
*
|
|
7
|
+
* @category CacheService
|
|
8
|
+
*/
|
|
9
|
+
import type * as SqlClient from "@effect/sql/SqlClient";
|
|
10
|
+
import { Effect } from "effect";
|
|
11
|
+
import { type ActivePRRow, type ContributorRow, type DiffByContributorRow, type Filters, type HealthRow, type SizeDistributionRow, type StalePRRow, type VolumeRow } from "./internal.js";
|
|
12
|
+
export declare const weeklyVolume: (sql: SqlClient.SqlClient) => (weekStart: string, weekEnd: string, filters: Filters) => Effect.Effect<VolumeRow, import("../../CacheError.ts").CacheError, never>;
|
|
13
|
+
export declare const topContributors: (sql: SqlClient.SqlClient) => (weekStart: string, weekEnd: string, filters: Filters, limit?: number) => Effect.Effect<readonly ContributorRow[], import("../../CacheError.ts").CacheError, never>;
|
|
14
|
+
export declare const mostActivePRs: (sql: SqlClient.SqlClient) => (weekStart: string, weekEnd: string, filters: Filters, limit?: number) => Effect.Effect<readonly ActivePRRow[], import("../../CacheError.ts").CacheError, never>;
|
|
15
|
+
export declare const prSizeDistribution: (sql: SqlClient.SqlClient) => (weekStart: string, weekEnd: string, filters: Filters) => Effect.Effect<SizeDistributionRow, import("../../CacheError.ts").CacheError, never>;
|
|
16
|
+
export declare const avgDiffSize: (sql: SqlClient.SqlClient) => (weekStart: string, weekEnd: string, filters: Filters) => Effect.Effect<{
|
|
17
|
+
filesAdded: number;
|
|
18
|
+
filesModified: number;
|
|
19
|
+
filesDeleted: number;
|
|
20
|
+
} | null, import("../../CacheError.ts").CacheError, never>;
|
|
21
|
+
export declare const diffSizeByContributor: (sql: SqlClient.SqlClient) => (weekStart: string, weekEnd: string, filters: Filters, limit?: number) => Effect.Effect<readonly DiffByContributorRow[], import("../../CacheError.ts").CacheError, never>;
|
|
22
|
+
export declare const stalePRs: (sql: SqlClient.SqlClient) => (nowISO: string, filters: Filters, limit?: number) => Effect.Effect<readonly StalePRRow[], import("../../CacheError.ts").CacheError, never>;
|
|
23
|
+
export declare const healthIndicators: (sql: SqlClient.SqlClient) => (weekStart: string, weekEnd: string, filters: Filters) => Effect.Effect<HealthRow, import("../../CacheError.ts").CacheError, never>;
|
|
24
|
+
export declare const filterOptions: (sql: SqlClient.SqlClient) => () => Effect.Effect<{
|
|
25
|
+
repos: string[];
|
|
26
|
+
authors: string[];
|
|
27
|
+
accounts: string[];
|
|
28
|
+
}, import("../../CacheError.ts").CacheError, never>;
|
|
29
|
+
export declare const totalComments: (sql: SqlClient.SqlClient) => (weekStart: string, weekEnd: string, filters: Filters) => Effect.Effect<number, import("../../CacheError.ts").CacheError, never>;
|
|
30
|
+
export declare const mergeTimeDetails: (sql: SqlClient.SqlClient) => (weekStart: string, weekEnd: string, filters: Filters) => Effect.Effect<{
|
|
31
|
+
prId: string;
|
|
32
|
+
prTitle: string;
|
|
33
|
+
author: string;
|
|
34
|
+
repositoryName: string;
|
|
35
|
+
awsAccountId: string;
|
|
36
|
+
durationMs: number;
|
|
37
|
+
fromLabel: string;
|
|
38
|
+
toLabel: string;
|
|
39
|
+
}[], import("../../CacheError.ts").CacheError, never>;
|
|
40
|
+
export declare const avgTimeToMerge: (sql: SqlClient.SqlClient) => (weekStart: string, weekEnd: string, filters: Filters) => Effect.Effect<number | null, import("../../CacheError.ts").CacheError, never>;
|
|
41
|
+
export declare const dataAvailableSince: (sql: SqlClient.SqlClient) => () => Effect.Effect<string | null, import("../../CacheError.ts").CacheError, never>;
|
|
42
|
+
//# sourceMappingURL=queries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../../../src/CacheService/repos/StatsRepo/queries.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,KAAK,SAAS,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EACL,KAAK,WAAW,EAGhB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EAGzB,KAAK,OAAO,EACZ,KAAK,SAAS,EAEd,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,SAAS,EAEf,MAAM,eAAe,CAAA;AAItB,eAAO,MAAM,YAAY,GAAI,KAAK,SAAS,CAAC,SAAS,MAAM,WAAW,MAAM,EAAE,SAAS,MAAM,EAAE,SAAS,OAAO,8EAc9G,CAAA;AAED,eAAO,MAAM,eAAe,GACzB,KAAK,SAAS,CAAC,SAAS,MAAM,WAAW,MAAM,EAAE,SAAS,MAAM,EAAE,SAAS,OAAO,EAAE,cAAU,8FAY9F,CAAA;AAEH,eAAO,MAAM,aAAa,GACvB,KAAK,SAAS,CAAC,SAAS,MAAM,WAAW,MAAM,EAAE,SAAS,MAAM,EAAE,SAAS,OAAO,EAAE,cAAU,2FAY9F,CAAA;AAEH,eAAO,MAAM,kBAAkB,GAC5B,KAAK,SAAS,CAAC,SAAS,MAAM,WAAW,MAAM,EAAE,SAAS,MAAM,EAAE,SAAS,OAAO,wFAiBlF,CAAA;AAEH,eAAO,MAAM,WAAW,GAAI,KAAK,SAAS,CAAC,SAAS,MAAM,WAAW,MAAM,EAAE,SAAS,MAAM,EAAE,SAAS,OAAO;;;;0DAoB7G,CAAA;AAED,eAAO,MAAM,qBAAqB,GAC/B,KAAK,SAAS,CAAC,SAAS,MAAM,WAAW,MAAM,EAAE,SAAS,MAAM,EAAE,SAAS,OAAO,EAAE,cAAU,oGAgB9F,CAAA;AAEH,eAAO,MAAM,QAAQ,GAAI,KAAK,SAAS,CAAC,SAAS,MAAM,QAAQ,MAAM,EAAE,SAAS,OAAO,EAAE,cAAU,0FAalG,CAAA;AAED,eAAO,MAAM,gBAAgB,GAC1B,KAAK,SAAS,CAAC,SAAS,MAAM,WAAW,MAAM,EAAE,SAAS,MAAM,EAAE,SAAS,OAAO,8EAelF,CAAA;AAEH,eAAO,MAAM,aAAa,GAAI,KAAK,SAAS,CAAC,SAAS;;;;mDAkBnD,CAAA;AAEH,eAAO,MAAM,aAAa,GAAI,KAAK,SAAS,CAAC,SAAS,MAAM,WAAW,MAAM,EAAE,SAAS,MAAM,EAAE,SAAS,OAAO,2EAY/G,CAAA;AAED,eAAO,MAAM,gBAAgB,GAC1B,KAAK,SAAS,CAAC,SAAS,MAAM,WAAW,MAAM,EAAE,SAAS,MAAM,EAAE,SAAS,OAAO;;;;;;;;;qDA0BlF,CAAA;AAEH,eAAO,MAAM,cAAc,GAAI,KAAK,SAAS,CAAC,SAAS,MAAM,WAAW,MAAM,EAAE,SAAS,MAAM,EAAE,SAAS,OAAO,kFAchH,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,KAAK,SAAS,CAAC,SAAS,wFAMxD,CAAA"}
|
|
@@ -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":"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"}
|
|
@@ -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"}
|