github-settings-as-code 3.0.2 → 3.1.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.
@@ -2,7 +2,7 @@ import { ActionsSettings } from '../constants.mjs';
2
2
  /**
3
3
  * Settings > Actions > General の現在値を取得する。
4
4
  *
5
- * 2 つのエンドポイントの結果を 1 つのオブジェクトにまとめる。
5
+ * 3 つのエンドポイントの結果を 1 つのオブジェクトにまとめる。
6
6
  */
7
7
  export declare const getActionsSettings: () => Promise<ActionsSettings>;
8
8
  //# sourceMappingURL=get-actions-settings.d.mts.map
@@ -1 +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,CAmBlE,CAAC"}
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,CA6BlE,CAAC"}
@@ -10,11 +10,15 @@ export const getActionsSettings = async () => {
10
10
 
11
11
  const permissions = await octokit.request('GET /repos/{owner}/{repo}/actions/permissions', { owner: OWNER, repo: REPO, headers: octokitHeaders });
12
12
 
13
+ const workflowPermissions = await octokit.request('GET /repos/{owner}/{repo}/actions/permissions/workflow', { owner: OWNER, repo: REPO, headers: octokitHeaders });
14
+
13
15
  const forkPrApproval = await octokit.request('GET /repos/{owner}/{repo}/actions/permissions/fork-pr-contributor-approval', { owner: OWNER, repo: REPO, headers: octokitHeaders });
14
16
  return ActionsSettings.fill({
15
17
  enabled: permissions.data.enabled,
16
18
  allowed_actions: permissions.data.allowed_actions,
17
19
  sha_pinning_required: permissions.data.sha_pinning_required,
20
+ default_workflow_permissions: workflowPermissions.data.default_workflow_permissions,
21
+ can_approve_pull_request_reviews: workflowPermissions.data.can_approve_pull_request_reviews,
18
22
  fork_pr_contributor_approval_policy: forkPrApproval.data.approval_policy,
19
23
  });
20
24
  };
@@ -1 +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,OAAO,eAAe,CAAC,IAAI,CAAC;QAC1B,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,OAAO;QACjC,eAAe,EAAE,WAAW,CAAC,IAAI,CAAC,eAAe;QACjD,oBAAoB,EAAE,WAAW,CAAC,IAAI,CAAC,oBAAoB;QAC3D,mCAAmC,EAAE,cAAc,CAAC,IAAI,CAAC,eAAe;KACzE,CAAC,CAAC;AACL,CAAC,CAAC"}
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,qGAAqG;IACrG,MAAM,mBAAmB,GAAG,MAAM,OAAO,CAAC,OAAO,CAC/C,wDAA+E,EAC/E,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,OAAO,eAAe,CAAC,IAAI,CAAC;QAC1B,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,OAAO;QACjC,eAAe,EAAE,WAAW,CAAC,IAAI,CAAC,eAAe;QACjD,oBAAoB,EAAE,WAAW,CAAC,IAAI,CAAC,oBAAoB;QAC3D,4BAA4B,EAC1B,mBAAmB,CAAC,IAAI,CAAC,4BAA4B;QACvD,gCAAgC,EAC9B,mBAAmB,CAAC,IAAI,CAAC,gCAAgC;QAC3D,mCAAmC,EAAE,cAAc,CAAC,IAAI,CAAC,eAAe;KACzE,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -1 +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"}
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,CA2Cd,CAAC"}
@@ -17,6 +17,14 @@ export const setActionsSettings = async (settings) => {
17
17
  };
18
18
  await octokit.request('PUT /repos/{owner}/{repo}/actions/permissions', permissionsParams);
19
19
 
20
+ await octokit.request('PUT /repos/{owner}/{repo}/actions/permissions/workflow', {
21
+ owner: OWNER,
22
+ repo: REPO,
23
+ headers: octokitHeaders,
24
+ default_workflow_permissions: settings.default_workflow_permissions,
25
+ can_approve_pull_request_reviews: settings.can_approve_pull_request_reviews,
26
+ });
27
+
20
28
  await octokit.request('PUT /repos/{owner}/{repo}/actions/permissions/fork-pr-contributor-approval', {
21
29
  owner: OWNER,
22
30
  repo: REPO,
@@ -1 +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"}
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,qGAAqG;IACrG,MAAM,OAAO,CAAC,OAAO,CACnB,wDAA+E,EAC/E;QACE,KAAK,EAAE,KAAK;QACZ,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,cAAc;QACvB,4BAA4B,EAAE,QAAQ,CAAC,4BAA4B;QACnE,gCAAgC,EAC9B,QAAQ,CAAC,gCAAgC;KAC5C,CACF,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"}
@@ -6,53 +6,70 @@ import * as t from 'ts-fortress';
6
6
  * 管理する:
7
7
  *
8
8
  * - `GET|PUT /repos/{owner}/{repo}/actions/permissions`
9
+ * - `GET|PUT /repos/{owner}/{repo}/actions/permissions/workflow`
9
10
  * - `GET|PUT /repos/{owner}/{repo}/actions/permissions/fork-pr-contributor-approval`
10
11
  */
11
12
  export declare const ActionsSettings: Readonly<{
12
13
  typeName: string;
13
14
  defaultValue: Readonly<{
14
15
  allowed_actions: "all" | "local_only" | "selected";
16
+ can_approve_pull_request_reviews: boolean;
17
+ default_workflow_permissions: "read" | "write";
15
18
  enabled: boolean;
16
19
  fork_pr_contributor_approval_policy: "all_external_contributors" | "first_time_contributors" | "first_time_contributors_new_to_github";
17
20
  sha_pinning_required: boolean;
18
21
  }>;
19
22
  is: (a: unknown) => a is Readonly<{
20
23
  allowed_actions: "all" | "local_only" | "selected";
24
+ can_approve_pull_request_reviews: boolean;
25
+ default_workflow_permissions: "read" | "write";
21
26
  enabled: boolean;
22
27
  fork_pr_contributor_approval_policy: "all_external_contributors" | "first_time_contributors" | "first_time_contributors_new_to_github";
23
28
  sha_pinning_required: boolean;
24
29
  }>;
25
30
  assertIs: (a: unknown) => asserts a is Readonly<{
26
31
  allowed_actions: "all" | "local_only" | "selected";
32
+ can_approve_pull_request_reviews: boolean;
33
+ default_workflow_permissions: "read" | "write";
27
34
  enabled: boolean;
28
35
  fork_pr_contributor_approval_policy: "all_external_contributors" | "first_time_contributors" | "first_time_contributors_new_to_github";
29
36
  sha_pinning_required: boolean;
30
37
  }>;
31
38
  cast: (a: unknown) => Readonly<{
32
39
  allowed_actions: "all" | "local_only" | "selected";
40
+ can_approve_pull_request_reviews: boolean;
41
+ default_workflow_permissions: "read" | "write";
33
42
  enabled: boolean;
34
43
  fork_pr_contributor_approval_policy: "all_external_contributors" | "first_time_contributors" | "first_time_contributors_new_to_github";
35
44
  sha_pinning_required: boolean;
36
45
  }>;
37
46
  fill: (a: unknown) => Readonly<{
38
47
  allowed_actions: "all" | "local_only" | "selected";
48
+ can_approve_pull_request_reviews: boolean;
49
+ default_workflow_permissions: "read" | "write";
39
50
  enabled: boolean;
40
51
  fork_pr_contributor_approval_policy: "all_external_contributors" | "first_time_contributors" | "first_time_contributors_new_to_github";
41
52
  sha_pinning_required: boolean;
42
53
  }>;
43
54
  prune: <B extends Readonly<{
44
55
  allowed_actions: "all" | "local_only" | "selected";
56
+ can_approve_pull_request_reviews: boolean;
57
+ default_workflow_permissions: "read" | "write";
45
58
  enabled: boolean;
46
59
  fork_pr_contributor_approval_policy: "all_external_contributors" | "first_time_contributors" | "first_time_contributors_new_to_github";
47
60
  sha_pinning_required: boolean;
48
61
  }>>(a: B) => Readonly<{
49
62
  allowed_actions: "all" | "local_only" | "selected";
63
+ can_approve_pull_request_reviews: boolean;
64
+ default_workflow_permissions: "read" | "write";
50
65
  enabled: boolean;
51
66
  fork_pr_contributor_approval_policy: "all_external_contributors" | "first_time_contributors" | "first_time_contributors_new_to_github";
52
67
  sha_pinning_required: boolean;
53
68
  }>;
54
69
  validate: (a: unknown) => t.Result<Readonly<{
55
70
  allowed_actions: "all" | "local_only" | "selected";
71
+ can_approve_pull_request_reviews: boolean;
72
+ default_workflow_permissions: "read" | "write";
56
73
  enabled: boolean;
57
74
  fork_pr_contributor_approval_policy: "all_external_contributors" | "first_time_contributors" | "first_time_contributors_new_to_github";
58
75
  sha_pinning_required: boolean;
@@ -125,6 +142,56 @@ export declare const ActionsSettings: Readonly<{
125
142
  }>[]>;
126
143
  optional?: true;
127
144
  }>;
145
+ /**
146
+ * 「 Workflow permissions 」。 job が `permissions` を宣言しなかったときに
147
+ * `GITHUB_TOKEN` が受け取る既定値。
148
+ *
149
+ * `read` にできるのは、 workflow 側が全て明示的に `permissions` を宣言して
150
+ * いる場合だけ。宣言の無い job はこの既定値をそのまま受け取るため、
151
+ * `write` のままだと「 branch の中身が何であれ書き込めるトークン」が
152
+ * 渡る。 .github/workflows/type-check.yml 冒頭の注記を参照。
153
+ */
154
+ readonly default_workflow_permissions: Readonly<{
155
+ typeName: string;
156
+ defaultValue: "read" | "write";
157
+ is: (a: unknown) => a is "read" | "write";
158
+ assertIs: (a: unknown) => asserts a is "read" | "write";
159
+ cast: (a: unknown) => "read" | "write";
160
+ fill: (a: unknown) => "read" | "write";
161
+ prune: <B extends "read" | "write">(a: B) => "read" | "write";
162
+ validate: (a: unknown) => t.Result<"read" | "write", readonly Readonly<{
163
+ path: readonly string[];
164
+ actualValue: unknown;
165
+ expectedType: string;
166
+ typeName: string;
167
+ details?: t.ValidationErrorDetails | undefined;
168
+ }>[]>;
169
+ optional?: true;
170
+ }>;
171
+ /**
172
+ * 「 Allow GitHub Actions to create and approve pull requests 」。
173
+ *
174
+ * `main` の ruleset は `required_approving_review_count` が 0 なので
175
+ * 承認そのものは merge 条件ではないが、 Actions に PR を作らせる必要が
176
+ * あるのは App token を使う workflow だけで、 `GITHUB_TOKEN` には要らない。
177
+ */
178
+ readonly can_approve_pull_request_reviews: Readonly<{
179
+ typeName: string;
180
+ defaultValue: boolean;
181
+ is: (a: unknown) => a is boolean;
182
+ assertIs: (a: unknown) => asserts a is boolean;
183
+ cast: (a: unknown) => boolean;
184
+ fill: (a: unknown) => boolean;
185
+ prune: <B extends boolean>(a: B) => boolean;
186
+ validate: (a: unknown) => t.Result<boolean, readonly Readonly<{
187
+ path: readonly string[];
188
+ actualValue: unknown;
189
+ expectedType: string;
190
+ typeName: string;
191
+ details?: t.ValidationErrorDetails | undefined;
192
+ }>[]>;
193
+ optional?: true;
194
+ }>;
128
195
  /**
129
196
  * 「 Approval for running fork pull request workflows from contributors 」。
130
197
  *
@@ -1 +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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAC1B,4DAA4D;;;;;;;;;;;;;;;;;;QAG5D,+CAA+C;;;;;;;;;;;;;;;;;;QAM/C;;;;;WAKG;;;;;;;;;;;;;;;;;;QAGH;;;;;;WAMG;;;;;;;;;;;;;;;;;;;EAYH,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC"}
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;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAC1B,4DAA4D;;;;;;;;;;;;;;;;;;QAG5D,+CAA+C;;;;;;;;;;;;;;;;;;QAM/C;;;;;WAKG;;;;;;;;;;;;;;;;;;QAGH;;;;;;;;WAQG;;;;;;;;;;;;;;;;;;QAMH;;;;;;WAMG;;;;;;;;;;;;;;;;;;QAGH;;;;;;WAMG;;;;;;;;;;;;;;;;;;;EAYH,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC"}
@@ -8,6 +8,7 @@ import * as t from 'ts-fortress';
8
8
 
9
9
 
10
10
 
11
+
11
12
  export const ActionsSettings = t.record({
12
13
 
13
14
  enabled: t.boolean(true),
@@ -30,6 +31,27 @@ export const ActionsSettings = t.record({
30
31
 
31
32
 
32
33
 
34
+
35
+
36
+ default_workflow_permissions: t.enumType(['read', 'write'], {
37
+ typeName: 'DefaultWorkflowPermissions',
38
+ defaultValue: 'read',
39
+ }),
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+ can_approve_pull_request_reviews: t.boolean(false),
48
+
49
+
50
+
51
+
52
+
53
+
54
+
33
55
  fork_pr_contributor_approval_policy: t.enumType([
34
56
  'first_time_contributors_new_to_github',
35
57
  'first_time_contributors',
@@ -1 +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"}
1
+ {"version":3,"file":"constants.mjs","sourceRoot":"","sources":["../../../src/github/actions-settings/constants.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,aAAa,CAAC;AAEjC;;;;;;;;;GASG;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;;;;;;;;OAQG;IACH,4BAA4B,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;QAC1D,QAAQ,EAAE,4BAA4B;QACtC,YAAY,EAAE,MAAM;KACrB,CAAC;IAEF;;;;;;OAMG;IACH,gCAAgC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAElD;;;;;;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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "github-settings-as-code",
3
- "version": "3.0.2",
3
+ "version": "3.1.0",
4
4
  "private": false,
5
5
  "keywords": [
6
6
  "github",
@@ -29,37 +29,37 @@
29
29
  "dedent": "^1.7.2",
30
30
  "dotenv": "^17.4.2",
31
31
  "octokit-safe-types": "^1.2.28",
32
- "ts-data-forge": "^14.6.3",
33
- "ts-fortress": "^12.1.1",
34
- "ts-repo-utils": "^10.6.0",
32
+ "ts-data-forge": "^14.7.1",
33
+ "ts-fortress": "^12.1.3",
34
+ "ts-repo-utils": "^10.6.2",
35
35
  "ts-type-forge": "^9.2.2"
36
36
  },
37
37
  "devDependencies": {
38
- "@types/node": "26.4.1",
39
- "@vitest/coverage-v8": "4.1.11",
40
- "@vitest/ui": "4.1.11",
41
- "cspell": "10.1.1",
38
+ "@types/node": "26.5.0",
39
+ "@vitest/coverage-v8": "5.0.0",
40
+ "@vitest/ui": "5.0.0",
41
+ "cspell": "10.2.1",
42
42
  "eslint": "10.9.1",
43
- "eslint-config-typed": "5.11.2",
44
- "eslint-plugin-ts-data-forge": "0.7.0",
45
- "eslint-plugin-ts-fortress": "1.2.0",
46
- "eslint-plugin-ts-type-forge": "0.8.1",
43
+ "eslint-config-typed": "5.11.7",
44
+ "eslint-plugin-ts-data-forge": "0.7.4",
45
+ "eslint-plugin-ts-fortress": "1.2.2",
46
+ "eslint-plugin-ts-type-forge": "0.8.3",
47
47
  "jiti": "2.7.0",
48
48
  "npm-run-all2": "9.0.3",
49
49
  "prettier": "3.9.6",
50
50
  "prettier-plugin-organize-imports": "4.3.0",
51
51
  "prettier-plugin-packagejson": "3.0.2",
52
- "tsx": "4.23.12",
52
+ "tsx": "4.23.13",
53
53
  "typescript": "6.0.3",
54
54
  "typescript-native": "npm:typescript@7.0.2",
55
- "vitest": "4.1.11"
55
+ "vitest": "5.0.0"
56
56
  },
57
57
  "engines": {
58
58
  "node": ">=22.22.2",
59
59
  "pnpm": ">=9.0.0"
60
60
  },
61
61
  "volta": {
62
- "node": "26.3.1"
62
+ "node": "26.8.1"
63
63
  },
64
64
  "publishConfig": {
65
65
  "access": "public",
@@ -6,7 +6,7 @@ import { ActionsSettings } from '../constants.mjs';
6
6
  /**
7
7
  * Settings > Actions > General の現在値を取得する。
8
8
  *
9
- * 2 つのエンドポイントの結果を 1 つのオブジェクトにまとめる。
9
+ * 3 つのエンドポイントの結果を 1 つのオブジェクトにまとめる。
10
10
  */
11
11
  export const getActionsSettings = async (): Promise<ActionsSettings> => {
12
12
  // https://docs.github.com/rest/actions/permissions#get-github-actions-permissions-for-a-repository
@@ -15,6 +15,12 @@ export const getActionsSettings = async (): Promise<ActionsSettings> => {
15
15
  { owner: OWNER, repo: REPO, headers: octokitHeaders },
16
16
  );
17
17
 
18
+ // https://docs.github.com/rest/actions/permissions#get-default-workflow-permissions-for-a-repository
19
+ const workflowPermissions = await octokit.request(
20
+ 'GET /repos/{owner}/{repo}/actions/permissions/workflow' satisfies EndpointKeys,
21
+ { owner: OWNER, repo: REPO, headers: octokitHeaders },
22
+ );
23
+
18
24
  // https://docs.github.com/rest/actions/permissions#get-fork-pr-contributor-approval-permissions-for-a-repository
19
25
  const forkPrApproval = await octokit.request(
20
26
  'GET /repos/{owner}/{repo}/actions/permissions/fork-pr-contributor-approval' satisfies EndpointKeys,
@@ -25,6 +31,10 @@ export const getActionsSettings = async (): Promise<ActionsSettings> => {
25
31
  enabled: permissions.data.enabled,
26
32
  allowed_actions: permissions.data.allowed_actions,
27
33
  sha_pinning_required: permissions.data.sha_pinning_required,
34
+ default_workflow_permissions:
35
+ workflowPermissions.data.default_workflow_permissions,
36
+ can_approve_pull_request_reviews:
37
+ workflowPermissions.data.can_approve_pull_request_reviews,
28
38
  fork_pr_contributor_approval_policy: forkPrApproval.data.approval_policy,
29
39
  });
30
40
  };
@@ -26,6 +26,19 @@ export const setActionsSettings = async (
26
26
  permissionsParams,
27
27
  );
28
28
 
29
+ // https://docs.github.com/rest/actions/permissions#set-default-workflow-permissions-for-a-repository
30
+ await octokit.request(
31
+ 'PUT /repos/{owner}/{repo}/actions/permissions/workflow' satisfies EndpointKeys,
32
+ {
33
+ owner: OWNER,
34
+ repo: REPO,
35
+ headers: octokitHeaders,
36
+ default_workflow_permissions: settings.default_workflow_permissions,
37
+ can_approve_pull_request_reviews:
38
+ settings.can_approve_pull_request_reviews,
39
+ },
40
+ );
41
+
29
42
  // https://docs.github.com/rest/actions/permissions#set-fork-pr-contributor-approval-permissions-for-a-repository
30
43
  await octokit.request(
31
44
  'PUT /repos/{owner}/{repo}/actions/permissions/fork-pr-contributor-approval' satisfies EndpointKeys,
@@ -7,6 +7,7 @@ import * as t from 'ts-fortress';
7
7
  * 管理する:
8
8
  *
9
9
  * - `GET|PUT /repos/{owner}/{repo}/actions/permissions`
10
+ * - `GET|PUT /repos/{owner}/{repo}/actions/permissions/workflow`
10
11
  * - `GET|PUT /repos/{owner}/{repo}/actions/permissions/fork-pr-contributor-approval`
11
12
  */
12
13
  export const ActionsSettings = t.record({
@@ -27,6 +28,29 @@ export const ActionsSettings = t.record({
27
28
  */
28
29
  sha_pinning_required: t.boolean(false),
29
30
 
31
+ /**
32
+ * 「 Workflow permissions 」。 job が `permissions` を宣言しなかったときに
33
+ * `GITHUB_TOKEN` が受け取る既定値。
34
+ *
35
+ * `read` にできるのは、 workflow 側が全て明示的に `permissions` を宣言して
36
+ * いる場合だけ。宣言の無い job はこの既定値をそのまま受け取るため、
37
+ * `write` のままだと「 branch の中身が何であれ書き込めるトークン」が
38
+ * 渡る。 .github/workflows/type-check.yml 冒頭の注記を参照。
39
+ */
40
+ default_workflow_permissions: t.enumType(['read', 'write'], {
41
+ typeName: 'DefaultWorkflowPermissions',
42
+ defaultValue: 'read',
43
+ }),
44
+
45
+ /**
46
+ * 「 Allow GitHub Actions to create and approve pull requests 」。
47
+ *
48
+ * `main` の ruleset は `required_approving_review_count` が 0 なので
49
+ * 承認そのものは merge 条件ではないが、 Actions に PR を作らせる必要が
50
+ * あるのは App token を使う workflow だけで、 `GITHUB_TOKEN` には要らない。
51
+ */
52
+ can_approve_pull_request_reviews: t.boolean(false),
53
+
30
54
  /**
31
55
  * 「 Approval for running fork pull request workflows from contributors 」。
32
56
  *