@knpkv/codecommit-core 0.5.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AwsClient/AwsClientGated.d.ts +30 -0
- package/dist/AwsClient/AwsClientGated.d.ts.map +1 -0
- package/dist/AwsClient/AwsClientGated.js +111 -0
- package/dist/AwsClient/AwsClientGated.js.map +1 -0
- package/dist/AwsClient/createApprovalRule.d.ts +4 -0
- package/dist/AwsClient/createApprovalRule.d.ts.map +1 -0
- package/dist/AwsClient/createApprovalRule.js +17 -0
- package/dist/AwsClient/createApprovalRule.js.map +1 -0
- package/dist/AwsClient/deleteApprovalRule.d.ts +4 -0
- package/dist/AwsClient/deleteApprovalRule.d.ts.map +1 -0
- package/dist/AwsClient/deleteApprovalRule.js +16 -0
- package/dist/AwsClient/deleteApprovalRule.js.map +1 -0
- package/dist/AwsClient/getPullRequest.d.ts.map +1 -1
- package/dist/AwsClient/getPullRequest.js +34 -7
- package/dist/AwsClient/getPullRequest.js.map +1 -1
- package/dist/AwsClient/getPullRequests.d.ts +81 -1
- package/dist/AwsClient/getPullRequests.d.ts.map +1 -1
- package/dist/AwsClient/getPullRequests.js +123 -17
- package/dist/AwsClient/getPullRequests.js.map +1 -1
- package/dist/AwsClient/index.d.ts +13 -1
- package/dist/AwsClient/index.d.ts.map +1 -1
- package/dist/AwsClient/index.js +16 -1
- package/dist/AwsClient/index.js.map +1 -1
- package/dist/AwsClient/internal.d.ts +63 -1
- package/dist/AwsClient/internal.d.ts.map +1 -1
- package/dist/AwsClient/internal.js +37 -3
- package/dist/AwsClient/internal.js.map +1 -1
- package/dist/AwsClient/updateApprovalRule.d.ts +4 -0
- package/dist/AwsClient/updateApprovalRule.d.ts.map +1 -0
- package/dist/AwsClient/updateApprovalRule.js +17 -0
- package/dist/AwsClient/updateApprovalRule.js.map +1 -0
- package/dist/CacheService/Database.d.ts +4 -0
- package/dist/CacheService/Database.d.ts.map +1 -1
- package/dist/CacheService/Database.js +15 -1
- package/dist/CacheService/Database.js.map +1 -1
- package/dist/CacheService/EventsHub.d.ts +44 -4
- package/dist/CacheService/EventsHub.d.ts.map +1 -1
- package/dist/CacheService/EventsHub.js.map +1 -1
- package/dist/CacheService/diff.d.ts +17 -1
- package/dist/CacheService/diff.d.ts.map +1 -1
- package/dist/CacheService/diff.js +34 -0
- package/dist/CacheService/diff.js.map +1 -1
- package/dist/CacheService/index.d.ts +5 -1
- package/dist/CacheService/index.d.ts.map +1 -1
- package/dist/CacheService/index.js +5 -1
- package/dist/CacheService/index.js.map +1 -1
- package/dist/CacheService/migrations/0011_audit_log.d.ts +5 -0
- package/dist/CacheService/migrations/0011_audit_log.d.ts.map +1 -0
- package/dist/CacheService/migrations/0011_audit_log.js +19 -0
- package/dist/CacheService/migrations/0011_audit_log.js.map +1 -0
- package/dist/CacheService/migrations/0012_audit_log_indexes.d.ts +5 -0
- package/dist/CacheService/migrations/0012_audit_log_indexes.d.ts.map +1 -0
- package/dist/CacheService/migrations/0012_audit_log_indexes.js +7 -0
- package/dist/CacheService/migrations/0012_audit_log_indexes.js.map +1 -0
- package/dist/CacheService/migrations/0013_approval_rules.d.ts +5 -0
- package/dist/CacheService/migrations/0013_approval_rules.d.ts.map +1 -0
- package/dist/CacheService/migrations/0013_approval_rules.js +4 -0
- package/dist/CacheService/migrations/0013_approval_rules.js.map +1 -0
- package/dist/CacheService/migrations/0014_approved_by_arns.d.ts +5 -0
- package/dist/CacheService/migrations/0014_approved_by_arns.d.ts.map +1 -0
- package/dist/CacheService/migrations/0014_approved_by_arns.js +4 -0
- package/dist/CacheService/migrations/0014_approved_by_arns.js.map +1 -0
- package/dist/CacheService/migrations/0015_repo_account_id.d.ts +5 -0
- package/dist/CacheService/migrations/0015_repo_account_id.d.ts.map +1 -0
- package/dist/CacheService/migrations/0015_repo_account_id.js +4 -0
- package/dist/CacheService/migrations/0015_repo_account_id.js.map +1 -0
- package/dist/CacheService/repos/NotificationRepo.d.ts.map +1 -1
- package/dist/CacheService/repos/NotificationRepo.js +2 -2
- package/dist/CacheService/repos/NotificationRepo.js.map +1 -1
- package/dist/CacheService/repos/PullRequestRepo/index.d.ts +10 -0
- package/dist/CacheService/repos/PullRequestRepo/index.d.ts.map +1 -1
- package/dist/CacheService/repos/PullRequestRepo/internal.d.ts +15 -0
- package/dist/CacheService/repos/PullRequestRepo/internal.d.ts.map +1 -1
- package/dist/CacheService/repos/PullRequestRepo/internal.js +30 -4
- package/dist/CacheService/repos/PullRequestRepo/internal.js.map +1 -1
- package/dist/CacheService/repos/PullRequestRepo/mutations.d.ts +12 -2
- package/dist/CacheService/repos/PullRequestRepo/mutations.d.ts.map +1 -1
- package/dist/CacheService/repos/PullRequestRepo/mutations.js +21 -5
- package/dist/CacheService/repos/PullRequestRepo/mutations.js.map +1 -1
- package/dist/CacheService/repos/PullRequestRepo/queries.d.ts +9 -0
- package/dist/CacheService/repos/PullRequestRepo/queries.d.ts.map +1 -1
- package/dist/CacheService/repos/StatsRepo/internal.d.ts.map +1 -1
- package/dist/CacheService/repos/StatsRepo/internal.js +5 -4
- package/dist/CacheService/repos/StatsRepo/internal.js.map +1 -1
- package/dist/Domain.d.ts +106 -7
- package/dist/Domain.d.ts.map +1 -1
- package/dist/Domain.js +66 -6
- package/dist/Domain.js.map +1 -1
- package/dist/Errors.d.ts +14 -1
- package/dist/Errors.d.ts.map +1 -1
- package/dist/Errors.js +10 -0
- package/dist/Errors.js.map +1 -1
- package/dist/PRService/internal.d.ts +23 -0
- package/dist/PRService/internal.d.ts.map +1 -1
- package/dist/PRService/internal.js +20 -5
- package/dist/PRService/internal.js.map +1 -1
- package/dist/PRService/refreshFetch.d.ts +5 -1
- package/dist/PRService/refreshFetch.d.ts.map +1 -1
- package/dist/PRService/refreshFetch.js +15 -4
- package/dist/PRService/refreshFetch.js.map +1 -1
- package/dist/PRService/refreshSinglePR.d.ts +7 -0
- package/dist/PRService/refreshSinglePR.d.ts.map +1 -1
- package/dist/PRService/refreshSinglePR.js +16 -3
- package/dist/PRService/refreshSinglePR.js.map +1 -1
- package/dist/PermissionService/AuditLog.d.ts +63 -0
- package/dist/PermissionService/AuditLog.d.ts.map +1 -0
- package/dist/PermissionService/AuditLog.js +127 -0
- package/dist/PermissionService/AuditLog.js.map +1 -0
- package/dist/PermissionService/PermissionGate.d.ts +47 -0
- package/dist/PermissionService/PermissionGate.d.ts.map +1 -0
- package/dist/PermissionService/PermissionGate.js +14 -0
- package/dist/PermissionService/PermissionGate.js.map +1 -0
- package/dist/PermissionService/PermissionGateLive.d.ts +41 -0
- package/dist/PermissionService/PermissionGateLive.d.ts.map +1 -0
- package/dist/PermissionService/PermissionGateLive.js +83 -0
- package/dist/PermissionService/PermissionGateLive.js.map +1 -0
- package/dist/PermissionService/index.d.ts +39 -0
- package/dist/PermissionService/index.d.ts.map +1 -0
- package/dist/PermissionService/index.js +87 -0
- package/dist/PermissionService/index.js.map +1 -0
- package/dist/PermissionService/operations.d.ts +53 -0
- package/dist/PermissionService/operations.d.ts.map +1 -0
- package/dist/PermissionService/operations.js +51 -0
- package/dist/PermissionService/operations.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @title AwsClientGated — transparent permission proxy
|
|
3
|
+
*
|
|
4
|
+
* Wraps every AwsClient method with permission check + audit logging.
|
|
5
|
+
* Returns the same `AwsClient.Service` type — callers don't know it exists.
|
|
6
|
+
*
|
|
7
|
+
* Two patterns:
|
|
8
|
+
* 1. InnerAwsClient tag — holds the real implementation, avoids circular dep
|
|
9
|
+
* 2. Service capture at Layer construction — all services yielded once,
|
|
10
|
+
* closed over in gate/wrapEffect/wrapStream, no R leakage
|
|
11
|
+
*
|
|
12
|
+
* PermissionDeniedError → AwsApiError at the boundary for type transparency.
|
|
13
|
+
* The actual PermissionDeniedError is preserved as the AwsApiError's `cause`.
|
|
14
|
+
*
|
|
15
|
+
* All operations — reads, writes, and approval rule CRUD — are gated with
|
|
16
|
+
* the appropriate category for UI badge color and prompt behavior.
|
|
17
|
+
*
|
|
18
|
+
* @module
|
|
19
|
+
*/
|
|
20
|
+
import { Context, Layer } from "effect";
|
|
21
|
+
import { AuditLogRepo } from "../PermissionService/AuditLog.js";
|
|
22
|
+
import { PermissionService } from "../PermissionService/index.js";
|
|
23
|
+
import { PermissionGate } from "../PermissionService/PermissionGate.js";
|
|
24
|
+
import { AwsClient } from "./index.js";
|
|
25
|
+
declare const InnerAwsClient_base: Context.TagClass<InnerAwsClient, "@knpkv/codecommit-core/InnerAwsClient", AwsClient.Service>;
|
|
26
|
+
export declare class InnerAwsClient extends InnerAwsClient_base {
|
|
27
|
+
}
|
|
28
|
+
export declare const AwsClientGatedLive: Layer.Layer<AwsClient, never, InnerAwsClient | PermissionService | PermissionGate | AuditLogRepo>;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=AwsClientGated.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AwsClientGated.d.ts","sourceRoot":"","sources":["../../src/AwsClient/AwsClientGated.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,OAAO,EAAU,KAAK,EAAiB,MAAM,QAAQ,CAAA;AAG9D,OAAO,EAAE,YAAY,EAAyB,MAAM,kCAAkC,CAAA;AACtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AAEjE,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAA;AACvE,OAAO,EAAE,SAAS,EAAuB,MAAM,YAAY,CAAA;;AAG3D,qBAAa,cAAe,SAAQ,mBAGjC;CAAG;AAiBN,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,KAAK,CAC1C,SAAS,EACT,KAAK,EACL,cAAc,GAAG,iBAAiB,GAAG,cAAc,GAAG,YAAY,CAqLnE,CAAA"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @title AwsClientGated — transparent permission proxy
|
|
3
|
+
*
|
|
4
|
+
* Wraps every AwsClient method with permission check + audit logging.
|
|
5
|
+
* Returns the same `AwsClient.Service` type — callers don't know it exists.
|
|
6
|
+
*
|
|
7
|
+
* Two patterns:
|
|
8
|
+
* 1. InnerAwsClient tag — holds the real implementation, avoids circular dep
|
|
9
|
+
* 2. Service capture at Layer construction — all services yielded once,
|
|
10
|
+
* closed over in gate/wrapEffect/wrapStream, no R leakage
|
|
11
|
+
*
|
|
12
|
+
* PermissionDeniedError → AwsApiError at the boundary for type transparency.
|
|
13
|
+
* The actual PermissionDeniedError is preserved as the AwsApiError's `cause`.
|
|
14
|
+
*
|
|
15
|
+
* All operations — reads, writes, and approval rule CRUD — are gated with
|
|
16
|
+
* the appropriate category for UI badge color and prompt behavior.
|
|
17
|
+
*
|
|
18
|
+
* @module
|
|
19
|
+
*/
|
|
20
|
+
import { Context, Effect, Layer, Match, Stream } from "effect";
|
|
21
|
+
import { AwsApiError, PermissionDeniedError } from "../Errors.js";
|
|
22
|
+
import { AuditLogRepo } from "../PermissionService/AuditLog.js";
|
|
23
|
+
import { PermissionService } from "../PermissionService/index.js";
|
|
24
|
+
import { getOperationMeta } from "../PermissionService/operations.js";
|
|
25
|
+
import { PermissionGate } from "../PermissionService/PermissionGate.js";
|
|
26
|
+
import { AwsClient } from "./index.js";
|
|
27
|
+
// Layer composition: AwsClientLive → InnerAwsClient (rename) → AwsClientGated → AwsClient
|
|
28
|
+
export class InnerAwsClient extends Context.Tag("@knpkv/codecommit-core/InnerAwsClient")() {
|
|
29
|
+
}
|
|
30
|
+
const toDeniedError = (p, reason) => new AwsApiError({
|
|
31
|
+
operation: p.operation,
|
|
32
|
+
profile: p.accountProfile,
|
|
33
|
+
region: p.region,
|
|
34
|
+
cause: new PermissionDeniedError({ operation: p.operation, reason })
|
|
35
|
+
});
|
|
36
|
+
export const AwsClientGatedLive = Layer.effect(AwsClient, Effect.gen(function* () {
|
|
37
|
+
const inner = yield* InnerAwsClient;
|
|
38
|
+
const permService = yield* PermissionService;
|
|
39
|
+
const gateService = yield* PermissionGate;
|
|
40
|
+
const auditLog = yield* AuditLogRepo;
|
|
41
|
+
// --- Core gate logic (captured services, no R leakage) ---
|
|
42
|
+
// Reads auditEnabled dynamically from Ref on each call —
|
|
43
|
+
// toggling audit in settings takes effect without restart
|
|
44
|
+
const logAudit = (params, permissionState, durationMs) => permService.isAuditEnabled().pipe(Effect.flatMap((enabled) => enabled
|
|
45
|
+
? auditLog.log({
|
|
46
|
+
timestamp: new Date().toISOString(),
|
|
47
|
+
operation: params.operation,
|
|
48
|
+
accountProfile: params.accountProfile,
|
|
49
|
+
region: params.region,
|
|
50
|
+
permissionState,
|
|
51
|
+
context: params.context,
|
|
52
|
+
durationMs
|
|
53
|
+
})
|
|
54
|
+
: Effect.void), Effect.catchAll(() => Effect.void));
|
|
55
|
+
const promptUser = (params) => Effect.gen(function* () {
|
|
56
|
+
const meta = getOperationMeta(params.operation);
|
|
57
|
+
const response = yield* gateService.request({
|
|
58
|
+
id: globalThis.crypto.randomUUID(),
|
|
59
|
+
operation: params.operation,
|
|
60
|
+
category: meta.category,
|
|
61
|
+
context: params.context
|
|
62
|
+
}).pipe(Effect.mapError(() => toDeniedError(params, "timeout")));
|
|
63
|
+
return yield* Match.value(response).pipe(Match.when("always_allow", () => permService.set(params.operation, "always_allow").pipe(Effect.as("always_allowed"))), Match.when("deny", () => Effect.gen(function* () {
|
|
64
|
+
yield* permService.set(params.operation, "deny");
|
|
65
|
+
yield* logAudit(params, "denied", null);
|
|
66
|
+
return yield* toDeniedError(params, "denied");
|
|
67
|
+
})), Match.when("allow_once", () => Effect.succeed("allowed")), Match.exhaustive);
|
|
68
|
+
});
|
|
69
|
+
const checkPermission = (params) => Effect.gen(function* () {
|
|
70
|
+
const state = yield* permService.check(params.operation);
|
|
71
|
+
return yield* Match.value(state).pipe(Match.when("always_allow", () => Effect.succeed("always_allowed")), Match.when("deny", () => logAudit(params, "denied", null).pipe(Effect.zipRight(toDeniedError(params, "denied")))), Match.when("allow", () => promptUser(params)), Match.exhaustive);
|
|
72
|
+
});
|
|
73
|
+
// --- Declarative wrapping: gated(op, ctx, acct, method) → wrapped method ---
|
|
74
|
+
// P inferred from `method` (last arg) — `acct` and `ctx` just extract strings
|
|
75
|
+
const gated = (op, ctx, acct, method) => (params) => {
|
|
76
|
+
const a = acct(params);
|
|
77
|
+
const g = { operation: op, context: ctx(params), accountProfile: a.profile, region: a.region };
|
|
78
|
+
return Effect.gen(function* () {
|
|
79
|
+
const ps = yield* checkPermission(g);
|
|
80
|
+
const start = Date.now();
|
|
81
|
+
const result = yield* method(params);
|
|
82
|
+
yield* logAudit(g, ps, Date.now() - start);
|
|
83
|
+
return result;
|
|
84
|
+
});
|
|
85
|
+
};
|
|
86
|
+
const gatedStream = (op, ctx, acct, method) => (params) => {
|
|
87
|
+
const a = acct(params);
|
|
88
|
+
const g = { operation: op, context: ctx(params), accountProfile: a.profile, region: a.region };
|
|
89
|
+
return Stream.unwrap(checkPermission(g).pipe(Effect.map((ps) => {
|
|
90
|
+
const start = Date.now();
|
|
91
|
+
return method(params).pipe(Stream.onDone(() => logAudit(g, ps, Date.now() - start)));
|
|
92
|
+
})));
|
|
93
|
+
};
|
|
94
|
+
const self = (a) => a;
|
|
95
|
+
const nested = (p) => p.account;
|
|
96
|
+
return {
|
|
97
|
+
getPullRequests: gatedStream("getPullRequests", (a) => `List PRs for ${a.profile}`, self, (a) => inner.getPullRequests(a)),
|
|
98
|
+
getCallerIdentity: gated("getCallerIdentity", (a) => `Get identity for ${a.profile}`, self, inner.getCallerIdentity),
|
|
99
|
+
createPullRequest: gated("createPullRequest", (p) => `Create PR on ${p.repositoryName}`, nested, inner.createPullRequest),
|
|
100
|
+
listBranches: gated("listBranches", (p) => `List branches in ${p.repositoryName}`, nested, inner.listBranches),
|
|
101
|
+
getCommentsForPullRequest: gated("getCommentsForPullRequest", (p) => `Comments for PR #${p.pullRequestId}`, nested, inner.getCommentsForPullRequest),
|
|
102
|
+
updatePullRequestTitle: gated("updatePullRequestTitle", (p) => `Edit title of PR #${p.pullRequestId}`, nested, inner.updatePullRequestTitle),
|
|
103
|
+
updatePullRequestDescription: gated("updatePullRequestDescription", (p) => `Edit desc of PR #${p.pullRequestId}`, nested, inner.updatePullRequestDescription),
|
|
104
|
+
getPullRequest: gated("getPullRequest", (p) => `Fetch PR #${p.pullRequestId}`, nested, inner.getPullRequest),
|
|
105
|
+
getDifferences: gated("getDifferences", (p) => `Diff for ${p.repositoryName}`, nested, inner.getDifferences),
|
|
106
|
+
createApprovalRule: gated("createApprovalRule", (p) => `Create rule "${p.approvalRuleName}" on PR #${p.pullRequestId}`, nested, inner.createApprovalRule),
|
|
107
|
+
updateApprovalRule: gated("updateApprovalRule", (p) => `Update rule "${p.approvalRuleName}" on PR #${p.pullRequestId}`, nested, inner.updateApprovalRule),
|
|
108
|
+
deleteApprovalRule: gated("deleteApprovalRule", (p) => `Delete rule "${p.approvalRuleName}" on PR #${p.pullRequestId}`, nested, inner.deleteApprovalRule)
|
|
109
|
+
};
|
|
110
|
+
}));
|
|
111
|
+
//# sourceMappingURL=AwsClientGated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AwsClientGated.js","sourceRoot":"","sources":["../../src/AwsClient/AwsClientGated.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { type CreateApprovalRuleParams } from "./internal.js";
|
|
3
|
+
export declare const createApprovalRule: (params: CreateApprovalRuleParams) => Effect.Effect<void, import("./internal.js").AwsCredentialError | import("./internal.js").AwsApiError, import("../AwsClientConfig.ts").AwsClientConfig | import("@effect/platform/HttpClient").HttpClient>;
|
|
4
|
+
//# sourceMappingURL=createApprovalRule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createApprovalRule.d.ts","sourceRoot":"","sources":["../../src/AwsClient/createApprovalRule.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,KAAK,wBAAwB,EAAgC,MAAM,eAAe,CAAA;AAY3F,eAAO,MAAM,kBAAkB,GAAI,QAAQ,wBAAwB,8MACmB,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates an approval rule on a pull request via
|
|
3
|
+
* `distilled-aws/codecommit.createPullRequestApprovalRule`, wrapped with
|
|
4
|
+
* {@link withAwsContext} for credential acquisition and retry.
|
|
5
|
+
*
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
import * as codecommit from "distilled-aws/codecommit";
|
|
9
|
+
import { Effect } from "effect";
|
|
10
|
+
import { makeApiError, withAwsContext } from "./internal.js";
|
|
11
|
+
const callCreateApprovalRule = (params) => codecommit.createPullRequestApprovalRule({
|
|
12
|
+
pullRequestId: params.pullRequestId,
|
|
13
|
+
approvalRuleName: params.approvalRuleName,
|
|
14
|
+
approvalRuleContent: params.approvalRuleContent
|
|
15
|
+
}).pipe(Effect.asVoid, Effect.mapError((cause) => makeApiError("createApprovalRule", params.account.profile, params.account.region, cause)));
|
|
16
|
+
export const createApprovalRule = (params) => withAwsContext("createApprovalRule", params.account, callCreateApprovalRule(params));
|
|
17
|
+
//# sourceMappingURL=createApprovalRule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createApprovalRule.js","sourceRoot":"","sources":["../../src/AwsClient/createApprovalRule.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,UAAU,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAiC,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE3F,MAAM,sBAAsB,GAAG,CAAC,MAAgC,EAAE,EAAE,CAClE,UAAU,CAAC,6BAA6B,CAAC;IACvC,aAAa,EAAE,MAAM,CAAC,aAAa;IACnC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;IACzC,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;CAChD,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,oBAAoB,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CACrH,CAAA;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAgC,EAAE,EAAE,CACrE,cAAc,CAAC,oBAAoB,EAAE,MAAM,CAAC,OAAO,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { type DeleteApprovalRuleParams } from "./internal.js";
|
|
3
|
+
export declare const deleteApprovalRule: (params: DeleteApprovalRuleParams) => Effect.Effect<void, import("./internal.js").AwsCredentialError | import("./internal.js").AwsApiError, import("../AwsClientConfig.ts").AwsClientConfig | import("@effect/platform/HttpClient").HttpClient>;
|
|
4
|
+
//# sourceMappingURL=deleteApprovalRule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deleteApprovalRule.d.ts","sourceRoot":"","sources":["../../src/AwsClient/deleteApprovalRule.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,KAAK,wBAAwB,EAAgC,MAAM,eAAe,CAAA;AAW3F,eAAO,MAAM,kBAAkB,GAAI,QAAQ,wBAAwB,8MACmB,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deletes an approval rule from a pull request via
|
|
3
|
+
* `distilled-aws/codecommit.deletePullRequestApprovalRule`, wrapped with
|
|
4
|
+
* {@link withAwsContext} for credential acquisition and retry.
|
|
5
|
+
*
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
import * as codecommit from "distilled-aws/codecommit";
|
|
9
|
+
import { Effect } from "effect";
|
|
10
|
+
import { makeApiError, withAwsContext } from "./internal.js";
|
|
11
|
+
const callDeleteApprovalRule = (params) => codecommit.deletePullRequestApprovalRule({
|
|
12
|
+
pullRequestId: params.pullRequestId,
|
|
13
|
+
approvalRuleName: params.approvalRuleName
|
|
14
|
+
}).pipe(Effect.asVoid, Effect.mapError((cause) => makeApiError("deleteApprovalRule", params.account.profile, params.account.region, cause)));
|
|
15
|
+
export const deleteApprovalRule = (params) => withAwsContext("deleteApprovalRule", params.account, callDeleteApprovalRule(params));
|
|
16
|
+
//# sourceMappingURL=deleteApprovalRule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deleteApprovalRule.js","sourceRoot":"","sources":["../../src/AwsClient/deleteApprovalRule.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,UAAU,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAiC,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE3F,MAAM,sBAAsB,GAAG,CAAC,MAAgC,EAAE,EAAE,CAClE,UAAU,CAAC,6BAA6B,CAAC;IACvC,aAAa,EAAE,MAAM,CAAC,aAAa;IACnC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;CAC1C,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,oBAAoB,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CACrH,CAAA;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAgC,EAAE,EAAE,CACrE,cAAc,CAAC,oBAAoB,EAAE,MAAM,CAAC,OAAO,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getPullRequest.d.ts","sourceRoot":"","sources":["../../src/AwsClient/getPullRequest.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getPullRequest.d.ts","sourceRoot":"","sources":["../../src/AwsClient/getPullRequest.ts"],"names":[],"mappings":"AA0BA,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAA;AAEvC,OAAO,EACL,KAAK,oBAAoB,EAGzB,iBAAiB,EAElB,MAAM,eAAe,CAAA;AA4FtB,eAAO,MAAM,cAAc,GAAI,QAAQ,oBAAoB,2NACmB,CAAA"}
|
|
@@ -1,8 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
|
+
* Fetches a single PR's full detail — metadata, approvers, approval rules,
|
|
3
|
+
* and repo account ID in parallel. Returns a {@link PullRequestDetail}
|
|
4
|
+
* transport object.
|
|
5
|
+
*
|
|
6
|
+
* **Mental model**
|
|
7
|
+
*
|
|
8
|
+
* ```
|
|
9
|
+
* codecommit.getPullRequest ─┬─► decodePullRequestDetail
|
|
10
|
+
* ├─► fetchApprovers → { names, arns }
|
|
11
|
+
* ├─► fetchApprovalEvaluation → satisfiedNames
|
|
12
|
+
* └─► fetchRepoAccountId → repo account ID
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* - Shared: {@link buildApprovalRules}, {@link fetchApprovalEvaluation},
|
|
16
|
+
* {@link fetchRepoAccountId} from getPullRequests.ts
|
|
17
|
+
* - Runs inside {@link withAwsContext} (Credentials + Region + AwsClientConfig)
|
|
18
|
+
*
|
|
19
|
+
* **Gotchas**
|
|
20
|
+
*
|
|
21
|
+
* - `PullRequestDetail.approvalRules` uses inline struct, not Schema.Class —
|
|
22
|
+
* class constructors reject plain objects from `buildApprovalRules`
|
|
23
|
+
*
|
|
2
24
|
* @internal
|
|
3
25
|
*/
|
|
4
26
|
import * as codecommit from "distilled-aws/codecommit";
|
|
5
27
|
import { Effect, Schema } from "effect";
|
|
28
|
+
import { buildApprovalRules, fetchApprovalEvaluation, fetchApprovers, fetchRepoAccountId } from "./getPullRequests.js";
|
|
6
29
|
import { makeApiError, normalizeAuthor, PullRequestDetail, withAwsContext } from "./internal.js";
|
|
7
30
|
const EpochFallback = new Date(0);
|
|
8
31
|
// Bidirectional Schema: raw AWS GetPullRequest response ↔ PullRequestDetail
|
|
@@ -63,19 +86,23 @@ const RawToPullRequestDetail = Schema.transform(RawGetPullRequestResponse, PullR
|
|
|
63
86
|
});
|
|
64
87
|
// Effectful decode — ParseError in error channel instead of thrown defect
|
|
65
88
|
const decodePullRequestDetail = (raw) => Schema.decodeUnknown(RawToPullRequestDetail)(raw);
|
|
66
|
-
const fetchApprovers = (pullRequestId, revisionId) => codecommit.getPullRequestApprovalStates({ pullRequestId, revisionId }).pipe(Effect.map((r) => (r.approvals ?? [])
|
|
67
|
-
.filter((a) => a.approvalState === "APPROVE" && a.userArn)
|
|
68
|
-
.map((a) => normalizeAuthor(a.userArn))), Effect.catchAll(() => Effect.succeed([])));
|
|
69
89
|
const callGetPullRequest = (params) => Effect.gen(function* () {
|
|
70
90
|
const resp = yield* codecommit.getPullRequest({ pullRequestId: params.pullRequestId });
|
|
71
91
|
const revisionId = resp.pullRequest?.revisionId ?? "";
|
|
72
|
-
const
|
|
92
|
+
const repoName = resp.pullRequest?.pullRequestTargets?.[0]?.repositoryName ?? "";
|
|
93
|
+
const [detail, approvers, evaluation, repoAccountId] = yield* Effect.all([
|
|
73
94
|
decodePullRequestDetail(resp),
|
|
74
|
-
fetchApprovers(params.pullRequestId, revisionId)
|
|
75
|
-
|
|
95
|
+
fetchApprovers(params.pullRequestId, revisionId),
|
|
96
|
+
fetchApprovalEvaluation(params.pullRequestId, revisionId),
|
|
97
|
+
fetchRepoAccountId(repoName)
|
|
98
|
+
], { concurrency: 4 });
|
|
99
|
+
const approvalRules = buildApprovalRules(resp.pullRequest?.approvalRules ?? [], evaluation.satisfiedNames);
|
|
76
100
|
return new PullRequestDetail({
|
|
77
101
|
...detail,
|
|
78
|
-
approvedBy: approvers
|
|
102
|
+
approvedBy: approvers.names,
|
|
103
|
+
approvedByArns: approvers.arns,
|
|
104
|
+
approvalRules,
|
|
105
|
+
repoAccountId: repoAccountId || undefined
|
|
79
106
|
});
|
|
80
107
|
}).pipe(Effect.mapError((cause) => makeApiError("getPullRequest", params.account.profile, params.account.region, cause)));
|
|
81
108
|
export const getPullRequest = (params) => withAwsContext("getPullRequest", params.account, callGetPullRequest(params));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getPullRequest.js","sourceRoot":"","sources":["../../src/AwsClient/getPullRequest.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"getPullRequest.js","sourceRoot":"","sources":["../../src/AwsClient/getPullRequest.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,92 @@
|
|
|
1
1
|
/**
|
|
2
|
+
* Bulk PR fetch — streams all open PRs across repos for one account.
|
|
3
|
+
*
|
|
4
|
+
* Lists all repositories, discovers PR IDs per repo, then fetches full
|
|
5
|
+
* details (approval rules, evaluation state, merge conflicts, approvers,
|
|
6
|
+
* repo account ID) per PR and decodes into {@link PullRequest} domain objects.
|
|
7
|
+
*
|
|
8
|
+
* **Mental model**
|
|
9
|
+
*
|
|
10
|
+
* ```
|
|
11
|
+
* listRepos → listPRIds → fetchPRDetails → getRepoAccount → decodePullRequest
|
|
12
|
+
* │ │
|
|
13
|
+
* evaluateApprovalRules getRepository
|
|
14
|
+
* getPullRequest (cached per repo)
|
|
15
|
+
* getApprovalStates
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* - Two API responses merged per PR: `getPullRequest.approvalRules` (rule defs)
|
|
19
|
+
* + `evaluateApprovalRules` (satisfied names). Cross-ref via {@link buildApprovalRules}.
|
|
20
|
+
* - {@link parseRuleContent}: AWS JSON `{Version, Statements[{ApprovalPoolMembers}]}`
|
|
21
|
+
* → `poolMembers` (normalized) + `poolMemberArns` (raw ARNs).
|
|
22
|
+
* - {@link fetchRepoAccountId}: `getRepository` once per repo (cached). Needed for
|
|
23
|
+
* cross-account SSO where `getCallerIdentity` ≠ CodeCommit account.
|
|
24
|
+
*
|
|
25
|
+
* **Gotchas**
|
|
26
|
+
*
|
|
27
|
+
* - `evaluateApprovalRules.approvalRulesSatisfied` is `string[]` of rule NAMES, not full objects
|
|
28
|
+
* - `parseRuleContent` falls back silently on malformed JSON (warns if content truthy)
|
|
29
|
+
* - `fetchApprovalEvaluation` uses `throttleRetry` — needs `AwsClientConfig` in context
|
|
30
|
+
*
|
|
2
31
|
* @internal
|
|
3
32
|
*/
|
|
4
33
|
import { HttpClient } from "@effect/platform";
|
|
5
|
-
import {
|
|
34
|
+
import { Credentials, Region } from "distilled-aws";
|
|
35
|
+
import { Effect, Stream } from "effect";
|
|
6
36
|
import { AwsClientConfig } from "../AwsClientConfig.js";
|
|
7
37
|
import { PullRequest } from "../Domain.js";
|
|
8
38
|
import type { AwsClientError } from "../Errors.js";
|
|
9
39
|
import { type AccountParams } from "./internal.js";
|
|
40
|
+
/**
|
|
41
|
+
* Parse AWS approval rule content JSON into pool members + required count.
|
|
42
|
+
* Format: {"Version":"2018-11-08","Statements":[{"Type":"Approvers","NumberOfApprovalsNeeded":N,"ApprovalPoolMembers":["arn:..."]}]}
|
|
43
|
+
*/
|
|
44
|
+
export declare const parseRuleContent: (content?: string) => {
|
|
45
|
+
requiredApprovals: number;
|
|
46
|
+
poolMembers: Array<string>;
|
|
47
|
+
poolMemberArns: Array<string>;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Evaluate which approval rules are satisfied/not, returning just the boolean + satisfied rule names.
|
|
51
|
+
*/
|
|
52
|
+
export declare const fetchApprovalEvaluation: (pullRequestId: string, revisionId: string) => Effect.Effect<{
|
|
53
|
+
isApproved: boolean;
|
|
54
|
+
satisfiedNames: Set<string>;
|
|
55
|
+
} | {
|
|
56
|
+
isApproved: boolean;
|
|
57
|
+
satisfiedNames: Set<string>;
|
|
58
|
+
}, never, AwsClientConfig | HttpClient.HttpClient | Region.Region | Credentials.Credentials>;
|
|
59
|
+
/** Plain data shape matching ApprovalRule — avoids Schema.Class branding. */
|
|
60
|
+
export interface ApprovalRuleData {
|
|
61
|
+
readonly ruleName: string;
|
|
62
|
+
readonly satisfied: boolean;
|
|
63
|
+
readonly requiredApprovals: number;
|
|
64
|
+
readonly poolMembers: Array<string>;
|
|
65
|
+
readonly poolMemberArns: Array<string>;
|
|
66
|
+
readonly fromTemplate?: string;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Build ApprovalRule data from getPullRequest's raw rules + evaluation satisfaction state.
|
|
70
|
+
* Filters out rules with empty names (phantom rules from missing AWS data).
|
|
71
|
+
*/
|
|
72
|
+
export declare const buildApprovalRules: (rawRules: ReadonlyArray<{
|
|
73
|
+
approvalRuleName?: string;
|
|
74
|
+
approvalRuleContent?: string;
|
|
75
|
+
originApprovalRuleTemplate?: {
|
|
76
|
+
approvalRuleTemplateName?: string;
|
|
77
|
+
};
|
|
78
|
+
}>, satisfiedNames: Set<string>) => Array<ApprovalRuleData>;
|
|
79
|
+
/**
|
|
80
|
+
* Fetch who approved a PR (ARN list of approvers with APPROVE state).
|
|
81
|
+
*/
|
|
82
|
+
export declare const fetchApprovers: (pullRequestId: string, revisionId: string) => Effect.Effect<{
|
|
83
|
+
names: string[];
|
|
84
|
+
arns: string[];
|
|
85
|
+
} | {
|
|
86
|
+
names: Array<string>;
|
|
87
|
+
arns: Array<string>;
|
|
88
|
+
}, never, AwsClientConfig | HttpClient.HttpClient | Region.Region | Credentials.Credentials>;
|
|
89
|
+
export declare const fetchRepoAccountId: (repoName: string) => Effect.Effect<string, never, HttpClient.HttpClient | Region.Region | Credentials.Credentials>;
|
|
10
90
|
export declare const getPullRequests: (account: AccountParams, options?: {
|
|
11
91
|
status?: "OPEN" | "CLOSED";
|
|
12
92
|
}) => Stream.Stream<PullRequest, AwsClientError, AwsClientConfig | HttpClient.HttpClient>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getPullRequests.d.ts","sourceRoot":"","sources":["../../src/AwsClient/getPullRequests.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"getPullRequests.d.ts","sourceRoot":"","sources":["../../src/AwsClient/getPullRequests.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAEnD,OAAO,EAAQ,MAAM,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAA0E,WAAW,EAAE,MAAM,cAAc,CAAA;AAClH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,KAAK,aAAa,EAAoE,MAAM,eAAe,CAAA;AAcpH;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAC3B,UAAU,MAAM,KACf;IAAE,iBAAiB,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAAC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;CAgBxF,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,uBAAuB,GAAI,eAAe,MAAM,EAAE,YAAY,MAAM;;;;;;4FAU9E,CAAA;AAEH,6EAA6E;AAC7E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;IACnC,QAAQ,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;IACtC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAC/B;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAC7B,UAAU,aAAa,CACrB;IACE,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,0BAA0B,CAAC,EAAE;QAAE,wBAAwB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CACnE,CACF,EACD,gBAAgB,GAAG,CAAC,MAAM,CAAC,KAC1B,KAAK,CAAC,gBAAgB,CAUlB,CAAA;AA8BP;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,eAAe,MAAM,EAAE,YAAY,MAAM;;;;WAYhB,KAAK,CAAC,MAAM,CAAC;UAAc,KAAK,CAAC,MAAM,CAAC;4FAC7F,CAAA;AA2HH,eAAO,MAAM,kBAAkB,GAAI,UAAU,MAAM,kGAKhD,CAAA;AAYH,eAAO,MAAM,eAAe,GAC1B,SAAS,aAAa,EACtB,UAAU;IAAE,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;CAAE,KACvC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,cAAc,EAAE,eAAe,GAAG,UAAU,CAAC,UAAU,CA6ClF,CAAA"}
|