github-settings-as-code 1.2.10 → 2.0.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.
Files changed (135) hide show
  1. package/README.md +60 -9
  2. package/dist/cmd/{gh-apply-all.d.mts → repo-settings.d.mts} +1 -1
  3. package/dist/cmd/repo-settings.d.mts.map +1 -0
  4. package/dist/cmd/repo-settings.mjs +118 -0
  5. package/dist/cmd/repo-settings.mjs.map +1 -0
  6. package/dist/github/actions-settings/api/get-actions-settings.d.mts +8 -0
  7. package/dist/github/actions-settings/api/get-actions-settings.d.mts.map +1 -0
  8. package/dist/github/actions-settings/api/get-actions-settings.mjs +25 -0
  9. package/dist/github/actions-settings/api/get-actions-settings.mjs.map +1 -0
  10. package/dist/github/actions-settings/api/index.d.mts +3 -0
  11. package/dist/github/actions-settings/api/index.d.mts.map +1 -0
  12. package/dist/github/actions-settings/api/index.mjs +3 -0
  13. package/dist/github/actions-settings/api/index.mjs.map +1 -0
  14. package/dist/github/actions-settings/api/set-actions-settings.d.mts +4 -0
  15. package/dist/github/actions-settings/api/set-actions-settings.d.mts.map +1 -0
  16. package/dist/github/actions-settings/api/set-actions-settings.mjs +27 -0
  17. package/dist/github/actions-settings/api/set-actions-settings.mjs.map +1 -0
  18. package/dist/github/actions-settings/apply.d.mts +5 -0
  19. package/dist/github/actions-settings/apply.d.mts.map +1 -0
  20. package/dist/github/actions-settings/apply.mjs +39 -0
  21. package/dist/github/actions-settings/apply.mjs.map +1 -0
  22. package/dist/github/actions-settings/backup.d.mts +5 -0
  23. package/dist/github/actions-settings/backup.d.mts.map +1 -0
  24. package/dist/github/actions-settings/backup.mjs +22 -0
  25. package/dist/github/actions-settings/backup.mjs.map +1 -0
  26. package/dist/github/actions-settings/constants.d.mts +69 -0
  27. package/dist/github/actions-settings/constants.d.mts.map +1 -0
  28. package/dist/github/actions-settings/constants.mjs +42 -0
  29. package/dist/github/actions-settings/constants.mjs.map +1 -0
  30. package/dist/github/actions-settings/index.d.mts +5 -0
  31. package/dist/github/actions-settings/index.d.mts.map +1 -0
  32. package/dist/github/actions-settings/index.mjs +5 -0
  33. package/dist/github/actions-settings/index.mjs.map +1 -0
  34. package/dist/github/constants.d.mts +3 -1
  35. package/dist/github/constants.d.mts.map +1 -1
  36. package/dist/github/constants.mjs +7 -31
  37. package/dist/github/constants.mjs.map +1 -1
  38. package/dist/github/index.d.mts +4 -0
  39. package/dist/github/index.d.mts.map +1 -1
  40. package/dist/github/index.mjs +4 -0
  41. package/dist/github/index.mjs.map +1 -1
  42. package/dist/github/octokit.d.mts.map +1 -1
  43. package/dist/github/octokit.mjs +39 -3
  44. package/dist/github/octokit.mjs.map +1 -1
  45. package/dist/github/pages/api/get-pages-settings.d.mts +8 -0
  46. package/dist/github/pages/api/get-pages-settings.d.mts.map +1 -0
  47. package/dist/github/pages/api/get-pages-settings.mjs +26 -0
  48. package/dist/github/pages/api/get-pages-settings.mjs.map +1 -0
  49. package/dist/github/pages/api/index.d.mts +3 -0
  50. package/dist/github/pages/api/index.d.mts.map +1 -0
  51. package/dist/github/pages/api/index.mjs +3 -0
  52. package/dist/github/pages/api/index.mjs.map +1 -0
  53. package/dist/github/pages/api/set-pages-settings.d.mts +9 -0
  54. package/dist/github/pages/api/set-pages-settings.d.mts.map +1 -0
  55. package/dist/github/pages/api/set-pages-settings.mjs +33 -0
  56. package/dist/github/pages/api/set-pages-settings.mjs.map +1 -0
  57. package/dist/github/pages/apply.d.mts +10 -0
  58. package/dist/github/pages/apply.d.mts.map +1 -0
  59. package/dist/github/pages/apply.mjs +49 -0
  60. package/dist/github/pages/apply.mjs.map +1 -0
  61. package/dist/github/pages/backup.d.mts +5 -0
  62. package/dist/github/pages/backup.d.mts.map +1 -0
  63. package/dist/github/pages/backup.mjs +26 -0
  64. package/dist/github/pages/backup.mjs.map +1 -0
  65. package/dist/github/pages/constants.d.mts +42 -0
  66. package/dist/github/pages/constants.d.mts.map +1 -0
  67. package/dist/github/pages/constants.mjs +14 -0
  68. package/dist/github/pages/constants.mjs.map +1 -0
  69. package/dist/github/pages/index.d.mts +5 -0
  70. package/dist/github/pages/index.d.mts.map +1 -0
  71. package/dist/github/pages/index.mjs +5 -0
  72. package/dist/github/pages/index.mjs.map +1 -0
  73. package/dist/github/repository/apply.d.mts.map +1 -1
  74. package/dist/github/repository/apply.mjs +4 -4
  75. package/dist/github/repository/apply.mjs.map +1 -1
  76. package/dist/github/repository/backup.d.mts.map +1 -1
  77. package/dist/github/repository/backup.mjs +2 -2
  78. package/dist/github/repository/backup.mjs.map +1 -1
  79. package/dist/github/repository/constants.d.mts +3259 -2024
  80. package/dist/github/repository/constants.d.mts.map +1 -1
  81. package/dist/github/repository/constants.mjs +2 -1
  82. package/dist/github/repository/constants.mjs.map +1 -1
  83. package/dist/github/resolve-target-repo.d.mts +16 -0
  84. package/dist/github/resolve-target-repo.d.mts.map +1 -0
  85. package/dist/github/resolve-target-repo.mjs +113 -0
  86. package/dist/github/resolve-target-repo.mjs.map +1 -0
  87. package/dist/github/ruleset/api/get-all-rulesets.d.mts.map +1 -1
  88. package/dist/github/ruleset/api/get-all-rulesets.mjs.map +1 -1
  89. package/dist/github/ruleset/constants.d.mts +750 -267
  90. package/dist/github/ruleset/constants.d.mts.map +1 -1
  91. package/dist/github/ruleset/constants.mjs +2 -1
  92. package/dist/github/ruleset/constants.mjs.map +1 -1
  93. package/dist/github/upgrade-stale-codec.d.mts +19 -0
  94. package/dist/github/upgrade-stale-codec.d.mts.map +1 -0
  95. package/dist/github/upgrade-stale-codec.mjs +20 -0
  96. package/dist/github/upgrade-stale-codec.mjs.map +1 -0
  97. package/dist/github/variables/apply.d.mts.map +1 -1
  98. package/dist/github/variables/apply.mjs +17 -6
  99. package/dist/github/variables/apply.mjs.map +1 -1
  100. package/package.json +41 -50
  101. package/src/cmd/repo-settings.mts +153 -0
  102. package/src/github/actions-settings/api/get-actions-settings.mts +38 -0
  103. package/src/github/actions-settings/api/index.mts +2 -0
  104. package/src/github/actions-settings/api/set-actions-settings.mts +39 -0
  105. package/src/github/actions-settings/apply.mts +63 -0
  106. package/src/github/actions-settings/backup.mts +36 -0
  107. package/src/github/actions-settings/constants.mts +50 -0
  108. package/src/github/actions-settings/index.mts +4 -0
  109. package/src/github/constants.mts +9 -42
  110. package/src/github/index.mts +4 -0
  111. package/src/github/octokit.mts +47 -3
  112. package/src/github/pages/api/get-pages-settings.mts +35 -0
  113. package/src/github/pages/api/index.mts +2 -0
  114. package/src/github/pages/api/set-pages-settings.mts +47 -0
  115. package/src/github/pages/apply.mts +73 -0
  116. package/src/github/pages/backup.mts +44 -0
  117. package/src/github/pages/constants.mts +16 -0
  118. package/src/github/pages/index.mts +4 -0
  119. package/src/github/repository/apply.mts +4 -7
  120. package/src/github/repository/backup.mts +2 -5
  121. package/src/github/repository/constants.mts +5 -1
  122. package/src/github/resolve-target-repo.mts +144 -0
  123. package/src/github/ruleset/api/get-all-rulesets.mts +3 -6
  124. package/src/github/ruleset/constants.mts +5 -1
  125. package/src/github/upgrade-stale-codec.mts +29 -0
  126. package/src/github/variables/apply.mts +17 -6
  127. package/dist/cmd/gh-apply-all.d.mts.map +0 -1
  128. package/dist/cmd/gh-apply-all.mjs +0 -10
  129. package/dist/cmd/gh-apply-all.mjs.map +0 -1
  130. package/dist/cmd/gh-backup-all.d.mts +0 -3
  131. package/dist/cmd/gh-backup-all.d.mts.map +0 -1
  132. package/dist/cmd/gh-backup-all.mjs +0 -9
  133. package/dist/cmd/gh-backup-all.mjs.map +0 -1
  134. package/src/cmd/gh-apply-all.mts +0 -18
  135. 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
- Commands to provide:
4
-
5
- - `gh:apply-all`
6
- - `gh:apply-repository-settings`
7
- - `gh:apply-rulesets`
8
- - `gh:apply-variables`
9
- - `gh:backup-all`
10
- - `gh:backup-repository-settings`
11
- - `gh:backup-rulesets`
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 で誤って有効化しないため )。
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
2
  import 'dotenv/config';
3
- //# sourceMappingURL=gh-apply-all.d.mts.map
3
+ //# sourceMappingURL=repo-settings.d.mts.map
@@ -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,3 @@
1
+ export * from './get-actions-settings.mjs';
2
+ export * from './set-actions-settings.mjs';
3
+ //# sourceMappingURL=index.d.mts.map
@@ -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,3 @@
1
+ export * from './get-actions-settings.mjs';
2
+ export * from './set-actions-settings.mjs';
3
+ //# sourceMappingURL=index.mjs.map
@@ -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,4 @@
1
+ import { type ActionsSettings } from '../constants.mjs';
2
+ /** Settings > Actions > General を JSON の内容に合わせる。 */
3
+ export declare const setActionsSettings: (settings: ActionsSettings) => Promise<void>;
4
+ //# sourceMappingURL=set-actions-settings.d.mts.map
@@ -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,5 @@
1
+ #!/usr/bin/env node
2
+ import 'dotenv/config';
3
+ /** `github/actions-settings/settings.json` を Settings > Actions > General に反映する。 */
4
+ export declare const applyActionsSettings: () => Promise<void>;
5
+ //# sourceMappingURL=apply.d.mts.map
@@ -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,5 @@
1
+ #!/usr/bin/env node
2
+ import 'dotenv/config';
3
+ /** Settings > Actions > General の現在値を `bk/` に保存する。 */
4
+ export declare const backupActionsSettings: (fmt?: boolean) => Promise<void>;
5
+ //# sourceMappingURL=backup.d.mts.map
@@ -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,5 @@
1
+ export * from './api/index.mjs';
2
+ export * from './apply.mjs';
3
+ export * from './backup.mjs';
4
+ export * from './constants.mjs';
5
+ //# sourceMappingURL=index.d.mts.map
@@ -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,5 @@
1
+ export * from './api/index.mjs';
2
+ export * from './apply.mjs';
3
+ export * from './backup.mjs';
4
+ export * from './constants.mjs';
5
+ //# sourceMappingURL=index.mjs.map
@@ -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,7 +1,9 @@
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 repositorySettingsJsonName = "settings.json";
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
9
  readonly 'X-GitHub-Api-Version': '2022-11-28';
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.mts","sourceRoot":"","sources":["../../src/github/constants.mts"],"names":[],"mappings":"AAWA,eAAO,MAAM,KAAK,QAAgB,CAAC;AAiCnC,eAAO,MAAM,IAAI,EAAE,MAA4B,CAAC;AAIhD,eAAO,MAAM,qBAAqB,QAGjC,CAAC;AAEF,eAAO,MAAM,0BAA0B,kBAAkB,CAAC;AAE1D,eAAO,MAAM,WAAW,QAAwC,CAAC;AAEjE,eAAO,MAAM,cAAc;aACzB,sBAAsB,EAAE,YAAY;CAC5B,CAAC"}
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 { hasKey, isRecord, isString, Json } from 'ts-data-forge';
4
- import { Result } from 'ts-repo-utils';
5
- const ownerNullable = process.env['OWNER'];
6
- if (ownerNullable === undefined) {
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 repositorySettingsJsonName = 'settings.json';
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',
@@ -1 +1 @@
1
- {"version":3,"file":"constants.mjs","sourceRoot":"","sources":["../../src/github/constants.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAE3C,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;IAChC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,aAAa,CAAC;AAEnC,MAAM,WAAW,GAAG,KAAK,IAAqB,EAAE;IAC9C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAE7C,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAEtE,mEAAmE;IACnE,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE;QACxD,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAE/C,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,IACE,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC;QAC5B,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC;QAClC,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EACjC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC;AAChC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,IAAI,GAAW,MAAM,WAAW,EAAE,CAAC;AAEhD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;AAE1D,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC,OAAO,CAC/C,SAAS,EACT,uBAAuB,CACxB,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,eAAe,CAAC;AAE1D,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AAEjE,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,sBAAsB,EAAE,YAAY;CAC5B,CAAC"}
1
+ {"version":3,"file":"constants.mjs","sourceRoot":"","sources":["../../src/github/constants.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,MAAM,UAAU,GAAG,MAAM,iBAAiB,EAAE,CAAC;AAE7C,MAAM,CAAC,MAAM,KAAK,GAAW,UAAU,CAAC,KAAK,CAAC;AAE9C,MAAM,CAAC,MAAM,IAAI,GAAW,UAAU,CAAC,IAAI,CAAC;AAE5C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;AAE1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,eAAe,CAAC;AAEhD,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC,OAAO,CAC/C,SAAS,EACT,uBAAuB,CACxB,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;AAEhF,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAEnE,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AAEjE,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,sBAAsB,EAAE,YAAY;CAC5B,CAAC"}