pr-merge-queue 0.0.0-stage → 0.0.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/LICENSE +201 -0
- package/README.md +125 -2
- package/dist/claim-pr/claim-pr.d.mts +45 -0
- package/dist/claim-pr/claim-pr.d.mts.map +1 -0
- package/dist/claim-pr/claim-pr.mjs +217 -0
- package/dist/claim-pr/claim-pr.mjs.map +1 -0
- package/dist/claim-pr/index.d.mts +2 -0
- package/dist/claim-pr/index.d.mts.map +1 -0
- package/dist/claim-pr/index.mjs +2 -0
- package/dist/claim-pr/index.mjs.map +1 -0
- package/dist/cmd/claim-pr.d.mts +3 -0
- package/dist/cmd/claim-pr.d.mts.map +1 -0
- package/dist/cmd/claim-pr.mjs +20 -0
- package/dist/cmd/claim-pr.mjs.map +1 -0
- package/dist/cmd/open-pr.d.mts +3 -0
- package/dist/cmd/open-pr.d.mts.map +1 -0
- package/dist/cmd/open-pr.mjs +20 -0
- package/dist/cmd/open-pr.mjs.map +1 -0
- package/dist/cmd/pr-report.d.mts +3 -0
- package/dist/cmd/pr-report.d.mts.map +1 -0
- package/dist/cmd/pr-report.mjs +20 -0
- package/dist/cmd/pr-report.mjs.map +1 -0
- package/dist/cmd/push-fixed-pr.d.mts +3 -0
- package/dist/cmd/push-fixed-pr.d.mts.map +1 -0
- package/dist/cmd/push-fixed-pr.mjs +20 -0
- package/dist/cmd/push-fixed-pr.mjs.map +1 -0
- package/dist/cmd/report-unowned-prs.d.mts +3 -0
- package/dist/cmd/report-unowned-prs.d.mts.map +1 -0
- package/dist/cmd/report-unowned-prs.mjs +20 -0
- package/dist/cmd/report-unowned-prs.mjs.map +1 -0
- package/dist/cmd/unblock-prs.d.mts +3 -0
- package/dist/cmd/unblock-prs.d.mts.map +1 -0
- package/dist/cmd/unblock-prs.mjs +19 -0
- package/dist/cmd/unblock-prs.mjs.map +1 -0
- package/dist/entry-point.d.mts +3 -0
- package/dist/entry-point.d.mts.map +1 -0
- package/dist/entry-point.mjs +3 -0
- package/dist/entry-point.mjs.map +1 -0
- package/dist/lib/cli-args.d.mts +27 -0
- package/dist/lib/cli-args.d.mts.map +1 -0
- package/dist/lib/cli-args.mjs +55 -0
- package/dist/lib/cli-args.mjs.map +1 -0
- package/dist/lib/github-api.d.mts +153 -0
- package/dist/lib/github-api.d.mts.map +1 -0
- package/dist/lib/github-api.mjs +291 -0
- package/dist/lib/github-api.mjs.map +1 -0
- package/dist/lib/index.d.mts +7 -0
- package/dist/lib/index.d.mts.map +1 -0
- package/dist/lib/index.mjs +7 -0
- package/dist/lib/index.mjs.map +1 -0
- package/dist/lib/json.d.mts +12 -0
- package/dist/lib/json.d.mts.map +1 -0
- package/dist/lib/json.mjs +28 -0
- package/dist/lib/json.mjs.map +1 -0
- package/dist/lib/log.d.mts +10 -0
- package/dist/lib/log.d.mts.map +1 -0
- package/dist/lib/log.mjs +13 -0
- package/dist/lib/log.mjs.map +1 -0
- package/dist/lib/shell.d.mts +18 -0
- package/dist/lib/shell.d.mts.map +1 -0
- package/dist/lib/shell.mjs +42 -0
- package/dist/lib/shell.mjs.map +1 -0
- package/dist/lib/time.d.mts +17 -0
- package/dist/lib/time.d.mts.map +1 -0
- package/dist/lib/time.mjs +35 -0
- package/dist/lib/time.mjs.map +1 -0
- package/dist/open-pr/github.d.mts +72 -0
- package/dist/open-pr/github.d.mts.map +1 -0
- package/dist/open-pr/github.mjs +249 -0
- package/dist/open-pr/github.mjs.map +1 -0
- package/dist/open-pr/index.d.mts +6 -0
- package/dist/open-pr/index.d.mts.map +1 -0
- package/dist/open-pr/index.mjs +6 -0
- package/dist/open-pr/index.mjs.map +1 -0
- package/dist/open-pr/main.d.mts +36 -0
- package/dist/open-pr/main.d.mts.map +1 -0
- package/dist/open-pr/main.mjs +204 -0
- package/dist/open-pr/main.mjs.map +1 -0
- package/dist/open-pr/options.d.mts +20 -0
- package/dist/open-pr/options.d.mts.map +1 -0
- package/dist/open-pr/options.mjs +66 -0
- package/dist/open-pr/options.mjs.map +1 -0
- package/dist/open-pr/steps.d.mts +23 -0
- package/dist/open-pr/steps.d.mts.map +1 -0
- package/dist/open-pr/steps.mjs +38 -0
- package/dist/open-pr/steps.mjs.map +1 -0
- package/dist/open-pr/types.d.mts +179 -0
- package/dist/open-pr/types.d.mts.map +1 -0
- package/dist/open-pr/types.mjs +20 -0
- package/dist/open-pr/types.mjs.map +1 -0
- package/dist/pr-report/github.d.mts +59 -0
- package/dist/pr-report/github.d.mts.map +1 -0
- package/dist/pr-report/github.mjs +561 -0
- package/dist/pr-report/github.mjs.map +1 -0
- package/dist/pr-report/index.d.mts +8 -0
- package/dist/pr-report/index.d.mts.map +1 -0
- package/dist/pr-report/index.mjs +8 -0
- package/dist/pr-report/index.mjs.map +1 -0
- package/dist/pr-report/linked-issues.d.mts +15 -0
- package/dist/pr-report/linked-issues.d.mts.map +1 -0
- package/dist/pr-report/linked-issues.mjs +39 -0
- package/dist/pr-report/linked-issues.mjs.map +1 -0
- package/dist/pr-report/main.d.mts +42 -0
- package/dist/pr-report/main.d.mts.map +1 -0
- package/dist/pr-report/main.mjs +163 -0
- package/dist/pr-report/main.mjs.map +1 -0
- package/dist/pr-report/options.d.mts +36 -0
- package/dist/pr-report/options.d.mts.map +1 -0
- package/dist/pr-report/options.mjs +90 -0
- package/dist/pr-report/options.mjs.map +1 -0
- package/dist/pr-report/queue.d.mts +28 -0
- package/dist/pr-report/queue.d.mts.map +1 -0
- package/dist/pr-report/queue.mjs +74 -0
- package/dist/pr-report/queue.mjs.map +1 -0
- package/dist/pr-report/render.d.mts +14 -0
- package/dist/pr-report/render.d.mts.map +1 -0
- package/dist/pr-report/render.mjs +318 -0
- package/dist/pr-report/render.mjs.map +1 -0
- package/dist/pr-report/repo-settings.d.mts +12 -0
- package/dist/pr-report/repo-settings.d.mts.map +1 -0
- package/dist/pr-report/repo-settings.mjs +22 -0
- package/dist/pr-report/repo-settings.mjs.map +1 -0
- package/dist/push-fixed-pr/index.d.mts +2 -0
- package/dist/push-fixed-pr/index.d.mts.map +1 -0
- package/dist/push-fixed-pr/index.mjs +2 -0
- package/dist/push-fixed-pr/index.mjs.map +1 -0
- package/dist/push-fixed-pr/push-fixed-pr.d.mts +54 -0
- package/dist/push-fixed-pr/push-fixed-pr.d.mts.map +1 -0
- package/dist/push-fixed-pr/push-fixed-pr.mjs +172 -0
- package/dist/push-fixed-pr/push-fixed-pr.mjs.map +1 -0
- package/dist/report-unowned-prs/index.d.mts +2 -0
- package/dist/report-unowned-prs/index.d.mts.map +1 -0
- package/dist/report-unowned-prs/index.mjs +2 -0
- package/dist/report-unowned-prs/index.mjs.map +1 -0
- package/dist/report-unowned-prs/report-unowned-prs.d.mts +49 -0
- package/dist/report-unowned-prs/report-unowned-prs.d.mts.map +1 -0
- package/dist/report-unowned-prs/report-unowned-prs.mjs +127 -0
- package/dist/report-unowned-prs/report-unowned-prs.mjs.map +1 -0
- package/dist/tsconfig.json +1 -0
- package/dist/unblock-prs/auto-fix.d.mts +45 -0
- package/dist/unblock-prs/auto-fix.d.mts.map +1 -0
- package/dist/unblock-prs/auto-fix.mjs +207 -0
- package/dist/unblock-prs/auto-fix.mjs.map +1 -0
- package/dist/unblock-prs/checks.d.mts +307 -0
- package/dist/unblock-prs/checks.d.mts.map +1 -0
- package/dist/unblock-prs/checks.mjs +372 -0
- package/dist/unblock-prs/checks.mjs.map +1 -0
- package/dist/unblock-prs/claims.d.mts +21 -0
- package/dist/unblock-prs/claims.d.mts.map +1 -0
- package/dist/unblock-prs/claims.mjs +23 -0
- package/dist/unblock-prs/claims.mjs.map +1 -0
- package/dist/unblock-prs/config.d.mts +487 -0
- package/dist/unblock-prs/config.d.mts.map +1 -0
- package/dist/unblock-prs/config.mjs +119 -0
- package/dist/unblock-prs/config.mjs.map +1 -0
- package/dist/unblock-prs/constants.d.mts +28 -0
- package/dist/unblock-prs/constants.d.mts.map +1 -0
- package/dist/unblock-prs/constants.mjs +28 -0
- package/dist/unblock-prs/constants.mjs.map +1 -0
- package/dist/unblock-prs/demotions.d.mts +42 -0
- package/dist/unblock-prs/demotions.d.mts.map +1 -0
- package/dist/unblock-prs/demotions.mjs +50 -0
- package/dist/unblock-prs/demotions.mjs.map +1 -0
- package/dist/unblock-prs/github.d.mts +739 -0
- package/dist/unblock-prs/github.d.mts.map +1 -0
- package/dist/unblock-prs/github.mjs +626 -0
- package/dist/unblock-prs/github.mjs.map +1 -0
- package/dist/unblock-prs/index.d.mts +25 -0
- package/dist/unblock-prs/index.d.mts.map +1 -0
- package/dist/unblock-prs/index.mjs +25 -0
- package/dist/unblock-prs/index.mjs.map +1 -0
- package/dist/unblock-prs/labels.d.mts +49 -0
- package/dist/unblock-prs/labels.d.mts.map +1 -0
- package/dist/unblock-prs/labels.mjs +49 -0
- package/dist/unblock-prs/labels.mjs.map +1 -0
- package/dist/unblock-prs/main.d.mts +179 -0
- package/dist/unblock-prs/main.d.mts.map +1 -0
- package/dist/unblock-prs/main.mjs +640 -0
- package/dist/unblock-prs/main.mjs.map +1 -0
- package/dist/unblock-prs/merge-after.d.mts +46 -0
- package/dist/unblock-prs/merge-after.d.mts.map +1 -0
- package/dist/unblock-prs/merge-after.mjs +65 -0
- package/dist/unblock-prs/merge-after.mjs.map +1 -0
- package/dist/unblock-prs/options.d.mts +35 -0
- package/dist/unblock-prs/options.d.mts.map +1 -0
- package/dist/unblock-prs/options.mjs +88 -0
- package/dist/unblock-prs/options.mjs.map +1 -0
- package/dist/unblock-prs/owner.d.mts +32 -0
- package/dist/unblock-prs/owner.d.mts.map +1 -0
- package/dist/unblock-prs/owner.mjs +63 -0
- package/dist/unblock-prs/owner.mjs.map +1 -0
- package/dist/unblock-prs/quiet.d.mts +21 -0
- package/dist/unblock-prs/quiet.d.mts.map +1 -0
- package/dist/unblock-prs/quiet.mjs +42 -0
- package/dist/unblock-prs/quiet.mjs.map +1 -0
- package/dist/unblock-prs/rebase.d.mts +120 -0
- package/dist/unblock-prs/rebase.d.mts.map +1 -0
- package/dist/unblock-prs/rebase.mjs +576 -0
- package/dist/unblock-prs/rebase.mjs.map +1 -0
- package/dist/unblock-prs/release.d.mts +62 -0
- package/dist/unblock-prs/release.d.mts.map +1 -0
- package/dist/unblock-prs/release.mjs +94 -0
- package/dist/unblock-prs/release.mjs.map +1 -0
- package/dist/unblock-prs/set-aside-comment.d.mts +20 -0
- package/dist/unblock-prs/set-aside-comment.d.mts.map +1 -0
- package/dist/unblock-prs/set-aside-comment.mjs +93 -0
- package/dist/unblock-prs/set-aside-comment.mjs.map +1 -0
- package/dist/unblock-prs/set-aside-detail.d.mts +41 -0
- package/dist/unblock-prs/set-aside-detail.d.mts.map +1 -0
- package/dist/unblock-prs/set-aside-detail.mjs +56 -0
- package/dist/unblock-prs/set-aside-detail.mjs.map +1 -0
- package/dist/unblock-prs/skips.d.mts +85 -0
- package/dist/unblock-prs/skips.d.mts.map +1 -0
- package/dist/unblock-prs/skips.mjs +141 -0
- package/dist/unblock-prs/skips.mjs.map +1 -0
- package/dist/unblock-prs/stack.d.mts +98 -0
- package/dist/unblock-prs/stack.d.mts.map +1 -0
- package/dist/unblock-prs/stack.mjs +141 -0
- package/dist/unblock-prs/stack.mjs.map +1 -0
- package/dist/unblock-prs/triage.d.mts +28 -0
- package/dist/unblock-prs/triage.d.mts.map +1 -0
- package/dist/unblock-prs/triage.mjs +396 -0
- package/dist/unblock-prs/triage.mjs.map +1 -0
- package/dist/unblock-prs/types.d.mts +793 -0
- package/dist/unblock-prs/types.d.mts.map +1 -0
- package/dist/unblock-prs/types.mjs +26 -0
- package/dist/unblock-prs/types.mjs.map +1 -0
- package/dist/unblock-prs/util.d.mts +23 -0
- package/dist/unblock-prs/util.d.mts.map +1 -0
- package/dist/unblock-prs/util.mjs +60 -0
- package/dist/unblock-prs/util.mjs.map +1 -0
- package/dist/unblock-prs/version-pr.d.mts +57 -0
- package/dist/unblock-prs/version-pr.d.mts.map +1 -0
- package/dist/unblock-prs/version-pr.mjs +79 -0
- package/dist/unblock-prs/version-pr.mjs.map +1 -0
- package/dist/unblock-prs/watch.d.mts +17 -0
- package/dist/unblock-prs/watch.d.mts.map +1 -0
- package/dist/unblock-prs/watch.mjs +128 -0
- package/dist/unblock-prs/watch.mjs.map +1 -0
- package/package.json +118 -3
- package/src/claim-pr/claim-pr.mts +380 -0
- package/src/claim-pr/claim-pr.test.mts +176 -0
- package/src/claim-pr/index.mts +1 -0
- package/src/cmd/claim-pr.mts +32 -0
- package/src/cmd/open-pr.mts +28 -0
- package/src/cmd/pr-report.mts +28 -0
- package/src/cmd/push-fixed-pr.mts +36 -0
- package/src/cmd/report-unowned-prs.mts +37 -0
- package/src/cmd/unblock-prs.mts +24 -0
- package/src/entry-point.mts +3 -0
- package/src/lib/cli-args.mts +86 -0
- package/src/lib/cli-args.test.mts +92 -0
- package/src/lib/github-api.mts +463 -0
- package/src/lib/github-api.test.mts +40 -0
- package/src/lib/index.mts +6 -0
- package/src/lib/json.mts +43 -0
- package/src/lib/json.test.mts +34 -0
- package/src/lib/log.mts +19 -0
- package/src/lib/log.test.mts +45 -0
- package/src/lib/shell.mts +52 -0
- package/src/lib/time.mts +49 -0
- package/src/open-pr/README.md +237 -0
- package/src/open-pr/github.mts +444 -0
- package/src/open-pr/index.mts +5 -0
- package/src/open-pr/main.mts +327 -0
- package/src/open-pr/options.mts +101 -0
- package/src/open-pr/options.test.mts +67 -0
- package/src/open-pr/steps.mts +57 -0
- package/src/open-pr/steps.test.mts +59 -0
- package/src/open-pr/types.mts +42 -0
- package/src/pr-report/README.md +244 -0
- package/src/pr-report/github.mts +911 -0
- package/src/pr-report/index.mts +7 -0
- package/src/pr-report/linked-issues.mts +51 -0
- package/src/pr-report/linked-issues.test.mts +65 -0
- package/src/pr-report/main.mts +257 -0
- package/src/pr-report/options.mts +140 -0
- package/src/pr-report/queue.mts +125 -0
- package/src/pr-report/render.mts +428 -0
- package/src/pr-report/render.test.mts +379 -0
- package/src/pr-report/repo-settings.mts +34 -0
- package/src/push-fixed-pr/index.mts +1 -0
- package/src/push-fixed-pr/push-fixed-pr.mts +276 -0
- package/src/push-fixed-pr/push-fixed-pr.test.mts +228 -0
- package/src/report-unowned-prs/index.mts +1 -0
- package/src/report-unowned-prs/report-unowned-prs.mts +190 -0
- package/src/report-unowned-prs/report-unowned-prs.test.mts +87 -0
- package/src/unblock-prs/README.md +1616 -0
- package/src/unblock-prs/auto-fix.mts +334 -0
- package/src/unblock-prs/auto-fix.test.mts +159 -0
- package/src/unblock-prs/checks.mts +538 -0
- package/src/unblock-prs/checks.test.mts +507 -0
- package/src/unblock-prs/claims.mts +33 -0
- package/src/unblock-prs/claims.test.mts +64 -0
- package/src/unblock-prs/config.mts +187 -0
- package/src/unblock-prs/config.schema.json +71 -0
- package/src/unblock-prs/config.test.mts +139 -0
- package/src/unblock-prs/constants.mts +33 -0
- package/src/unblock-prs/demotions.mts +73 -0
- package/src/unblock-prs/demotions.test.mts +100 -0
- package/src/unblock-prs/github.mts +1042 -0
- package/src/unblock-prs/github.test.mts +84 -0
- package/src/unblock-prs/index.mts +24 -0
- package/src/unblock-prs/labels.mts +70 -0
- package/src/unblock-prs/main.mts +1051 -0
- package/src/unblock-prs/merge-after.mts +117 -0
- package/src/unblock-prs/merge-after.test.mts +120 -0
- package/src/unblock-prs/options.mts +157 -0
- package/src/unblock-prs/owner.mts +91 -0
- package/src/unblock-prs/owner.test.mts +114 -0
- package/src/unblock-prs/quiet.mts +62 -0
- package/src/unblock-prs/quiet.test.mts +175 -0
- package/src/unblock-prs/rebase.mts +962 -0
- package/src/unblock-prs/release.mts +149 -0
- package/src/unblock-prs/release.test.mts +209 -0
- package/src/unblock-prs/set-aside-comment.mts +143 -0
- package/src/unblock-prs/set-aside-comment.test.mts +148 -0
- package/src/unblock-prs/set-aside-detail.mts +82 -0
- package/src/unblock-prs/set-aside-detail.test.mts +131 -0
- package/src/unblock-prs/skips.mts +215 -0
- package/src/unblock-prs/skips.test.mts +280 -0
- package/src/unblock-prs/stack.mts +220 -0
- package/src/unblock-prs/stack.test.mts +449 -0
- package/src/unblock-prs/triage.mts +669 -0
- package/src/unblock-prs/triage.test.mts +100 -0
- package/src/unblock-prs/types.mts +358 -0
- package/src/unblock-prs/util.mts +78 -0
- package/src/unblock-prs/util.test.mts +26 -0
- package/src/unblock-prs/version-pr.mts +112 -0
- package/src/unblock-prs/version-pr.test.mts +78 -0
- package/src/unblock-prs/watch.mts +219 -0
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
import * as nodePath from 'node:path';
|
|
16
|
+
import { Arr, Json, Result, unknownToString } from 'ts-data-forge';
|
|
17
|
+
import * as t from 'ts-fortress';
|
|
18
|
+
import { parseJson, readJsonFile } from './json.mjs';
|
|
19
|
+
import { git, repoRoot } from './shell.mjs';
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
export const tokenFromEnv = () => {
|
|
31
|
+
const token = process.env['GH_TOKEN'] ?? process.env['GITHUB_TOKEN'] ?? '';
|
|
32
|
+
return token === '' ? undefined : token;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
export const resolveToken = async () => {
|
|
41
|
+
const fromEnv = tokenFromEnv();
|
|
42
|
+
if (fromEnv !== undefined) {
|
|
43
|
+
return Result.ok(fromEnv);
|
|
44
|
+
}
|
|
45
|
+
const fromGh = await git('gh auth token');
|
|
46
|
+
if (Result.isErr(fromGh)) {
|
|
47
|
+
return Result.err('no credential: set GH_TOKEN or GITHUB_TOKEN, or authenticate `gh`');
|
|
48
|
+
}
|
|
49
|
+
const trimmed = fromGh.value.trim();
|
|
50
|
+
return trimmed === ''
|
|
51
|
+
? Result.err('no credential: set GH_TOKEN or GITHUB_TOKEN, or authenticate `gh`')
|
|
52
|
+
: Result.ok(trimmed);
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
export const resolveRepo = async (repoOption) => {
|
|
67
|
+
if (repoOption !== undefined) {
|
|
68
|
+
return parseRepoRef(repoOption);
|
|
69
|
+
}
|
|
70
|
+
const origin = await git('git remote get-url origin');
|
|
71
|
+
const fromOrigin = Result.isOk(origin)
|
|
72
|
+
? repoOfUrl(origin.value.trim())
|
|
73
|
+
: undefined;
|
|
74
|
+
if (fromOrigin !== undefined) {
|
|
75
|
+
return Result.ok(fromOrigin);
|
|
76
|
+
}
|
|
77
|
+
const manifest = await readJsonFile(nodePath.join(await repoRoot(), 'package.json'), PackageJsonSchema);
|
|
78
|
+
const fromManifest = Result.isOk(manifest)
|
|
79
|
+
? repoOfUrl(manifest.value.repository.url)
|
|
80
|
+
: undefined;
|
|
81
|
+
return fromManifest === undefined
|
|
82
|
+
? Result.err('cannot tell which repository this is: origin is not a GitHub remote, and the root package.json names none; pass --repo owner/name')
|
|
83
|
+
: Result.ok(fromManifest);
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export const parseRepoRef = (raw) => {
|
|
87
|
+
const parts = raw.split('/');
|
|
88
|
+
if (!Arr.isFixedLengthArray(2, parts)) {
|
|
89
|
+
return Result.err(`expected owner/name, got ${JSON.stringify(raw)}`);
|
|
90
|
+
}
|
|
91
|
+
const [owner, name] = parts;
|
|
92
|
+
return owner === '' || name === ''
|
|
93
|
+
? Result.err(`expected owner/name, got ${JSON.stringify(raw)}`)
|
|
94
|
+
: Result.ok({ owner, name });
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
export const repoOfUrl = (url) => {
|
|
103
|
+
const match = /github\.com[/:](?<owner>[\w.-]+)\/(?<name>[\w.-]+?)(?:\.git)?$/u.exec(url);
|
|
104
|
+
const owner = match?.groups?.['owner'];
|
|
105
|
+
const name = match?.groups?.['name'];
|
|
106
|
+
return owner === undefined || name === undefined
|
|
107
|
+
? undefined
|
|
108
|
+
: { owner, name };
|
|
109
|
+
};
|
|
110
|
+
const PackageJsonSchema = t.record({
|
|
111
|
+
repository: t.record({ url: t.string() }),
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
export const resolveApiContext = async (repoOption) => {
|
|
119
|
+
const token = await resolveToken();
|
|
120
|
+
if (Result.isErr(token)) {
|
|
121
|
+
return token;
|
|
122
|
+
}
|
|
123
|
+
const repo = await resolveRepo(repoOption);
|
|
124
|
+
return Result.isErr(repo)
|
|
125
|
+
? repo
|
|
126
|
+
: Result.ok({ repo: repo.value, token: token.value });
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
export const rest = async (context, method, path, schema, { query, body, withBodyHtml = false } = {}) => {
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
const parameters = query === undefined ? undefined : new URLSearchParams({ ...query });
|
|
137
|
+
const search = parameters === undefined ? '' : `?${parameters.toString()}`;
|
|
138
|
+
const response = await send({
|
|
139
|
+
url: `https://api.github.com/repos/${context.repo.owner}/${context.repo.name}${path}${search}`,
|
|
140
|
+
method,
|
|
141
|
+
token: context.token,
|
|
142
|
+
accept: withBodyHtml
|
|
143
|
+
? 'application/vnd.github.full+json'
|
|
144
|
+
: 'application/vnd.github+json',
|
|
145
|
+
body: body === undefined ? undefined : JSON.stringify(body),
|
|
146
|
+
});
|
|
147
|
+
return Result.isErr(response)
|
|
148
|
+
? Result.err(response.value.message)
|
|
149
|
+
: validate(response.value, schema);
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
export const viewerLogin = async (token) => {
|
|
156
|
+
const response = await send({
|
|
157
|
+
url: 'https://api.github.com/user',
|
|
158
|
+
method: 'GET',
|
|
159
|
+
token,
|
|
160
|
+
accept: 'application/vnd.github+json',
|
|
161
|
+
body: undefined,
|
|
162
|
+
});
|
|
163
|
+
return Result.isErr(response)
|
|
164
|
+
? Result.err(response.value.message)
|
|
165
|
+
: Result.map(validate(response.value, t.record({ login: t.string() })), ({ login }) => login);
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
export const graphql = async (context, query, variables) => Result.map(await graphqlQuery(context, query, variables, t.unknown()), () => undefined);
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
export const graphqlQuery = async (context, query, variables, schema) => {
|
|
183
|
+
const response = await send({
|
|
184
|
+
url: 'https://api.github.com/graphql',
|
|
185
|
+
method: 'POST',
|
|
186
|
+
token: context.token,
|
|
187
|
+
accept: 'application/json',
|
|
188
|
+
body: JSON.stringify({ query, variables }),
|
|
189
|
+
});
|
|
190
|
+
if (Result.isErr(response)) {
|
|
191
|
+
return Result.err(response.value.message);
|
|
192
|
+
}
|
|
193
|
+
const parsed = validate(response.value, GraphqlResponseSchema);
|
|
194
|
+
if (Result.isErr(parsed)) {
|
|
195
|
+
return parsed;
|
|
196
|
+
}
|
|
197
|
+
const errors = parsed.value.errors ?? [];
|
|
198
|
+
if (Arr.isNonEmpty(errors)) {
|
|
199
|
+
return Result.err(errors.map((error) => error.message).join('; '));
|
|
200
|
+
}
|
|
201
|
+
const data = schema.validate(parsed.value.data);
|
|
202
|
+
return Result.isErr(data)
|
|
203
|
+
? Result.err(t.validationErrorsToMessages(data.value).join('\n'))
|
|
204
|
+
: Result.ok(data.value);
|
|
205
|
+
};
|
|
206
|
+
const GraphqlResponseSchema = t.record({
|
|
207
|
+
data: t.optional(t.unknown()),
|
|
208
|
+
errors: t.optional(t.array(t.record({ message: t.string() }))),
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
export const addLabel = async (context, prNumber, label) => Result.map(await rest(context, 'POST', `/issues/${prNumber}/labels`, t.unknown(), {
|
|
215
|
+
body: { labels: [label] },
|
|
216
|
+
}), () => undefined);
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
export const removeLabel = async (context, prNumber, label) => {
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
const segment = encodeURIComponent(label);
|
|
227
|
+
const removed = await rest(context, 'DELETE', `/issues/${prNumber}/labels/${segment}`, t.unknown());
|
|
228
|
+
return Result.isOk(removed) || removed.value.startsWith('404 ')
|
|
229
|
+
? Result.ok(undefined)
|
|
230
|
+
: removed;
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
export const send = async ({ url, method, token, accept, body, }) => {
|
|
241
|
+
const response = await Result.fromPromise(fetch(url, {
|
|
242
|
+
method,
|
|
243
|
+
headers: {
|
|
244
|
+
...(token === undefined ? {} : { Authorization: `Bearer ${token}` }),
|
|
245
|
+
Accept: accept,
|
|
246
|
+
'X-GitHub-Api-Version': '2022-11-28',
|
|
247
|
+
|
|
248
|
+
'User-Agent': 'noshiro-pf-mono-tools',
|
|
249
|
+
...(body === undefined ? {} : { 'Content-Type': 'application/json' }),
|
|
250
|
+
},
|
|
251
|
+
...(body === undefined ? {} : { body }),
|
|
252
|
+
}));
|
|
253
|
+
if (Result.isErr(response)) {
|
|
254
|
+
return Result.err({
|
|
255
|
+
message: `request failed: ${unknownToString(response.value)}`,
|
|
256
|
+
rateLimited: false,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
const read = await Result.fromPromise(response.value.text());
|
|
260
|
+
const payload = Result.isOk(read) ? read.value : '';
|
|
261
|
+
return response.value.ok
|
|
262
|
+
? Result.ok(payload)
|
|
263
|
+
: Result.err({
|
|
264
|
+
message: `${response.value.status} ${response.value.statusText}: ${messageFrom(payload)}`,
|
|
265
|
+
rateLimited: response.value.headers.get('x-ratelimit-remaining') === '0',
|
|
266
|
+
});
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
const messageFrom = (body) => {
|
|
270
|
+
const parsed = Json.parse(body);
|
|
271
|
+
if (Result.isErr(parsed)) {
|
|
272
|
+
return body.slice(0, 200);
|
|
273
|
+
}
|
|
274
|
+
const validated = t
|
|
275
|
+
.record({ message: t.optional(t.string()) })
|
|
276
|
+
.validate(parsed.value);
|
|
277
|
+
return Result.isOk(validated) && validated.value.message !== undefined
|
|
278
|
+
? validated.value.message
|
|
279
|
+
: body.slice(0, 200);
|
|
280
|
+
};
|
|
281
|
+
const validate = (body, schema) => {
|
|
282
|
+
|
|
283
|
+
if (body === '') {
|
|
284
|
+
const validated = schema.validate(undefined);
|
|
285
|
+
return Result.isErr(validated)
|
|
286
|
+
? Result.err(t.validationErrorsToMessages(validated.value).join('\n'))
|
|
287
|
+
: Result.ok(validated.value);
|
|
288
|
+
}
|
|
289
|
+
return parseJson(body, schema, 'the answer from GitHub');
|
|
290
|
+
};
|
|
291
|
+
//# sourceMappingURL=github-api.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-api.mjs","sourceRoot":"","sources":["../../src/lib/github-api.mts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/lib/index.mts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/lib/index.mts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Reading JSON into a schema's type, from text or from a file. */
|
|
2
|
+
import { Result } from 'ts-data-forge';
|
|
3
|
+
import * as t from 'ts-fortress';
|
|
4
|
+
/**
|
|
5
|
+
* `text` parsed and validated against `schema`. `source` names where the text
|
|
6
|
+
* came from — a file, an API route, a command — so that the message says
|
|
7
|
+
* which answer was wrong, not only how.
|
|
8
|
+
*/
|
|
9
|
+
export declare const parseJson: <A>(text: string, schema: t.Type<A>, source: string) => Result<A, string>;
|
|
10
|
+
/** {@link parseJson} of a file's contents, the file naming itself. */
|
|
11
|
+
export declare const readJsonFile: <A>(file: string, schema: t.Type<A>) => Promise<Result<A, string>>;
|
|
12
|
+
//# sourceMappingURL=json.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.mts","sourceRoot":"","sources":["../../src/lib/json.mts"],"names":[],"mappings":"AAAA,mEAAmE;AAGnE,OAAO,EAAQ,MAAM,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,CAAC,MAAM,aAAa,CAAC;AAEjC;;;;GAIG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,QACnB,MAAM,UACJ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UACT,MAAM,KACb,MAAM,CAAC,CAAC,EAAE,MAAM,CAclB,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,YAAY,GAAU,CAAC,QAC5B,MAAM,UACJ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAChB,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAO3B,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
|
|
2
|
+
import * as fs from 'node:fs/promises';
|
|
3
|
+
import { Json, Result } from 'ts-data-forge';
|
|
4
|
+
import * as t from 'ts-fortress';
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
export const parseJson = (text, schema, source) => {
|
|
11
|
+
const parsed = Json.parse(text);
|
|
12
|
+
if (Result.isErr(parsed)) {
|
|
13
|
+
return Result.err(`${source} is not valid JSON: ${parsed.value}`);
|
|
14
|
+
}
|
|
15
|
+
const validated = schema.validate(parsed.value);
|
|
16
|
+
return Result.isErr(validated)
|
|
17
|
+
? Result.err(`${source} has an unexpected shape:\n${t.validationErrorsToMessages(validated.value).join('\n')}`)
|
|
18
|
+
: Result.ok(validated.value);
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export const readJsonFile = async (file, schema) => {
|
|
22
|
+
|
|
23
|
+
const text = await Result.fromPromise(fs.readFile(file, 'utf8'));
|
|
24
|
+
return Result.isErr(text)
|
|
25
|
+
? Result.err(`cannot read ${file}`)
|
|
26
|
+
: parseJson(text.value, schema, file);
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=json.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.mjs","sourceRoot":"","sources":["../../src/lib/json.mts"],"names":[],"mappings":"AAAA,mEAAmE;AAEnE,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,CAAC,MAAM,aAAa,CAAC;AAEjC;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,IAAY,EACZ,MAAiB,EACjB,MAAc,EACK,EAAE;IACrB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEhC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,uBAAuB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEhD,OAAO,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;QAC5B,CAAC,CAAC,MAAM,CAAC,GAAG,CACR,GAAG,MAAM,8BAA8B,CAAC,CAAC,0BAA0B,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAClG;QACH,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC,CAAC;AAEF,sEAAsE;AACtE,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,IAAY,EACZ,MAAiB,EACW,EAAE;IAC9B,mEAAmE;IACnE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAEjE,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;QACvB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;QACnC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAC1C,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** The log line every long-running command writes. */
|
|
2
|
+
export declare const log: (message: string) => void;
|
|
3
|
+
/**
|
|
4
|
+
* `message` stamped with the time in the machine's time zone (`TZ`), because
|
|
5
|
+
* the person reading the log reads it against their own clock. The offset
|
|
6
|
+
* stays in the stamp, so a line pasted elsewhere still names one instant.
|
|
7
|
+
* `offsetMinutes` (east of UTC) is the machine's unless given.
|
|
8
|
+
*/
|
|
9
|
+
export declare const logLine: (message: string, epochMs?: number, offsetMinutes?: number) => string;
|
|
10
|
+
//# sourceMappingURL=log.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.d.mts","sourceRoot":"","sources":["../../src/lib/log.mts"],"names":[],"mappings":"AAAA,sDAAsD;AAItD,eAAO,MAAM,GAAG,YAAa,MAAM,KAAG,IAErC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,OAAO,YACT,MAAM,YACN,MAAM,kBACC,MAAM,KACrB,MAA2E,CAAC"}
|
package/dist/lib/log.mjs
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
|
|
2
|
+
import { currentEpochMs, localTimestamp } from './time.mjs';
|
|
3
|
+
export const log = (message) => {
|
|
4
|
+
console.info(logLine(message));
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
export const logLine = (message, epochMs = currentEpochMs(), offsetMinutes) => `[${localTimestamp(epochMs, offsetMinutes)}] ${message}`;
|
|
13
|
+
//# sourceMappingURL=log.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.mjs","sourceRoot":"","sources":["../../src/lib/log.mts"],"names":[],"mappings":"AAAA,sDAAsD;AAEtD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,OAAe,EAAQ,EAAE;IAC3C,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AACjC,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,OAAe,EACf,OAAO,GAAW,cAAc,EAAE,EAClC,aAAsB,EACd,EAAE,CAAC,IAAI,cAAc,CAAC,OAAO,EAAE,aAAa,CAAC,KAAK,OAAO,EAAW,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Running `git`, `gh` and `pnpm` from a command, and quoting what they take. */
|
|
2
|
+
import { Result } from 'ts-data-forge';
|
|
3
|
+
/**
|
|
4
|
+
* Runs a git or gh command silently and resolves to its stdout, or to a
|
|
5
|
+
* message that includes what it printed to stderr. `unblock-prs` runs its
|
|
6
|
+
* `pnpm` commands through it too. It runs where the command was started
|
|
7
|
+
* unless told otherwise; git finds the repository from any directory in it.
|
|
8
|
+
*/
|
|
9
|
+
export declare const git: (command: string, cwd?: string) => Promise<Result<string, string>>;
|
|
10
|
+
/**
|
|
11
|
+
* The root of the repository the command runs in, where its configuration
|
|
12
|
+
* files are read from: the working tree holding the current directory, or
|
|
13
|
+
* the current directory itself where git finds none (a tree without `.git`).
|
|
14
|
+
*/
|
|
15
|
+
export declare const repoRoot: () => Promise<string>;
|
|
16
|
+
/** Single-quotes a string for a POSIX shell. */
|
|
17
|
+
export declare const sh: (value: string) => string;
|
|
18
|
+
//# sourceMappingURL=shell.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.d.mts","sourceRoot":"","sources":["../../src/lib/shell.mts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAGvC;;;;;GAKG;AACH,eAAO,MAAM,GAAG,YACL,MAAM,QACV,MAAM,KACV,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAWhC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,QAAQ,QAAa,OAAO,CAAC,MAAM,CAI/C,CAAC;AAEF,gDAAgD;AAChD,eAAO,MAAM,EAAE,UAAW,MAAM,KAAG,MACsB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
|
|
2
|
+
import { Result } from 'ts-data-forge';
|
|
3
|
+
import { $ } from 'ts-repo-utils';
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
export const git = async (command, cwd = process.cwd()) => {
|
|
11
|
+
const result = await $(command, {
|
|
12
|
+
cwd,
|
|
13
|
+
silent: true,
|
|
14
|
+
env: childEnv,
|
|
15
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
16
|
+
});
|
|
17
|
+
return Result.isOk(result)
|
|
18
|
+
? Result.ok(result.value.stdout)
|
|
19
|
+
: Result.err(result.value.message.trim());
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
export const repoRoot = async () => {
|
|
27
|
+
const top = await git('git rev-parse --show-toplevel');
|
|
28
|
+
return Result.isOk(top) ? top.value.trim() : process.cwd();
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export const sh = (value) => `'${value.replaceAll("'", String.raw `'\''`)}'`;
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
const childEnv = {
|
|
38
|
+
...process.env,
|
|
39
|
+
GIT_TERMINAL_PROMPT: '0',
|
|
40
|
+
GIT_EDITOR: 'true',
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=shell.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.mjs","sourceRoot":"","sources":["../../src/lib/shell.mts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAElC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EACtB,OAAe,EACf,GAAG,GAAW,OAAO,CAAC,GAAG,EAAE,EACM,EAAE;IACnC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,OAAO,EAAE;QAC9B,GAAG;QACH,MAAM,EAAE,IAAI;QACZ,GAAG,EAAE,QAAQ;QACb,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;KAC5B,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QACxB,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;QAChC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9C,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,IAAqB,EAAE;IAClD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAEvD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;AAC7D,CAAC,CAAC;AAEF,gDAAgD;AAChD,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAa,EAAU,EAAE,CAC1C,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAA,MAAM,CAAC,GAAY,CAAC;AAE1D;;;;GAIG;AACH,MAAM,QAAQ,GAAsB;IAClC,GAAG,OAAO,CAAC,GAAG;IACd,mBAAmB,EAAE,GAAG;IACxB,UAAU,EAAE,MAAM;CACV,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The clock, and instants written as the commands write them — through
|
|
3
|
+
* `Date` rather than `Temporal`, which the oldest Node.js this package's
|
|
4
|
+
* `engines` names has only behind a flag. GitHub's
|
|
5
|
+
* timestamps are read with `pr-report-core`'s `epochMsOf`.
|
|
6
|
+
*/
|
|
7
|
+
/** Milliseconds since the epoch, now. */
|
|
8
|
+
export declare const currentEpochMs: () => number;
|
|
9
|
+
/** An instant in UTC to the second, as GitHub writes one: `2026-09-29T01:02:03Z`. */
|
|
10
|
+
export declare const isoSeconds: (epochMs: number) => string;
|
|
11
|
+
/**
|
|
12
|
+
* An instant in local time to the millisecond, with its offset from UTC:
|
|
13
|
+
* `2026-09-27T21:03:04.500+09:00`. The offset is the machine's (`TZ`) at
|
|
14
|
+
* that instant unless one is given, in minutes east of UTC.
|
|
15
|
+
*/
|
|
16
|
+
export declare const localTimestamp: (epochMs: number, offsetMinutes?: number) => string;
|
|
17
|
+
//# sourceMappingURL=time.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time.d.mts","sourceRoot":"","sources":["../../src/lib/time.mts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,yCAAyC;AACzC,eAAO,MAAM,cAAc,QAAO,MAAoB,CAAC;AAEvD,qFAAqF;AACrF,eAAO,MAAM,UAAU,YAAa,MAAM,KAAG,MACG,CAAC;AAEjD;;;;GAIG;AACH,eAAO,MAAM,cAAc,YAChB,MAAM,kBACA,MAAM,KACpB,MAYF,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
export const currentEpochMs = () => Date.now();
|
|
9
|
+
|
|
10
|
+
export const isoSeconds = (epochMs) => `${isoMillis(epochMs).slice(0, 19)}Z`;
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
export const localTimestamp = (epochMs, offsetMinutes = machineOffsetMinutes(epochMs)) => {
|
|
17
|
+
const local = isoMillis(epochMs + offsetMinutes * 60_000).slice(0, 23);
|
|
18
|
+
const sign = offsetMinutes < 0 ? '-' : '+';
|
|
19
|
+
const hours = Math.floor(Math.abs(offsetMinutes) / 60)
|
|
20
|
+
.toString()
|
|
21
|
+
.padStart(2, '0');
|
|
22
|
+
const minutes = (Math.abs(offsetMinutes) % 60).toString().padStart(2, '0');
|
|
23
|
+
return `${local}${sign}${hours}:${minutes}`;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const isoMillis = (epochMs) => {
|
|
27
|
+
const date = new Date(epochMs);
|
|
28
|
+
return date.toISOString();
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const machineOffsetMinutes = (epochMs) => {
|
|
32
|
+
const date = new Date(epochMs);
|
|
33
|
+
return -date.getTimezoneOffset();
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=time.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time.mjs","sourceRoot":"","sources":["../../src/lib/time.mts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,yCAAyC;AACzC,MAAM,CAAC,MAAM,cAAc,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AAEvD,qFAAqF;AACrF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAe,EAAU,EAAE,CACpD,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAY,CAAC;AAEjD;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,OAAe,EACf,aAAa,GAAW,oBAAoB,CAAC,OAAO,CAAC,EAC7C,EAAE;IACV,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,GAAG,aAAa,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEvE,MAAM,IAAI,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAE3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC;SACnD,QAAQ,EAAE;SACV,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAEpB,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAE3E,OAAO,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,IAAI,OAAO,EAAW,CAAC;AACvD,CAAC,CAAC;AAEF,kCAAkC;AAClC,MAAM,SAAS,GAAG,CAAC,OAAe,EAAU,EAAE;IAC5C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;IAE/B,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;AAC5B,CAAC,CAAC;AAEF,2EAA2E;AAC3E,MAAM,oBAAoB,GAAG,CAAC,OAAe,EAAU,EAAE;IACvD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;IAE/B,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;AACnC,CAAC,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/** Everything that talks to GitHub or to `git`, and nothing that decides. */
|
|
2
|
+
import { Result } from 'ts-data-forge';
|
|
3
|
+
import { type ApiContext } from '../lib/index.mjs';
|
|
4
|
+
import { type PullRequest } from './types.mjs';
|
|
5
|
+
/**
|
|
6
|
+
* There is a credential and a repository to use it on, and the branch about
|
|
7
|
+
* to be pushed is not the branch everything targets.
|
|
8
|
+
*/
|
|
9
|
+
export declare const preflight: () => Promise<Result<Readonly<{
|
|
10
|
+
api: ApiContext;
|
|
11
|
+
branch: string;
|
|
12
|
+
defaultBranch: string;
|
|
13
|
+
}>, string>>;
|
|
14
|
+
/** The subject of the branch tip, which is the default pull request title. */
|
|
15
|
+
export declare const lastCommitSubject: () => Promise<Result<string, string>>;
|
|
16
|
+
/** Pushes and sets the upstream, so the branch exists to open against. */
|
|
17
|
+
export declare const pushBranch: (branch: string) => Promise<Result<undefined, string>>;
|
|
18
|
+
/**
|
|
19
|
+
* The open pull request for this branch, or `undefined`.
|
|
20
|
+
*
|
|
21
|
+
* `head` is qualified with the owner. A bare branch name matches the same
|
|
22
|
+
* name on a fork, and this command must not mistake someone else's pull
|
|
23
|
+
* request for its own.
|
|
24
|
+
*/
|
|
25
|
+
export declare const findOpenPullRequest: (api: ApiContext, branch: string) => Promise<Result<PullRequest | undefined, string>>;
|
|
26
|
+
/**
|
|
27
|
+
* The open pull request whose branch `base` is, when a new one is to be
|
|
28
|
+
* stacked on it: exactly one, from this repository. Anything else is not a
|
|
29
|
+
* stack `unblock-prs` or the reports would recognize, and is refused rather
|
|
30
|
+
* than opened.
|
|
31
|
+
*/
|
|
32
|
+
export declare const findStackParent: (api: ApiContext, base: string) => Promise<Result<number, string>>;
|
|
33
|
+
/**
|
|
34
|
+
* Whether the branch contains the tip of `base`, as a layer stacked on it
|
|
35
|
+
* has to: one that does not shows the layer below's old commits in its diff.
|
|
36
|
+
*/
|
|
37
|
+
export declare const containsBase: (base: string) => Promise<Result<undefined, string>>;
|
|
38
|
+
export declare const viewPullRequest: (api: ApiContext, prNumber: number) => Promise<Result<PullRequest, string>>;
|
|
39
|
+
/**
|
|
40
|
+
* Creates it ready for review — never a draft, because `unblock-prs` passes a
|
|
41
|
+
* draft over, and queueing a pull request is meant to be `merge-queued` and
|
|
42
|
+
* nothing else.
|
|
43
|
+
*/
|
|
44
|
+
export declare const createPullRequest: ({ api, branch, base, title, body, }: Readonly<{
|
|
45
|
+
api: ApiContext;
|
|
46
|
+
branch: string;
|
|
47
|
+
base: string;
|
|
48
|
+
title: string;
|
|
49
|
+
body: string;
|
|
50
|
+
}>) => Promise<Result<number, string>>;
|
|
51
|
+
/**
|
|
52
|
+
* What the issues the pull request closes start after, as open pull
|
|
53
|
+
* requests it should merge after (`pr-report-core`'s `inheritStartAfter`),
|
|
54
|
+
* less what its body or `alsoDeclared` — the layer it is stacked on — already
|
|
55
|
+
* says. The readers derive the same each time they read, so this is the
|
|
56
|
+
* body stating it, as it states a stack.
|
|
57
|
+
*
|
|
58
|
+
* Closing issues are read from the keywords GitHub marked in the body, which
|
|
59
|
+
* it marks whatever the base; one linked by hand in the sidebar is not seen.
|
|
60
|
+
*/
|
|
61
|
+
export declare const missingInheritedOrder: (api: ApiContext, prNumber: number, alsoDeclared: readonly number[]) => Promise<Result<Readonly<{
|
|
62
|
+
body: string;
|
|
63
|
+
missing: readonly number[];
|
|
64
|
+
}>, string>>;
|
|
65
|
+
export declare const updateBody: (api: ApiContext, prNumber: number, body: string) => Promise<Result<undefined, string>>;
|
|
66
|
+
/**
|
|
67
|
+
* GraphQL: the REST API cannot take a pull request out of draft. The one
|
|
68
|
+
* GraphQL call this command makes, and only for a pull request someone
|
|
69
|
+
* opened as a draft before running it.
|
|
70
|
+
*/
|
|
71
|
+
export declare const markReady: (api: ApiContext, nodeId: string) => Promise<Result<undefined, string>>;
|
|
72
|
+
//# sourceMappingURL=github.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.d.mts","sourceRoot":"","sources":["../../src/open-pr/github.mts"],"names":[],"mappings":"AAAA,6EAA6E;AAU7E,OAAO,EAAO,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAOL,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AAErB;;;GAGG;AACH,eAAO,MAAM,SAAS,QAAa,OAAO,CACxC,MAAM,CACJ,QAAQ,CAAC;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,EACpE,MAAM,CACP,CA8CF,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,iBAAiB,QAAa,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAYxE,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,UAAU,WACb,MAAM,KACb,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAInC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,QACzB,UAAU,UACP,MAAM,KACb,OAAO,CAAC,MAAM,CAAC,WAAW,GAAG,SAAS,EAAE,MAAM,CAAC,CAwBjD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,QACrB,UAAU,QACT,MAAM,KACX,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA8BhC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,YAAY,SACjB,MAAM,KACX,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAkBnC,CAAC;AAEF,eAAO,MAAM,eAAe,QACrB,UAAU,YACL,MAAM,KACf,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CASrC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,wCAM3B,QAAQ,CAAC;IACV,GAAG,EAAE,UAAU,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUlC,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,QAC3B,UAAU,YACL,MAAM,gBACF,SAAS,MAAM,EAAE,KAC9B,OAAO,CACR,MAAM,CAAC,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC,EAAE,MAAM,CAAC,CA0EvE,CAAC;AAEF,eAAO,MAAM,UAAU,QAChB,UAAU,YACL,MAAM,QACV,MAAM,KACX,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAMnC,CAAC;AAqDF;;;;GAIG;AACH,eAAO,MAAM,SAAS,QACf,UAAU,UACP,MAAM,KACb,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAWjC,CAAC"}
|