@knpkv/codecommit-core 0.19.0 → 0.20.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 (99) hide show
  1. package/dist/AwsClient/AwsClientGated.d.ts.map +1 -1
  2. package/dist/AwsClient/AwsClientGated.js +0 -2
  3. package/dist/AwsClient/AwsClientGated.js.map +1 -1
  4. package/dist/AwsClient/approvalRuleContent.d.ts +2 -1
  5. package/dist/AwsClient/approvalRuleContent.d.ts.map +1 -1
  6. package/dist/AwsClient/approvalRuleContent.js +25 -18
  7. package/dist/AwsClient/approvalRuleContent.js.map +1 -1
  8. package/dist/AwsClient/getPullRequest.d.ts.map +1 -1
  9. package/dist/AwsClient/getPullRequest.js +19 -10
  10. package/dist/AwsClient/getPullRequest.js.map +1 -1
  11. package/dist/AwsClient/getPullRequests.d.ts +30 -23
  12. package/dist/AwsClient/getPullRequests.d.ts.map +1 -1
  13. package/dist/AwsClient/getPullRequests.js +47 -32
  14. package/dist/AwsClient/getPullRequests.js.map +1 -1
  15. package/dist/AwsClient/index.d.ts +1 -10
  16. package/dist/AwsClient/index.d.ts.map +1 -1
  17. package/dist/AwsClient/index.js +0 -1
  18. package/dist/AwsClient/index.js.map +1 -1
  19. package/dist/AwsClient/internal.d.ts +11 -1
  20. package/dist/AwsClient/internal.d.ts.map +1 -1
  21. package/dist/AwsClient/internal.js +7 -0
  22. package/dist/AwsClient/internal.js.map +1 -1
  23. package/dist/CacheService/Database.d.ts +1 -1
  24. package/dist/CacheService/Database.d.ts.map +1 -1
  25. package/dist/CacheService/Database.js +6 -2
  26. package/dist/CacheService/Database.js.map +1 -1
  27. package/dist/CacheService/diff.d.ts +10 -0
  28. package/dist/CacheService/diff.d.ts.map +1 -1
  29. package/dist/CacheService/diff.js +12 -1
  30. package/dist/CacheService/diff.js.map +1 -1
  31. package/dist/CacheService/migrations/0022_pull_request_approval_unknown.d.ts +9 -0
  32. package/dist/CacheService/migrations/0022_pull_request_approval_unknown.d.ts.map +1 -0
  33. package/dist/CacheService/migrations/0022_pull_request_approval_unknown.js +8 -0
  34. package/dist/CacheService/migrations/0022_pull_request_approval_unknown.js.map +1 -0
  35. package/dist/CacheService/migrations/0023_pull_request_row_versions.d.ts +17 -0
  36. package/dist/CacheService/migrations/0023_pull_request_row_versions.d.ts.map +1 -0
  37. package/dist/CacheService/migrations/0023_pull_request_row_versions.js +37 -0
  38. package/dist/CacheService/migrations/0023_pull_request_row_versions.js.map +1 -0
  39. package/dist/CacheService/repos/PullRequestRepo/index.d.ts +34 -8
  40. package/dist/CacheService/repos/PullRequestRepo/index.d.ts.map +1 -1
  41. package/dist/CacheService/repos/PullRequestRepo/index.js +1 -1
  42. package/dist/CacheService/repos/PullRequestRepo/index.js.map +1 -1
  43. package/dist/CacheService/repos/PullRequestRepo/internal.d.ts +69 -2
  44. package/dist/CacheService/repos/PullRequestRepo/internal.d.ts.map +1 -1
  45. package/dist/CacheService/repos/PullRequestRepo/internal.js +73 -2
  46. package/dist/CacheService/repos/PullRequestRepo/internal.js.map +1 -1
  47. package/dist/CacheService/repos/PullRequestRepo/mutations.d.ts +39 -16
  48. package/dist/CacheService/repos/PullRequestRepo/mutations.d.ts.map +1 -1
  49. package/dist/CacheService/repos/PullRequestRepo/mutations.js +61 -92
  50. package/dist/CacheService/repos/PullRequestRepo/mutations.js.map +1 -1
  51. package/dist/CacheService/repos/PullRequestRepo/queries.d.ts +24 -0
  52. package/dist/CacheService/repos/PullRequestRepo/queries.d.ts.map +1 -1
  53. package/dist/CacheService/repos/PullRequestRepo/queries.js +10 -3
  54. package/dist/CacheService/repos/PullRequestRepo/queries.js.map +1 -1
  55. package/dist/CacheService/repos/PullRequestRepo/rowWrites.d.ts +131 -0
  56. package/dist/CacheService/repos/PullRequestRepo/rowWrites.d.ts.map +1 -0
  57. package/dist/CacheService/repos/PullRequestRepo/rowWrites.js +214 -0
  58. package/dist/CacheService/repos/PullRequestRepo/rowWrites.js.map +1 -0
  59. package/dist/CacheService/repos/StatsRepo/internal.d.ts +0 -1
  60. package/dist/CacheService/repos/StatsRepo/internal.d.ts.map +1 -1
  61. package/dist/CacheService/repos/StatsRepo/internal.js.map +1 -1
  62. package/dist/CacheService/repos/StatsRepo/queries.d.ts.map +1 -1
  63. package/dist/CacheService/repos/StatsRepo/queries.js +2 -1
  64. package/dist/CacheService/repos/StatsRepo/queries.js.map +1 -1
  65. package/dist/CacheService/repos/StatsRepo/reviewerData.d.ts.map +1 -1
  66. package/dist/CacheService/repos/StatsRepo/reviewerData.js +1 -2
  67. package/dist/CacheService/repos/StatsRepo/reviewerData.js.map +1 -1
  68. package/dist/Domain.d.ts +70 -0
  69. package/dist/Domain.d.ts.map +1 -1
  70. package/dist/Domain.js +55 -1
  71. package/dist/Domain.js.map +1 -1
  72. package/dist/HealthScore.d.ts +1 -1
  73. package/dist/HealthScore.d.ts.map +1 -1
  74. package/dist/HealthScore.js +20 -5
  75. package/dist/HealthScore.js.map +1 -1
  76. package/dist/PRService/internal.d.ts +17 -1
  77. package/dist/PRService/internal.d.ts.map +1 -1
  78. package/dist/PRService/internal.js +8 -0
  79. package/dist/PRService/internal.js.map +1 -1
  80. package/dist/PRService/refreshDiffs.d.ts.map +1 -1
  81. package/dist/PRService/refreshDiffs.js +8 -5
  82. package/dist/PRService/refreshDiffs.js.map +1 -1
  83. package/dist/PRService/refreshEnrich.d.ts.map +1 -1
  84. package/dist/PRService/refreshEnrich.js +26 -45
  85. package/dist/PRService/refreshEnrich.js.map +1 -1
  86. package/dist/PRService/refreshFetch.d.ts +1 -1
  87. package/dist/PRService/refreshFetch.d.ts.map +1 -1
  88. package/dist/PRService/refreshFetch.js +89 -74
  89. package/dist/PRService/refreshFetch.js.map +1 -1
  90. package/dist/PRService/refreshHistory.d.ts.map +1 -1
  91. package/dist/PRService/refreshHistory.js +17 -10
  92. package/dist/PRService/refreshHistory.js.map +1 -1
  93. package/dist/PRService/refreshScore.d.ts.map +1 -1
  94. package/dist/PRService/refreshScore.js +4 -2
  95. package/dist/PRService/refreshScore.js.map +1 -1
  96. package/dist/PRService/refreshSinglePR.d.ts.map +1 -1
  97. package/dist/PRService/refreshSinglePR.js +44 -25
  98. package/dist/PRService/refreshSinglePR.js.map +1 -1
  99. package/package.json +1 -1
@@ -12,10 +12,15 @@
12
12
  * @category CacheService
13
13
  */
14
14
  import { Effect, Schema } from "effect";
15
- import { ApprovalRule } from "../../../Domain.js";
15
+ import { ApprovalRule, type ApprovalUnknownReason } from "../../../Domain.js";
16
16
  import { CacheError } from "../../CacheError.js";
17
+ import type { ApprovalGroup, RowGroup, RowVersions } from "./rowWrites.js";
17
18
  /** DB column `TEXT` (comma-separated) <-> `readonly string[]` */
18
19
  export declare const CommaSeparatedArray: Schema.decodeTo<Schema.$Array<Schema.String>, Schema.NullOr<Schema.String>, never, never>;
20
+ /**
21
+ * The `approval_unknown_reason` column: the reason's tag, or NULL when the last evaluation succeeded.
22
+ */
23
+ export declare const ApprovalUnknownColumn: Schema.NullOr<Schema.Literals<readonly ["NotPermitted", "Throttled", "ProviderFailed"]>>;
19
24
  export declare const CachedPullRequest: Schema.Struct<{
20
25
  readonly id: Schema.brand<Schema.String, "PullRequestId">;
21
26
  readonly awsAccountId: Schema.String;
@@ -28,11 +33,17 @@ export declare const CachedPullRequest: Schema.Struct<{
28
33
  readonly repositoryName: Schema.brand<Schema.String, "RepositoryName">;
29
34
  readonly creationDate: Schema.DateFromString;
30
35
  readonly lastModifiedDate: Schema.DateFromString;
36
+ /** With `lastModifiedDate`, the row group's version: the observation that last wrote it. */
37
+ readonly observationSeq: Schema.Number;
38
+ /** The approval group's version: the provider last activity and observation that last wrote it. */
39
+ readonly approvalVersion: Schema.DateFromString;
40
+ readonly approvalObservationSeq: Schema.Number;
31
41
  readonly status: Schema.Literals<readonly ["OPEN", "CLOSED", "MERGED"]>;
32
42
  readonly sourceBranch: Schema.String;
33
43
  readonly destinationBranch: Schema.String;
34
44
  readonly isMergeable: Schema.decodeTo<Schema.Boolean, Schema.Number, never, never>;
35
45
  readonly isApproved: Schema.decodeTo<Schema.Boolean, Schema.Number, never, never>;
46
+ readonly approvalUnknownReason: Schema.NullOr<Schema.Literals<readonly ["NotPermitted", "Throttled", "ProviderFailed"]>>;
36
47
  readonly commentCount: Schema.NullOr<Schema.Number>;
37
48
  readonly healthScore: Schema.NullOr<Schema.Number>;
38
49
  readonly link: Schema.String;
@@ -70,13 +81,69 @@ export declare const UpsertInput: Schema.Struct<{
70
81
  readonly destinationBranch: Schema.String;
71
82
  readonly isMergeable: Schema.Number;
72
83
  readonly isApproved: Schema.Number;
84
+ readonly approvalUnknownReason: Schema.NullOr<Schema.Literals<readonly ["NotPermitted", "Throttled", "ProviderFailed"]>>;
73
85
  readonly commentCount: Schema.NullOr<Schema.Number>;
74
86
  readonly link: Schema.String;
75
87
  readonly approvedBy: Schema.$Array<Schema.String>;
76
88
  readonly approvedByArns: Schema.$Array<Schema.String>;
77
- readonly approvalRules: Schema.withDecodingDefaultTypeKey<Schema.$Array<typeof ApprovalRule>, never>;
89
+ readonly approvalRules: Schema.withDecodingDefaultTypeKey<Schema.$Array<Schema.Struct<{
90
+ readonly ruleName: Schema.String;
91
+ readonly requiredApprovals: Schema.Number;
92
+ readonly poolMembers: Schema.$Array<Schema.String>;
93
+ readonly poolMemberArns: Schema.withDecodingDefaultTypeKey<Schema.$Array<Schema.String>, never>;
94
+ readonly satisfied: Schema.Boolean;
95
+ readonly fromTemplate: Schema.optional<Schema.String>;
96
+ }>>, never>;
78
97
  }>;
79
98
  export type UpsertInput = typeof UpsertInput.Type;
99
+ /**
100
+ * A provider read's approval, as `recordApprovalEvaluation` and `approvalColumnsOf` take it: the
101
+ * evaluated value and its complete rules, or the reason evaluation failed. A `PullRequestDetail` is one.
102
+ */
103
+ export interface ApprovalRead {
104
+ readonly isApproved: boolean;
105
+ readonly approvalRules: UpsertInput["approvalRules"];
106
+ readonly approvalUnknown?: ApprovalUnknownReason | undefined;
107
+ }
108
+ /** Both groups' versions as a read of the row saw them: what a recomputed write must still find. */
109
+ export declare const versionsOf: (row: {
110
+ readonly lastModifiedDate: Date;
111
+ readonly observationSeq: number;
112
+ readonly approvalVersion: Date;
113
+ readonly approvalObservationSeq: number;
114
+ }) => RowVersions;
115
+ /**
116
+ * A listed pull request's row group, complete. The listing reads open pull requests, so no merger and
117
+ * no closing time are authoritative values, not gaps.
118
+ */
119
+ export declare const rowGroupOfListing: (input: UpsertInput) => RowGroup;
120
+ /** A listed pull request's approval group, complete. */
121
+ export declare const approvalGroupOfListing: (input: UpsertInput) => ApprovalGroup;
122
+ /** A provider re-read's row group, complete: a closed or merged read also carries when and by whom. */
123
+ export declare const rowGroupOfRead: (read: {
124
+ readonly title: string;
125
+ readonly description?: string | undefined;
126
+ readonly author: string;
127
+ readonly status: string;
128
+ readonly creationDate: Date;
129
+ readonly lastActivityDate: Date;
130
+ readonly sourceBranch: string;
131
+ readonly destinationBranch: string;
132
+ readonly isMergeable: boolean;
133
+ readonly approvedBy: ReadonlyArray<string>;
134
+ readonly approvedByArns: ReadonlyArray<string>;
135
+ readonly mergedBy?: string | undefined;
136
+ }) => RowGroup;
137
+ /** A provider read's approval group, complete. */
138
+ export declare const approvalGroupOfRead: (read: ApprovalRead) => ApprovalGroup;
139
+ /**
140
+ * The approval columns an upsert input carries for a provider read. While approval is unknown,
141
+ * `isApproved` is a placeholder: the write keeps an existing row's last known value.
142
+ */
143
+ export declare const approvalColumnsOf: (read: ApprovalRead) => {
144
+ isApproved: number;
145
+ approvalUnknownReason: "NotPermitted" | "ProviderFailed" | "Throttled" | null;
146
+ };
80
147
  /** Wrap an Effect with CacheError mapping and a span. */
81
148
  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>>;
82
149
  /** Join a string array for the approved_by TEXT column. */
@@ -1 +1 @@
1
- {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../../../src/CacheService/repos/PullRequestRepo/internal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAgB,MAAM,QAAQ,CAAA;AACrD,OAAO,EAAE,YAAY,EAAoD,MAAM,oBAAoB,CAAA;AACnG,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAEhD,iEAAiE;AACjE,eAAO,MAAM,mBAAmB,2FAK/B,CAAA;AAwBD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8B5B,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;;;;;;;;;;;;;;;;;;;;;;EAsBtB,CAAA;AAEF,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,IAAI,CAAA;AAEjD,yDAAyD;AACzD,eAAO,MAAM,UAAU,OAAQ,MAAM,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,iFAI/E,CAAA;AAEH,2DAA2D;AAC3D,eAAO,MAAM,cAAc,QAAS,aAAa,CAAC,MAAM,CAAC,kBAA4C,CAAA"}
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../../../src/CacheService/repos/PullRequestRepo/internal.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,7 @@
12
12
  * @category CacheService
13
13
  */
14
14
  import { Effect, Schema, SchemaGetter } from "effect";
15
- import { ApprovalRule, PullRequestId, PullRequestStatus, RepositoryName } from "../../../Domain.js";
15
+ import { ApprovalRule, ApprovalUnknownTag, PullRequestId, PullRequestStatus, RepositoryName } from "../../../Domain.js";
16
16
  import { CacheError } from "../../CacheError.js";
17
17
  /** DB column `TEXT` (comma-separated) <-> `readonly string[]` */
18
18
  export const CommaSeparatedArray = Schema.NullOr(Schema.String).pipe(Schema.decodeTo(Schema.Array(Schema.String), {
@@ -37,6 +37,10 @@ const ApprovalRulesFromJson = Schema.NullOr(Schema.String).pipe(Schema.decodeTo(
37
37
  }),
38
38
  encode: SchemaGetter.transform((arr) => (arr.length > 0 ? JSON.stringify(arr) : null))
39
39
  }));
40
+ /**
41
+ * The `approval_unknown_reason` column: the reason's tag, or NULL when the last evaluation succeeded.
42
+ */
43
+ export const ApprovalUnknownColumn = Schema.NullOr(ApprovalUnknownTag);
40
44
  export const CachedPullRequest = Schema.Struct({
41
45
  id: PullRequestId,
42
46
  awsAccountId: Schema.String,
@@ -49,11 +53,17 @@ export const CachedPullRequest = Schema.Struct({
49
53
  repositoryName: RepositoryName,
50
54
  creationDate: Schema.DateFromString,
51
55
  lastModifiedDate: Schema.DateFromString,
56
+ /** With `lastModifiedDate`, the row group's version: the observation that last wrote it. */
57
+ observationSeq: Schema.Number,
58
+ /** The approval group's version: the provider last activity and observation that last wrote it. */
59
+ approvalVersion: Schema.DateFromString,
60
+ approvalObservationSeq: Schema.Number,
52
61
  status: PullRequestStatus,
53
62
  sourceBranch: Schema.String,
54
63
  destinationBranch: Schema.String,
55
64
  isMergeable: BooleanFromNumber,
56
65
  isApproved: BooleanFromNumber,
66
+ approvalUnknownReason: ApprovalUnknownColumn,
57
67
  commentCount: Schema.NullOr(Schema.Number),
58
68
  healthScore: Schema.NullOr(Schema.Number),
59
69
  link: Schema.String,
@@ -85,11 +95,72 @@ export const UpsertInput = Schema.Struct({
85
95
  destinationBranch: Schema.String,
86
96
  isMergeable: Schema.Number,
87
97
  isApproved: Schema.Number,
98
+ approvalUnknownReason: ApprovalUnknownColumn,
88
99
  commentCount: Schema.NullOr(Schema.Number),
89
100
  link: Schema.String,
90
101
  approvedBy: Schema.Array(Schema.String),
91
102
  approvedByArns: Schema.Array(Schema.String),
92
- approvalRules: Schema.Array(ApprovalRule).pipe(Schema.withDecodingDefaultTypeKey(Effect.succeed([])))
103
+ // The rule's plain shape, not the class: callers pass the provider's rules as plain objects, and the
104
+ // cache stores them as JSON either way.
105
+ approvalRules: Schema.Array(Schema.Struct(ApprovalRule.fields)).pipe(Schema.withDecodingDefaultTypeKey(Effect.succeed([])))
106
+ });
107
+ /** Both groups' versions as a read of the row saw them: what a recomputed write must still find. */
108
+ export const versionsOf = (row) => ({
109
+ row: { lastActivity: row.lastModifiedDate, observation: row.observationSeq },
110
+ approval: { lastActivity: row.approvalVersion, observation: row.approvalObservationSeq }
111
+ });
112
+ /**
113
+ * A listed pull request's row group, complete. The listing reads open pull requests, so no merger and
114
+ * no closing time are authoritative values, not gaps.
115
+ */
116
+ export const rowGroupOfListing = (input) => ({
117
+ title: input.title,
118
+ description: input.description,
119
+ author: input.author,
120
+ status: input.status,
121
+ creationDate: input.creationDate,
122
+ sourceBranch: input.sourceBranch,
123
+ destinationBranch: input.destinationBranch,
124
+ isMergeable: input.isMergeable === 1,
125
+ approvedBy: input.approvedBy,
126
+ approvedByArns: input.approvedByArns,
127
+ mergedBy: null,
128
+ closedAt: null
129
+ });
130
+ /** A listed pull request's approval group, complete. */
131
+ export const approvalGroupOfListing = (input) => ({
132
+ isApproved: input.isApproved === 1,
133
+ approvalRules: input.approvalRules,
134
+ unknownReason: input.approvalUnknownReason
135
+ });
136
+ /** A provider re-read's row group, complete: a closed or merged read also carries when and by whom. */
137
+ export const rowGroupOfRead = (read) => ({
138
+ title: read.title,
139
+ description: read.description ?? null,
140
+ author: read.author,
141
+ status: read.status,
142
+ creationDate: read.creationDate.toISOString(),
143
+ sourceBranch: read.sourceBranch,
144
+ destinationBranch: read.destinationBranch,
145
+ isMergeable: read.isMergeable,
146
+ approvedBy: read.approvedBy,
147
+ approvedByArns: read.approvedByArns,
148
+ mergedBy: read.mergedBy ?? null,
149
+ closedAt: read.status === "OPEN" ? null : read.lastActivityDate.toISOString()
150
+ });
151
+ /** A provider read's approval group, complete. */
152
+ export const approvalGroupOfRead = (read) => ({
153
+ isApproved: read.isApproved,
154
+ approvalRules: read.approvalRules,
155
+ unknownReason: read.approvalUnknown?._tag ?? null
156
+ });
157
+ /**
158
+ * The approval columns an upsert input carries for a provider read. While approval is unknown,
159
+ * `isApproved` is a placeholder: the write keeps an existing row's last known value.
160
+ */
161
+ export const approvalColumnsOf = (read) => ({
162
+ isApproved: read.approvalUnknown === undefined && read.isApproved ? 1 : 0,
163
+ approvalUnknownReason: read.approvalUnknown?._tag ?? null
93
164
  });
94
165
  /** Wrap an Effect with CacheError mapping and a span. */
95
166
  export const cacheError = (op) => (effect) => effect.pipe(Effect.mapError((cause) => new CacheError({ operation: `PullRequestRepo.${op}`, cause })), Effect.withSpan(`PullRequestRepo.${op}`));
@@ -1 +1 @@
1
- {"version":3,"file":"internal.js","sourceRoot":"","sources":["../../../../src/CacheService/repos/PullRequestRepo/internal.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"internal.js","sourceRoot":"","sources":["../../../../src/CacheService/repos/PullRequestRepo/internal.ts"],"names":[],"mappings":"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"}
@@ -4,34 +4,57 @@
4
4
  * SQL write operations for the pull_requests table. Each function takes `sql`
5
5
  * and `publish` (change event) and returns the mutation implementations.
6
6
  *
7
- * Provides upsert (INSERT ON CONFLICT UPDATE with column-specific merge
8
- * strategy), stale cleanup, diff stats updates, status transitions,
9
- * comment count updates, health score updates, and commented-by refresh.
10
- *
11
- * **Gotchas**
12
- *
13
- * - approval_rules uses `= excluded` (no COALESCE) — always fresh from API
14
- * - repo_account_id uses COALESCE — preserves across partial updates
7
+ * Every write goes through `rowWrites`: provider reads write whole column groups under their versions
8
+ * (`upsert` for a listing, `writeRead` for a re-read), recomputed values go through `writeDerived`,
9
+ * which applies only to the row as it was read, and a not-found read deletes through `deleteOne`.
15
10
  *
16
11
  * @category CacheService
17
12
  */
13
+ import type { Option } from "effect";
18
14
  import { Effect } from "effect";
19
15
  import type * as SqlClient from "effect/sql/SqlClient";
20
- import { UpsertInput } from "./internal.js";
16
+ import { type ApprovalRead, CachedPullRequest, rowGroupOfRead, UpsertInput } from "./internal.js";
17
+ import { type DerivedColumns, type GroupsWritten, type RowVersions } from "./rowWrites.js";
18
+ /** What an upsert wrote, and the row it replaced (none for a pull request seen for the first time). */
19
+ export interface UpsertResult extends GroupsWritten {
20
+ readonly replaced: Option.Option<CachedPullRequest>;
21
+ }
21
22
  export interface PullRequestCoordinates {
22
23
  readonly repositoryName: string;
23
24
  readonly accountRegion: string;
24
25
  }
25
26
  export declare const mutations: (sql: SqlClient.SqlClient, publish: Effect.Effect<void>) => {
26
- upsert: (input: UpsertInput) => Effect.Effect<void, import("../../CacheError.ts").CacheError, never>;
27
- upsertMany: (prs: ReadonlyArray<UpsertInput>) => Effect.Effect<void, import("../../CacheError.ts").CacheError, never>;
27
+ /** The next observation number: take it before the provider read whose results a write carries. */
28
+ observe: () => Effect.Effect<number, import("../../CacheError.ts").CacheError, never>;
29
+ /**
30
+ * Write a listed pull request observed by `observation`: its row and approval groups, each unless
31
+ * that group is newer. The result says which were written; a group not written means a newer read
32
+ * already reached it.
33
+ */
34
+ upsert: (input: UpsertInput, observation: number) => Effect.Effect<UpsertResult, import("../../CacheError.ts").CacheError, never>;
35
+ /**
36
+ * Write a pull request read in full (a single-PR refresh): like `upsert`, but both groups come
37
+ * from `read`, so a merged or closed read carries its merger and closing time.
38
+ */
39
+ upsertRead: (input: UpsertInput, read: Parameters<typeof rowGroupOfRead>[0] & ApprovalRead, observation: number) => Effect.Effect<UpsertResult, import("../../CacheError.ts").CacheError, never>;
40
+ upsertMany: (prs: ReadonlyArray<UpsertInput>, observation: number) => Effect.Effect<void, import("../../CacheError.ts").CacheError, never>;
41
+ /**
42
+ * Write a provider re-read of a cached pull request, observed by `observation`: its whole row group
43
+ * (including a closed or merged status) and approval group, each unless that group is newer.
44
+ */
45
+ writeRead: (awsAccountId: string, id: string, read: Parameters<typeof rowGroupOfRead>[0] & ApprovalRead, observation: number, coordinates?: PullRequestCoordinates) => Effect.Effect<GroupsWritten, import("../../CacheError.ts").CacheError, never>;
46
+ /**
47
+ * Write values recomputed from a cached row (diff stats, comment count, health score), only while
48
+ * the row still holds `observed`, the versions it was read at. True when written.
49
+ */
50
+ writeDerived: (awsAccountId: string, id: string, observed: RowVersions, columns: DerivedColumns, coordinates?: PullRequestCoordinates) => Effect.Effect<boolean, import("../../CacheError.ts").CacheError, never>;
28
51
  deleteStale: (olderThan: string) => Effect.Effect<void, import("../../CacheError.ts").CacheError, never>;
29
52
  deleteStaleOpen: (olderThan: string) => Effect.Effect<void, import("../../CacheError.ts").CacheError, never>;
30
- deleteOne: (awsAccountId: string, id: string, coordinates?: PullRequestCoordinates) => Effect.Effect<void, import("../../CacheError.ts").CacheError, never>;
31
- updateDiffStats: (awsAccountId: string, id: string, filesAdded: number, filesModified: number, filesDeleted: number, coordinates?: PullRequestCoordinates) => Effect.Effect<void, import("../../CacheError.ts").CacheError, never>;
32
- updateStatusAndClosedAt: (awsAccountId: string, id: string, status: string, closedAt: string, mergedBy?: string, approvedBy?: ReadonlyArray<string>, coordinates?: PullRequestCoordinates) => Effect.Effect<void, import("../../CacheError.ts").CacheError, never>;
33
- updateCommentCount: (awsAccountId: string, id: string, count: number | null, coordinates?: PullRequestCoordinates) => Effect.Effect<void, import("../../CacheError.ts").CacheError, never>;
34
- updateHealthScore: (awsAccountId: string, id: string, score: number, coordinates?: PullRequestCoordinates) => Effect.Effect<void, import("../../CacheError.ts").CacheError, never>;
53
+ /**
54
+ * Delete a row the provider answered "does not exist" for, in a read begun at `observation`,
55
+ * unless a read that began later has written it since. True when the row was deleted.
56
+ */
57
+ deleteOne: (awsAccountId: string, id: string, observation: number, coordinates?: PullRequestCoordinates) => Effect.Effect<boolean, import("../../CacheError.ts").CacheError, never>;
35
58
  refreshCommentedBy: () => Effect.Effect<void, import("../../CacheError.ts").CacheError, never>;
36
59
  propagateRepoAccountId: () => Effect.Effect<void, import("../../CacheError.ts").CacheError, never>;
37
60
  };
@@ -1 +1 @@
1
- {"version":3,"file":"mutations.d.ts","sourceRoot":"","sources":["../../../../src/CacheService/repos/PullRequestRepo/mutations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAA;AACvC,OAAO,KAAK,KAAK,SAAS,MAAM,sBAAsB,CAAA;AAGtD,OAAO,EAA8B,WAAW,EAAE,MAAM,eAAe,CAAA;AAGvE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAC/B;AAED,eAAO,MAAM,SAAS,QAAS,SAAS,CAAC,SAAS,WAAW,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;oBAqF5D,WAAW;sBAET,aAAa,CAAC,WAAW,CAAC;6BAMnB,MAAM;iCAGF,MAAM;8BAGT,MAAM,MAAM,MAAM,gBAAgB,sBAAsB;oCASlE,MAAM,MAChB,MAAM,cACE,MAAM,iBACH,MAAM,gBACP,MAAM,gBACN,sBAAsB;4CAatB,MAAM,MAChB,MAAM,UACF,MAAM,YACJ,MAAM,aACL,MAAM,eACJ,aAAa,CAAC,MAAM,CAAC,gBACpB,sBAAsB;uCAiBtB,MAAM,MAChB,MAAM,SACH,MAAM,GAAG,IAAI,gBACN,sBAAsB;sCAYJ,MAAM,MAAM,MAAM,SAAS,MAAM,gBAAgB,sBAAsB;;;CAuF5G,CAAA"}
1
+ {"version":3,"file":"mutations.d.ts","sourceRoot":"","sources":["../../../../src/CacheService/repos/PullRequestRepo/mutations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACpC,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAA;AACvC,OAAO,KAAK,KAAK,SAAS,MAAM,sBAAsB,CAAA;AAGtD,OAAO,EAGL,KAAK,YAAY,EACjB,iBAAiB,EAGjB,cAAc,EACd,WAAW,EACZ,MAAM,eAAe,CAAA;AAEtB,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EAElB,KAAK,WAAW,EAEjB,MAAM,gBAAgB,CAAA;AAEvB,uGAAuG;AACvG,MAAM,WAAW,YAAa,SAAQ,aAAa;IACjD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAA;CACpD;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAC/B;AAED,eAAO,MAAM,SAAS,QAAS,SAAS,CAAC,SAAS,WAAW,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;IAkE5E,mGAAmG;;IAGnG;;;;OAIG;oBACa,WAAW,eAAe,MAAM;IAMhD;;;OAGG;wBAEM,WAAW,QACZ,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,eAC5C,MAAM;sBAOH,aAAa,CAAC,WAAW,CAAC,eAAe,MAAM;IAMjE;;;OAGG;8BAEa,MAAM,MAChB,MAAM,QACJ,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,eAC5C,MAAM,gBACL,sBAAsB;IAetC;;;OAGG;iCAEa,MAAM,MAChB,MAAM,YACA,WAAW,WACZ,cAAc,gBACT,sBAAsB;6BAQb,MAAM;iCAGF,MAAM;IAGnC;;;OAGG;8BACuB,MAAM,MAAM,MAAM,eAAe,MAAM,gBAAgB,sBAAsB;;;CAuF1G,CAAA"}
@@ -1,26 +1,11 @@
1
- /**
2
- * @module PullRequestRepo/mutations
3
- *
4
- * SQL write operations for the pull_requests table. Each function takes `sql`
5
- * and `publish` (change event) and returns the mutation implementations.
6
- *
7
- * Provides upsert (INSERT ON CONFLICT UPDATE with column-specific merge
8
- * strategy), stale cleanup, diff stats updates, status transitions,
9
- * comment count updates, health score updates, and commented-by refresh.
10
- *
11
- * **Gotchas**
12
- *
13
- * - approval_rules uses `= excluded` (no COALESCE) — always fresh from API
14
- * - repo_account_id uses COALESCE — preserves across partial updates
15
- *
16
- * @category CacheService
17
- */
18
1
  import { Effect, Schema } from "effect";
19
2
  import * as SqlSchema from "effect/sql/SqlSchema";
20
3
  import { decodeCommentLocationJson } from "../commentLocations.js";
21
- import { cacheError, joinApprovedBy, UpsertInput } from "./internal.js";
4
+ import { approvalGroupOfListing, approvalGroupOfRead, CachedPullRequest, cacheError, rowGroupOfListing, rowGroupOfRead, UpsertInput } from "./internal.js";
22
5
  import { PullRequestAmbiguityError } from "./queries.js";
6
+ import { rowWrites } from "./rowWrites.js";
23
7
  export const mutations = (sql, publish) => {
8
+ const writes = rowWrites(sql);
24
9
  const countByLegacyIdentity_ = SqlSchema.findOne({
25
10
  Result: Schema.Struct({ count: Schema.Number }),
26
11
  Request: Schema.Struct({ awsAccountId: Schema.String, id: Schema.String }),
@@ -37,80 +22,70 @@ export const mutations = (sql, publish) => {
37
22
  : sql `aws_account_id = ${awsAccountId} AND id = ${id}
38
23
  AND repository_name = ${coordinates.repositoryName}
39
24
  AND account_region = ${coordinates.accountRegion}`;
40
- const upsert_ = SqlSchema.void({
25
+ const encodeUpsert = Schema.encodeEffect(UpsertInput);
26
+ const findReplaced = SqlSchema.findOneOption({
27
+ Result: CachedPullRequest,
41
28
  Request: UpsertInput,
42
- execute: (req) => {
43
- const approvedByStr = joinApprovedBy(req.approvedBy);
44
- const approvedByArnsStr = joinApprovedBy(req.approvedByArns);
45
- const approvalRulesJson = req.approvalRules !== undefined && req.approvalRules.length > 0
46
- ? JSON.stringify(req.approvalRules)
47
- : "[]";
48
- return sql `INSERT INTO pull_requests
49
- (id, aws_account_id, repo_account_id, account_profile, account_region, title, description,
50
- author, repository_name, creation_date, last_modified_date, status,
51
- source_branch, destination_branch, is_mergeable, is_approved,
52
- comment_count, link, approved_by, approved_by_arns, approval_rules, fetched_at)
53
- VALUES (${req.id}, ${req.awsAccountId}, ${req.repoAccountId}, ${req.accountProfile}, ${req.accountRegion},
54
- ${req.title}, ${req.description}, ${req.author}, ${req.repositoryName},
55
- ${req.creationDate}, ${req.lastModifiedDate}, ${req.status},
56
- ${req.sourceBranch}, ${req.destinationBranch}, ${req.isMergeable}, ${req.isApproved},
57
- ${req.commentCount}, ${req.link}, ${approvedByStr}, ${approvedByArnsStr}, ${approvalRulesJson}, strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))
58
- ON CONFLICT (aws_account_id, id, repository_name, account_region) DO UPDATE SET
59
- account_profile = excluded.account_profile,
60
- account_region = excluded.account_region,
61
- title = excluded.title,
62
- description = excluded.description,
63
- author = excluded.author,
64
- repository_name = excluded.repository_name,
65
- creation_date = excluded.creation_date,
66
- last_modified_date = excluded.last_modified_date,
67
- status = excluded.status,
68
- source_branch = excluded.source_branch,
69
- destination_branch = excluded.destination_branch,
70
- is_mergeable = excluded.is_mergeable,
71
- is_approved = excluded.is_approved,
72
- comment_count = COALESCE(excluded.comment_count, pull_requests.comment_count),
73
- health_score = pull_requests.health_score,
74
- link = excluded.link,
75
- approved_by = COALESCE(excluded.approved_by, pull_requests.approved_by),
76
- approved_by_arns = COALESCE(excluded.approved_by_arns, pull_requests.approved_by_arns),
77
- -- Always overwrite: rules are fetched fresh on every sync, unlike approved_by which accumulates
78
- approval_rules = excluded.approval_rules,
79
- repo_account_id = COALESCE(excluded.repo_account_id, pull_requests.repo_account_id),
80
- fetched_at = excluded.fetched_at`;
81
- }
29
+ execute: (req) => sql `SELECT * FROM pull_requests WHERE aws_account_id = ${req.awsAccountId} AND id = ${req.id}
30
+ AND repository_name = ${req.repositoryName} AND account_region = ${req.accountRegion}`
82
31
  });
32
+ /**
33
+ * Read the row and write it in one transaction, so the result carries the row this write replaced:
34
+ * what a notification diffs against, not a snapshot another write may have changed since.
35
+ */
36
+ const upsertWith = (input, row, approval, observation) => sql.withTransaction(Effect.all({
37
+ replaced: findReplaced(input),
38
+ written: encodeUpsert(input).pipe(Effect.flatMap((req) => writes.upsert(req, row, approval, observation)))
39
+ })).pipe(Effect.map(({ replaced, written }) => ({ ...written, replaced })));
40
+ const upsert_ = (input, observation) => upsertWith(input, rowGroupOfListing(input), approvalGroupOfListing(input), observation);
41
+ /** Publish a change only when a write applied. */
42
+ const publishIfApplied = (applied) => applied ? publish : Effect.void;
83
43
  const deleteStale_ = SqlSchema.void({
84
44
  Request: Schema.Struct({ olderThan: Schema.String }),
85
- execute: (req) => sql `DELETE FROM pull_requests WHERE fetched_at < ${req.olderThan}`
45
+ execute: (req) => writes.deleteFetchedBefore(req.olderThan, false)
86
46
  });
87
47
  const deleteStaleOpen_ = SqlSchema.void({
88
48
  Request: Schema.Struct({ olderThan: Schema.String }),
89
- execute: (req) => sql `DELETE FROM pull_requests WHERE status = 'OPEN' AND fetched_at < ${req.olderThan}`
49
+ execute: (req) => writes.deleteFetchedBefore(req.olderThan, true)
90
50
  });
91
51
  const repo = {
92
- upsert: (input) => upsert_(input).pipe(Effect.tap(() => publish), cacheError("upsert")),
93
- upsertMany: (prs) => sql.withTransaction(Effect.forEach(prs, (pr) => upsert_(pr), { discard: true })).pipe(Effect.tap(() => publish), cacheError("upsertMany")),
52
+ /** The next observation number: take it before the provider read whose results a write carries. */
53
+ observe: () => writes.observe().pipe(cacheError("observe")),
54
+ /**
55
+ * Write a listed pull request observed by `observation`: its row and approval groups, each unless
56
+ * that group is newer. The result says which were written; a group not written means a newer read
57
+ * already reached it.
58
+ */
59
+ upsert: (input, observation) => upsert_(input, observation).pipe(Effect.tap((written) => publishIfApplied(written.row || written.approval)), cacheError("upsert")),
60
+ /**
61
+ * Write a pull request read in full (a single-PR refresh): like `upsert`, but both groups come
62
+ * from `read`, so a merged or closed read carries its merger and closing time.
63
+ */
64
+ upsertRead: (input, read, observation) => upsertWith(input, rowGroupOfRead(read), approvalGroupOfRead(read), observation).pipe(Effect.tap((written) => publishIfApplied(written.row || written.approval)), cacheError("upsertRead")),
65
+ upsertMany: (prs, observation) => sql.withTransaction(Effect.forEach(prs, (pr) => upsert_(pr, observation), { discard: true })).pipe(Effect.tap(() => publish), cacheError("upsertMany")),
66
+ /**
67
+ * Write a provider re-read of a cached pull request, observed by `observation`: its whole row group
68
+ * (including a closed or merged status) and approval group, each unless that group is newer.
69
+ */
70
+ writeRead: (awsAccountId, id, read, observation, coordinates) => ensureUnambiguous(awsAccountId, id, coordinates).pipe(Effect.andThen(writes.writeRead(pullRequestWhere(awsAccountId, id, coordinates), { lastActivity: read.lastActivityDate, observation }, rowGroupOfRead(read), approvalGroupOfRead(read))), Effect.tap((written) => publishIfApplied(written.row || written.approval)), cacheError("writeRead")),
71
+ /**
72
+ * Write values recomputed from a cached row (diff stats, comment count, health score), only while
73
+ * the row still holds `observed`, the versions it was read at. True when written.
74
+ */
75
+ writeDerived: (awsAccountId, id, observed, columns, coordinates) => ensureUnambiguous(awsAccountId, id, coordinates).pipe(Effect.andThen(writes.writeDerived(pullRequestWhere(awsAccountId, id, coordinates), observed, columns)), Effect.tap(publishIfApplied), cacheError("writeDerived")),
94
76
  deleteStale: (olderThan) => deleteStale_({ olderThan }).pipe(Effect.tap(() => publish), cacheError("deleteStale")),
95
77
  deleteStaleOpen: (olderThan) => deleteStaleOpen_({ olderThan }).pipe(Effect.tap(() => publish), cacheError("deleteStaleOpen")),
96
- deleteOne: (awsAccountId, id, coordinates) => ensureUnambiguous(awsAccountId, id, coordinates).pipe(Effect.andThen(sql `DELETE FROM pull_requests WHERE ${pullRequestWhere(awsAccountId, id, coordinates)}`), Effect.asVoid, Effect.tap(() => publish), cacheError("deleteOne")),
97
- updateDiffStats: (awsAccountId, id, filesAdded, filesModified, filesDeleted, coordinates) => ensureUnambiguous(awsAccountId, id, coordinates).pipe(Effect.andThen(sql `UPDATE pull_requests SET files_added = ${filesAdded}, files_modified = ${filesModified}, files_deleted = ${filesDeleted}
98
- WHERE ${pullRequestWhere(awsAccountId, id, coordinates)}`), Effect.asVoid, Effect.tap(() => publish), cacheError("updateDiffStats")),
99
- updateStatusAndClosedAt: (awsAccountId, id, status, closedAt, mergedBy, approvedBy, coordinates) => {
100
- const approvedByStr = approvedBy !== undefined ? joinApprovedBy([...approvedBy]) : null;
101
- return ensureUnambiguous(awsAccountId, id, coordinates).pipe(Effect.andThen(sql `UPDATE pull_requests SET status = ${status}, closed_at = ${closedAt}, merged_by = ${mergedBy ?? null},
102
- approved_by = COALESCE(${approvedByStr}, approved_by),
103
- last_modified_date = ${closedAt}
104
- WHERE ${pullRequestWhere(awsAccountId, id, coordinates)}`), Effect.asVoid, Effect.tap(() => publish), cacheError("updateStatusAndClosedAt"));
105
- },
106
- updateCommentCount: (awsAccountId, id, count, coordinates) => ensureUnambiguous(awsAccountId, id, coordinates).pipe(Effect.andThen(sql `UPDATE pull_requests SET comment_count = ${count}
107
- WHERE ${pullRequestWhere(awsAccountId, id, coordinates)}`), Effect.asVoid, Effect.tap(() => publish), cacheError("updateCommentCount")),
108
- updateHealthScore: (awsAccountId, id, score, coordinates) => ensureUnambiguous(awsAccountId, id, coordinates).pipe(Effect.andThen(sql `UPDATE pull_requests SET health_score = ${score}
109
- WHERE ${pullRequestWhere(awsAccountId, id, coordinates)}`), Effect.asVoid, Effect.tap(() => publish), cacheError("updateHealthScore")),
78
+ /**
79
+ * Delete a row the provider answered "does not exist" for, in a read begun at `observation`,
80
+ * unless a read that began later has written it since. True when the row was deleted.
81
+ */
82
+ deleteOne: (awsAccountId, id, observation, coordinates) => ensureUnambiguous(awsAccountId, id, coordinates).pipe(Effect.andThen(writes.deleteIfNotNewer(pullRequestWhere(awsAccountId, id, coordinates), observation)), Effect.tap(publishIfApplied), cacheError("deleteOne")),
110
83
  refreshCommentedBy: () => sql.withTransaction(Effect.gen(function* () {
111
84
  const rows = yield* sql `
112
85
  SELECT c.aws_account_id AS awsAccountId, c.pull_request_id AS pullRequestId,
113
86
  p.repository_name AS repositoryName, p.account_region AS accountRegion,
87
+ p.last_modified_date AS rowAt, p.observation_seq AS rowSeq,
88
+ p.approval_version AS approvalAt, p.approval_observation_seq AS approvalSeq,
114
89
  p.author AS author, c.locations_json AS locationsJson
115
90
  FROM pr_comments c
116
91
  INNER JOIN pull_requests p
@@ -148,23 +123,17 @@ export const mutations = (sql, publish) => {
148
123
  for (const loc of parsed)
149
124
  walk(loc.comments);
150
125
  const commentedBy = commenters.size > 0 ? [...commenters].join(",") : null;
151
- yield* sql `UPDATE pull_requests SET commented_by = ${commentedBy}
152
- WHERE id = ${row.pullRequestId}
153
- AND aws_account_id = ${row.awsAccountId}
154
- AND repository_name = ${row.repositoryName}
155
- AND account_region = ${row.accountRegion}`;
126
+ // Read and written in one transaction, so the versions it read still hold.
127
+ yield* writes.writeDerived(pullRequestWhere(row.awsAccountId, row.pullRequestId, {
128
+ repositoryName: row.repositoryName,
129
+ accountRegion: row.accountRegion
130
+ }), {
131
+ row: { lastActivity: new Date(row.rowAt), observation: row.rowSeq },
132
+ approval: { lastActivity: new Date(row.approvalAt), observation: row.approvalSeq }
133
+ }, { commentedBy });
156
134
  }
157
135
  })).pipe(Effect.asVoid, cacheError("refreshCommentedBy")),
158
- propagateRepoAccountId: () => sql `UPDATE pull_requests
159
- SET repo_account_id = (
160
- SELECT p2.repo_account_id FROM pull_requests p2
161
- WHERE p2.repo_account_id IS NOT NULL
162
- AND p2.aws_account_id = pull_requests.aws_account_id
163
- AND p2.repository_name = pull_requests.repository_name
164
- AND p2.account_region = pull_requests.account_region
165
- LIMIT 1
166
- )
167
- WHERE repo_account_id IS NULL`.pipe(Effect.asVoid, cacheError("propagateRepoAccountId"))
136
+ propagateRepoAccountId: () => writes.fillRepoAccountIds().pipe(Effect.asVoid, cacheError("propagateRepoAccountId"))
168
137
  };
169
138
  return repo;
170
139
  };
@@ -1 +1 @@
1
- {"version":3,"file":"mutations.js","sourceRoot":"","sources":["../../../../src/CacheService/repos/PullRequestRepo/mutations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mutations.js","sourceRoot":"","sources":["../../../../src/CacheService/repos/PullRequestRepo/mutations.ts"],"names":[],"mappings":"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"}