github-settings-as-code 1.2.9 → 2.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/README.md +60 -9
- package/dist/cmd/{gh-apply-all.d.mts → repo-settings.d.mts} +1 -1
- package/dist/cmd/repo-settings.d.mts.map +1 -0
- package/dist/cmd/repo-settings.mjs +118 -0
- package/dist/cmd/repo-settings.mjs.map +1 -0
- package/dist/github/actions-settings/api/get-actions-settings.d.mts +8 -0
- package/dist/github/actions-settings/api/get-actions-settings.d.mts.map +1 -0
- package/dist/github/actions-settings/api/get-actions-settings.mjs +25 -0
- package/dist/github/actions-settings/api/get-actions-settings.mjs.map +1 -0
- package/dist/github/actions-settings/api/index.d.mts +3 -0
- package/dist/github/actions-settings/api/index.d.mts.map +1 -0
- package/dist/github/actions-settings/api/index.mjs +3 -0
- package/dist/github/actions-settings/api/index.mjs.map +1 -0
- package/dist/github/actions-settings/api/set-actions-settings.d.mts +4 -0
- package/dist/github/actions-settings/api/set-actions-settings.d.mts.map +1 -0
- package/dist/github/actions-settings/api/set-actions-settings.mjs +27 -0
- package/dist/github/actions-settings/api/set-actions-settings.mjs.map +1 -0
- package/dist/github/actions-settings/apply.d.mts +5 -0
- package/dist/github/actions-settings/apply.d.mts.map +1 -0
- package/dist/github/actions-settings/apply.mjs +39 -0
- package/dist/github/actions-settings/apply.mjs.map +1 -0
- package/dist/github/actions-settings/backup.d.mts +5 -0
- package/dist/github/actions-settings/backup.d.mts.map +1 -0
- package/dist/github/actions-settings/backup.mjs +22 -0
- package/dist/github/actions-settings/backup.mjs.map +1 -0
- package/dist/github/actions-settings/constants.d.mts +69 -0
- package/dist/github/actions-settings/constants.d.mts.map +1 -0
- package/dist/github/actions-settings/constants.mjs +42 -0
- package/dist/github/actions-settings/constants.mjs.map +1 -0
- package/dist/github/actions-settings/index.d.mts +5 -0
- package/dist/github/actions-settings/index.d.mts.map +1 -0
- package/dist/github/actions-settings/index.mjs +5 -0
- package/dist/github/actions-settings/index.mjs.map +1 -0
- package/dist/github/constants.d.mts +4 -2
- package/dist/github/constants.d.mts.map +1 -1
- package/dist/github/constants.mjs +7 -31
- package/dist/github/constants.mjs.map +1 -1
- package/dist/github/index.d.mts +4 -0
- package/dist/github/index.d.mts.map +1 -1
- package/dist/github/index.mjs +4 -0
- package/dist/github/index.mjs.map +1 -1
- package/dist/github/octokit.d.mts.map +1 -1
- package/dist/github/octokit.mjs +39 -3
- package/dist/github/octokit.mjs.map +1 -1
- package/dist/github/pages/api/get-pages-settings.d.mts +8 -0
- package/dist/github/pages/api/get-pages-settings.d.mts.map +1 -0
- package/dist/github/pages/api/get-pages-settings.mjs +26 -0
- package/dist/github/pages/api/get-pages-settings.mjs.map +1 -0
- package/dist/github/pages/api/index.d.mts +3 -0
- package/dist/github/pages/api/index.d.mts.map +1 -0
- package/dist/github/pages/api/index.mjs +3 -0
- package/dist/github/pages/api/index.mjs.map +1 -0
- package/dist/github/pages/api/set-pages-settings.d.mts +9 -0
- package/dist/github/pages/api/set-pages-settings.d.mts.map +1 -0
- package/dist/github/pages/api/set-pages-settings.mjs +33 -0
- package/dist/github/pages/api/set-pages-settings.mjs.map +1 -0
- package/dist/github/pages/apply.d.mts +10 -0
- package/dist/github/pages/apply.d.mts.map +1 -0
- package/dist/github/pages/apply.mjs +49 -0
- package/dist/github/pages/apply.mjs.map +1 -0
- package/dist/github/pages/backup.d.mts +5 -0
- package/dist/github/pages/backup.d.mts.map +1 -0
- package/dist/github/pages/backup.mjs +26 -0
- package/dist/github/pages/backup.mjs.map +1 -0
- package/dist/github/pages/constants.d.mts +42 -0
- package/dist/github/pages/constants.d.mts.map +1 -0
- package/dist/github/pages/constants.mjs +14 -0
- package/dist/github/pages/constants.mjs.map +1 -0
- package/dist/github/pages/index.d.mts +5 -0
- package/dist/github/pages/index.d.mts.map +1 -0
- package/dist/github/pages/index.mjs +5 -0
- package/dist/github/pages/index.mjs.map +1 -0
- package/dist/github/repository/api/update-repository.d.mts.map +1 -1
- package/dist/github/repository/apply.d.mts.map +1 -1
- package/dist/github/repository/apply.mjs +4 -4
- package/dist/github/repository/apply.mjs.map +1 -1
- package/dist/github/repository/backup.d.mts.map +1 -1
- package/dist/github/repository/backup.mjs +2 -2
- package/dist/github/repository/backup.mjs.map +1 -1
- package/dist/github/repository/constants.d.mts +3267 -2032
- package/dist/github/repository/constants.d.mts.map +1 -1
- package/dist/github/repository/constants.mjs +2 -1
- package/dist/github/repository/constants.mjs.map +1 -1
- package/dist/github/resolve-target-repo.d.mts +16 -0
- package/dist/github/resolve-target-repo.d.mts.map +1 -0
- package/dist/github/resolve-target-repo.mjs +113 -0
- package/dist/github/resolve-target-repo.mjs.map +1 -0
- package/dist/github/ruleset/api/create-ruleset.d.mts.map +1 -1
- package/dist/github/ruleset/api/get-all-rulesets.d.mts.map +1 -1
- package/dist/github/ruleset/api/get-all-rulesets.mjs.map +1 -1
- package/dist/github/ruleset/api/get-ruleset.d.mts.map +1 -1
- package/dist/github/ruleset/api/update-ruleset.d.mts.map +1 -1
- package/dist/github/ruleset/apply.mjs.map +1 -1
- package/dist/github/ruleset/backup.d.mts.map +1 -1
- package/dist/github/ruleset/backup.mjs.map +1 -1
- package/dist/github/ruleset/constants.d.mts +752 -269
- package/dist/github/ruleset/constants.d.mts.map +1 -1
- package/dist/github/ruleset/constants.mjs +2 -1
- package/dist/github/ruleset/constants.mjs.map +1 -1
- package/dist/github/ruleset/read-rule-set-contents.mjs.map +1 -1
- package/dist/github/upgrade-stale-codec.d.mts +19 -0
- package/dist/github/upgrade-stale-codec.d.mts.map +1 -0
- package/dist/github/upgrade-stale-codec.mjs +20 -0
- package/dist/github/upgrade-stale-codec.mjs.map +1 -0
- package/dist/github/variables/api/create-repo-variable.d.mts.map +1 -1
- package/dist/github/variables/api/update-repo-variable.d.mts.map +1 -1
- package/dist/github/variables/apply.d.mts.map +1 -1
- package/dist/github/variables/apply.mjs +9 -6
- package/dist/github/variables/apply.mjs.map +1 -1
- package/package.json +53 -58
- package/src/cmd/repo-settings.mts +153 -0
- package/src/github/actions-settings/api/get-actions-settings.mts +38 -0
- package/src/github/actions-settings/api/index.mts +2 -0
- package/src/github/actions-settings/api/set-actions-settings.mts +39 -0
- package/src/github/actions-settings/apply.mts +63 -0
- package/src/github/actions-settings/backup.mts +36 -0
- package/src/github/actions-settings/constants.mts +50 -0
- package/src/github/actions-settings/index.mts +4 -0
- package/src/github/constants.mts +9 -42
- package/src/github/index.mts +4 -0
- package/src/github/octokit.mts +47 -3
- package/src/github/pages/api/get-pages-settings.mts +35 -0
- package/src/github/pages/api/index.mts +2 -0
- package/src/github/pages/api/set-pages-settings.mts +47 -0
- package/src/github/pages/apply.mts +73 -0
- package/src/github/pages/backup.mts +44 -0
- package/src/github/pages/constants.mts +16 -0
- package/src/github/pages/index.mts +4 -0
- package/src/github/repository/apply.mts +4 -7
- package/src/github/repository/backup.mts +2 -5
- package/src/github/repository/constants.mts +5 -1
- package/src/github/resolve-target-repo.mts +144 -0
- package/src/github/ruleset/api/get-all-rulesets.mts +3 -6
- package/src/github/ruleset/constants.mts +5 -1
- package/src/github/upgrade-stale-codec.mts +29 -0
- package/src/github/variables/apply.mts +9 -6
- package/dist/cmd/gh-apply-all.d.mts.map +0 -1
- package/dist/cmd/gh-apply-all.mjs +0 -10
- package/dist/cmd/gh-apply-all.mjs.map +0 -1
- package/dist/cmd/gh-backup-all.d.mts +0 -3
- package/dist/cmd/gh-backup-all.d.mts.map +0 -1
- package/dist/cmd/gh-backup-all.mjs +0 -9
- package/dist/cmd/gh-backup-all.mjs.map +0 -1
- package/src/cmd/gh-apply-all.mts +0 -18
- package/src/cmd/gh-backup-all.mts +0 -12
package/README.md
CHANGED
|
@@ -1,11 +1,62 @@
|
|
|
1
1
|
# Github Settings as Code
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
3
|
+
GitHub の repository 設定を JSON ファイルで管理するための CLI。
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
repo-settings <command> [target] [options]
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
| Command | 説明 |
|
|
12
|
+
| -------- | -------------------------------------------- |
|
|
13
|
+
| `apply` | ローカルの設定ファイルを GitHub に反映する |
|
|
14
|
+
| `backup` | GitHub の現在値をローカルの `bk/` に保存する |
|
|
15
|
+
|
|
16
|
+
| Target | 対応するファイル | `apply` | `backup` |
|
|
17
|
+
| ------------- | ------------------------------------------ | ------- | -------- |
|
|
18
|
+
| `all`(既定) | すべて | ✅ | ✅ |
|
|
19
|
+
| `repository` | `github/repository-settings/settings.json` | ✅ | ✅ |
|
|
20
|
+
| `rulesets` | `github/rulesets/*.json` | ✅ | ✅ |
|
|
21
|
+
| `variables` | repository variables | ✅ | — |
|
|
22
|
+
| `actions` | `github/actions-settings/settings.json` | ✅ | ✅ |
|
|
23
|
+
| `pages` | `github/pages/settings.json` | ✅ | ✅ |
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
repo-settings apply
|
|
27
|
+
repo-settings apply rulesets
|
|
28
|
+
repo-settings backup
|
|
29
|
+
repo-settings apply --owner noshiro-pf --repo ts-repo-utils
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## 対象 repository の解決
|
|
33
|
+
|
|
34
|
+
以下の順で決まる。通常は `git remote` から決まるため、どちらの指定も不要。
|
|
35
|
+
|
|
36
|
+
1. コマンドライン引数 `--owner` / `--repo`
|
|
37
|
+
2. 環境変数 `OWNER` / `REPO_NAME`
|
|
38
|
+
3. `git remote get-url origin`
|
|
39
|
+
4. `package.json` の `name`( repository 名のみ )
|
|
40
|
+
|
|
41
|
+
## 認証
|
|
42
|
+
|
|
43
|
+
以下の順で解決される。ローカルでは `gh auth login` 済みであれば設定不要。
|
|
44
|
+
|
|
45
|
+
1. 環境変数 `GITHUB_APP_TOKEN` / `GH_TOKEN` / `PERSONAL_ACCESS_TOKEN`
|
|
46
|
+
2. `gh auth token`( gh CLI のログイン情報 )
|
|
47
|
+
|
|
48
|
+
CI では GitHub App の installation token を `GH_TOKEN` に渡す。 repository
|
|
49
|
+
設定・ruleset の操作には **Administration** 権限が必要で、既定の `GITHUB_TOKEN`
|
|
50
|
+
では権限が足りない(`permissions:` に `administration` は存在しない)。
|
|
51
|
+
|
|
52
|
+
## 管理できる設定
|
|
53
|
+
|
|
54
|
+
| ファイル | GitHub 上の場所 |
|
|
55
|
+
| ------------------------------------------ | --------------------------------------- |
|
|
56
|
+
| `github/repository-settings/settings.json` | Settings > General |
|
|
57
|
+
| `github/rulesets/*.json` | Settings > Rules > Rulesets |
|
|
58
|
+
| `github/actions-settings/settings.json` | Settings > Actions > General |
|
|
59
|
+
| `github/pages/settings.json` | Settings > Pages > Build and deployment |
|
|
60
|
+
|
|
61
|
+
`github/pages/settings.json` を置いていない repository では Pages の操作を行わない
|
|
62
|
+
( Pages を使わない repository で誤って有効化しないため )。
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-settings.d.mts","sourceRoot":"","sources":["../../src/cmd/repo-settings.mts"],"names":[],"mappings":";AAEA,OAAO,eAAe,CAAC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import 'dotenv/config';
|
|
3
|
+
import * as util from 'node:util';
|
|
4
|
+
const HELP = `
|
|
5
|
+
Usage: repo-settings <command> [target] [options]
|
|
6
|
+
|
|
7
|
+
GitHub の repository 設定を JSON ファイルで管理する。
|
|
8
|
+
|
|
9
|
+
Commands:
|
|
10
|
+
apply [target] ローカルの設定ファイルを GitHub に反映する
|
|
11
|
+
backup [target] GitHub の現在値をローカルの bk/ に保存する
|
|
12
|
+
|
|
13
|
+
Targets:
|
|
14
|
+
all すべて(既定)
|
|
15
|
+
repository github/repository-settings/settings.json
|
|
16
|
+
rulesets github/rulesets/*.json
|
|
17
|
+
variables repository variables ( apply のみ )
|
|
18
|
+
actions github/actions-settings/settings.json
|
|
19
|
+
pages github/pages/settings.json
|
|
20
|
+
|
|
21
|
+
Options:
|
|
22
|
+
--owner <owner> 対象の owner
|
|
23
|
+
--repo <repo> 対象の repository 名
|
|
24
|
+
-h, --help このヘルプを表示する
|
|
25
|
+
|
|
26
|
+
owner / repo は「コマンドライン引数 → 環境変数 OWNER / REPO_NAME →
|
|
27
|
+
git remote origin → package.json の name 」の順で解決される。
|
|
28
|
+
通常は git remote から決まるため、どちらの指定も不要。
|
|
29
|
+
|
|
30
|
+
認証は「環境変数 GITHUB_APP_TOKEN / GH_TOKEN / PERSONAL_ACCESS_TOKEN →
|
|
31
|
+
gh CLI ( gh auth token )」の順で解決される。ローカルでは gh auth login
|
|
32
|
+
だけで動く。
|
|
33
|
+
|
|
34
|
+
Examples:
|
|
35
|
+
repo-settings apply
|
|
36
|
+
repo-settings apply rulesets
|
|
37
|
+
repo-settings backup
|
|
38
|
+
repo-settings apply --owner noshiro-pf --repo ts-repo-utils
|
|
39
|
+
`.trim();
|
|
40
|
+
const COMMANDS = ['apply', 'backup'];
|
|
41
|
+
const TARGETS = [
|
|
42
|
+
'all',
|
|
43
|
+
'repository',
|
|
44
|
+
'rulesets',
|
|
45
|
+
'variables',
|
|
46
|
+
'actions',
|
|
47
|
+
'pages',
|
|
48
|
+
];
|
|
49
|
+
const COMMAND_SET = new Set(COMMANDS);
|
|
50
|
+
const isCommand = (value) => COMMAND_SET.has(value);
|
|
51
|
+
const TARGET_SET = new Set(TARGETS);
|
|
52
|
+
const isTarget = (value) => TARGET_SET.has(value);
|
|
53
|
+
// NOTE: 明示的な型注釈を変数側に付けることで、呼び出し後に制御フローが到達
|
|
54
|
+
// しないことを TypeScript に認識させる( narrowing のために必要 )。
|
|
55
|
+
const fail = (message) => {
|
|
56
|
+
console.error(`❌ ${message}`);
|
|
57
|
+
console.error('');
|
|
58
|
+
console.error(HELP);
|
|
59
|
+
process.exit(1);
|
|
60
|
+
};
|
|
61
|
+
const { values, positionals } = util.parseArgs({
|
|
62
|
+
args: process.argv.slice(2),
|
|
63
|
+
options: {
|
|
64
|
+
owner: { type: 'string' },
|
|
65
|
+
repo: { type: 'string' },
|
|
66
|
+
help: { type: 'boolean', short: 'h', default: false },
|
|
67
|
+
},
|
|
68
|
+
strict: false,
|
|
69
|
+
allowPositionals: true,
|
|
70
|
+
});
|
|
71
|
+
if (values.help === true || positionals.length === 0) {
|
|
72
|
+
console.log(HELP);
|
|
73
|
+
process.exit(positionals.length === 0 ? 1 : 0);
|
|
74
|
+
}
|
|
75
|
+
const [commandArg, targetArg = 'all'] = positionals;
|
|
76
|
+
if (commandArg === undefined || !isCommand(commandArg)) {
|
|
77
|
+
fail(`Unknown command: "${commandArg ?? ''}"`);
|
|
78
|
+
}
|
|
79
|
+
if (!isTarget(targetArg)) {
|
|
80
|
+
fail(`Unknown target: "${targetArg}"`);
|
|
81
|
+
}
|
|
82
|
+
// NOTE: ここで初めて設定モジュールを読み込む。 owner / repo の解決は import 時に
|
|
83
|
+
// 走るため、 --help や引数エラーの時点では評価させたくない。
|
|
84
|
+
const github = await import('../github/index.mjs');
|
|
85
|
+
const runners = {
|
|
86
|
+
apply: {
|
|
87
|
+
all: async () => {
|
|
88
|
+
await github.applyVariables();
|
|
89
|
+
await github.applyRulesets();
|
|
90
|
+
await github.applyRepositorySettings();
|
|
91
|
+
await github.applyActionsSettings();
|
|
92
|
+
await github.applyPagesSettings();
|
|
93
|
+
},
|
|
94
|
+
repository: github.applyRepositorySettings,
|
|
95
|
+
rulesets: github.applyRulesets,
|
|
96
|
+
variables: github.applyVariables,
|
|
97
|
+
actions: github.applyActionsSettings,
|
|
98
|
+
pages: github.applyPagesSettings,
|
|
99
|
+
},
|
|
100
|
+
backup: {
|
|
101
|
+
all: async () => {
|
|
102
|
+
await github.backupRulesets();
|
|
103
|
+
await github.backupRepositorySettings();
|
|
104
|
+
await github.backupActionsSettings();
|
|
105
|
+
await github.backupPagesSettings();
|
|
106
|
+
},
|
|
107
|
+
repository: github.backupRepositorySettings,
|
|
108
|
+
rulesets: github.backupRulesets,
|
|
109
|
+
actions: github.backupActionsSettings,
|
|
110
|
+
pages: github.backupPagesSettings,
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
const runner = runners[commandArg][targetArg];
|
|
114
|
+
if (runner === undefined) {
|
|
115
|
+
fail(`"${commandArg}" does not support the target "${targetArg}"`);
|
|
116
|
+
}
|
|
117
|
+
await runner();
|
|
118
|
+
//# sourceMappingURL=repo-settings.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-settings.mjs","sourceRoot":"","sources":["../../src/cmd/repo-settings.mts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ActionsSettings } from '../constants.mjs';
|
|
2
|
+
/**
|
|
3
|
+
* Settings > Actions > General の現在値を取得する。
|
|
4
|
+
*
|
|
5
|
+
* 2 つのエンドポイントの結果を 1 つのオブジェクトにまとめる。
|
|
6
|
+
*/
|
|
7
|
+
export declare const getActionsSettings: () => Promise<ActionsSettings>;
|
|
8
|
+
//# sourceMappingURL=get-actions-settings.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-actions-settings.d.mts","sourceRoot":"","sources":["../../../../src/github/actions-settings/api/get-actions-settings.mts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,QAAa,OAAO,CAAC,eAAe,CA2BlE,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { octokitHeaders, OWNER, REPO } from '../../constants.mjs';
|
|
2
|
+
import { octokit } from '../../octokit.mjs';
|
|
3
|
+
import { ActionsSettings } from '../constants.mjs';
|
|
4
|
+
/**
|
|
5
|
+
* Settings > Actions > General の現在値を取得する。
|
|
6
|
+
*
|
|
7
|
+
* 2 つのエンドポイントの結果を 1 つのオブジェクトにまとめる。
|
|
8
|
+
*/
|
|
9
|
+
export const getActionsSettings = async () => {
|
|
10
|
+
// https://docs.github.com/rest/actions/permissions#get-github-actions-permissions-for-a-repository
|
|
11
|
+
const permissions = await octokit.request('GET /repos/{owner}/{repo}/actions/permissions', { owner: OWNER, repo: REPO, headers: octokitHeaders });
|
|
12
|
+
// https://docs.github.com/rest/actions/permissions#get-fork-pr-contributor-approval-permissions-for-a-repository
|
|
13
|
+
const forkPrApproval = await octokit.request('GET /repos/{owner}/{repo}/actions/permissions/fork-pr-contributor-approval', { owner: OWNER, repo: REPO, headers: octokitHeaders });
|
|
14
|
+
// sha_pinning_required は @octokit/types v16 の型に無いため、レスポンスから
|
|
15
|
+
// 直接読まずに validate 側の既定値へフォールバックさせる。
|
|
16
|
+
const shaPinningRequired = permissions.data['sha_pinning_required'];
|
|
17
|
+
// eslint-disable-next-line unicorn/no-array-fill-with-reference-type
|
|
18
|
+
return ActionsSettings.fill({
|
|
19
|
+
enabled: permissions.data.enabled,
|
|
20
|
+
allowed_actions: permissions.data.allowed_actions,
|
|
21
|
+
sha_pinning_required: typeof shaPinningRequired === 'boolean' ? shaPinningRequired : undefined,
|
|
22
|
+
fork_pr_contributor_approval_policy: forkPrApproval.data.approval_policy,
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=get-actions-settings.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-actions-settings.mjs","sourceRoot":"","sources":["../../../../src/github/actions-settings/api/get-actions-settings.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,IAA8B,EAAE;IACrE,mGAAmG;IACnG,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,OAAO,CACvC,+CAAsE,EACtE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,CACtD,CAAC;IAEF,iHAAiH;IACjH,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,OAAO,CAC1C,4EAAmG,EACnG,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,CACtD,CAAC;IAEF,4DAA4D;IAC5D,oCAAoC;IACpC,MAAM,kBAAkB,GACtB,WAAW,CAAC,IACb,CAAC,sBAAsB,CAAC,CAAC;IAE1B,qEAAqE;IACrE,OAAO,eAAe,CAAC,IAAI,CAAC;QAC1B,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,OAAO;QACjC,eAAe,EAAE,WAAW,CAAC,IAAI,CAAC,eAAe;QACjD,oBAAoB,EAClB,OAAO,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS;QAC1E,mCAAmC,EAAE,cAAc,CAAC,IAAI,CAAC,eAAe;KACzE,CAAC,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../../src/github/actions-settings/api/index.mts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../../src/github/actions-settings/api/index.mts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-actions-settings.d.mts","sourceRoot":"","sources":["../../../../src/github/actions-settings/api/set-actions-settings.mts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,oDAAoD;AACpD,eAAO,MAAM,kBAAkB,aACnB,eAAe,KACxB,OAAO,CAAC,IAAI,CA8Bd,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { octokitHeaders, OWNER, REPO } from '../../constants.mjs';
|
|
2
|
+
import { octokit } from '../../octokit.mjs';
|
|
3
|
+
/** Settings > Actions > General を JSON の内容に合わせる。 */
|
|
4
|
+
export const setActionsSettings = async (settings) => {
|
|
5
|
+
// https://docs.github.com/rest/actions/permissions#set-github-actions-permissions-for-a-repository
|
|
6
|
+
//
|
|
7
|
+
// NOTE: sha_pinning_required は @octokit/types v16 の型定義にまだ無い。 API は
|
|
8
|
+
// 受け付けるので、いったん変数に束縛して渡している(オブジェクトリテラルを直接
|
|
9
|
+
// 渡すと excess property check に引っかかるため)。型が追随したら不要になる。
|
|
10
|
+
const permissionsParams = {
|
|
11
|
+
owner: OWNER,
|
|
12
|
+
repo: REPO,
|
|
13
|
+
headers: octokitHeaders,
|
|
14
|
+
enabled: settings.enabled,
|
|
15
|
+
allowed_actions: settings.allowed_actions,
|
|
16
|
+
sha_pinning_required: settings.sha_pinning_required,
|
|
17
|
+
};
|
|
18
|
+
await octokit.request('PUT /repos/{owner}/{repo}/actions/permissions', permissionsParams);
|
|
19
|
+
// https://docs.github.com/rest/actions/permissions#set-fork-pr-contributor-approval-permissions-for-a-repository
|
|
20
|
+
await octokit.request('PUT /repos/{owner}/{repo}/actions/permissions/fork-pr-contributor-approval', {
|
|
21
|
+
owner: OWNER,
|
|
22
|
+
repo: REPO,
|
|
23
|
+
headers: octokitHeaders,
|
|
24
|
+
approval_policy: settings.fork_pr_contributor_approval_policy,
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=set-actions-settings.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-actions-settings.mjs","sourceRoot":"","sources":["../../../../src/github/actions-settings/api/set-actions-settings.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAG5C,oDAAoD;AACpD,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EACrC,QAAyB,EACV,EAAE;IACjB,mGAAmG;IACnG,EAAE;IACF,mEAAmE;IACnE,yCAAyC;IACzC,oDAAoD;IACpD,MAAM,iBAAiB,GAAG;QACxB,KAAK,EAAE,KAAK;QACZ,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,cAAc;QACvB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,eAAe,EAAE,QAAQ,CAAC,eAAe;QACzC,oBAAoB,EAAE,QAAQ,CAAC,oBAAoB;KAC3C,CAAC;IAEX,MAAM,OAAO,CAAC,OAAO,CACnB,+CAAsE,EACtE,iBAAiB,CAClB,CAAC;IAEF,iHAAiH;IACjH,MAAM,OAAO,CAAC,OAAO,CACnB,4EAAmG,EACnG;QACE,KAAK,EAAE,KAAK;QACZ,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,cAAc;QACvB,eAAe,EAAE,QAAQ,CAAC,mCAAmC;KAC9D,CACF,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.d.mts","sourceRoot":"","sources":["../../../src/github/actions-settings/apply.mts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AAcvB,oFAAoF;AACpF,eAAO,MAAM,oBAAoB,QAAa,OAAO,CAAC,IAAI,CAwBzD,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import 'dotenv/config';
|
|
3
|
+
import * as fs from 'node:fs/promises';
|
|
4
|
+
import * as path from 'node:path';
|
|
5
|
+
import { validationErrorsToMessages } from 'ts-fortress';
|
|
6
|
+
import { formatUncommittedFiles, isDirectlyExecuted, Result, } from 'ts-repo-utils';
|
|
7
|
+
import { actionsSettingsDir, settingsJsonName } from '../constants.mjs';
|
|
8
|
+
import { getActionsSettings, setActionsSettings } from './api/index.mjs';
|
|
9
|
+
import { backupActionsSettings } from './backup.mjs';
|
|
10
|
+
import { ActionsSettings } from './constants.mjs';
|
|
11
|
+
/** `github/actions-settings/settings.json` を Settings > Actions > General に反映する。 */
|
|
12
|
+
export const applyActionsSettings = async () => {
|
|
13
|
+
await backupActionsSettings(false);
|
|
14
|
+
const settings = await readSettings();
|
|
15
|
+
await setActionsSettings(settings);
|
|
16
|
+
// 反映後の実際の値でローカルのファイルを更新する
|
|
17
|
+
{
|
|
18
|
+
const applied = await getActionsSettings();
|
|
19
|
+
const str = JSON.stringify(applied, undefined, 2);
|
|
20
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
|
21
|
+
await fs.writeFile(path.resolve(actionsSettingsDir, settingsJsonName), str);
|
|
22
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
|
23
|
+
await fs.writeFile(path.resolve(actionsSettingsDir, 'bk', settingsJsonName), str);
|
|
24
|
+
await formatUncommittedFiles();
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
const readSettings = async () => {
|
|
28
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
|
29
|
+
const settingsText = await fs.readFile(path.resolve(actionsSettingsDir, settingsJsonName), { encoding: 'utf8' });
|
|
30
|
+
const validationResult = ActionsSettings.validate(JSON.parse(settingsText));
|
|
31
|
+
if (Result.isErr(validationResult)) {
|
|
32
|
+
throw new Error(validationErrorsToMessages(validationResult.value).join('\n'));
|
|
33
|
+
}
|
|
34
|
+
return validationResult.value;
|
|
35
|
+
};
|
|
36
|
+
if (isDirectlyExecuted(import.meta.url)) {
|
|
37
|
+
await applyActionsSettings();
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=apply.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.mjs","sourceRoot":"","sources":["../../../src/github/actions-settings/apply.mts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,MAAM,GACP,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,oFAAoF;AACpF,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,IAAmB,EAAE;IAC5D,MAAM,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAEnC,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;IAEtC,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAEnC,0BAA0B;IAC1B,CAAC;QACC,MAAM,OAAO,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAE3C,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAElD,mEAAmE;QACnE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,EAAE,GAAG,CAAC,CAAC;QAE5E,mEAAmE;QACnE,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,IAAI,EAAE,gBAAgB,CAAC,EACxD,GAAG,CACJ,CAAC;QAEF,MAAM,sBAAsB,EAAE,CAAC;IACjC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,KAAK,IAA8B,EAAE;IACxD,mEAAmE;IACnE,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,QAAQ,CACpC,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,EAClD,EAAE,QAAQ,EAAE,MAAM,EAAE,CACrB,CAAC;IAEF,MAAM,gBAAgB,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;IAE5E,IAAI,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,0BAA0B,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC9D,CAAC;IACJ,CAAC;IAED,OAAO,gBAAgB,CAAC,KAAK,CAAC;AAChC,CAAC,CAAC;AAEF,IAAI,kBAAkB,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACxC,MAAM,oBAAoB,EAAE,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.d.mts","sourceRoot":"","sources":["../../../src/github/actions-settings/backup.mts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AAavB,sDAAsD;AACtD,eAAO,MAAM,qBAAqB,SAC3B,OAAO,KACX,OAAO,CAAC,IAAI,CAcd,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import 'dotenv/config';
|
|
3
|
+
import * as fs from 'node:fs/promises';
|
|
4
|
+
import * as path from 'node:path';
|
|
5
|
+
import { formatUncommittedFiles, isDirectlyExecuted, makeEmptyDir, } from 'ts-repo-utils';
|
|
6
|
+
import { actionsSettingsDir, settingsJsonName } from '../constants.mjs';
|
|
7
|
+
import { getActionsSettings } from './api/index.mjs';
|
|
8
|
+
const backupDir = path.resolve(actionsSettingsDir, './bk');
|
|
9
|
+
/** Settings > Actions > General の現在値を `bk/` に保存する。 */
|
|
10
|
+
export const backupActionsSettings = async (fmt = true) => {
|
|
11
|
+
await makeEmptyDir(backupDir);
|
|
12
|
+
const settings = await getActionsSettings();
|
|
13
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
|
14
|
+
await fs.writeFile(path.resolve(backupDir, settingsJsonName), JSON.stringify(settings, undefined, 2));
|
|
15
|
+
if (fmt) {
|
|
16
|
+
await formatUncommittedFiles();
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
if (isDirectlyExecuted(import.meta.url)) {
|
|
20
|
+
await backupActionsSettings();
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=backup.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.mjs","sourceRoot":"","sources":["../../../src/github/actions-settings/backup.mts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,YAAY,GACb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AAE3D,sDAAsD;AACtD,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EACxC,GAAG,GAAY,IAAI,EACJ,EAAE;IACjB,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;IAE9B,MAAM,QAAQ,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAE5C,mEAAmE;IACnE,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,gBAAgB,CAAC,EACzC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,CACvC,CAAC;IAEF,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,sBAAsB,EAAE,CAAC;IACjC,CAAC;AACH,CAAC,CAAC;AAEF,IAAI,kBAAkB,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACxC,MAAM,qBAAqB,EAAE,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import * as t from 'ts-fortress';
|
|
2
|
+
/**
|
|
3
|
+
* `github/actions-settings/settings.json` の型。
|
|
4
|
+
*
|
|
5
|
+
* Settings > Actions > General に対応する。 2 つの API をまとめて 1 ファイルで
|
|
6
|
+
* 管理する:
|
|
7
|
+
*
|
|
8
|
+
* - `GET|PUT /repos/{owner}/{repo}/actions/permissions`
|
|
9
|
+
* - `GET|PUT /repos/{owner}/{repo}/actions/permissions/fork-pr-contributor-approval`
|
|
10
|
+
*/
|
|
11
|
+
export declare const ActionsSettings: Readonly<{
|
|
12
|
+
typeName: string;
|
|
13
|
+
defaultValue: Readonly<{
|
|
14
|
+
allowed_actions: "all" | "local_only" | "selected";
|
|
15
|
+
enabled: boolean;
|
|
16
|
+
fork_pr_contributor_approval_policy: "all_external_contributors" | "first_time_contributors" | "first_time_contributors_new_to_github";
|
|
17
|
+
sha_pinning_required: boolean;
|
|
18
|
+
}>;
|
|
19
|
+
is: (a: unknown) => a is Readonly<{
|
|
20
|
+
allowed_actions: "all" | "local_only" | "selected";
|
|
21
|
+
enabled: boolean;
|
|
22
|
+
fork_pr_contributor_approval_policy: "all_external_contributors" | "first_time_contributors" | "first_time_contributors_new_to_github";
|
|
23
|
+
sha_pinning_required: boolean;
|
|
24
|
+
}>;
|
|
25
|
+
assertIs: (a: unknown) => asserts a is Readonly<{
|
|
26
|
+
allowed_actions: "all" | "local_only" | "selected";
|
|
27
|
+
enabled: boolean;
|
|
28
|
+
fork_pr_contributor_approval_policy: "all_external_contributors" | "first_time_contributors" | "first_time_contributors_new_to_github";
|
|
29
|
+
sha_pinning_required: boolean;
|
|
30
|
+
}>;
|
|
31
|
+
cast: (a: unknown) => Readonly<{
|
|
32
|
+
allowed_actions: "all" | "local_only" | "selected";
|
|
33
|
+
enabled: boolean;
|
|
34
|
+
fork_pr_contributor_approval_policy: "all_external_contributors" | "first_time_contributors" | "first_time_contributors_new_to_github";
|
|
35
|
+
sha_pinning_required: boolean;
|
|
36
|
+
}>;
|
|
37
|
+
fill: (a: unknown) => Readonly<{
|
|
38
|
+
allowed_actions: "all" | "local_only" | "selected";
|
|
39
|
+
enabled: boolean;
|
|
40
|
+
fork_pr_contributor_approval_policy: "all_external_contributors" | "first_time_contributors" | "first_time_contributors_new_to_github";
|
|
41
|
+
sha_pinning_required: boolean;
|
|
42
|
+
}>;
|
|
43
|
+
prune: <B extends Readonly<{
|
|
44
|
+
allowed_actions: "all" | "local_only" | "selected";
|
|
45
|
+
enabled: boolean;
|
|
46
|
+
fork_pr_contributor_approval_policy: "all_external_contributors" | "first_time_contributors" | "first_time_contributors_new_to_github";
|
|
47
|
+
sha_pinning_required: boolean;
|
|
48
|
+
}>>(a: B) => Readonly<{
|
|
49
|
+
allowed_actions: "all" | "local_only" | "selected";
|
|
50
|
+
enabled: boolean;
|
|
51
|
+
fork_pr_contributor_approval_policy: "all_external_contributors" | "first_time_contributors" | "first_time_contributors_new_to_github";
|
|
52
|
+
sha_pinning_required: boolean;
|
|
53
|
+
}>;
|
|
54
|
+
validate: (a: unknown) => t.Result<Readonly<{
|
|
55
|
+
allowed_actions: "all" | "local_only" | "selected";
|
|
56
|
+
enabled: boolean;
|
|
57
|
+
fork_pr_contributor_approval_policy: "all_external_contributors" | "first_time_contributors" | "first_time_contributors_new_to_github";
|
|
58
|
+
sha_pinning_required: boolean;
|
|
59
|
+
}>, readonly Readonly<{
|
|
60
|
+
path: readonly string[];
|
|
61
|
+
actualValue: unknown;
|
|
62
|
+
expectedType: string;
|
|
63
|
+
typeName: string;
|
|
64
|
+
details?: t.ValidationErrorDetails | undefined;
|
|
65
|
+
}>[]>;
|
|
66
|
+
optional?: true;
|
|
67
|
+
}>;
|
|
68
|
+
export type ActionsSettings = t.TypeOf<typeof ActionsSettings>;
|
|
69
|
+
//# sourceMappingURL=constants.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.mts","sourceRoot":"","sources":["../../../src/github/actions-settings/constants.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,aAAa,CAAC;AAEjC;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoC1B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import * as t from 'ts-fortress';
|
|
2
|
+
/**
|
|
3
|
+
* `github/actions-settings/settings.json` の型。
|
|
4
|
+
*
|
|
5
|
+
* Settings > Actions > General に対応する。 2 つの API をまとめて 1 ファイルで
|
|
6
|
+
* 管理する:
|
|
7
|
+
*
|
|
8
|
+
* - `GET|PUT /repos/{owner}/{repo}/actions/permissions`
|
|
9
|
+
* - `GET|PUT /repos/{owner}/{repo}/actions/permissions/fork-pr-contributor-approval`
|
|
10
|
+
*/
|
|
11
|
+
export const ActionsSettings = t.record({
|
|
12
|
+
/** Actions permissions: この repository で Actions を有効にするか。 */
|
|
13
|
+
enabled: t.boolean(true),
|
|
14
|
+
/** Actions permissions: 実行を許可する action の範囲。 */
|
|
15
|
+
allowed_actions: t.enumType(['all', 'local_only', 'selected'], {
|
|
16
|
+
typeName: 'AllowedActions',
|
|
17
|
+
defaultValue: 'all',
|
|
18
|
+
}),
|
|
19
|
+
/**
|
|
20
|
+
* 「 Require actions to be pinned to a full-length commit SHA 」。
|
|
21
|
+
*
|
|
22
|
+
* NOTE: @octokit/types v16 時点でこのフィールドは型定義に入っていないため、
|
|
23
|
+
* リクエスト時にのみ手当てしている( set-actions-permissions.mts 参照)。
|
|
24
|
+
*/
|
|
25
|
+
sha_pinning_required: t.boolean(false),
|
|
26
|
+
/**
|
|
27
|
+
* 「 Approval for running fork pull request workflows from contributors 」。
|
|
28
|
+
*
|
|
29
|
+
* - `first_time_contributors_new_to_github`: GitHub 自体に不慣れな初回貢献者のみ承認必須
|
|
30
|
+
* - `first_time_contributors`: この repository への初回貢献者のみ承認必須
|
|
31
|
+
* - `all_external_contributors`: 外部貢献者すべてに承認必須
|
|
32
|
+
*/
|
|
33
|
+
fork_pr_contributor_approval_policy: t.enumType([
|
|
34
|
+
'first_time_contributors_new_to_github',
|
|
35
|
+
'first_time_contributors',
|
|
36
|
+
'all_external_contributors',
|
|
37
|
+
], {
|
|
38
|
+
typeName: 'ForkPrContributorApprovalPolicy',
|
|
39
|
+
defaultValue: 'all_external_contributors',
|
|
40
|
+
}),
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=constants.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.mjs","sourceRoot":"","sources":["../../../src/github/actions-settings/constants.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,aAAa,CAAC;AAEjC;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,4DAA4D;IAC5D,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IAExB,+CAA+C;IAC/C,eAAe,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE;QAC7D,QAAQ,EAAE,gBAAgB;QAC1B,YAAY,EAAE,KAAK;KACpB,CAAC;IAEF;;;;;OAKG;IACH,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAEtC;;;;;;OAMG;IACH,mCAAmC,EAAE,CAAC,CAAC,QAAQ,CAC7C;QACE,uCAAuC;QACvC,yBAAyB;QACzB,2BAA2B;KAC5B,EACD;QACE,QAAQ,EAAE,iCAAiC;QAC3C,YAAY,EAAE,2BAA2B;KAC1C,CACF;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../src/github/actions-settings/index.mts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../src/github/actions-settings/index.mts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
export declare const OWNER: string;
|
|
2
2
|
export declare const REPO: string;
|
|
3
|
+
export declare const settingsJsonName = "settings.json";
|
|
3
4
|
export declare const repositorySettingsDir: string;
|
|
4
|
-
export declare const
|
|
5
|
+
export declare const actionsSettingsDir: string;
|
|
6
|
+
export declare const pagesSettingsDir: string;
|
|
5
7
|
export declare const rulesetsDir: string;
|
|
6
8
|
export declare const octokitHeaders: {
|
|
7
|
-
readonly 'X-GitHub-Api-Version':
|
|
9
|
+
readonly 'X-GitHub-Api-Version': '2022-11-28';
|
|
8
10
|
};
|
|
9
11
|
//# sourceMappingURL=constants.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.mts","sourceRoot":"","sources":["../../src/github/constants.mts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"constants.d.mts","sourceRoot":"","sources":["../../src/github/constants.mts"],"names":[],"mappings":"AAKA,eAAO,MAAM,KAAK,EAAE,MAAyB,CAAC;AAE9C,eAAO,MAAM,IAAI,EAAE,MAAwB,CAAC;AAI5C,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AAEhD,eAAO,MAAM,qBAAqB,QAGjC,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAgD,CAAC;AAEhF,eAAO,MAAM,gBAAgB,QAAqC,CAAC;AAEnE,eAAO,MAAM,WAAW,QAAwC,CAAC;AAEjE,eAAO,MAAM,cAAc;aACzB,sBAAsB,EAAE,YAAY;CAC5B,CAAC"}
|
|
@@ -1,37 +1,13 @@
|
|
|
1
|
-
import * as fs from 'node:fs/promises';
|
|
2
1
|
import * as path from 'node:path';
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
throw new Error('OWNER env var is not set');
|
|
8
|
-
}
|
|
9
|
-
export const OWNER = ownerNullable;
|
|
10
|
-
const getRepoName = async () => {
|
|
11
|
-
const repoNameEnv = process.env['REPO_NAME'];
|
|
12
|
-
if (repoNameEnv !== undefined) {
|
|
13
|
-
return repoNameEnv;
|
|
14
|
-
}
|
|
15
|
-
const packageJsonPath = path.resolve(process.cwd(), './package.json');
|
|
16
|
-
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
|
17
|
-
const packageJsonStr = await fs.readFile(packageJsonPath, {
|
|
18
|
-
encoding: 'utf8',
|
|
19
|
-
});
|
|
20
|
-
const packageJson = Json.parse(packageJsonStr);
|
|
21
|
-
if (Result.isErr(packageJson)) {
|
|
22
|
-
throw new Error(packageJson.value);
|
|
23
|
-
}
|
|
24
|
-
if (!isRecord(packageJson.value) ||
|
|
25
|
-
!hasKey(packageJson.value, 'name') ||
|
|
26
|
-
!isString(packageJson.value.name)) {
|
|
27
|
-
throw new Error('package.json not parsed correctly');
|
|
28
|
-
}
|
|
29
|
-
return packageJson.value.name;
|
|
30
|
-
};
|
|
31
|
-
export const REPO = await getRepoName();
|
|
2
|
+
import { resolveTargetRepo } from './resolve-target-repo.mjs';
|
|
3
|
+
const targetRepo = await resolveTargetRepo();
|
|
4
|
+
export const OWNER = targetRepo.owner;
|
|
5
|
+
export const REPO = targetRepo.repo;
|
|
32
6
|
const githubDir = path.resolve(process.cwd(), './github');
|
|
7
|
+
export const settingsJsonName = 'settings.json';
|
|
33
8
|
export const repositorySettingsDir = path.resolve(githubDir, './repository-settings');
|
|
34
|
-
export const
|
|
9
|
+
export const actionsSettingsDir = path.resolve(githubDir, './actions-settings');
|
|
10
|
+
export const pagesSettingsDir = path.resolve(githubDir, './pages');
|
|
35
11
|
export const rulesetsDir = path.resolve(githubDir, './rulesets');
|
|
36
12
|
export const octokitHeaders = {
|
|
37
13
|
'X-GitHub-Api-Version': '2022-11-28',
|