github-issue-tower-defence-management 1.72.0 → 1.73.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/README.md +1 -1
- package/bin/domain/usecases/AnalyzeProblemByIssueUseCase.js +1 -1
- package/bin/domain/usecases/AnalyzeProblemByIssueUseCase.js.map +1 -1
- package/bin/domain/usecases/ChangeTargetPullRequestApprover.js +45 -0
- package/bin/domain/usecases/ChangeTargetPullRequestApprover.js.map +1 -0
- package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js +3 -36
- package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js.map +1 -1
- package/bin/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.js +5 -1
- package/bin/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.js.map +1 -1
- package/bin/domain/usecases/utils.js +1 -1
- package/bin/domain/usecases/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/domain/usecases/AnalyzeProblemByIssueUseCase.test.ts +66 -0
- package/src/domain/usecases/AnalyzeProblemByIssueUseCase.ts +1 -1
- package/src/domain/usecases/ChangeTargetPullRequestApprover.test.ts +131 -0
- package/src/domain/usecases/ChangeTargetPullRequestApprover.ts +58 -0
- package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts +9 -49
- package/src/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.test.ts +225 -0
- package/src/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.ts +15 -1
- package/src/domain/usecases/utils.test.ts +35 -0
- package/src/domain/usecases/utils.ts +1 -1
- package/types/domain/usecases/ChangeTargetPullRequestApprover.d.ts +9 -0
- package/types/domain/usecases/ChangeTargetPullRequestApprover.d.ts.map +1 -0
- package/types/domain/usecases/NotifyFinishedIssuePreparationUseCase.d.ts +1 -3
- package/types/domain/usecases/NotifyFinishedIssuePreparationUseCase.d.ts.map +1 -1
- package/types/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.d.ts +2 -1
- package/types/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.d.ts.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
## [1.73.1](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.73.0...v1.73.1) (2026-06-06)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* **security:** use global regex replace to fully sanitize URI characters and quote characters ([e06dbd6](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/e06dbd69a124101761e1357405e4c72668a37241)), closes [#720](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/720)
|
|
7
|
+
|
|
8
|
+
# [1.73.0](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.72.0...v1.73.0) (2026-06-06)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
* **core:** run change-target auto-approve check in periodic awaiting quality check cycle ([bf7f5b3](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/bf7f5b307c2d6af2f0377cab6d26e93b4e014e47)), closes [#770](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/770)
|
|
14
|
+
|
|
1
15
|
# [1.72.0](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.71.1...v1.72.0) (2026-06-06)
|
|
2
16
|
|
|
3
17
|
|
package/README.md
CHANGED
|
@@ -364,7 +364,7 @@ The `schedule` command runs two distinct processing loops within a single invoca
|
|
|
364
364
|
|
|
365
365
|
The following use cases execute on every `schedule` trigger (cadence is determined by the caller's cron/daemon, typically ~3 minutes):
|
|
366
366
|
|
|
367
|
-
- `RevertNotReadyAwaitingQualityCheckUseCase` — reverts awaiting-quality-check issues whose linked PR is conflicting, draft, missing, multiplied, has failing or never-started CI checks, or has unresolved review comments, back to awaiting-workspace
|
|
367
|
+
- `RevertNotReadyAwaitingQualityCheckUseCase` — reverts awaiting-quality-check issues whose linked PR is conflicting, draft, missing, multiplied, has failing or never-started CI checks, or has unresolved review comments, back to awaiting-workspace. For awaiting-quality-check issues that have no rejections, it also runs the same `change-target:<path>` auto-approve check as `NotifyFinishedIssuePreparationUseCase`: when the issue carries one or more `change-target:` labels and every changed file of the ready PR is confined to the labeled paths, the PR is auto-approved (issues with an `llm-agent` label are skipped).
|
|
368
368
|
- `RevertOrphanedPreparationUseCase` — reverts orphaned preparation issues back to awaiting-workspace
|
|
369
369
|
- `StartPreparationUseCase` — starts preparation for issues ready to be worked on
|
|
370
370
|
- `NotifyFinishedIssuePreparationUseCase` — checks preparation-status issues and advances them. When the issue carries one or more `change-target:<path>` labels and all auto status checks pass, the related pull request's full file list is fetched (paginated, no 100-file truncation) and the PR is auto-approved before transitioning to Awaiting Quality Check if every changed file is under at least one of the labeled paths. Matching is boundary-safe (`change-target:foo` matches `foo/bar.ts` but not `foobar/baz.ts`); multiple `change-target:` labels are OR-combined. When no `change-target:` label is present, behavior is unchanged.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnalyzeProblemByIssueUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/AnalyzeProblemByIssueUseCase.ts"],"names":[],"mappings":";;;AAKA,MAAa,4BAA4B;IACvC,YACW,eAAuD,EACvD,cAGR;QAJQ,oBAAe,GAAf,eAAe,CAAwC;QACvD,mBAAc,GAAd,cAAc,CAGtB;QAGH,QAAG,GAAG,KAAK,EAAE,KAIZ,EAAiB,EAAE;YAClB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAClC,IACE,CAAC,KAAK;gBACN,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CACrB,CAAC,UAAU,EAAE,EAAE,CACb,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,CAC/D,EACD,CAAC;gBACD,OAAO;YACT,CAAC;YACD,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACnE,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO;YACT,CAAC;YACD,KAAK,MAAM,WAAW,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC;gBACxD,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC;gBAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,SAAS;gBACX,CAAC;gBACD,MAAM,IAAI,CAAC,eAAe,CAAC,aAAa,CACtC,UAAU,EACV,IAAI,CAAC,wBAAwB,CAAC,EAAE,GAAG,WAAW,EAAE,UAAU,EAAE,CAAC,CAC9D,CAAC;gBACF,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC,CAAC;QACF,6BAAwB,GAAG,CACzB,WAEC,EACO,EAAE;YACV,MAAM,qBAAqB,GAAG,CAAC,GAAW,EAAE,EAAE;gBAC5C,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5C,CAAC,CAAC;YACF,MAAM,sBAAsB,GAAG,CAAC,KAAa,EAAE,EAAE;gBAC/C,OAAO,KAAK,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"AnalyzeProblemByIssueUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/AnalyzeProblemByIssueUseCase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ChangeTargetPullRequestApprover = void 0;
|
|
4
|
+
class ChangeTargetPullRequestApprover {
|
|
5
|
+
constructor(issueRepository) {
|
|
6
|
+
this.issueRepository = issueRepository;
|
|
7
|
+
this.approveIfConfined = async (issueLabels, approvedPrUrl) => {
|
|
8
|
+
if (approvedPrUrl === null) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
const changeTargetPaths = this.extractChangeTargetPaths(issueLabels);
|
|
12
|
+
if (changeTargetPaths.length === 0) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const changedFilePaths = await this.issueRepository.getPullRequestChangedFilePaths(approvedPrUrl);
|
|
16
|
+
if (changedFilePaths.length === 0) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const allConfined = changedFilePaths.every((filePath) => this.isFilePathConfinedToAllowedPaths(filePath, changeTargetPaths));
|
|
20
|
+
if (!allConfined) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
await this.issueRepository.approvePullRequest(approvedPrUrl);
|
|
24
|
+
};
|
|
25
|
+
this.extractChangeTargetPaths = (labels) => {
|
|
26
|
+
const prefix = 'change-target:';
|
|
27
|
+
const paths = [];
|
|
28
|
+
for (const label of labels) {
|
|
29
|
+
if (!label.startsWith(prefix))
|
|
30
|
+
continue;
|
|
31
|
+
const raw = label.slice(prefix.length).trim();
|
|
32
|
+
if (raw.length === 0)
|
|
33
|
+
continue;
|
|
34
|
+
const normalized = raw.replace(/\/+$/, '');
|
|
35
|
+
if (normalized.length === 0)
|
|
36
|
+
continue;
|
|
37
|
+
paths.push(normalized);
|
|
38
|
+
}
|
|
39
|
+
return paths;
|
|
40
|
+
};
|
|
41
|
+
this.isFilePathConfinedToAllowedPaths = (filePath, allowedPaths) => allowedPaths.some((allowedPath) => filePath === allowedPath || filePath.startsWith(`${allowedPath}/`));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.ChangeTargetPullRequestApprover = ChangeTargetPullRequestApprover;
|
|
45
|
+
//# sourceMappingURL=ChangeTargetPullRequestApprover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChangeTargetPullRequestApprover.js","sourceRoot":"","sources":["../../../src/domain/usecases/ChangeTargetPullRequestApprover.ts"],"names":[],"mappings":";;;AAEA,MAAa,+BAA+B;IAC1C,YACmB,eAGhB;QAHgB,oBAAe,GAAf,eAAe,CAG/B;QAGH,sBAAiB,GAAG,KAAK,EACvB,WAAqB,EACrB,aAA4B,EACb,EAAE;YACjB,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;gBAC3B,OAAO;YACT,CAAC;YACD,MAAM,iBAAiB,GAAG,IAAI,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC;YACrE,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnC,OAAO;YACT,CAAC;YACD,MAAM,gBAAgB,GACpB,MAAM,IAAI,CAAC,eAAe,CAAC,8BAA8B,CAAC,aAAa,CAAC,CAAC;YAC3E,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClC,OAAO;YACT,CAAC;YACD,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,CACtD,IAAI,CAAC,gCAAgC,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CACnE,CAAC;YACF,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,OAAO;YACT,CAAC;YACD,MAAM,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC;QAC/D,CAAC,CAAC;QAEM,6BAAwB,GAAG,CAAC,MAAgB,EAAY,EAAE;YAChE,MAAM,MAAM,GAAG,gBAAgB,CAAC;YAChC,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;oBAAE,SAAS;gBACxC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC9C,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS;gBAC/B,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAC3C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS;gBACtC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACzB,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEM,qCAAgC,GAAG,CACzC,QAAgB,EAChB,YAAsB,EACb,EAAE,CACX,YAAY,CAAC,IAAI,CACf,CAAC,WAAW,EAAE,EAAE,CACd,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,WAAW,GAAG,CAAC,CACrE,CAAC;IAhDD,CAAC;CAiDL;AAvDD,0EAuDC"}
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.NotifyFinishedIssuePreparationUseCase = exports.IllegalIssueStatusError = exports.IssueNotFoundError = void 0;
|
|
4
4
|
const WorkflowStatus_1 = require("../entities/WorkflowStatus");
|
|
5
5
|
const IssueRejectionEvaluator_1 = require("./IssueRejectionEvaluator");
|
|
6
|
+
const ChangeTargetPullRequestApprover_1 = require("./ChangeTargetPullRequestApprover");
|
|
6
7
|
class IssueNotFoundError extends Error {
|
|
7
8
|
constructor(issueUrl) {
|
|
8
9
|
super(`Issue not found: ${issueUrl}`);
|
|
@@ -99,7 +100,7 @@ class NotifyFinishedIssuePreparationUseCase {
|
|
|
99
100
|
return;
|
|
100
101
|
}
|
|
101
102
|
if (rejections.length <= 0) {
|
|
102
|
-
await this.
|
|
103
|
+
await this.changeTargetPullRequestApprover.approveIfConfined(issue.labels, approvedPrUrl);
|
|
103
104
|
issue.status = WorkflowStatus_1.AWAITING_QUALITY_CHECK_STATUS_NAME;
|
|
104
105
|
await this.issueRepository.update(issue, project);
|
|
105
106
|
await this.issueRepository.updateStatus(project, issue, awaitingQualityCheckStatusOption.id);
|
|
@@ -114,41 +115,6 @@ class NotifyFinishedIssuePreparationUseCase {
|
|
|
114
115
|
await this.issueCommentRepository.createComment(issue, rejectionStatusMessage);
|
|
115
116
|
};
|
|
116
117
|
this.isAuthorTrusted = (author, allowedIssueAuthors) => allowedIssueAuthors === null || allowedIssueAuthors.includes(author);
|
|
117
|
-
this.extractChangeTargetPaths = (labels) => {
|
|
118
|
-
const prefix = 'change-target:';
|
|
119
|
-
const paths = [];
|
|
120
|
-
for (const label of labels) {
|
|
121
|
-
if (!label.startsWith(prefix))
|
|
122
|
-
continue;
|
|
123
|
-
const raw = label.slice(prefix.length).trim();
|
|
124
|
-
if (raw.length === 0)
|
|
125
|
-
continue;
|
|
126
|
-
const normalized = raw.replace(/\/+$/, '');
|
|
127
|
-
if (normalized.length === 0)
|
|
128
|
-
continue;
|
|
129
|
-
paths.push(normalized);
|
|
130
|
-
}
|
|
131
|
-
return paths;
|
|
132
|
-
};
|
|
133
|
-
this.isFilePathConfinedToAllowedPaths = (filePath, allowedPaths) => allowedPaths.some((allowedPath) => filePath === allowedPath || filePath.startsWith(`${allowedPath}/`));
|
|
134
|
-
this.maybeAutoApprovePrByChangeTarget = async (issue, approvedPrUrl) => {
|
|
135
|
-
if (approvedPrUrl === null) {
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
const changeTargetPaths = this.extractChangeTargetPaths(issue.labels);
|
|
139
|
-
if (changeTargetPaths.length === 0) {
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
const changedFilePaths = await this.issueRepository.getPullRequestChangedFilePaths(approvedPrUrl);
|
|
143
|
-
if (changedFilePaths.length === 0) {
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
const allConfined = changedFilePaths.every((filePath) => this.isFilePathConfinedToAllowedPaths(filePath, changeTargetPaths));
|
|
147
|
-
if (!allConfined) {
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
await this.issueRepository.approvePullRequest(approvedPrUrl);
|
|
151
|
-
};
|
|
152
118
|
this.collectRejections = async (issue, comments, isTrustedAuthor) => {
|
|
153
119
|
const rejections = [];
|
|
154
120
|
const lastComment = comments[comments.length - 1];
|
|
@@ -232,6 +198,7 @@ class NotifyFinishedIssuePreparationUseCase {
|
|
|
232
198
|
}
|
|
233
199
|
};
|
|
234
200
|
this.issueRejectionEvaluator = new IssueRejectionEvaluator_1.IssueRejectionEvaluator(issueRepository);
|
|
201
|
+
this.changeTargetPullRequestApprover = new ChangeTargetPullRequestApprover_1.ChangeTargetPullRequestApprover(issueRepository);
|
|
235
202
|
}
|
|
236
203
|
}
|
|
237
204
|
exports.NotifyFinishedIssuePreparationUseCase = NotifyFinishedIssuePreparationUseCase;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotifyFinishedIssuePreparationUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"NotifyFinishedIssuePreparationUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.RevertNotReadyAwaitingQualityCheckUseCase = void 0;
|
|
4
4
|
const IssueRejectionEvaluator_1 = require("./IssueRejectionEvaluator");
|
|
5
|
+
const ChangeTargetPullRequestApprover_1 = require("./ChangeTargetPullRequestApprover");
|
|
5
6
|
const WorkflowStatus_1 = require("../entities/WorkflowStatus");
|
|
6
7
|
class RevertNotReadyAwaitingQualityCheckUseCase {
|
|
7
8
|
constructor(projectRepository, issueRepository, issueCommentRepository) {
|
|
@@ -28,14 +29,17 @@ class RevertNotReadyAwaitingQualityCheckUseCase {
|
|
|
28
29
|
if (hasLlmAgentLabel) {
|
|
29
30
|
continue;
|
|
30
31
|
}
|
|
31
|
-
const { rejections } = await this.issueRejectionEvaluator.evaluate(issue);
|
|
32
|
+
const { rejections, approvedPrUrl } = await this.issueRejectionEvaluator.evaluate(issue);
|
|
32
33
|
if (rejections.length > 0) {
|
|
33
34
|
await this.issueRepository.updateStatus(project, issue, awaitingWorkspaceStatusOption.id);
|
|
34
35
|
await this.issueCommentRepository.createComment(issue, `Auto Status Check: REJECTED\n${rejections.map((r) => `- ${r.detail}`).join('\n')}`);
|
|
36
|
+
continue;
|
|
35
37
|
}
|
|
38
|
+
await this.changeTargetPullRequestApprover.approveIfConfined(issue.labels, approvedPrUrl);
|
|
36
39
|
}
|
|
37
40
|
};
|
|
38
41
|
this.issueRejectionEvaluator = new IssueRejectionEvaluator_1.IssueRejectionEvaluator(issueRepository);
|
|
42
|
+
this.changeTargetPullRequestApprover = new ChangeTargetPullRequestApprover_1.ChangeTargetPullRequestApprover(issueRepository);
|
|
39
43
|
}
|
|
40
44
|
}
|
|
41
45
|
exports.RevertNotReadyAwaitingQualityCheckUseCase = RevertNotReadyAwaitingQualityCheckUseCase;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RevertNotReadyAwaitingQualityCheckUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.ts"],"names":[],"mappings":";;;AAGA,uEAAoE;AACpE,+DAGoC;AAEpC,MAAa,yCAAyC;
|
|
1
|
+
{"version":3,"file":"RevertNotReadyAwaitingQualityCheckUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.ts"],"names":[],"mappings":";;;AAGA,uEAAoE;AACpE,uFAAoF;AACpF,+DAGoC;AAEpC,MAAa,yCAAyC;IAIpD,YACmB,iBAGhB,EACgB,eAQhB,EACgB,sBAGhB;QAhBgB,sBAAiB,GAAjB,iBAAiB,CAGjC;QACgB,oBAAe,GAAf,eAAe,CAQ/B;QACgB,2BAAsB,GAAtB,sBAAsB,CAGtC;QAQH,QAAG,GAAG,KAAK,EAAE,MAGZ,EAAiB,EAAE;YAClB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAC/D,MAAM,CAAC,UAAU,CAClB,CAAC;YACF,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,kCAAkC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;YACzE,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YACnE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CACb,iCAAiC,SAAS,gBAAgB,MAAM,CAAC,UAAU,EAAE,CAC9E,CAAC;YACJ,CAAC;YAED,MAAM,6BAA6B,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAChE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,+CAA8B,CACjD,CAAC;YACF,IAAI,CAAC,6BAA6B,EAAE,CAAC;gBACnC,OAAO;YACT,CAAC;YAED,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,CACxD,SAAS,EACT,MAAM,CAAC,sBAAsB,CAC9B,CAAC;YAEF,MAAM,0BAA0B,GAAG,MAAM,CAAC,MAAM,CAC9C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,mDAAkC,CAC/D,CAAC;YAEF,KAAK,MAAM,KAAK,IAAI,0BAA0B,EAAE,CAAC;gBAC/C,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CACxC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,WAAW,IAAI,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,CACvD,CAAC;gBACF,IAAI,gBAAgB,EAAE,CAAC;oBACrB,SAAS;gBACX,CAAC;gBAED,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,GACjC,MAAM,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACrD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC1B,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,CACrC,OAAO,EACP,KAAK,EACL,6BAA6B,CAAC,EAAE,CACjC,CAAC;oBACF,MAAM,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAC7C,KAAK,EACL,gCAAgC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACpF,CAAC;oBACF,SAAS;gBACX,CAAC;gBAED,MAAM,IAAI,CAAC,+BAA+B,CAAC,iBAAiB,CAC1D,KAAK,CAAC,MAAM,EACZ,aAAa,CACd,CAAC;YACJ,CAAC;QACH,CAAC,CAAC;QAnEA,IAAI,CAAC,uBAAuB,GAAG,IAAI,iDAAuB,CAAC,eAAe,CAAC,CAAC;QAC5E,IAAI,CAAC,+BAA+B,GAAG,IAAI,iEAA+B,CACxE,eAAe,CAChB,CAAC;IACJ,CAAC;CAgEF;AA3FD,8FA2FC"}
|
|
@@ -5,7 +5,7 @@ const encodeForURI = (url) => {
|
|
|
5
5
|
if (!url) {
|
|
6
6
|
return '';
|
|
7
7
|
}
|
|
8
|
-
return encodeURI(url).replace(
|
|
8
|
+
return encodeURI(url).replace(/#/g, '%23').replace(/&/g, '%26');
|
|
9
9
|
};
|
|
10
10
|
exports.encodeForURI = encodeForURI;
|
|
11
11
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/domain/usecases/utils.ts"],"names":[],"mappings":";;;AAAO,MAAM,YAAY,GAAG,CAAC,GAAmB,EAAU,EAAE;IAC1D,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/domain/usecases/utils.ts"],"names":[],"mappings":";;;AAAO,MAAM,YAAY,GAAG,CAAC,GAAmB,EAAU,EAAE;IAC1D,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAClE,CAAC,CAAC;AALW,QAAA,YAAY,gBAKvB"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { mock } from 'jest-mock-extended';
|
|
2
|
+
import { AnalyzeProblemByIssueUseCase } from './AnalyzeProblemByIssueUseCase';
|
|
3
|
+
import { IssueRepository } from './adapter-interfaces/IssueRepository';
|
|
4
|
+
import { DateRepository } from './adapter-interfaces/DateRepository';
|
|
5
|
+
import { Issue } from '../entities/Issue';
|
|
6
|
+
import { StoryObject } from '../entities/StoryObjectMap';
|
|
7
|
+
import { StoryOption } from '../entities/Project';
|
|
8
|
+
|
|
9
|
+
describe('AnalyzeProblemByIssueUseCase', () => {
|
|
10
|
+
const mockIssueRepository = mock<IssueRepository>();
|
|
11
|
+
const mockDateRepository = mock<DateRepository>();
|
|
12
|
+
const useCase = new AnalyzeProblemByIssueUseCase(
|
|
13
|
+
mockIssueRepository,
|
|
14
|
+
mockDateRepository,
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
describe('createSummaryCommentBody', () => {
|
|
18
|
+
const createIssueWithTitle = (title: string): Issue => {
|
|
19
|
+
const issue = mock<Issue>();
|
|
20
|
+
issue.url = 'https://github.com/org/repo/issues/1';
|
|
21
|
+
issue.number = 1;
|
|
22
|
+
issue.title = title;
|
|
23
|
+
issue.isClosed = false;
|
|
24
|
+
issue.assignees = [];
|
|
25
|
+
issue.dependedIssueUrls = [];
|
|
26
|
+
issue.estimationMinutes = null;
|
|
27
|
+
issue.completionDate50PercentConfidence = null;
|
|
28
|
+
return issue;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const createStoryIssue = (): Issue => {
|
|
32
|
+
const issue = mock<Issue>();
|
|
33
|
+
issue.url = 'https://github.com/org/repo/issues/100';
|
|
34
|
+
issue.number = 100;
|
|
35
|
+
issue.title = 'Story';
|
|
36
|
+
return issue;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
it('should replace all double-quote characters in the issue title with single quotes', () => {
|
|
40
|
+
const titleWithMultipleQuotes = 'a"b"c"d';
|
|
41
|
+
const storyObject: StoryObject & { storyIssue: Issue } = {
|
|
42
|
+
story: mock<StoryOption>(),
|
|
43
|
+
storyIssue: createStoryIssue(),
|
|
44
|
+
issues: [createIssueWithTitle(titleWithMultipleQuotes)],
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const result = useCase.createSummaryCommentBody(storyObject);
|
|
48
|
+
|
|
49
|
+
expect(result).toContain("a'b'c'd");
|
|
50
|
+
expect(result).not.toContain('a"b');
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('should leave titles without double-quote characters unchanged', () => {
|
|
54
|
+
const plainTitle = 'plain title';
|
|
55
|
+
const storyObject: StoryObject & { storyIssue: Issue } = {
|
|
56
|
+
story: mock<StoryOption>(),
|
|
57
|
+
storyIssue: createStoryIssue(),
|
|
58
|
+
issues: [createIssueWithTitle(plainTitle)],
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const result = useCase.createSummaryCommentBody(storyObject);
|
|
62
|
+
|
|
63
|
+
expect(result).toContain(plainTitle);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
});
|
|
@@ -52,7 +52,7 @@ export class AnalyzeProblemByIssueUseCase {
|
|
|
52
52
|
return url.split('/').slice(-3).join('/');
|
|
53
53
|
};
|
|
54
54
|
const issueTitleForFlowchart = (title: string) => {
|
|
55
|
-
return title.replace(
|
|
55
|
+
return title.replace(/"/g, "'");
|
|
56
56
|
};
|
|
57
57
|
const flowChart = `
|
|
58
58
|
\`\`\`mermaid
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { ChangeTargetPullRequestApprover } from './ChangeTargetPullRequestApprover';
|
|
2
|
+
|
|
3
|
+
describe('ChangeTargetPullRequestApprover', () => {
|
|
4
|
+
let mockIssueRepository: {
|
|
5
|
+
getPullRequestChangedFilePaths: jest.Mock;
|
|
6
|
+
approvePullRequest: jest.Mock;
|
|
7
|
+
};
|
|
8
|
+
let approver: ChangeTargetPullRequestApprover;
|
|
9
|
+
const prUrl = 'https://github.com/user/repo/pull/1';
|
|
10
|
+
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
jest.resetAllMocks();
|
|
13
|
+
mockIssueRepository = {
|
|
14
|
+
getPullRequestChangedFilePaths: jest.fn().mockResolvedValue([]),
|
|
15
|
+
approvePullRequest: jest.fn().mockResolvedValue(undefined),
|
|
16
|
+
};
|
|
17
|
+
approver = new ChangeTargetPullRequestApprover(mockIssueRepository);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('should do nothing when approvedPrUrl is null', async () => {
|
|
21
|
+
await approver.approveIfConfined(['change-target:src/domain'], null);
|
|
22
|
+
|
|
23
|
+
expect(
|
|
24
|
+
mockIssueRepository.getPullRequestChangedFilePaths,
|
|
25
|
+
).not.toHaveBeenCalled();
|
|
26
|
+
expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('should do nothing when issue has no change-target label', async () => {
|
|
30
|
+
await approver.approveIfConfined(['category:e2e'], prUrl);
|
|
31
|
+
|
|
32
|
+
expect(
|
|
33
|
+
mockIssueRepository.getPullRequestChangedFilePaths,
|
|
34
|
+
).not.toHaveBeenCalled();
|
|
35
|
+
expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('should approve when all files are confined to the labeled path', async () => {
|
|
39
|
+
mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
|
|
40
|
+
'src/domain/entities/Foo.ts',
|
|
41
|
+
'src/domain/usecases/Bar.ts',
|
|
42
|
+
]);
|
|
43
|
+
|
|
44
|
+
await approver.approveIfConfined(['change-target:src/domain'], prUrl);
|
|
45
|
+
|
|
46
|
+
expect(
|
|
47
|
+
mockIssueRepository.getPullRequestChangedFilePaths,
|
|
48
|
+
).toHaveBeenCalledWith(prUrl);
|
|
49
|
+
expect(mockIssueRepository.approvePullRequest).toHaveBeenCalledWith(prUrl);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('should not approve when any file is outside the labeled path', async () => {
|
|
53
|
+
mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
|
|
54
|
+
'src/domain/entities/Foo.ts',
|
|
55
|
+
'src/adapter/Outside.ts',
|
|
56
|
+
]);
|
|
57
|
+
|
|
58
|
+
await approver.approveIfConfined(['change-target:src/domain'], prUrl);
|
|
59
|
+
|
|
60
|
+
expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it('should approve when files are confined under any of multiple labels', async () => {
|
|
64
|
+
mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
|
|
65
|
+
'src/domain/Foo.ts',
|
|
66
|
+
'docs/intro.md',
|
|
67
|
+
]);
|
|
68
|
+
|
|
69
|
+
await approver.approveIfConfined(
|
|
70
|
+
['change-target:src/domain', 'change-target:docs'],
|
|
71
|
+
prUrl,
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
expect(mockIssueRepository.approvePullRequest).toHaveBeenCalledWith(prUrl);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it('should match boundary-safely (foo matches foo/bar.ts but not foobar/baz.ts)', async () => {
|
|
78
|
+
mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
|
|
79
|
+
'foo/bar.ts',
|
|
80
|
+
'foobar/baz.ts',
|
|
81
|
+
]);
|
|
82
|
+
|
|
83
|
+
await approver.approveIfConfined(['change-target:foo'], prUrl);
|
|
84
|
+
|
|
85
|
+
expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('should approve when changed file equals the labeled path exactly', async () => {
|
|
89
|
+
mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
|
|
90
|
+
'README.md',
|
|
91
|
+
]);
|
|
92
|
+
|
|
93
|
+
await approver.approveIfConfined(['change-target:README.md'], prUrl);
|
|
94
|
+
|
|
95
|
+
expect(mockIssueRepository.approvePullRequest).toHaveBeenCalledWith(prUrl);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('should not approve when there are zero changed files', async () => {
|
|
99
|
+
mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([]);
|
|
100
|
+
|
|
101
|
+
await approver.approveIfConfined(['change-target:src/domain'], prUrl);
|
|
102
|
+
|
|
103
|
+
expect(
|
|
104
|
+
mockIssueRepository.getPullRequestChangedFilePaths,
|
|
105
|
+
).toHaveBeenCalledWith(prUrl);
|
|
106
|
+
expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it('should normalize trailing slashes in change-target label paths', async () => {
|
|
110
|
+
mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
|
|
111
|
+
'src/domain/entities/Foo.ts',
|
|
112
|
+
]);
|
|
113
|
+
|
|
114
|
+
await approver.approveIfConfined(['change-target:src/domain/'], prUrl);
|
|
115
|
+
|
|
116
|
+
expect(mockIssueRepository.approvePullRequest).toHaveBeenCalledWith(prUrl);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it('should ignore empty change-target label values', async () => {
|
|
120
|
+
mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
|
|
121
|
+
'src/domain/Foo.ts',
|
|
122
|
+
]);
|
|
123
|
+
|
|
124
|
+
await approver.approveIfConfined(['change-target:'], prUrl);
|
|
125
|
+
|
|
126
|
+
expect(
|
|
127
|
+
mockIssueRepository.getPullRequestChangedFilePaths,
|
|
128
|
+
).not.toHaveBeenCalled();
|
|
129
|
+
expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
|
|
130
|
+
});
|
|
131
|
+
});
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { IssueRepository } from './adapter-interfaces/IssueRepository';
|
|
2
|
+
|
|
3
|
+
export class ChangeTargetPullRequestApprover {
|
|
4
|
+
constructor(
|
|
5
|
+
private readonly issueRepository: Pick<
|
|
6
|
+
IssueRepository,
|
|
7
|
+
'getPullRequestChangedFilePaths' | 'approvePullRequest'
|
|
8
|
+
>,
|
|
9
|
+
) {}
|
|
10
|
+
|
|
11
|
+
approveIfConfined = async (
|
|
12
|
+
issueLabels: string[],
|
|
13
|
+
approvedPrUrl: string | null,
|
|
14
|
+
): Promise<void> => {
|
|
15
|
+
if (approvedPrUrl === null) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const changeTargetPaths = this.extractChangeTargetPaths(issueLabels);
|
|
19
|
+
if (changeTargetPaths.length === 0) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const changedFilePaths =
|
|
23
|
+
await this.issueRepository.getPullRequestChangedFilePaths(approvedPrUrl);
|
|
24
|
+
if (changedFilePaths.length === 0) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const allConfined = changedFilePaths.every((filePath) =>
|
|
28
|
+
this.isFilePathConfinedToAllowedPaths(filePath, changeTargetPaths),
|
|
29
|
+
);
|
|
30
|
+
if (!allConfined) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
await this.issueRepository.approvePullRequest(approvedPrUrl);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
private extractChangeTargetPaths = (labels: string[]): string[] => {
|
|
37
|
+
const prefix = 'change-target:';
|
|
38
|
+
const paths: string[] = [];
|
|
39
|
+
for (const label of labels) {
|
|
40
|
+
if (!label.startsWith(prefix)) continue;
|
|
41
|
+
const raw = label.slice(prefix.length).trim();
|
|
42
|
+
if (raw.length === 0) continue;
|
|
43
|
+
const normalized = raw.replace(/\/+$/, '');
|
|
44
|
+
if (normalized.length === 0) continue;
|
|
45
|
+
paths.push(normalized);
|
|
46
|
+
}
|
|
47
|
+
return paths;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
private isFilePathConfinedToAllowedPaths = (
|
|
51
|
+
filePath: string,
|
|
52
|
+
allowedPaths: string[],
|
|
53
|
+
): boolean =>
|
|
54
|
+
allowedPaths.some(
|
|
55
|
+
(allowedPath) =>
|
|
56
|
+
filePath === allowedPath || filePath.startsWith(`${allowedPath}/`),
|
|
57
|
+
);
|
|
58
|
+
}
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
IssueRejectionEvaluator,
|
|
13
13
|
PrRejectedReasonType,
|
|
14
14
|
} from './IssueRejectionEvaluator';
|
|
15
|
+
import { ChangeTargetPullRequestApprover } from './ChangeTargetPullRequestApprover';
|
|
15
16
|
|
|
16
17
|
export class IssueNotFoundError extends Error {
|
|
17
18
|
constructor(issueUrl: string) {
|
|
@@ -38,6 +39,7 @@ type RejectedReasonType =
|
|
|
38
39
|
|
|
39
40
|
export class NotifyFinishedIssuePreparationUseCase {
|
|
40
41
|
private readonly issueRejectionEvaluator: IssueRejectionEvaluator;
|
|
42
|
+
private readonly changeTargetPullRequestApprover: ChangeTargetPullRequestApprover;
|
|
41
43
|
|
|
42
44
|
constructor(
|
|
43
45
|
private readonly projectRepository: Pick<ProjectRepository, 'getByUrl'>,
|
|
@@ -63,6 +65,9 @@ export class NotifyFinishedIssuePreparationUseCase {
|
|
|
63
65
|
>,
|
|
64
66
|
) {
|
|
65
67
|
this.issueRejectionEvaluator = new IssueRejectionEvaluator(issueRepository);
|
|
68
|
+
this.changeTargetPullRequestApprover = new ChangeTargetPullRequestApprover(
|
|
69
|
+
issueRepository,
|
|
70
|
+
);
|
|
66
71
|
}
|
|
67
72
|
|
|
68
73
|
run = async (params: {
|
|
@@ -227,7 +232,10 @@ export class NotifyFinishedIssuePreparationUseCase {
|
|
|
227
232
|
}
|
|
228
233
|
|
|
229
234
|
if (rejections.length <= 0) {
|
|
230
|
-
await this.
|
|
235
|
+
await this.changeTargetPullRequestApprover.approveIfConfined(
|
|
236
|
+
issue.labels,
|
|
237
|
+
approvedPrUrl,
|
|
238
|
+
);
|
|
231
239
|
issue.status = AWAITING_QUALITY_CHECK_STATUS_NAME;
|
|
232
240
|
await this.issueRepository.update(issue, project);
|
|
233
241
|
await this.issueRepository.updateStatus(
|
|
@@ -274,54 +282,6 @@ export class NotifyFinishedIssuePreparationUseCase {
|
|
|
274
282
|
): boolean =>
|
|
275
283
|
allowedIssueAuthors === null || allowedIssueAuthors.includes(author);
|
|
276
284
|
|
|
277
|
-
private extractChangeTargetPaths = (labels: string[]): string[] => {
|
|
278
|
-
const prefix = 'change-target:';
|
|
279
|
-
const paths: string[] = [];
|
|
280
|
-
for (const label of labels) {
|
|
281
|
-
if (!label.startsWith(prefix)) continue;
|
|
282
|
-
const raw = label.slice(prefix.length).trim();
|
|
283
|
-
if (raw.length === 0) continue;
|
|
284
|
-
const normalized = raw.replace(/\/+$/, '');
|
|
285
|
-
if (normalized.length === 0) continue;
|
|
286
|
-
paths.push(normalized);
|
|
287
|
-
}
|
|
288
|
-
return paths;
|
|
289
|
-
};
|
|
290
|
-
|
|
291
|
-
private isFilePathConfinedToAllowedPaths = (
|
|
292
|
-
filePath: string,
|
|
293
|
-
allowedPaths: string[],
|
|
294
|
-
): boolean =>
|
|
295
|
-
allowedPaths.some(
|
|
296
|
-
(allowedPath) =>
|
|
297
|
-
filePath === allowedPath || filePath.startsWith(`${allowedPath}/`),
|
|
298
|
-
);
|
|
299
|
-
|
|
300
|
-
private maybeAutoApprovePrByChangeTarget = async (
|
|
301
|
-
issue: { labels: string[] },
|
|
302
|
-
approvedPrUrl: string | null,
|
|
303
|
-
): Promise<void> => {
|
|
304
|
-
if (approvedPrUrl === null) {
|
|
305
|
-
return;
|
|
306
|
-
}
|
|
307
|
-
const changeTargetPaths = this.extractChangeTargetPaths(issue.labels);
|
|
308
|
-
if (changeTargetPaths.length === 0) {
|
|
309
|
-
return;
|
|
310
|
-
}
|
|
311
|
-
const changedFilePaths =
|
|
312
|
-
await this.issueRepository.getPullRequestChangedFilePaths(approvedPrUrl);
|
|
313
|
-
if (changedFilePaths.length === 0) {
|
|
314
|
-
return;
|
|
315
|
-
}
|
|
316
|
-
const allConfined = changedFilePaths.every((filePath) =>
|
|
317
|
-
this.isFilePathConfinedToAllowedPaths(filePath, changeTargetPaths),
|
|
318
|
-
);
|
|
319
|
-
if (!allConfined) {
|
|
320
|
-
return;
|
|
321
|
-
}
|
|
322
|
-
await this.issueRepository.approvePullRequest(approvedPrUrl);
|
|
323
|
-
};
|
|
324
|
-
|
|
325
285
|
private collectRejections = async (
|
|
326
286
|
issue: { url: string; labels: string[]; isPr: boolean },
|
|
327
287
|
comments: { author: string; content: string }[],
|
|
@@ -81,6 +81,8 @@ describe('RevertNotReadyAwaitingQualityCheckUseCase', () => {
|
|
|
81
81
|
updateStatus: jest.Mock;
|
|
82
82
|
findRelatedOpenPRs: jest.Mock;
|
|
83
83
|
getOpenPullRequest: jest.Mock;
|
|
84
|
+
getPullRequestChangedFilePaths: jest.Mock;
|
|
85
|
+
approvePullRequest: jest.Mock;
|
|
84
86
|
};
|
|
85
87
|
let mockIssueCommentRepository: {
|
|
86
88
|
createComment: jest.Mock;
|
|
@@ -105,6 +107,8 @@ describe('RevertNotReadyAwaitingQualityCheckUseCase', () => {
|
|
|
105
107
|
updateStatus: jest.fn().mockResolvedValue(undefined),
|
|
106
108
|
findRelatedOpenPRs: jest.fn().mockResolvedValue([]),
|
|
107
109
|
getOpenPullRequest: jest.fn().mockResolvedValue(null),
|
|
110
|
+
getPullRequestChangedFilePaths: jest.fn().mockResolvedValue([]),
|
|
111
|
+
approvePullRequest: jest.fn().mockResolvedValue(undefined),
|
|
108
112
|
};
|
|
109
113
|
|
|
110
114
|
mockIssueCommentRepository = {
|
|
@@ -405,4 +409,225 @@ describe('RevertNotReadyAwaitingQualityCheckUseCase', () => {
|
|
|
405
409
|
expect.stringContaining('REQUIRED_CI_JOB_NEVER_STARTED'),
|
|
406
410
|
);
|
|
407
411
|
});
|
|
412
|
+
|
|
413
|
+
describe('change-target label auto-approve', () => {
|
|
414
|
+
const setupReadyIssue = (labels: string[]) => {
|
|
415
|
+
const issue = createMockIssue({
|
|
416
|
+
status: 'Awaiting Quality Check',
|
|
417
|
+
labels,
|
|
418
|
+
});
|
|
419
|
+
mockIssueRepository.getAllIssues.mockResolvedValue({
|
|
420
|
+
issues: [issue],
|
|
421
|
+
cacheUsed: false,
|
|
422
|
+
});
|
|
423
|
+
mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
|
|
424
|
+
createReadyPr(),
|
|
425
|
+
]);
|
|
426
|
+
return issue;
|
|
427
|
+
};
|
|
428
|
+
|
|
429
|
+
const runCycle = () =>
|
|
430
|
+
useCase.run({
|
|
431
|
+
projectUrl: 'https://github.com/users/user/projects/1',
|
|
432
|
+
allowIssueCacheMinutes: 10,
|
|
433
|
+
});
|
|
434
|
+
|
|
435
|
+
it('should not approve PR when issue has no change-target label', async () => {
|
|
436
|
+
setupReadyIssue([]);
|
|
437
|
+
|
|
438
|
+
await runCycle();
|
|
439
|
+
|
|
440
|
+
expect(
|
|
441
|
+
mockIssueRepository.getPullRequestChangedFilePaths,
|
|
442
|
+
).not.toHaveBeenCalled();
|
|
443
|
+
expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
|
|
444
|
+
expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
|
|
445
|
+
});
|
|
446
|
+
|
|
447
|
+
it('should approve PR when issue has change-target label and all files are confined', async () => {
|
|
448
|
+
setupReadyIssue(['change-target:src/domain']);
|
|
449
|
+
mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
|
|
450
|
+
'src/domain/entities/Foo.ts',
|
|
451
|
+
'src/domain/usecases/Bar.ts',
|
|
452
|
+
]);
|
|
453
|
+
|
|
454
|
+
await runCycle();
|
|
455
|
+
|
|
456
|
+
expect(
|
|
457
|
+
mockIssueRepository.getPullRequestChangedFilePaths,
|
|
458
|
+
).toHaveBeenCalledWith('https://github.com/user/repo/pull/1');
|
|
459
|
+
expect(mockIssueRepository.approvePullRequest).toHaveBeenCalledWith(
|
|
460
|
+
'https://github.com/user/repo/pull/1',
|
|
461
|
+
);
|
|
462
|
+
expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
it('should not approve PR when any changed file is outside the labeled path', async () => {
|
|
466
|
+
setupReadyIssue(['change-target:src/domain']);
|
|
467
|
+
mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
|
|
468
|
+
'src/domain/entities/Foo.ts',
|
|
469
|
+
'src/adapter/repositories/Outside.ts',
|
|
470
|
+
]);
|
|
471
|
+
|
|
472
|
+
await runCycle();
|
|
473
|
+
|
|
474
|
+
expect(
|
|
475
|
+
mockIssueRepository.getPullRequestChangedFilePaths,
|
|
476
|
+
).toHaveBeenCalledWith('https://github.com/user/repo/pull/1');
|
|
477
|
+
expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
|
|
478
|
+
});
|
|
479
|
+
|
|
480
|
+
it('should approve when files are confined under any of multiple change-target labels', async () => {
|
|
481
|
+
setupReadyIssue(['change-target:src/domain', 'change-target:docs']);
|
|
482
|
+
mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
|
|
483
|
+
'src/domain/entities/Foo.ts',
|
|
484
|
+
'docs/intro.md',
|
|
485
|
+
]);
|
|
486
|
+
|
|
487
|
+
await runCycle();
|
|
488
|
+
|
|
489
|
+
expect(mockIssueRepository.approvePullRequest).toHaveBeenCalledWith(
|
|
490
|
+
'https://github.com/user/repo/pull/1',
|
|
491
|
+
);
|
|
492
|
+
});
|
|
493
|
+
|
|
494
|
+
it('should not approve when PR has more than 100 changed files and one file beyond entry 100 is outside the labeled path', async () => {
|
|
495
|
+
setupReadyIssue(['change-target:src/domain']);
|
|
496
|
+
const filePaths: string[] = [];
|
|
497
|
+
for (let i = 0; i < 150; i += 1) {
|
|
498
|
+
filePaths.push(`src/domain/file${i}.ts`);
|
|
499
|
+
}
|
|
500
|
+
filePaths.push('src/adapter/Outside.ts');
|
|
501
|
+
mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue(
|
|
502
|
+
filePaths,
|
|
503
|
+
);
|
|
504
|
+
|
|
505
|
+
await runCycle();
|
|
506
|
+
|
|
507
|
+
expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
|
|
508
|
+
});
|
|
509
|
+
|
|
510
|
+
it('should match boundary-safely (change-target:foo matches foo/bar.ts but not foobar/baz.ts)', async () => {
|
|
511
|
+
setupReadyIssue(['change-target:foo']);
|
|
512
|
+
mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
|
|
513
|
+
'foo/bar.ts',
|
|
514
|
+
'foobar/baz.ts',
|
|
515
|
+
]);
|
|
516
|
+
|
|
517
|
+
await runCycle();
|
|
518
|
+
|
|
519
|
+
expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
|
|
520
|
+
});
|
|
521
|
+
|
|
522
|
+
it('should approve when changed files match exact path or subpath of the labeled path', async () => {
|
|
523
|
+
setupReadyIssue(['change-target:foo']);
|
|
524
|
+
mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
|
|
525
|
+
'foo/bar.ts',
|
|
526
|
+
'foo/nested/baz.ts',
|
|
527
|
+
]);
|
|
528
|
+
|
|
529
|
+
await runCycle();
|
|
530
|
+
|
|
531
|
+
expect(mockIssueRepository.approvePullRequest).toHaveBeenCalledWith(
|
|
532
|
+
'https://github.com/user/repo/pull/1',
|
|
533
|
+
);
|
|
534
|
+
});
|
|
535
|
+
|
|
536
|
+
it('should not approve when PR has zero changed files', async () => {
|
|
537
|
+
setupReadyIssue(['change-target:src/domain']);
|
|
538
|
+
mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([]);
|
|
539
|
+
|
|
540
|
+
await runCycle();
|
|
541
|
+
|
|
542
|
+
expect(
|
|
543
|
+
mockIssueRepository.getPullRequestChangedFilePaths,
|
|
544
|
+
).toHaveBeenCalledWith('https://github.com/user/repo/pull/1');
|
|
545
|
+
expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
|
|
546
|
+
});
|
|
547
|
+
|
|
548
|
+
it('should not approve when there is no ready PR even if change-target label is present', async () => {
|
|
549
|
+
const issue = createMockIssue({
|
|
550
|
+
status: 'Awaiting Quality Check',
|
|
551
|
+
labels: ['change-target:src/domain'],
|
|
552
|
+
});
|
|
553
|
+
mockIssueRepository.getAllIssues.mockResolvedValue({
|
|
554
|
+
issues: [issue],
|
|
555
|
+
cacheUsed: false,
|
|
556
|
+
});
|
|
557
|
+
mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([]);
|
|
558
|
+
|
|
559
|
+
await runCycle();
|
|
560
|
+
|
|
561
|
+
expect(
|
|
562
|
+
mockIssueRepository.getPullRequestChangedFilePaths,
|
|
563
|
+
).not.toHaveBeenCalled();
|
|
564
|
+
expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
|
|
565
|
+
expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
|
|
566
|
+
mockProject,
|
|
567
|
+
issue,
|
|
568
|
+
'awaiting-workspace-id',
|
|
569
|
+
);
|
|
570
|
+
});
|
|
571
|
+
|
|
572
|
+
it('should not approve when PR has unresolved rejections even with change-target label', async () => {
|
|
573
|
+
const issue = createMockIssue({
|
|
574
|
+
status: 'Awaiting Quality Check',
|
|
575
|
+
labels: ['change-target:src/domain'],
|
|
576
|
+
});
|
|
577
|
+
mockIssueRepository.getAllIssues.mockResolvedValue({
|
|
578
|
+
issues: [issue],
|
|
579
|
+
cacheUsed: false,
|
|
580
|
+
});
|
|
581
|
+
mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
|
|
582
|
+
{ ...createReadyPr(), isConflicted: true },
|
|
583
|
+
]);
|
|
584
|
+
|
|
585
|
+
await runCycle();
|
|
586
|
+
|
|
587
|
+
expect(
|
|
588
|
+
mockIssueRepository.getPullRequestChangedFilePaths,
|
|
589
|
+
).not.toHaveBeenCalled();
|
|
590
|
+
expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
|
|
591
|
+
expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
|
|
592
|
+
mockProject,
|
|
593
|
+
issue,
|
|
594
|
+
'awaiting-workspace-id',
|
|
595
|
+
);
|
|
596
|
+
});
|
|
597
|
+
|
|
598
|
+
it('should skip change-target auto-approve for issue with llm-agent label', async () => {
|
|
599
|
+
const issue = createMockIssue({
|
|
600
|
+
status: 'Awaiting Quality Check',
|
|
601
|
+
labels: ['llm-agent', 'change-target:src/domain'],
|
|
602
|
+
});
|
|
603
|
+
mockIssueRepository.getAllIssues.mockResolvedValue({
|
|
604
|
+
issues: [issue],
|
|
605
|
+
cacheUsed: false,
|
|
606
|
+
});
|
|
607
|
+
mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
|
|
608
|
+
createReadyPr(),
|
|
609
|
+
]);
|
|
610
|
+
|
|
611
|
+
await runCycle();
|
|
612
|
+
|
|
613
|
+
expect(
|
|
614
|
+
mockIssueRepository.getPullRequestChangedFilePaths,
|
|
615
|
+
).not.toHaveBeenCalled();
|
|
616
|
+
expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
|
|
617
|
+
expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
|
|
618
|
+
});
|
|
619
|
+
|
|
620
|
+
it('should normalize trailing slashes in change-target label paths', async () => {
|
|
621
|
+
setupReadyIssue(['change-target:src/domain/']);
|
|
622
|
+
mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
|
|
623
|
+
'src/domain/entities/Foo.ts',
|
|
624
|
+
]);
|
|
625
|
+
|
|
626
|
+
await runCycle();
|
|
627
|
+
|
|
628
|
+
expect(mockIssueRepository.approvePullRequest).toHaveBeenCalledWith(
|
|
629
|
+
'https://github.com/user/repo/pull/1',
|
|
630
|
+
);
|
|
631
|
+
});
|
|
632
|
+
});
|
|
408
633
|
});
|
|
@@ -2,6 +2,7 @@ import { IssueRepository } from './adapter-interfaces/IssueRepository';
|
|
|
2
2
|
import { ProjectRepository } from './adapter-interfaces/ProjectRepository';
|
|
3
3
|
import { IssueCommentRepository } from './adapter-interfaces/IssueCommentRepository';
|
|
4
4
|
import { IssueRejectionEvaluator } from './IssueRejectionEvaluator';
|
|
5
|
+
import { ChangeTargetPullRequestApprover } from './ChangeTargetPullRequestApprover';
|
|
5
6
|
import {
|
|
6
7
|
AWAITING_QUALITY_CHECK_STATUS_NAME,
|
|
7
8
|
AWAITING_WORKSPACE_STATUS_NAME,
|
|
@@ -9,6 +10,7 @@ import {
|
|
|
9
10
|
|
|
10
11
|
export class RevertNotReadyAwaitingQualityCheckUseCase {
|
|
11
12
|
private readonly issueRejectionEvaluator: IssueRejectionEvaluator;
|
|
13
|
+
private readonly changeTargetPullRequestApprover: ChangeTargetPullRequestApprover;
|
|
12
14
|
|
|
13
15
|
constructor(
|
|
14
16
|
private readonly projectRepository: Pick<
|
|
@@ -21,6 +23,8 @@ export class RevertNotReadyAwaitingQualityCheckUseCase {
|
|
|
21
23
|
| 'updateStatus'
|
|
22
24
|
| 'findRelatedOpenPRs'
|
|
23
25
|
| 'getOpenPullRequest'
|
|
26
|
+
| 'getPullRequestChangedFilePaths'
|
|
27
|
+
| 'approvePullRequest'
|
|
24
28
|
>,
|
|
25
29
|
private readonly issueCommentRepository: Pick<
|
|
26
30
|
IssueCommentRepository,
|
|
@@ -28,6 +32,9 @@ export class RevertNotReadyAwaitingQualityCheckUseCase {
|
|
|
28
32
|
>,
|
|
29
33
|
) {
|
|
30
34
|
this.issueRejectionEvaluator = new IssueRejectionEvaluator(issueRepository);
|
|
35
|
+
this.changeTargetPullRequestApprover = new ChangeTargetPullRequestApprover(
|
|
36
|
+
issueRepository,
|
|
37
|
+
);
|
|
31
38
|
}
|
|
32
39
|
|
|
33
40
|
run = async (params: {
|
|
@@ -71,7 +78,8 @@ export class RevertNotReadyAwaitingQualityCheckUseCase {
|
|
|
71
78
|
continue;
|
|
72
79
|
}
|
|
73
80
|
|
|
74
|
-
const { rejections } =
|
|
81
|
+
const { rejections, approvedPrUrl } =
|
|
82
|
+
await this.issueRejectionEvaluator.evaluate(issue);
|
|
75
83
|
if (rejections.length > 0) {
|
|
76
84
|
await this.issueRepository.updateStatus(
|
|
77
85
|
project,
|
|
@@ -82,7 +90,13 @@ export class RevertNotReadyAwaitingQualityCheckUseCase {
|
|
|
82
90
|
issue,
|
|
83
91
|
`Auto Status Check: REJECTED\n${rejections.map((r) => `- ${r.detail}`).join('\n')}`,
|
|
84
92
|
);
|
|
93
|
+
continue;
|
|
85
94
|
}
|
|
95
|
+
|
|
96
|
+
await this.changeTargetPullRequestApprover.approveIfConfined(
|
|
97
|
+
issue.labels,
|
|
98
|
+
approvedPrUrl,
|
|
99
|
+
);
|
|
86
100
|
}
|
|
87
101
|
};
|
|
88
102
|
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { encodeForURI } from './utils';
|
|
2
|
+
|
|
3
|
+
describe('encodeForURI', () => {
|
|
4
|
+
it('should return empty string when url is undefined', () => {
|
|
5
|
+
expect(encodeForURI(undefined)).toBe('');
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
it('should return empty string when url is null', () => {
|
|
9
|
+
expect(encodeForURI(null)).toBe('');
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it('should return empty string when url is empty', () => {
|
|
13
|
+
expect(encodeForURI('')).toBe('');
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('should encode a single # character', () => {
|
|
17
|
+
expect(encodeForURI('foo#bar')).toBe('foo%23bar');
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('should encode all occurrences of # in the input', () => {
|
|
21
|
+
expect(encodeForURI('foo#bar#baz#qux')).toBe('foo%23bar%23baz%23qux');
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it('should encode a single & character', () => {
|
|
25
|
+
expect(encodeForURI('foo&bar')).toBe('foo%26bar');
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('should encode all occurrences of & in the input', () => {
|
|
29
|
+
expect(encodeForURI('foo&bar&baz&qux')).toBe('foo%26bar%26baz%26qux');
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('should encode all occurrences of both # and & together', () => {
|
|
33
|
+
expect(encodeForURI('a#b&c#d&e')).toBe('a%23b%26c%23d%26e');
|
|
34
|
+
});
|
|
35
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { IssueRepository } from './adapter-interfaces/IssueRepository';
|
|
2
|
+
export declare class ChangeTargetPullRequestApprover {
|
|
3
|
+
private readonly issueRepository;
|
|
4
|
+
constructor(issueRepository: Pick<IssueRepository, 'getPullRequestChangedFilePaths' | 'approvePullRequest'>);
|
|
5
|
+
approveIfConfined: (issueLabels: string[], approvedPrUrl: string | null) => Promise<void>;
|
|
6
|
+
private extractChangeTargetPaths;
|
|
7
|
+
private isFilePathConfinedToAllowedPaths;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=ChangeTargetPullRequestApprover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChangeTargetPullRequestApprover.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/ChangeTargetPullRequestApprover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAEvE,qBAAa,+BAA+B;IAExC,OAAO,CAAC,QAAQ,CAAC,eAAe;gBAAf,eAAe,EAAE,IAAI,CACpC,eAAe,EACf,gCAAgC,GAAG,oBAAoB,CACxD;IAGH,iBAAiB,GACf,aAAa,MAAM,EAAE,EACrB,eAAe,MAAM,GAAG,IAAI,KAC3B,OAAO,CAAC,IAAI,CAAC,CAoBd;IAEF,OAAO,CAAC,wBAAwB,CAY9B;IAEF,OAAO,CAAC,gCAAgC,CAOpC;CACL"}
|
|
@@ -14,6 +14,7 @@ export declare class NotifyFinishedIssuePreparationUseCase {
|
|
|
14
14
|
private readonly issueCommentRepository;
|
|
15
15
|
private readonly webhookRepository;
|
|
16
16
|
private readonly issueRejectionEvaluator;
|
|
17
|
+
private readonly changeTargetPullRequestApprover;
|
|
17
18
|
constructor(projectRepository: Pick<ProjectRepository, 'getByUrl'>, issueRepository: Pick<IssueRepository, 'get' | 'update' | 'updateStatus' | 'findRelatedOpenPRs' | 'getStoryObjectMap' | 'getOpenPullRequest' | 'getPullRequestChangedFilePaths' | 'approvePullRequest' | 'setDependedIssueUrl'>, issueCommentRepository: Pick<IssueCommentRepository, 'getCommentsFromIssue' | 'createComment'>, webhookRepository: Pick<WebhookRepository, 'sendGetRequest'>);
|
|
18
19
|
run: (params: {
|
|
19
20
|
projectUrl: string;
|
|
@@ -23,9 +24,6 @@ export declare class NotifyFinishedIssuePreparationUseCase {
|
|
|
23
24
|
allowedIssueAuthors?: string[] | null;
|
|
24
25
|
}) => Promise<void>;
|
|
25
26
|
private isAuthorTrusted;
|
|
26
|
-
private extractChangeTargetPaths;
|
|
27
|
-
private isFilePathConfinedToAllowedPaths;
|
|
28
|
-
private maybeAutoApprovePrByChangeTarget;
|
|
29
27
|
private collectRejections;
|
|
30
28
|
private reportBodyHasNextStep;
|
|
31
29
|
private setDependedIssueUrlForAllOpenPRs;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotifyFinishedIssuePreparationUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"NotifyFinishedIssuePreparationUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAa3E,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,QAAQ,EAAE,MAAM;CAI7B;AACD,qBAAa,uBAAwB,SAAQ,KAAK;gBAE9C,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,cAAc,EAAE,MAAM,GAAG,IAAI;CAOhC;AAMD,qBAAa,qCAAqC;IAK9C,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAYhC,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IAIvC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IArBpC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA0B;IAClE,OAAO,CAAC,QAAQ,CAAC,+BAA+B,CAAkC;gBAG/D,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC,EACtD,eAAe,EAAE,IAAI,CACpC,eAAe,EACb,KAAK,GACL,QAAQ,GACR,cAAc,GACd,oBAAoB,GACpB,mBAAmB,GACnB,oBAAoB,GACpB,gCAAgC,GAChC,oBAAoB,GACpB,qBAAqB,CACxB,EACgB,sBAAsB,EAAE,IAAI,CAC3C,sBAAsB,EACtB,sBAAsB,GAAG,eAAe,CACzC,EACgB,iBAAiB,EAAE,IAAI,CACtC,iBAAiB,EACjB,gBAAgB,CACjB;IAQH,GAAG,GAAU,QAAQ;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,sBAAsB,EAAE,MAAM,CAAC;QAC/B,iCAAiC,EAAE,MAAM,GAAG,IAAI,CAAC;QACjD,mBAAmB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;KACvC,KAAG,OAAO,CAAC,IAAI,CAAC,CAsMf;IAEF,OAAO,CAAC,eAAe,CAIgD;IAEvE,OAAO,CAAC,iBAAiB,CA8BvB;IAEF,OAAO,CAAC,qBAAqB,CAuB3B;IAEF,OAAO,CAAC,gCAAgC,CAiBtC;IAEF,OAAO,CAAC,uBAAuB,CAQ7B;IAEF,OAAO,CAAC,+BAA+B,CAkCrC;CACH"}
|
|
@@ -6,7 +6,8 @@ export declare class RevertNotReadyAwaitingQualityCheckUseCase {
|
|
|
6
6
|
private readonly issueRepository;
|
|
7
7
|
private readonly issueCommentRepository;
|
|
8
8
|
private readonly issueRejectionEvaluator;
|
|
9
|
-
|
|
9
|
+
private readonly changeTargetPullRequestApprover;
|
|
10
|
+
constructor(projectRepository: Pick<ProjectRepository, 'findProjectIdByUrl' | 'getProject'>, issueRepository: Pick<IssueRepository, 'getAllIssues' | 'updateStatus' | 'findRelatedOpenPRs' | 'getOpenPullRequest' | 'getPullRequestChangedFilePaths' | 'approvePullRequest'>, issueCommentRepository: Pick<IssueCommentRepository, 'createComment'>);
|
|
10
11
|
run: (params: {
|
|
11
12
|
projectUrl: string;
|
|
12
13
|
allowIssueCacheMinutes: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RevertNotReadyAwaitingQualityCheckUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;
|
|
1
|
+
{"version":3,"file":"RevertNotReadyAwaitingQualityCheckUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAQrF,qBAAa,yCAAyC;IAKlD,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAIlC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAShC,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IAjBzC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA0B;IAClE,OAAO,CAAC,QAAQ,CAAC,+BAA+B,CAAkC;gBAG/D,iBAAiB,EAAE,IAAI,CACtC,iBAAiB,EACjB,oBAAoB,GAAG,YAAY,CACpC,EACgB,eAAe,EAAE,IAAI,CACpC,eAAe,EACb,cAAc,GACd,cAAc,GACd,oBAAoB,GACpB,oBAAoB,GACpB,gCAAgC,GAChC,oBAAoB,CACvB,EACgB,sBAAsB,EAAE,IAAI,CAC3C,sBAAsB,EACtB,eAAe,CAChB;IAQH,GAAG,GAAU,QAAQ;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,sBAAsB,EAAE,MAAM,CAAC;KAChC,KAAG,OAAO,CAAC,IAAI,CAAC,CA0Df;CACH"}
|