@knpkv/codecommit-core 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/dist/AwsClient/getDifferences.d.ts +16 -0
  2. package/dist/AwsClient/getDifferences.d.ts.map +1 -0
  3. package/dist/AwsClient/getDifferences.js +22 -0
  4. package/dist/AwsClient/getDifferences.js.map +1 -0
  5. package/dist/AwsClient/getPullRequest.d.ts.map +1 -1
  6. package/dist/AwsClient/getPullRequest.js +26 -5
  7. package/dist/AwsClient/getPullRequest.js.map +1 -1
  8. package/dist/AwsClient/getPullRequests.d.ts.map +1 -1
  9. package/dist/AwsClient/getPullRequests.js +29 -11
  10. package/dist/AwsClient/getPullRequests.js.map +1 -1
  11. package/dist/AwsClient/index.d.ts +21 -13
  12. package/dist/AwsClient/index.d.ts.map +1 -1
  13. package/dist/AwsClient/index.js +3 -1
  14. package/dist/AwsClient/index.js.map +1 -1
  15. package/dist/AwsClient/internal.d.ts +23 -0
  16. package/dist/AwsClient/internal.d.ts.map +1 -1
  17. package/dist/AwsClient/internal.js +4 -1
  18. package/dist/AwsClient/internal.js.map +1 -1
  19. package/dist/CacheService/Database.d.ts.map +1 -1
  20. package/dist/CacheService/Database.js +9 -1
  21. package/dist/CacheService/Database.js.map +1 -1
  22. package/dist/CacheService/index.d.ts +3 -2
  23. package/dist/CacheService/index.d.ts.map +1 -1
  24. package/dist/CacheService/index.js +2 -1
  25. package/dist/CacheService/index.js.map +1 -1
  26. package/dist/CacheService/migrations/0007_stats_columns.d.ts +5 -0
  27. package/dist/CacheService/migrations/0007_stats_columns.d.ts.map +1 -0
  28. package/dist/CacheService/migrations/0007_stats_columns.js +13 -0
  29. package/dist/CacheService/migrations/0007_stats_columns.js.map +1 -0
  30. package/dist/CacheService/migrations/0008_merged_by.d.ts +5 -0
  31. package/dist/CacheService/migrations/0008_merged_by.d.ts.map +1 -0
  32. package/dist/CacheService/migrations/0008_merged_by.js +4 -0
  33. package/dist/CacheService/migrations/0008_merged_by.js.map +1 -0
  34. package/dist/CacheService/migrations/0009_approved_by.d.ts +5 -0
  35. package/dist/CacheService/migrations/0009_approved_by.d.ts.map +1 -0
  36. package/dist/CacheService/migrations/0009_approved_by.js +4 -0
  37. package/dist/CacheService/migrations/0009_approved_by.js.map +1 -0
  38. package/dist/CacheService/migrations/0010_commented_by.d.ts +5 -0
  39. package/dist/CacheService/migrations/0010_commented_by.d.ts.map +1 -0
  40. package/dist/CacheService/migrations/0010_commented_by.js +4 -0
  41. package/dist/CacheService/migrations/0010_commented_by.js.map +1 -0
  42. package/dist/CacheService/repos/PullRequestRepo/index.d.ts +132 -0
  43. package/dist/CacheService/repos/PullRequestRepo/index.d.ts.map +1 -0
  44. package/dist/CacheService/repos/PullRequestRepo/index.js +35 -0
  45. package/dist/CacheService/repos/PullRequestRepo/index.js.map +1 -0
  46. package/dist/CacheService/repos/PullRequestRepo/internal.d.ts +72 -0
  47. package/dist/CacheService/repos/PullRequestRepo/internal.d.ts.map +1 -0
  48. package/dist/CacheService/repos/PullRequestRepo/internal.js +69 -0
  49. package/dist/CacheService/repos/PullRequestRepo/internal.js.map +1 -0
  50. package/dist/CacheService/repos/PullRequestRepo/mutations.d.ts +24 -0
  51. package/dist/CacheService/repos/PullRequestRepo/mutations.d.ts.map +1 -0
  52. package/dist/CacheService/repos/PullRequestRepo/mutations.js +94 -0
  53. package/dist/CacheService/repos/PullRequestRepo/mutations.js.map +1 -0
  54. package/dist/CacheService/repos/PullRequestRepo/queries.d.ts +113 -0
  55. package/dist/CacheService/repos/PullRequestRepo/queries.d.ts.map +1 -0
  56. package/dist/CacheService/repos/PullRequestRepo/queries.js +89 -0
  57. package/dist/CacheService/repos/PullRequestRepo/queries.js.map +1 -0
  58. package/dist/CacheService/repos/StatsRepo/index.d.ts +93 -0
  59. package/dist/CacheService/repos/StatsRepo/index.d.ts.map +1 -0
  60. package/dist/CacheService/repos/StatsRepo/index.js +41 -0
  61. package/dist/CacheService/repos/StatsRepo/index.js.map +1 -0
  62. package/dist/CacheService/repos/StatsRepo/internal.d.ts +120 -0
  63. package/dist/CacheService/repos/StatsRepo/internal.d.ts.map +1 -0
  64. package/dist/CacheService/repos/StatsRepo/internal.js +34 -0
  65. package/dist/CacheService/repos/StatsRepo/internal.js.map +1 -0
  66. package/dist/CacheService/repos/StatsRepo/queries.d.ts +42 -0
  67. package/dist/CacheService/repos/StatsRepo/queries.d.ts.map +1 -0
  68. package/dist/CacheService/repos/StatsRepo/queries.js +182 -0
  69. package/dist/CacheService/repos/StatsRepo/queries.js.map +1 -0
  70. package/dist/CacheService/repos/StatsRepo/reviewerData.d.ts +47 -0
  71. package/dist/CacheService/repos/StatsRepo/reviewerData.d.ts.map +1 -0
  72. package/dist/CacheService/repos/StatsRepo/reviewerData.js +172 -0
  73. package/dist/CacheService/repos/StatsRepo/reviewerData.js.map +1 -0
  74. package/dist/DateUtils.d.ts +28 -0
  75. package/dist/DateUtils.d.ts.map +1 -1
  76. package/dist/DateUtils.js +69 -1
  77. package/dist/DateUtils.js.map +1 -1
  78. package/dist/Domain.d.ts +13 -3
  79. package/dist/Domain.d.ts.map +1 -1
  80. package/dist/Domain.js +6 -5
  81. package/dist/Domain.js.map +1 -1
  82. package/dist/PRService/index.d.ts +3 -3
  83. package/dist/PRService/index.d.ts.map +1 -1
  84. package/dist/PRService/index.js +1 -1
  85. package/dist/PRService/index.js.map +1 -1
  86. package/dist/PRService/internal.d.ts +24 -2
  87. package/dist/PRService/internal.d.ts.map +1 -1
  88. package/dist/PRService/internal.js +23 -8
  89. package/dist/PRService/internal.js.map +1 -1
  90. package/dist/PRService/refresh.d.ts +1 -1
  91. package/dist/PRService/refresh.d.ts.map +1 -1
  92. package/dist/PRService/refresh.js +2 -0
  93. package/dist/PRService/refresh.js.map +1 -1
  94. package/dist/PRService/refreshDiffs.d.ts +16 -0
  95. package/dist/PRService/refreshDiffs.d.ts.map +1 -0
  96. package/dist/PRService/refreshDiffs.js +54 -0
  97. package/dist/PRService/refreshDiffs.js.map +1 -0
  98. package/dist/PRService/refreshEnrich.d.ts +1 -1
  99. package/dist/PRService/refreshEnrich.d.ts.map +1 -1
  100. package/dist/PRService/refreshEnrich.js +3 -1
  101. package/dist/PRService/refreshEnrich.js.map +1 -1
  102. package/dist/PRService/refreshFetch.d.ts +1 -1
  103. package/dist/PRService/refreshFetch.d.ts.map +1 -1
  104. package/dist/PRService/refreshFetch.js +12 -3
  105. package/dist/PRService/refreshFetch.js.map +1 -1
  106. package/dist/PRService/refreshHistory.d.ts +19 -0
  107. package/dist/PRService/refreshHistory.d.ts.map +1 -0
  108. package/dist/PRService/refreshHistory.js +110 -0
  109. package/dist/PRService/refreshHistory.js.map +1 -0
  110. package/dist/PRService/refreshResolve.d.ts +1 -1
  111. package/dist/PRService/refreshResolve.d.ts.map +1 -1
  112. package/dist/PRService/refreshResolve.js +1 -1
  113. package/dist/PRService/refreshResolve.js.map +1 -1
  114. package/dist/PRService/refreshScore.d.ts +1 -1
  115. package/dist/PRService/refreshScore.d.ts.map +1 -1
  116. package/dist/PRService/refreshScore.js +1 -1
  117. package/dist/PRService/refreshScore.js.map +1 -1
  118. package/dist/PRService/refreshSinglePR.d.ts +1 -1
  119. package/dist/PRService/refreshSinglePR.d.ts.map +1 -1
  120. package/dist/PRService/refreshSinglePR.js +4 -3
  121. package/dist/PRService/refreshSinglePR.js.map +1 -1
  122. package/dist/StatsService/WeeklyStats.d.ts +174 -0
  123. package/dist/StatsService/WeeklyStats.d.ts.map +1 -0
  124. package/dist/StatsService/WeeklyStats.js +110 -0
  125. package/dist/StatsService/WeeklyStats.js.map +1 -0
  126. package/dist/StatsService/index.d.ts +45 -0
  127. package/dist/StatsService/index.d.ts.map +1 -0
  128. package/dist/StatsService/index.js +145 -0
  129. package/dist/StatsService/index.js.map +1 -0
  130. package/dist/index.d.ts +1 -0
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.js +1 -0
  133. package/dist/index.js.map +1 -1
  134. package/package.json +1 -1
  135. package/dist/CacheService/repos/PullRequestRepo.d.ts +0 -112
  136. package/dist/CacheService/repos/PullRequestRepo.d.ts.map +0 -1
  137. package/dist/CacheService/repos/PullRequestRepo.js +0 -146
  138. package/dist/CacheService/repos/PullRequestRepo.js.map +0 -1
@@ -0,0 +1,145 @@
1
+ /**
2
+ * @module StatsService
3
+ *
4
+ * Mental model: this is an **orchestration layer** — it doesn't own data,
5
+ * it assembles a `WeeklyStats` view-model by fanning out to StatsRepo
6
+ * queries and reviewer analysis in parallel, then shaping the results for
7
+ * the client.
8
+ *
9
+ * - All repo queries run with `{ concurrency: "unbounded" }` for max throughput.
10
+ * - `getWeeklyStats` is a read path; `syncWeek` is a write path that back-fills
11
+ * historical PR data into the cache.
12
+ * - A `catchAll` fallback returns an empty `WeeklyStats` so the UI always gets
13
+ * a valid response, even when the cache is cold.
14
+ *
15
+ * @category Service
16
+ */
17
+ import { Data, Effect, Layer, Option } from "effect";
18
+ import { AwsClient } from "../AwsClient/index.js";
19
+ import { PullRequestRepo } from "../CacheService/repos/PullRequestRepo/index.js";
20
+ import { StatsRepo } from "../CacheService/repos/StatsRepo/index.js";
21
+ import { ConfigService } from "../ConfigService/index.js";
22
+ import { median, parseISOWeek, toISOWeek } from "../DateUtils.js";
23
+ import { syncWeek as syncWeekImpl } from "../PRService/refreshHistory.js";
24
+ export { WeeklyStats } from "./WeeklyStats.js";
25
+ class InvalidISOWeek extends Data.TaggedError("InvalidISOWeek") {
26
+ }
27
+ // ---------------------------------------------------------------------------
28
+ // Service
29
+ // ---------------------------------------------------------------------------
30
+ export class StatsService extends Effect.Service()("@knpkv/codecommit-core/StatsService", {
31
+ effect: Effect.gen(function* () {
32
+ const statsRepo = yield* StatsRepo;
33
+ const prRepo = yield* PullRequestRepo;
34
+ const configService = yield* ConfigService;
35
+ const awsClient = yield* AwsClient;
36
+ const depsLayer = Layer.mergeAll(Layer.succeed(ConfigService, configService), Layer.succeed(AwsClient, awsClient), Layer.succeed(PullRequestRepo, prRepo));
37
+ const getWeeklyStats = Effect.fn("StatsService.getWeeklyStats")(function* (week, filters) {
38
+ const range = yield* Option.match(parseISOWeek(week), {
39
+ onNone: () => Effect.fail(new InvalidISOWeek({ week })),
40
+ onSome: Effect.succeed
41
+ });
42
+ const weekStart = range.start.toISOString();
43
+ const weekEnd = range.end.toISOString();
44
+ const nowISO = new Date().toISOString();
45
+ const [volume, topContributors, mostActivePRs, prSizeDistribution, avgDiffSize, diffSizeByContributor, stalePRs, health, filterOptions, totalComments, reviewerData, mergeTimeDetails, dataAvailableSince] = yield* Effect.all([
46
+ statsRepo.weeklyVolume(weekStart, weekEnd, filters),
47
+ statsRepo.topContributors(weekStart, weekEnd, filters),
48
+ statsRepo.mostActivePRs(weekStart, weekEnd, filters),
49
+ statsRepo.prSizeDistribution(weekStart, weekEnd, filters),
50
+ statsRepo.avgDiffSize(weekStart, weekEnd, filters),
51
+ statsRepo.diffSizeByContributor(weekStart, weekEnd, filters),
52
+ statsRepo.stalePRs(nowISO, filters),
53
+ statsRepo.healthIndicators(weekStart, weekEnd, filters),
54
+ statsRepo.filterOptions(),
55
+ statsRepo.totalComments(weekStart, weekEnd, filters),
56
+ statsRepo.reviewerData(weekStart, weekEnd, filters),
57
+ statsRepo.mergeTimeDetails(weekStart, weekEnd, filters),
58
+ statsRepo.dataAvailableSince()
59
+ ], { concurrency: "unbounded" });
60
+ const reviewCoverage = health.total > 0 ? health.withComments / health.total : null;
61
+ const approvalRate = health.total > 0 ? health.approved / health.total : null;
62
+ const busFactor = topContributors.length > 0
63
+ ? {
64
+ topContributorShare: volume.prsCreated > 0 ? topContributors[0].prCount / volume.prsCreated : 0,
65
+ uniqueContributors: topContributors.length
66
+ }
67
+ : null;
68
+ return {
69
+ week,
70
+ weekStart,
71
+ weekEnd,
72
+ dataAvailableSince,
73
+ prsCreated: volume.prsCreated,
74
+ prsMerged: volume.prsMerged,
75
+ prsClosed: volume.prsClosed,
76
+ totalComments,
77
+ topContributors: [...topContributors],
78
+ topReviewers: reviewerData.topReviewers,
79
+ topApprovers: reviewerData.topApprovers,
80
+ medianTimeToMerge: median(mergeTimeDetails.map((d) => d.durationMs)),
81
+ medianTimeToFirstReview: median(reviewerData.firstReviewDetails.map((d) => d.durationMs)),
82
+ medianTimeToAddressFeedback: median(reviewerData.feedbackDetails.map((d) => d.durationMs)),
83
+ mergeTimeDetails: [...mergeTimeDetails].sort((a, b) => b.durationMs - a.durationMs),
84
+ firstReviewDetails: [...reviewerData.firstReviewDetails].sort((a, b) => b.durationMs - a.durationMs),
85
+ feedbackDetails: [...reviewerData.feedbackDetails].sort((a, b) => b.durationMs - a.durationMs),
86
+ mostActivePRs: mostActivePRs.map((p) => ({
87
+ ...p,
88
+ commentCount: p.commentCount ?? 0
89
+ })),
90
+ prSizeDistribution,
91
+ avgDiffSize,
92
+ diffSizeByContributor: [...diffSizeByContributor],
93
+ stalePRs: [...stalePRs],
94
+ reviewCoverage,
95
+ approvalRate,
96
+ busFactor,
97
+ availableRepos: filterOptions.repos,
98
+ availableAuthors: filterOptions.authors,
99
+ availableAccounts: filterOptions.accounts
100
+ };
101
+ });
102
+ return {
103
+ getWeeklyStats: (week, filters) => {
104
+ const fallback = {
105
+ week,
106
+ weekStart: "",
107
+ weekEnd: "",
108
+ dataAvailableSince: null,
109
+ prsCreated: 0,
110
+ prsMerged: 0,
111
+ prsClosed: 0,
112
+ totalComments: 0,
113
+ topContributors: [],
114
+ topReviewers: [],
115
+ topApprovers: [],
116
+ medianTimeToMerge: null,
117
+ medianTimeToFirstReview: null,
118
+ medianTimeToAddressFeedback: null,
119
+ mergeTimeDetails: [],
120
+ firstReviewDetails: [],
121
+ feedbackDetails: [],
122
+ mostActivePRs: [],
123
+ prSizeDistribution: { small: 0, medium: 0, large: 0, extraLarge: 0 },
124
+ avgDiffSize: null,
125
+ diffSizeByContributor: [],
126
+ stalePRs: [],
127
+ reviewCoverage: null,
128
+ approvalRate: null,
129
+ busFactor: null,
130
+ availableRepos: [],
131
+ availableAuthors: [],
132
+ availableAccounts: []
133
+ };
134
+ return getWeeklyStats(week, filters).pipe(Effect.catchTags({
135
+ CacheError: (e) => Effect.logWarning("StatsService.getWeeklyStats failed", e).pipe(Effect.as(fallback)),
136
+ InvalidISOWeek: (e) => Effect.logWarning("StatsService.getWeeklyStats failed", e).pipe(Effect.as(fallback))
137
+ }));
138
+ },
139
+ syncWeek: (week, state) => syncWeekImpl(state, week).pipe(Effect.provide(depsLayer)),
140
+ currentWeek: () => toISOWeek(new Date())
141
+ };
142
+ })
143
+ }) {
144
+ }
145
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/StatsService/index.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -22,6 +22,7 @@ export * as Domain from "./Domain.js";
22
22
  export * as Errors from "./Errors.js";
23
23
  export * as PRService from "./PRService/index.js";
24
24
  export * as SandboxService from "./SandboxService/index.js";
25
+ export * as StatsService from "./StatsService/index.js";
25
26
  export { Registry } from "@effect-atom/atom";
26
27
  export { Reactivity } from "@effect/experimental";
27
28
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,YAAY,MAAM,yBAAyB,CAAA;AACvD,OAAO,KAAK,aAAa,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,cAAc,MAAM,2BAA2B,CAAA;AAG3D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,YAAY,MAAM,yBAAyB,CAAA;AACvD,OAAO,KAAK,aAAa,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,cAAc,MAAM,2BAA2B,CAAA;AAC3D,OAAO,KAAK,YAAY,MAAM,yBAAyB,CAAA;AAGvD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA"}
package/dist/index.js CHANGED
@@ -22,6 +22,7 @@ export * as Domain from "./Domain.js";
22
22
  export * as Errors from "./Errors.js";
23
23
  export * as PRService from "./PRService/index.js";
24
24
  export * as SandboxService from "./SandboxService/index.js";
25
+ export * as StatsService from "./StatsService/index.js";
25
26
  // Re-export Effect dependencies for convenience
26
27
  export { Registry } from "@effect-atom/atom";
27
28
  export { Reactivity } from "@effect/experimental";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,YAAY,MAAM,yBAAyB,CAAA;AACvD,OAAO,KAAK,aAAa,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,cAAc,MAAM,2BAA2B,CAAA;AAE3D,gDAAgD;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,YAAY,MAAM,yBAAyB,CAAA;AACvD,OAAO,KAAK,aAAa,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,cAAc,MAAM,2BAA2B,CAAA;AAC3D,OAAO,KAAK,YAAY,MAAM,yBAAyB,CAAA;AAEvD,gDAAgD;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knpkv/codecommit-core",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
4
4
  "description": "Core logic for CodeCommit PR browser",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,112 +0,0 @@
1
- import * as Model from "@effect/sql/Model";
2
- import * as SqlClient from "@effect/sql/SqlClient";
3
- import { Effect, Option, Schema } from "effect";
4
- import { CacheError } from "../CacheError.js";
5
- import { EventsHub } from "../EventsHub.js";
6
- export declare const CachedPullRequest: Schema.Struct<{
7
- id: Schema.brand<typeof Schema.String, "PullRequestId">;
8
- awsAccountId: typeof Schema.String;
9
- accountProfile: Schema.brand<typeof Schema.String, "AwsProfileName">;
10
- accountRegion: Schema.brand<typeof Schema.String, "AwsRegion">;
11
- title: typeof Schema.String;
12
- description: Schema.NullOr<typeof Schema.String>;
13
- author: typeof Schema.String;
14
- repositoryName: Schema.brand<typeof Schema.String, "RepositoryName">;
15
- creationDate: typeof Schema.DateFromString;
16
- lastModifiedDate: typeof Schema.DateFromString;
17
- status: Schema.Literal<["OPEN", "CLOSED", "MERGED"]>;
18
- sourceBranch: typeof Schema.String;
19
- destinationBranch: typeof Schema.String;
20
- isMergeable: typeof Model.BooleanFromNumber;
21
- isApproved: typeof Model.BooleanFromNumber;
22
- commentCount: Schema.NullOr<typeof Schema.Number>;
23
- healthScore: Schema.NullOr<typeof Schema.Number>;
24
- link: typeof Schema.String;
25
- fetchedAt: typeof Schema.String;
26
- }>;
27
- export type CachedPullRequest = typeof CachedPullRequest.Type;
28
- export interface SearchResult {
29
- readonly items: ReadonlyArray<CachedPullRequest>;
30
- readonly total: number;
31
- readonly hasMore: boolean;
32
- }
33
- export declare const UpsertInput: Schema.Struct<{
34
- id: typeof Schema.String;
35
- awsAccountId: typeof Schema.String;
36
- accountProfile: typeof Schema.String;
37
- accountRegion: typeof Schema.String;
38
- title: typeof Schema.String;
39
- description: Schema.NullOr<typeof Schema.String>;
40
- author: typeof Schema.String;
41
- repositoryName: typeof Schema.String;
42
- creationDate: typeof Schema.String;
43
- lastModifiedDate: typeof Schema.String;
44
- status: typeof Schema.String;
45
- sourceBranch: typeof Schema.String;
46
- destinationBranch: typeof Schema.String;
47
- isMergeable: typeof Schema.Number;
48
- isApproved: typeof Schema.Number;
49
- commentCount: Schema.NullOr<typeof Schema.Number>;
50
- link: typeof Schema.String;
51
- }>;
52
- export type UpsertInput = typeof UpsertInput.Type;
53
- declare const PullRequestRepo_base: Effect.Service.Class<PullRequestRepo, "PullRequestRepo", {
54
- 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>, import("effect/Layer").Layer<EventsHub, never, never>];
55
- readonly effect: Effect.Effect<{
56
- readonly findAll: () => Effect.Effect<readonly {
57
- readonly link: string;
58
- readonly awsAccountId: string;
59
- readonly id: string & import("effect/Brand").Brand<"PullRequestId">;
60
- readonly title: string;
61
- readonly author: string;
62
- readonly repositoryName: string & import("effect/Brand").Brand<"RepositoryName">;
63
- readonly creationDate: Date;
64
- readonly lastModifiedDate: Date;
65
- readonly status: "OPEN" | "CLOSED" | "MERGED";
66
- readonly sourceBranch: string;
67
- readonly destinationBranch: string;
68
- readonly isMergeable: boolean;
69
- readonly isApproved: boolean;
70
- readonly description: string | null;
71
- readonly commentCount: number | null;
72
- readonly healthScore: number | null;
73
- readonly fetchedAt: string;
74
- readonly accountProfile: string & import("effect/Brand").Brand<"AwsProfileName">;
75
- readonly accountRegion: string & import("effect/Brand").Brand<"AwsRegion">;
76
- }[], CacheError, never>;
77
- readonly findByAccountAndId: (awsAccountId: string, id: string) => Effect.Effect<Option.Option<{
78
- readonly link: string;
79
- readonly awsAccountId: string;
80
- readonly id: string & import("effect/Brand").Brand<"PullRequestId">;
81
- readonly title: string;
82
- readonly author: string;
83
- readonly repositoryName: string & import("effect/Brand").Brand<"RepositoryName">;
84
- readonly creationDate: Date;
85
- readonly lastModifiedDate: Date;
86
- readonly status: "OPEN" | "CLOSED" | "MERGED";
87
- readonly sourceBranch: string;
88
- readonly destinationBranch: string;
89
- readonly isMergeable: boolean;
90
- readonly isApproved: boolean;
91
- readonly description: string | null;
92
- readonly commentCount: number | null;
93
- readonly healthScore: number | null;
94
- readonly fetchedAt: string;
95
- readonly accountProfile: string & import("effect/Brand").Brand<"AwsProfileName">;
96
- readonly accountRegion: string & import("effect/Brand").Brand<"AwsRegion">;
97
- }>, CacheError, never>;
98
- readonly upsert: (input: UpsertInput) => Effect.Effect<void, CacheError, never>;
99
- readonly upsertMany: (prs: ReadonlyArray<UpsertInput>) => Effect.Effect<void, CacheError, never>;
100
- readonly search: (query: string, opts?: {
101
- readonly limit?: number;
102
- readonly offset?: number;
103
- }) => Effect.Effect<SearchResult, CacheError>;
104
- readonly deleteStale: (olderThan: string) => Effect.Effect<void, CacheError, never>;
105
- readonly updateCommentCount: (awsAccountId: string, id: string, count: number | null) => Effect.Effect<void, CacheError, never>;
106
- readonly updateHealthScore: (awsAccountId: string, id: string, score: number) => Effect.Effect<void, CacheError, never>;
107
- }, never, SqlClient.SqlClient | EventsHub>;
108
- }>;
109
- export declare class PullRequestRepo extends PullRequestRepo_base {
110
- }
111
- export {};
112
- //# sourceMappingURL=PullRequestRepo.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PullRequestRepo.d.ts","sourceRoot":"","sources":["../../../src/CacheService/repos/PullRequestRepo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,mBAAmB,CAAA;AAC1C,OAAO,KAAK,SAAS,MAAM,uBAAuB,CAAA;AAElD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,SAAS,EAAc,MAAM,iBAAiB,CAAA;AAEvD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;EAoB5B,CAAA;AAEF,MAAM,MAAM,iBAAiB,GAAG,OAAO,iBAAiB,CAAC,IAAI,CAAA;AAE7D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAA;IAChD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAC1B;AAED,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;EAkBtB,CAAA;AAEF,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,IAAI,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;oDAqGR,MAAM,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;iCAErC,WAAW;mCACT,aAAa,CAAC,WAAW,CAAC;iCAGnC,MAAM,SACN;YAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,KAC3D,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC;0CAoBjB,MAAM;oDAEI,MAAM,MAAM,MAAM,SAAS,MAAM,GAAG,IAAI;mDAEzC,MAAM,MAAM,MAAM,SAAS,MAAM;;;AA7HzE,qBAAa,eAAgB,SAAQ,oBAiInC;CAAG"}
@@ -1,146 +0,0 @@
1
- import * as Model from "@effect/sql/Model";
2
- import * as SqlClient from "@effect/sql/SqlClient";
3
- import * as SqlSchema from "@effect/sql/SqlSchema";
4
- import { Effect, Option, Schema } from "effect";
5
- import { AwsProfileName, AwsRegion, PullRequestId, PullRequestStatus, RepositoryName } from "../../Domain.js";
6
- import { CacheError } from "../CacheError.js";
7
- import { DatabaseLive } from "../Database.js";
8
- import { EventsHub, RepoChange } from "../EventsHub.js";
9
- export const CachedPullRequest = Schema.Struct({
10
- id: PullRequestId,
11
- awsAccountId: Schema.String,
12
- accountProfile: AwsProfileName,
13
- accountRegion: AwsRegion,
14
- title: Schema.String,
15
- description: Schema.NullOr(Schema.String),
16
- author: Schema.String,
17
- repositoryName: RepositoryName,
18
- creationDate: Schema.DateFromString,
19
- lastModifiedDate: Schema.DateFromString,
20
- status: PullRequestStatus,
21
- sourceBranch: Schema.String,
22
- destinationBranch: Schema.String,
23
- isMergeable: Model.BooleanFromNumber,
24
- isApproved: Model.BooleanFromNumber,
25
- commentCount: Schema.NullOr(Schema.Number),
26
- healthScore: Schema.NullOr(Schema.Number),
27
- link: Schema.String,
28
- fetchedAt: Schema.String
29
- });
30
- export const UpsertInput = Schema.Struct({
31
- id: Schema.String,
32
- awsAccountId: Schema.String,
33
- accountProfile: Schema.String,
34
- accountRegion: Schema.String,
35
- title: Schema.String,
36
- description: Schema.NullOr(Schema.String),
37
- author: Schema.String,
38
- repositoryName: Schema.String,
39
- creationDate: Schema.String,
40
- lastModifiedDate: Schema.String,
41
- status: Schema.String,
42
- sourceBranch: Schema.String,
43
- destinationBranch: Schema.String,
44
- isMergeable: Schema.Number,
45
- isApproved: Schema.Number,
46
- commentCount: Schema.NullOr(Schema.Number),
47
- link: Schema.String
48
- });
49
- const cacheError = (op) => (effect) => effect.pipe(Effect.mapError((cause) => new CacheError({ operation: `PullRequestRepo.${op}`, cause })), Effect.withSpan(`PullRequestRepo.${op}`, { captureStackTrace: false }));
50
- export class PullRequestRepo extends Effect.Service()("PullRequestRepo", {
51
- dependencies: [DatabaseLive, EventsHub.Default],
52
- effect: Effect.gen(function* () {
53
- const sql = yield* SqlClient.SqlClient;
54
- const hub = yield* EventsHub;
55
- const findAll_ = SqlSchema.findAll({
56
- Result: CachedPullRequest,
57
- Request: Schema.Void,
58
- execute: () => sql `SELECT * FROM pull_requests ORDER BY creation_date DESC`
59
- });
60
- const findByAccountAndId_ = SqlSchema.findOne({
61
- Result: CachedPullRequest,
62
- Request: Schema.Struct({ awsAccountId: Schema.String, id: Schema.String }),
63
- execute: (req) => sql `SELECT * FROM pull_requests
64
- WHERE aws_account_id = ${req.awsAccountId} AND id = ${req.id}`
65
- });
66
- const upsert_ = SqlSchema.void({
67
- Request: UpsertInput,
68
- execute: (req) => sql `INSERT INTO pull_requests
69
- (id, aws_account_id, account_profile, account_region, title, description,
70
- author, repository_name, creation_date, last_modified_date, status,
71
- source_branch, destination_branch, is_mergeable, is_approved,
72
- comment_count, link, fetched_at)
73
- VALUES (${req.id}, ${req.awsAccountId}, ${req.accountProfile}, ${req.accountRegion},
74
- ${req.title}, ${req.description}, ${req.author}, ${req.repositoryName},
75
- ${req.creationDate}, ${req.lastModifiedDate}, ${req.status},
76
- ${req.sourceBranch}, ${req.destinationBranch}, ${req.isMergeable}, ${req.isApproved},
77
- ${req.commentCount}, ${req.link}, strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))
78
- ON CONFLICT (aws_account_id, id) DO UPDATE SET
79
- account_profile = excluded.account_profile,
80
- account_region = excluded.account_region,
81
- title = excluded.title,
82
- description = excluded.description,
83
- author = excluded.author,
84
- repository_name = excluded.repository_name,
85
- creation_date = excluded.creation_date,
86
- last_modified_date = excluded.last_modified_date,
87
- status = excluded.status,
88
- source_branch = excluded.source_branch,
89
- destination_branch = excluded.destination_branch,
90
- is_mergeable = excluded.is_mergeable,
91
- is_approved = excluded.is_approved,
92
- comment_count = COALESCE(excluded.comment_count, pull_requests.comment_count),
93
- health_score = COALESCE(excluded.health_score, pull_requests.health_score),
94
- link = excluded.link,
95
- fetched_at = excluded.fetched_at`
96
- });
97
- const search_ = SqlSchema.findAll({
98
- Result: CachedPullRequest,
99
- Request: Schema.Struct({ query: Schema.String, limit: Schema.Number, offset: Schema.Number }),
100
- execute: (req) => sql `SELECT pull_requests.* FROM pull_requests
101
- JOIN pull_requests_fts fts ON pull_requests.rowid = fts.rowid
102
- WHERE pull_requests_fts MATCH ${req.query}
103
- ORDER BY rank
104
- LIMIT ${req.limit} OFFSET ${req.offset}`
105
- });
106
- const searchCount_ = SqlSchema.findOne({
107
- Result: Schema.Struct({ count: Schema.Number }),
108
- Request: Schema.Struct({ query: Schema.String }),
109
- execute: (req) => sql `SELECT count(*) as count FROM pull_requests
110
- JOIN pull_requests_fts fts ON pull_requests.rowid = fts.rowid
111
- WHERE pull_requests_fts MATCH ${req.query}`
112
- });
113
- const deleteStale_ = SqlSchema.void({
114
- Request: Schema.Struct({ olderThan: Schema.String }),
115
- execute: (req) => sql `DELETE FROM pull_requests WHERE fetched_at < ${req.olderThan}`
116
- });
117
- const updateCommentCount_ = (awsAccountId, id, count) => sql `UPDATE pull_requests SET comment_count = ${count}
118
- WHERE id = ${id} AND aws_account_id = ${awsAccountId}`.pipe(Effect.asVoid);
119
- const updateHealthScore_ = (awsAccountId, id, score) => sql `UPDATE pull_requests SET health_score = ${score}
120
- WHERE id = ${id} AND aws_account_id = ${awsAccountId}`.pipe(Effect.asVoid);
121
- const upsertMany_ = (prs) => sql.withTransaction(Effect.forEach(prs, (pr) => upsert_(pr), { discard: true }));
122
- const publish = hub.publish(RepoChange.PullRequests());
123
- return {
124
- findAll: () => findAll_(undefined).pipe(cacheError("findAll")),
125
- findByAccountAndId: (awsAccountId, id) => findByAccountAndId_({ awsAccountId, id }).pipe(cacheError("findByAccountAndId")),
126
- upsert: (input) => upsert_(input).pipe(Effect.tap(() => publish), cacheError("upsert")),
127
- upsertMany: (prs) => upsertMany_(prs).pipe(Effect.tap(() => publish), cacheError("upsertMany")),
128
- search: (query, opts) => {
129
- const limit = opts?.limit ?? 20;
130
- const offset = opts?.offset ?? 0;
131
- const stripped = query.replace(/[*^"]/g, "").replace(/\b(NEAR|OR|NOT|AND)\b/gi, "");
132
- const escaped = stripped.replace(/"/g, `""`);
133
- const ftsQuery = `"${escaped}"`;
134
- return Effect.all({
135
- items: search_({ query: ftsQuery, limit, offset }),
136
- total: searchCount_({ query: ftsQuery }).pipe(Effect.map((r) => r.pipe(Option.getOrElse(() => ({ count: 0 }))).count))
137
- }).pipe(Effect.map(({ items, total }) => ({ items, total, hasMore: offset + items.length < total })), Effect.catchTag("SqlError", () => Effect.logWarning("FTS search failed").pipe(Effect.as({ items: [], total: 0, hasMore: false }))), cacheError("search"));
138
- },
139
- deleteStale: (olderThan) => deleteStale_({ olderThan }).pipe(Effect.tap(() => publish), cacheError("deleteStale")),
140
- updateCommentCount: (awsAccountId, id, count) => updateCommentCount_(awsAccountId, id, count).pipe(Effect.tap(() => publish), cacheError("updateCommentCount")),
141
- updateHealthScore: (awsAccountId, id, score) => updateHealthScore_(awsAccountId, id, score).pipe(Effect.tap(() => publish), cacheError("updateHealthScore"))
142
- };
143
- })
144
- }) {
145
- }
146
- //# sourceMappingURL=PullRequestRepo.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PullRequestRepo.js","sourceRoot":"","sources":["../../../src/CacheService/repos/PullRequestRepo.ts"],"names":[],"mappings":"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"}