@knpkv/codecommit-core 0.5.0 → 0.6.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.
Files changed (177) hide show
  1. package/dist/AwsClient/AwsClientGated.d.ts +27 -0
  2. package/dist/AwsClient/AwsClientGated.d.ts.map +1 -0
  3. package/dist/AwsClient/AwsClientGated.js +105 -0
  4. package/dist/AwsClient/AwsClientGated.js.map +1 -0
  5. package/dist/AwsClient/getDifferences.d.ts +16 -0
  6. package/dist/AwsClient/getDifferences.d.ts.map +1 -0
  7. package/dist/AwsClient/getDifferences.js +22 -0
  8. package/dist/AwsClient/getDifferences.js.map +1 -0
  9. package/dist/AwsClient/getPullRequest.d.ts.map +1 -1
  10. package/dist/AwsClient/getPullRequest.js +26 -5
  11. package/dist/AwsClient/getPullRequest.js.map +1 -1
  12. package/dist/AwsClient/getPullRequests.d.ts.map +1 -1
  13. package/dist/AwsClient/getPullRequests.js +29 -11
  14. package/dist/AwsClient/getPullRequests.js.map +1 -1
  15. package/dist/AwsClient/index.d.ts +21 -13
  16. package/dist/AwsClient/index.d.ts.map +1 -1
  17. package/dist/AwsClient/index.js +3 -1
  18. package/dist/AwsClient/index.js.map +1 -1
  19. package/dist/AwsClient/internal.d.ts +23 -0
  20. package/dist/AwsClient/internal.d.ts.map +1 -1
  21. package/dist/AwsClient/internal.js +4 -1
  22. package/dist/AwsClient/internal.js.map +1 -1
  23. package/dist/CacheService/Database.d.ts.map +1 -1
  24. package/dist/CacheService/Database.js +13 -1
  25. package/dist/CacheService/Database.js.map +1 -1
  26. package/dist/CacheService/EventsHub.d.ts +44 -4
  27. package/dist/CacheService/EventsHub.d.ts.map +1 -1
  28. package/dist/CacheService/EventsHub.js.map +1 -1
  29. package/dist/CacheService/index.d.ts +3 -2
  30. package/dist/CacheService/index.d.ts.map +1 -1
  31. package/dist/CacheService/index.js +2 -1
  32. package/dist/CacheService/index.js.map +1 -1
  33. package/dist/CacheService/migrations/0007_stats_columns.d.ts +5 -0
  34. package/dist/CacheService/migrations/0007_stats_columns.d.ts.map +1 -0
  35. package/dist/CacheService/migrations/0007_stats_columns.js +13 -0
  36. package/dist/CacheService/migrations/0007_stats_columns.js.map +1 -0
  37. package/dist/CacheService/migrations/0008_merged_by.d.ts +5 -0
  38. package/dist/CacheService/migrations/0008_merged_by.d.ts.map +1 -0
  39. package/dist/CacheService/migrations/0008_merged_by.js +4 -0
  40. package/dist/CacheService/migrations/0008_merged_by.js.map +1 -0
  41. package/dist/CacheService/migrations/0009_approved_by.d.ts +5 -0
  42. package/dist/CacheService/migrations/0009_approved_by.d.ts.map +1 -0
  43. package/dist/CacheService/migrations/0009_approved_by.js +4 -0
  44. package/dist/CacheService/migrations/0009_approved_by.js.map +1 -0
  45. package/dist/CacheService/migrations/0010_commented_by.d.ts +5 -0
  46. package/dist/CacheService/migrations/0010_commented_by.d.ts.map +1 -0
  47. package/dist/CacheService/migrations/0010_commented_by.js +4 -0
  48. package/dist/CacheService/migrations/0010_commented_by.js.map +1 -0
  49. package/dist/CacheService/migrations/0011_audit_log.d.ts +5 -0
  50. package/dist/CacheService/migrations/0011_audit_log.d.ts.map +1 -0
  51. package/dist/CacheService/migrations/0011_audit_log.js +19 -0
  52. package/dist/CacheService/migrations/0011_audit_log.js.map +1 -0
  53. package/dist/CacheService/migrations/0012_audit_log_indexes.d.ts +5 -0
  54. package/dist/CacheService/migrations/0012_audit_log_indexes.d.ts.map +1 -0
  55. package/dist/CacheService/migrations/0012_audit_log_indexes.js +7 -0
  56. package/dist/CacheService/migrations/0012_audit_log_indexes.js.map +1 -0
  57. package/dist/CacheService/repos/PullRequestRepo/index.d.ts +132 -0
  58. package/dist/CacheService/repos/PullRequestRepo/index.d.ts.map +1 -0
  59. package/dist/CacheService/repos/PullRequestRepo/index.js +35 -0
  60. package/dist/CacheService/repos/PullRequestRepo/index.js.map +1 -0
  61. package/dist/CacheService/repos/PullRequestRepo/internal.d.ts +72 -0
  62. package/dist/CacheService/repos/PullRequestRepo/internal.d.ts.map +1 -0
  63. package/dist/CacheService/repos/PullRequestRepo/internal.js +69 -0
  64. package/dist/CacheService/repos/PullRequestRepo/internal.js.map +1 -0
  65. package/dist/CacheService/repos/PullRequestRepo/mutations.d.ts +24 -0
  66. package/dist/CacheService/repos/PullRequestRepo/mutations.d.ts.map +1 -0
  67. package/dist/CacheService/repos/PullRequestRepo/mutations.js +94 -0
  68. package/dist/CacheService/repos/PullRequestRepo/mutations.js.map +1 -0
  69. package/dist/CacheService/repos/PullRequestRepo/queries.d.ts +113 -0
  70. package/dist/CacheService/repos/PullRequestRepo/queries.d.ts.map +1 -0
  71. package/dist/CacheService/repos/PullRequestRepo/queries.js +89 -0
  72. package/dist/CacheService/repos/PullRequestRepo/queries.js.map +1 -0
  73. package/dist/CacheService/repos/StatsRepo/index.d.ts +93 -0
  74. package/dist/CacheService/repos/StatsRepo/index.d.ts.map +1 -0
  75. package/dist/CacheService/repos/StatsRepo/index.js +41 -0
  76. package/dist/CacheService/repos/StatsRepo/index.js.map +1 -0
  77. package/dist/CacheService/repos/StatsRepo/internal.d.ts +120 -0
  78. package/dist/CacheService/repos/StatsRepo/internal.d.ts.map +1 -0
  79. package/dist/CacheService/repos/StatsRepo/internal.js +34 -0
  80. package/dist/CacheService/repos/StatsRepo/internal.js.map +1 -0
  81. package/dist/CacheService/repos/StatsRepo/queries.d.ts +42 -0
  82. package/dist/CacheService/repos/StatsRepo/queries.d.ts.map +1 -0
  83. package/dist/CacheService/repos/StatsRepo/queries.js +182 -0
  84. package/dist/CacheService/repos/StatsRepo/queries.js.map +1 -0
  85. package/dist/CacheService/repos/StatsRepo/reviewerData.d.ts +47 -0
  86. package/dist/CacheService/repos/StatsRepo/reviewerData.d.ts.map +1 -0
  87. package/dist/CacheService/repos/StatsRepo/reviewerData.js +172 -0
  88. package/dist/CacheService/repos/StatsRepo/reviewerData.js.map +1 -0
  89. package/dist/DateUtils.d.ts +28 -0
  90. package/dist/DateUtils.d.ts.map +1 -1
  91. package/dist/DateUtils.js +69 -1
  92. package/dist/DateUtils.js.map +1 -1
  93. package/dist/Domain.d.ts +13 -3
  94. package/dist/Domain.d.ts.map +1 -1
  95. package/dist/Domain.js +6 -5
  96. package/dist/Domain.js.map +1 -1
  97. package/dist/Errors.d.ts +14 -1
  98. package/dist/Errors.d.ts.map +1 -1
  99. package/dist/Errors.js +10 -0
  100. package/dist/Errors.js.map +1 -1
  101. package/dist/PRService/index.d.ts +3 -3
  102. package/dist/PRService/index.d.ts.map +1 -1
  103. package/dist/PRService/index.js +1 -1
  104. package/dist/PRService/index.js.map +1 -1
  105. package/dist/PRService/internal.d.ts +24 -2
  106. package/dist/PRService/internal.d.ts.map +1 -1
  107. package/dist/PRService/internal.js +23 -8
  108. package/dist/PRService/internal.js.map +1 -1
  109. package/dist/PRService/refresh.d.ts +1 -1
  110. package/dist/PRService/refresh.d.ts.map +1 -1
  111. package/dist/PRService/refresh.js +2 -0
  112. package/dist/PRService/refresh.js.map +1 -1
  113. package/dist/PRService/refreshDiffs.d.ts +16 -0
  114. package/dist/PRService/refreshDiffs.d.ts.map +1 -0
  115. package/dist/PRService/refreshDiffs.js +54 -0
  116. package/dist/PRService/refreshDiffs.js.map +1 -0
  117. package/dist/PRService/refreshEnrich.d.ts +1 -1
  118. package/dist/PRService/refreshEnrich.d.ts.map +1 -1
  119. package/dist/PRService/refreshEnrich.js +3 -1
  120. package/dist/PRService/refreshEnrich.js.map +1 -1
  121. package/dist/PRService/refreshFetch.d.ts +1 -1
  122. package/dist/PRService/refreshFetch.d.ts.map +1 -1
  123. package/dist/PRService/refreshFetch.js +12 -3
  124. package/dist/PRService/refreshFetch.js.map +1 -1
  125. package/dist/PRService/refreshHistory.d.ts +19 -0
  126. package/dist/PRService/refreshHistory.d.ts.map +1 -0
  127. package/dist/PRService/refreshHistory.js +110 -0
  128. package/dist/PRService/refreshHistory.js.map +1 -0
  129. package/dist/PRService/refreshResolve.d.ts +1 -1
  130. package/dist/PRService/refreshResolve.d.ts.map +1 -1
  131. package/dist/PRService/refreshResolve.js +1 -1
  132. package/dist/PRService/refreshResolve.js.map +1 -1
  133. package/dist/PRService/refreshScore.d.ts +1 -1
  134. package/dist/PRService/refreshScore.d.ts.map +1 -1
  135. package/dist/PRService/refreshScore.js +1 -1
  136. package/dist/PRService/refreshScore.js.map +1 -1
  137. package/dist/PRService/refreshSinglePR.d.ts +1 -1
  138. package/dist/PRService/refreshSinglePR.d.ts.map +1 -1
  139. package/dist/PRService/refreshSinglePR.js +4 -3
  140. package/dist/PRService/refreshSinglePR.js.map +1 -1
  141. package/dist/PermissionService/AuditLog.d.ts +62 -0
  142. package/dist/PermissionService/AuditLog.d.ts.map +1 -0
  143. package/dist/PermissionService/AuditLog.js +113 -0
  144. package/dist/PermissionService/AuditLog.js.map +1 -0
  145. package/dist/PermissionService/PermissionGate.d.ts +47 -0
  146. package/dist/PermissionService/PermissionGate.d.ts.map +1 -0
  147. package/dist/PermissionService/PermissionGate.js +14 -0
  148. package/dist/PermissionService/PermissionGate.js.map +1 -0
  149. package/dist/PermissionService/PermissionGateLive.d.ts +41 -0
  150. package/dist/PermissionService/PermissionGateLive.d.ts.map +1 -0
  151. package/dist/PermissionService/PermissionGateLive.js +83 -0
  152. package/dist/PermissionService/PermissionGateLive.js.map +1 -0
  153. package/dist/PermissionService/index.d.ts +39 -0
  154. package/dist/PermissionService/index.d.ts.map +1 -0
  155. package/dist/PermissionService/index.js +87 -0
  156. package/dist/PermissionService/index.js.map +1 -0
  157. package/dist/PermissionService/operations.d.ts +40 -0
  158. package/dist/PermissionService/operations.d.ts.map +1 -0
  159. package/dist/PermissionService/operations.js +38 -0
  160. package/dist/PermissionService/operations.js.map +1 -0
  161. package/dist/StatsService/WeeklyStats.d.ts +174 -0
  162. package/dist/StatsService/WeeklyStats.d.ts.map +1 -0
  163. package/dist/StatsService/WeeklyStats.js +110 -0
  164. package/dist/StatsService/WeeklyStats.js.map +1 -0
  165. package/dist/StatsService/index.d.ts +45 -0
  166. package/dist/StatsService/index.d.ts.map +1 -0
  167. package/dist/StatsService/index.js +145 -0
  168. package/dist/StatsService/index.js.map +1 -0
  169. package/dist/index.d.ts +2 -0
  170. package/dist/index.d.ts.map +1 -1
  171. package/dist/index.js +2 -0
  172. package/dist/index.js.map +1 -1
  173. package/package.json +1 -1
  174. package/dist/CacheService/repos/PullRequestRepo.d.ts +0 -112
  175. package/dist/CacheService/repos/PullRequestRepo.d.ts.map +0 -1
  176. package/dist/CacheService/repos/PullRequestRepo.js +0 -146
  177. package/dist/CacheService/repos/PullRequestRepo.js.map +0 -1
@@ -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"}