github-settings-as-code 3.2.0 → 4.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 +17 -15
- package/dist/cmd/repo-settings.mjs +4 -2
- package/dist/cmd/repo-settings.mjs.map +1 -1
- package/dist/github/actions-settings/apply.d.mts.map +1 -1
- package/dist/github/actions-settings/apply.mjs +0 -4
- package/dist/github/actions-settings/apply.mjs.map +1 -1
- package/dist/github/actions-settings/backup.d.mts +1 -1
- package/dist/github/actions-settings/backup.d.mts.map +1 -1
- package/dist/github/actions-settings/backup.mjs +4 -4
- package/dist/github/actions-settings/backup.mjs.map +1 -1
- package/dist/github/actions-settings/constants.d.mts +1 -1
- package/dist/github/clear-json-files.d.mts +17 -0
- package/dist/github/clear-json-files.d.mts.map +1 -0
- package/dist/github/clear-json-files.mjs +29 -0
- package/dist/github/clear-json-files.mjs.map +1 -0
- package/dist/github/constants.d.mts +1 -0
- package/dist/github/constants.d.mts.map +1 -1
- package/dist/github/constants.mjs +1 -0
- package/dist/github/constants.mjs.map +1 -1
- package/dist/github/environments/api/get-environments.d.mts +1 -1
- package/dist/github/environments/apply.d.mts +3 -3
- package/dist/github/environments/apply.d.mts.map +1 -1
- package/dist/github/environments/apply.mjs +5 -9
- package/dist/github/environments/apply.mjs.map +1 -1
- package/dist/github/environments/backup.d.mts +6 -1
- package/dist/github/environments/backup.d.mts.map +1 -1
- package/dist/github/environments/backup.mjs +11 -5
- package/dist/github/environments/backup.mjs.map +1 -1
- package/dist/github/environments/constants.d.mts +1 -1
- package/dist/github/environments/read-environment-contents.d.mts +0 -1
- package/dist/github/environments/read-environment-contents.d.mts.map +1 -1
- package/dist/github/environments/read-environment-contents.mjs +0 -1
- package/dist/github/environments/read-environment-contents.mjs.map +1 -1
- package/dist/github/index.d.mts +2 -0
- package/dist/github/index.d.mts.map +1 -1
- package/dist/github/index.mjs +2 -0
- package/dist/github/index.mjs.map +1 -1
- package/dist/github/pages/apply.d.mts.map +1 -1
- package/dist/github/pages/apply.mjs +0 -2
- package/dist/github/pages/apply.mjs.map +1 -1
- package/dist/github/pages/backup.d.mts +11 -1
- package/dist/github/pages/backup.d.mts.map +1 -1
- package/dist/github/pages/backup.mjs +18 -5
- package/dist/github/pages/backup.mjs.map +1 -1
- package/dist/github/repository/apply.d.mts.map +1 -1
- package/dist/github/repository/apply.mjs +0 -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 +4 -4
- package/dist/github/repository/backup.mjs.map +1 -1
- package/dist/github/ruleset/apply.d.mts.map +1 -1
- package/dist/github/ruleset/apply.mjs +9 -9
- package/dist/github/ruleset/apply.mjs.map +1 -1
- package/dist/github/ruleset/backup.d.mts +7 -0
- package/dist/github/ruleset/backup.d.mts.map +1 -1
- package/dist/github/ruleset/backup.mjs +20 -7
- package/dist/github/ruleset/backup.mjs.map +1 -1
- package/dist/github/ruleset/read-rule-set-contents.d.mts +0 -1
- package/dist/github/ruleset/read-rule-set-contents.d.mts.map +1 -1
- package/dist/github/ruleset/read-rule-set-contents.mjs +0 -1
- package/dist/github/ruleset/read-rule-set-contents.mjs.map +1 -1
- package/dist/github/settings-file-path.d.mts +14 -0
- package/dist/github/settings-file-path.d.mts.map +1 -0
- package/dist/github/settings-file-path.mjs +41 -0
- package/dist/github/settings-file-path.mjs.map +1 -0
- package/dist/github/variables/api/list-repo-variables.d.mts.map +1 -1
- package/dist/github/variables/api/list-repo-variables.mjs +3 -1
- package/dist/github/variables/api/list-repo-variables.mjs.map +1 -1
- package/dist/github/variables/apply.d.mts +9 -0
- package/dist/github/variables/apply.d.mts.map +1 -1
- package/dist/github/variables/apply.mjs +31 -17
- package/dist/github/variables/apply.mjs.map +1 -1
- package/dist/github/variables/backup.d.mts +20 -0
- package/dist/github/variables/backup.d.mts.map +1 -0
- package/dist/github/variables/backup.mjs +35 -0
- package/dist/github/variables/backup.mjs.map +1 -0
- package/dist/github/variables/constants.d.mts +65 -0
- package/dist/github/variables/constants.d.mts.map +1 -0
- package/dist/github/variables/constants.mjs +48 -0
- package/dist/github/variables/constants.mjs.map +1 -0
- package/dist/github/variables/index.d.mts +2 -0
- package/dist/github/variables/index.d.mts.map +1 -1
- package/dist/github/variables/index.mjs +2 -0
- package/dist/github/variables/index.mjs.map +1 -1
- package/dist/github/vulnerability-alerts/apply.d.mts.map +1 -1
- package/dist/github/vulnerability-alerts/apply.mjs +0 -2
- package/dist/github/vulnerability-alerts/apply.mjs.map +1 -1
- package/dist/github/vulnerability-alerts/backup.d.mts +1 -1
- package/dist/github/vulnerability-alerts/backup.d.mts.map +1 -1
- package/dist/github/vulnerability-alerts/backup.mjs +4 -4
- package/dist/github/vulnerability-alerts/backup.mjs.map +1 -1
- package/package.json +29 -28
- package/src/cmd/repo-settings.mts +5 -2
- package/src/github/actions-settings/apply.mts +0 -9
- package/src/github/actions-settings/backup.mts +6 -11
- package/src/github/actions-settings/constants.mts +1 -1
- package/src/github/clear-json-files.mts +31 -0
- package/src/github/clear-json-files.test.mts +78 -0
- package/src/github/constants.mts +2 -0
- package/src/github/environments/api/get-environments.mts +1 -1
- package/src/github/environments/apply.mts +8 -13
- package/src/github/environments/backup.mts +13 -12
- package/src/github/environments/constants.mts +1 -1
- package/src/github/environments/read-environment-contents.mts +0 -4
- package/src/github/index.mts +2 -0
- package/src/github/pages/apply.mts +0 -6
- package/src/github/pages/backup.mts +21 -12
- package/src/github/repository/apply.mts +0 -9
- package/src/github/repository/backup.mts +5 -10
- package/src/github/ruleset/apply.mts +10 -18
- package/src/github/ruleset/backup.mts +23 -13
- package/src/github/ruleset/read-rule-set-contents.mts +0 -4
- package/src/github/ruleset/schema.test.mts +0 -13
- package/src/github/settings-file-path.mts +51 -0
- package/src/github/settings-file-path.test.mts +70 -0
- package/src/github/variables/api/list-repo-variables.mts +3 -1
- package/src/github/variables/apply.mts +54 -27
- package/src/github/variables/backup.mts +47 -0
- package/src/github/variables/constants.mts +61 -0
- package/src/github/variables/constants.test.mts +110 -0
- package/src/github/variables/index.mts +2 -0
- package/src/github/vulnerability-alerts/apply.mts +0 -6
- package/src/github/vulnerability-alerts/backup.mts +6 -11
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.mjs","sourceRoot":"","sources":["../../../src/github/variables/constants.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,KAAK,CAAC,MAAM,aAAa,CAAC;AAEjC;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;IAC1E,QAAQ,EAAE,qBAAqB;CAChC,CAAC,CAAC;AAIH;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,SAA8B,EACxB,EAAE;IACR,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAC7C,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,CACrC,CAAC;IAEF,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACb;YACE,0CAA0C,SAAS;iBAChD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;iBACnC,IAAI,CAAC,IAAI,CAAC,GAAG;YAChB,kDAAkD;SACnD,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAEF,6CAA6C;AAC7C,MAAM,mBAAmB,GAAG,2BAA2B,CAAC;AAExD,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAW,EAAE,CACpD,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../src/github/variables/index.mts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../src/github/variables/index.mts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../src/github/variables/index.mts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../src/github/variables/index.mts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply.d.mts","sourceRoot":"","sources":["../../../src/github/vulnerability-alerts/apply.mts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AAiBvB;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,QAAa,OAAO,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"apply.d.mts","sourceRoot":"","sources":["../../../src/github/vulnerability-alerts/apply.mts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AAiBvB;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,QAAa,OAAO,CAAC,IAAI,CAsB7D,CAAC"}
|
|
@@ -27,8 +27,6 @@ export const applyVulnerabilityAlerts = async () => {
|
|
|
27
27
|
const str = JSON.stringify(applied, undefined, 2);
|
|
28
28
|
|
|
29
29
|
await fs.writeFile(settingsPath, str);
|
|
30
|
-
|
|
31
|
-
await fs.writeFile(path.resolve(vulnerabilityAlertsDir, 'bk', settingsJsonName), str);
|
|
32
30
|
await formatUncommittedFiles();
|
|
33
31
|
}
|
|
34
32
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply.mjs","sourceRoot":"","sources":["../../../src/github/vulnerability-alerts/apply.mts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,CAAC,MAAM,aAAa,CAAC;AACjC,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,UAAU,EACV,MAAM,GACP,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EACL,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAE9D;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,IAAmB,EAAE;IAChE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,CAAC;IAE5E,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;QACtC,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,CAAC;IAElD,MAAM,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAEvC,0BAA0B;IAC1B,CAAC;QACC,MAAM,OAAO,GAAG,MAAM,sBAAsB,EAAE,CAAC;QAE/C,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAElD,mEAAmE;QACnE,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QAEtC,
|
|
1
|
+
{"version":3,"file":"apply.mjs","sourceRoot":"","sources":["../../../src/github/vulnerability-alerts/apply.mts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,CAAC,MAAM,aAAa,CAAC;AACjC,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,UAAU,EACV,MAAM,GACP,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EACL,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAE9D;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,IAAmB,EAAE;IAChE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,CAAC;IAE5E,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;QACtC,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,CAAC;IAElD,MAAM,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAEvC,0BAA0B;IAC1B,CAAC;QACC,MAAM,OAAO,GAAG,MAAM,sBAAsB,EAAE,CAAC;QAE/C,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAElD,mEAAmE;QACnE,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QAEtC,MAAM,sBAAsB,EAAE,CAAC;IACjC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,KAAK,EACxB,YAAoB,EACkB,EAAE;IACxC,mEAAmE;IACnE,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAE3E,MAAM,gBAAgB,GAAG,2BAA2B,CAAC,QAAQ,CAC3D,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CACzB,CAAC;IAEF,IAAI,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,CAAC,CAAC,0BAA0B,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAChE,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,wBAAwB,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backup.d.mts","sourceRoot":"","sources":["../../../src/github/vulnerability-alerts/backup.mts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"backup.d.mts","sourceRoot":"","sources":["../../../src/github/vulnerability-alerts/backup.mts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AAQvB,0CAA0C;AAC1C,eAAO,MAAM,yBAAyB,SAC/B,OAAO,KACX,OAAO,CAAC,IAAI,CAcd,CAAC"}
|
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
import 'dotenv/config';
|
|
3
3
|
import * as fs from 'node:fs/promises';
|
|
4
4
|
import * as path from 'node:path';
|
|
5
|
-
import { formatUncommittedFiles, isDirectlyExecuted
|
|
5
|
+
import { formatUncommittedFiles, isDirectlyExecuted } from 'ts-repo-utils';
|
|
6
|
+
import { clearJsonFilesIn } from '../clear-json-files.mjs';
|
|
6
7
|
import { settingsJsonName, vulnerabilityAlertsDir } from '../constants.mjs';
|
|
7
8
|
import { getVulnerabilityAlerts } from './api/index.mjs';
|
|
8
|
-
const backupDir = path.resolve(vulnerabilityAlertsDir, './bk');
|
|
9
9
|
|
|
10
10
|
export const backupVulnerabilityAlerts = async (fmt = true) => {
|
|
11
|
-
await makeEmptyDir(backupDir);
|
|
12
11
|
const settings = await getVulnerabilityAlerts();
|
|
12
|
+
await clearJsonFilesIn(vulnerabilityAlertsDir);
|
|
13
13
|
|
|
14
|
-
await fs.writeFile(path.resolve(
|
|
14
|
+
await fs.writeFile(path.resolve(vulnerabilityAlertsDir, settingsJsonName), JSON.stringify(settings, undefined, 2));
|
|
15
15
|
if (fmt) {
|
|
16
16
|
await formatUncommittedFiles();
|
|
17
17
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backup.mjs","sourceRoot":"","sources":["../../../src/github/vulnerability-alerts/backup.mts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,
|
|
1
|
+
{"version":3,"file":"backup.mjs","sourceRoot":"","sources":["../../../src/github/vulnerability-alerts/backup.mts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,0CAA0C;AAC1C,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,EAC5C,GAAG,GAAY,IAAI,EACJ,EAAE;IACjB,MAAM,QAAQ,GAAG,MAAM,sBAAsB,EAAE,CAAC;IAEhD,MAAM,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;IAE/C,mEAAmE;IACnE,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,EACtD,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,yBAAyB,EAAE,CAAC;AACpC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "github-settings-as-code",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"keywords": [
|
|
6
6
|
"github",
|
|
@@ -31,19 +31,19 @@
|
|
|
31
31
|
"octokit-safe-types": "^1.2.28",
|
|
32
32
|
"ts-data-forge": "^14.7.1",
|
|
33
33
|
"ts-fortress": "^12.1.3",
|
|
34
|
-
"ts-repo-utils": "^10.
|
|
34
|
+
"ts-repo-utils": "^10.7.0",
|
|
35
35
|
"ts-type-forge": "^9.2.2"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
|
-
"@types/node": "26.5.
|
|
38
|
+
"@types/node": "26.5.1",
|
|
39
39
|
"@vitest/coverage-v8": "5.0.0",
|
|
40
40
|
"@vitest/ui": "5.0.0",
|
|
41
|
-
"cspell": "10.
|
|
42
|
-
"eslint": "10.
|
|
43
|
-
"eslint-config-typed": "5.11.
|
|
44
|
-
"eslint-plugin-ts-data-forge": "0.
|
|
45
|
-
"eslint-plugin-ts-fortress": "1.2.
|
|
46
|
-
"eslint-plugin-ts-type-forge": "0.8.
|
|
41
|
+
"cspell": "10.3.0",
|
|
42
|
+
"eslint": "10.10.0",
|
|
43
|
+
"eslint-config-typed": "5.11.10",
|
|
44
|
+
"eslint-plugin-ts-data-forge": "0.8.1",
|
|
45
|
+
"eslint-plugin-ts-fortress": "1.2.3",
|
|
46
|
+
"eslint-plugin-ts-type-forge": "0.8.4",
|
|
47
47
|
"jiti": "2.7.0",
|
|
48
48
|
"npm-run-all2": "9.0.3",
|
|
49
49
|
"prettier": "3.9.6",
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"pnpm": ">=9.0.0"
|
|
60
60
|
},
|
|
61
61
|
"volta": {
|
|
62
|
-
"node": "26.8.
|
|
62
|
+
"node": "26.8.2"
|
|
63
63
|
},
|
|
64
64
|
"publishConfig": {
|
|
65
65
|
"access": "public",
|
|
@@ -67,29 +67,30 @@
|
|
|
67
67
|
},
|
|
68
68
|
"scripts": {
|
|
69
69
|
"build": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/build.mts",
|
|
70
|
-
"
|
|
70
|
+
"check:cspell": "cspell \"**\" --gitignore --gitignore-root ../../ --no-progress",
|
|
71
71
|
"check:ext": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/check-ext.mts",
|
|
72
|
+
"check:lint": "eslint .",
|
|
73
|
+
"check:test": "pnpm run z:vitest:node run",
|
|
74
|
+
"check:test:cov": "pnpm run z:vitest:node run --coverage",
|
|
75
|
+
"check:types": "node ../../node_modules/typescript-native/bin/tsc --noEmit",
|
|
72
76
|
"check-all": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/check-all.mts",
|
|
73
|
-
"codemod": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ../../libs/ts-codemod-cli/src/cmd/ts-codemod.mts --uncommitted --transformer append-as-const --transformer convert-to-readonly '{src,scripts,samples}/**/*.mts' && pnpm run fmt",
|
|
74
|
-
"codemod:diff": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ../../libs/ts-codemod-cli/src/cmd/ts-codemod.mts --diff-from origin/main --transformer append-as-const --transformer convert-to-readonly '{src,scripts,samples}/**/*.mts' && pnpm run fmt",
|
|
75
|
-
"codemod:full": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ../../libs/ts-codemod-cli/src/cmd/ts-codemod.mts --transformer append-as-const --transformer convert-to-readonly '{src,scripts,samples}/**/*.mts' && pnpm run fmt",
|
|
76
|
-
"cspell": "cspell \"**\" --gitignore --gitignore-root ../../ --no-progress",
|
|
77
77
|
"doc": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/gen-docs.mts",
|
|
78
|
-
"
|
|
79
|
-
"
|
|
80
|
-
"
|
|
81
|
-
"
|
|
82
|
-
"
|
|
83
|
-
"
|
|
84
|
-
"lint
|
|
85
|
-
"
|
|
86
|
-
"
|
|
78
|
+
"fix:codemod": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ../../libs/ts-codemod-cli/src/cmd/ts-codemod.mts --uncommitted --transformer append-as-const --transformer convert-to-readonly '{src,scripts,samples}/**/*.mts' && pnpm run fix:fmt",
|
|
79
|
+
"fix:codemod:diff": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ../../libs/ts-codemod-cli/src/cmd/ts-codemod.mts --diff-from origin/main --transformer append-as-const --transformer convert-to-readonly '{src,scripts,samples}/**/*.mts' && pnpm run fix:fmt",
|
|
80
|
+
"fix:codemod:full": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ../../libs/ts-codemod-cli/src/cmd/ts-codemod.mts --transformer append-as-const --transformer convert-to-readonly '{src,scripts,samples}/**/*.mts' && pnpm run fix:fmt",
|
|
81
|
+
"fix:fmt": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ../../libs/ts-repo-utils/src/cmd/format-uncommitted.mts --cwd .",
|
|
82
|
+
"fix:fmt:diff": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ../../libs/ts-repo-utils/src/cmd/format-diff-from.mts origin/main --cwd .",
|
|
83
|
+
"fix:fmt:full": "prettier --write .",
|
|
84
|
+
"fix:lint": "eslint . --fix",
|
|
85
|
+
"fmt": "pnpm run fix:fmt",
|
|
86
|
+
"gen": "run-s gen:index",
|
|
87
|
+
"gen:index": "run-s gen:index:src fix:fmt",
|
|
88
|
+
"gen:index:src": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ../../libs/ts-repo-utils/src/cmd/gen-index-ts.mts ./src/github --index-ext .mts --export-ext .mjs --target-ext .mts --exclude cmd --exclude octokit.mts",
|
|
89
|
+
"test": "pnpm run check:test",
|
|
87
90
|
"test:cov:ui": "vite preview --outDir ./coverage",
|
|
88
91
|
"test:ui": "pnpm run z:vitest:node --ui",
|
|
89
|
-
"
|
|
90
|
-
"
|
|
91
|
-
"tscw": "node ../../node_modules/typescript-native/bin/tsc --noEmit --watch -p ./tsconfig.json",
|
|
92
|
-
"type-check": "node ../../node_modules/typescript-native/bin/tsc --noEmit",
|
|
92
|
+
"watch:test": "pnpm run z:vitest:node watch",
|
|
93
|
+
"watch:types": "node ../../node_modules/typescript-native/bin/tsc --noEmit --watch -p ./tsconfig.json",
|
|
93
94
|
"z:vitest": "vitest --config ./configs/vitest.config.mts",
|
|
94
95
|
"z:vitest:node": "pnpm run z:vitest --project='Node.js'"
|
|
95
96
|
}
|
|
@@ -13,13 +13,13 @@ const HELP = dedent`
|
|
|
13
13
|
|
|
14
14
|
Commands:
|
|
15
15
|
apply [target] ローカルの設定ファイルを GitHub に反映する
|
|
16
|
-
backup [target] GitHub
|
|
16
|
+
backup [target] GitHub の現在値でローカルの設定ファイルを撮り直す
|
|
17
17
|
|
|
18
18
|
Targets:
|
|
19
19
|
all すべて(既定)
|
|
20
20
|
repository repo-settings/repository-settings/settings.json
|
|
21
21
|
rulesets repo-settings/rulesets/*.json
|
|
22
|
-
variables
|
|
22
|
+
variables repo-settings/variables/settings.json
|
|
23
23
|
actions repo-settings/actions-settings/settings.json
|
|
24
24
|
pages repo-settings/pages/settings.json
|
|
25
25
|
environments repo-settings/environments/*.json
|
|
@@ -156,9 +156,12 @@ const runners: ReadonlyRecord<
|
|
|
156
156
|
await github.backupEnvironments();
|
|
157
157
|
|
|
158
158
|
await github.backupVulnerabilityAlerts();
|
|
159
|
+
|
|
160
|
+
await github.backupVariables();
|
|
159
161
|
},
|
|
160
162
|
repository: github.backupRepositorySettings,
|
|
161
163
|
rulesets: github.backupRulesets,
|
|
164
|
+
variables: github.backupVariables,
|
|
162
165
|
actions: github.backupActionsSettings,
|
|
163
166
|
pages: github.backupPagesSettings,
|
|
164
167
|
environments: github.backupEnvironments,
|
|
@@ -10,13 +10,10 @@ import {
|
|
|
10
10
|
} from 'ts-repo-utils';
|
|
11
11
|
import { actionsSettingsDir, settingsJsonName } from '../constants.mjs';
|
|
12
12
|
import { getActionsSettings, setActionsSettings } from './api/index.mjs';
|
|
13
|
-
import { backupActionsSettings } from './backup.mjs';
|
|
14
13
|
import { ActionsSettings } from './constants.mjs';
|
|
15
14
|
|
|
16
15
|
/** `repo-settings/actions-settings/settings.json` を Settings > Actions > General に反映する。 */
|
|
17
16
|
export const applyActionsSettings = async (): Promise<void> => {
|
|
18
|
-
await backupActionsSettings(false);
|
|
19
|
-
|
|
20
17
|
const settings = await readSettings();
|
|
21
18
|
|
|
22
19
|
await setActionsSettings(settings);
|
|
@@ -30,12 +27,6 @@ export const applyActionsSettings = async (): Promise<void> => {
|
|
|
30
27
|
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
|
31
28
|
await fs.writeFile(path.resolve(actionsSettingsDir, settingsJsonName), str);
|
|
32
29
|
|
|
33
|
-
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
|
34
|
-
await fs.writeFile(
|
|
35
|
-
path.resolve(actionsSettingsDir, 'bk', settingsJsonName),
|
|
36
|
-
str,
|
|
37
|
-
);
|
|
38
|
-
|
|
39
30
|
await formatUncommittedFiles();
|
|
40
31
|
}
|
|
41
32
|
};
|
|
@@ -2,27 +2,22 @@
|
|
|
2
2
|
import 'dotenv/config';
|
|
3
3
|
import * as fs from 'node:fs/promises';
|
|
4
4
|
import * as path from 'node:path';
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
isDirectlyExecuted,
|
|
8
|
-
makeEmptyDir,
|
|
9
|
-
} from 'ts-repo-utils';
|
|
5
|
+
import { formatUncommittedFiles, isDirectlyExecuted } from 'ts-repo-utils';
|
|
6
|
+
import { clearJsonFilesIn } from '../clear-json-files.mjs';
|
|
10
7
|
import { actionsSettingsDir, settingsJsonName } from '../constants.mjs';
|
|
11
8
|
import { getActionsSettings } from './api/index.mjs';
|
|
12
9
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
/** Settings > Actions > General の現在値を `bk/` に保存する。 */
|
|
10
|
+
/** Settings > Actions > General の現在値を宣言ファイルへ撮り直す。 */
|
|
16
11
|
export const backupActionsSettings = async (
|
|
17
12
|
fmt: boolean = true,
|
|
18
13
|
): Promise<void> => {
|
|
19
|
-
await makeEmptyDir(backupDir);
|
|
20
|
-
|
|
21
14
|
const settings = await getActionsSettings();
|
|
22
15
|
|
|
16
|
+
await clearJsonFilesIn(actionsSettingsDir);
|
|
17
|
+
|
|
23
18
|
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
|
24
19
|
await fs.writeFile(
|
|
25
|
-
path.resolve(
|
|
20
|
+
path.resolve(actionsSettingsDir, settingsJsonName),
|
|
26
21
|
JSON.stringify(settings, undefined, 2),
|
|
27
22
|
);
|
|
28
23
|
|
|
@@ -35,7 +35,7 @@ export const ActionsSettings = t.record({
|
|
|
35
35
|
* `read` にできるのは、 workflow 側が全て明示的に `permissions` を宣言して
|
|
36
36
|
* いる場合だけ。宣言の無い job はこの既定値をそのまま受け取るため、
|
|
37
37
|
* `write` のままだと「 branch の中身が何であれ書き込めるトークン」が
|
|
38
|
-
* 渡る。 .github/workflows/
|
|
38
|
+
* 渡る。 .github/workflows/code-check.yml 冒頭の注記を参照。
|
|
39
39
|
*/
|
|
40
40
|
default_workflow_permissions: t.enumType(['read', 'write'], {
|
|
41
41
|
typeName: 'DefaultWorkflowPermissions',
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as fs from 'node:fs/promises';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* `dir` の直下の `*.json` を消す。ディレクトリが無ければ作る。
|
|
6
|
+
*
|
|
7
|
+
* backup が書き込む前にこれを呼ぶ。撮り直したあとにそこに在るものが、そのまま
|
|
8
|
+
* 「GitHub から取れたもの」になる — 取れなかった資源は `git status` に削除と
|
|
9
|
+
* して現れる。消さずに上書きするだけだと、取れなかった資源の古いファイルが
|
|
10
|
+
* 残り、取れたのと見分けがつかない。
|
|
11
|
+
*
|
|
12
|
+
* まだ apply していない宣言も同じように削除として現れるが、それも見えた方が
|
|
13
|
+
* よい情報で、コミットしなければ失われない。
|
|
14
|
+
*
|
|
15
|
+
* `rm -rf` ではなく直下の `*.json` に限る。宣言の隣に置いてある README
|
|
16
|
+
* (`repo-settings/variables/README.md`)のような、JSON でない同居ファイルを
|
|
17
|
+
* 巻き込まないため。
|
|
18
|
+
*/
|
|
19
|
+
export const clearJsonFilesIn = async (dir: string): Promise<void> => {
|
|
20
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
|
21
|
+
await fs.mkdir(dir, { recursive: true });
|
|
22
|
+
|
|
23
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
|
24
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
25
|
+
|
|
26
|
+
for (const entry of entries) {
|
|
27
|
+
if (entry.isFile() && entry.name.endsWith('.json')) {
|
|
28
|
+
await fs.rm(path.resolve(dir, entry.name));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import * as fs from 'node:fs/promises';
|
|
2
|
+
import * as os from 'node:os';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import { clearJsonFilesIn } from './clear-json-files.mjs';
|
|
5
|
+
|
|
6
|
+
const makeDir = async (): Promise<string> =>
|
|
7
|
+
fs.mkdtemp(path.join(os.tmpdir(), 'clear-json-files-'));
|
|
8
|
+
|
|
9
|
+
/** 途中のディレクトリごと作って書く。入れ子の fixture もこれで用意する。 */
|
|
10
|
+
const write = async (filePath: string, content: string): Promise<void> => {
|
|
11
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
|
12
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
13
|
+
|
|
14
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
|
15
|
+
await fs.writeFile(filePath, content);
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const namesIn = async (dir: string): Promise<readonly string[]> =>
|
|
19
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
|
20
|
+
fs.readdir(dir).then((names) => names.toSorted());
|
|
21
|
+
|
|
22
|
+
describe(clearJsonFilesIn, () => {
|
|
23
|
+
test('removes the json files directly under the directory', async () => {
|
|
24
|
+
const dir = await makeDir();
|
|
25
|
+
|
|
26
|
+
await write(path.join(dir, 'main.json'), '{}');
|
|
27
|
+
|
|
28
|
+
await write(path.join(dir, 'release.json'), '{}');
|
|
29
|
+
|
|
30
|
+
await clearJsonFilesIn(dir);
|
|
31
|
+
|
|
32
|
+
assert.deepStrictEqual(await namesIn(dir), []);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test('keeps a file that is not json, so a README beside the declarations survives', async () => {
|
|
36
|
+
const dir = await makeDir();
|
|
37
|
+
|
|
38
|
+
await write(path.join(dir, 'settings.json'), '{}');
|
|
39
|
+
|
|
40
|
+
await write(path.join(dir, 'README.md'), '# notes');
|
|
41
|
+
|
|
42
|
+
await clearJsonFilesIn(dir);
|
|
43
|
+
|
|
44
|
+
assert.deepStrictEqual(await namesIn(dir), ['README.md']);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test('does not descend into a subdirectory', async () => {
|
|
48
|
+
const dir = await makeDir();
|
|
49
|
+
|
|
50
|
+
await write(path.join(dir, 'nested', 'deep.json'), '{}');
|
|
51
|
+
|
|
52
|
+
await clearJsonFilesIn(dir);
|
|
53
|
+
|
|
54
|
+
assert.deepStrictEqual(await namesIn(dir), ['nested']);
|
|
55
|
+
|
|
56
|
+
assert.deepStrictEqual(await namesIn(path.join(dir, 'nested')), [
|
|
57
|
+
'deep.json',
|
|
58
|
+
]);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test('creates the directory when it does not exist', async () => {
|
|
62
|
+
const dir = path.join(await makeDir(), 'not-yet');
|
|
63
|
+
|
|
64
|
+
await clearJsonFilesIn(dir);
|
|
65
|
+
|
|
66
|
+
assert.deepStrictEqual(await namesIn(dir), []);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
test('is a no-op on a directory holding no json', async () => {
|
|
70
|
+
const dir = await makeDir();
|
|
71
|
+
|
|
72
|
+
await write(path.join(dir, 'README.md'), '# notes');
|
|
73
|
+
|
|
74
|
+
await clearJsonFilesIn(dir);
|
|
75
|
+
|
|
76
|
+
assert.deepStrictEqual(await namesIn(dir), ['README.md']);
|
|
77
|
+
});
|
|
78
|
+
});
|
package/src/github/constants.mts
CHANGED
|
@@ -34,6 +34,8 @@ export const vulnerabilityAlertsDir = path.resolve(
|
|
|
34
34
|
|
|
35
35
|
export const rulesetsDir = path.resolve(settingsDir, './rulesets');
|
|
36
36
|
|
|
37
|
+
export const variablesDir = path.resolve(settingsDir, './variables');
|
|
38
|
+
|
|
37
39
|
export const octokitHeaders = {
|
|
38
40
|
'X-GitHub-Api-Version': '2022-11-28',
|
|
39
41
|
} as const;
|
|
@@ -10,7 +10,7 @@ import { EnvironmentSettings } from '../constants.mjs';
|
|
|
10
10
|
* Settings > Environments の現在値を、宣言ファイルと同じ形にして返す。
|
|
11
11
|
*
|
|
12
12
|
* 名前順に整える。 GitHub が返す順は作成順で、環境を 1 つ足しただけで
|
|
13
|
-
*
|
|
13
|
+
* 宣言ファイルの中身が並び替わると差分が読めなくなるため。
|
|
14
14
|
*/
|
|
15
15
|
export const getAllEnvironments = async (): Promise<
|
|
16
16
|
readonly EnvironmentSettings[]
|
|
@@ -1,25 +1,22 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import 'dotenv/config';
|
|
3
3
|
import * as fs from 'node:fs/promises';
|
|
4
|
-
import * as path from 'node:path';
|
|
5
4
|
import { Arr } from 'ts-data-forge';
|
|
6
|
-
import { isDirectlyExecuted } from 'ts-repo-utils';
|
|
5
|
+
import { formatUncommittedFiles, isDirectlyExecuted } from 'ts-repo-utils';
|
|
7
6
|
import { environmentsDir } from '../constants.mjs';
|
|
7
|
+
import { settingsFilePath } from '../settings-file-path.mjs';
|
|
8
8
|
import { getAllEnvironments, setEnvironment } from './api/index.mjs';
|
|
9
|
-
import { backupEnvironments } from './backup.mjs';
|
|
10
9
|
import { type EnvironmentSettings } from './constants.mjs';
|
|
11
10
|
import { readEnvironmentFiles } from './read-environment-contents.mjs';
|
|
12
11
|
|
|
13
12
|
/**
|
|
14
13
|
* `repo-settings/environments/*.json` を Settings > Environments に反映する。
|
|
15
14
|
*
|
|
16
|
-
* ruleset と同じく、宣言に無い環境は消さない。 GUI
|
|
17
|
-
*
|
|
18
|
-
*
|
|
15
|
+
* ruleset と同じく、宣言に無い環境は消さない。 GUI で作られたものは drift
|
|
16
|
+
* 検査が報せるのであって、 apply が黙って片付けてしまうと「いつ誰が何を
|
|
17
|
+
* 作ったか」を見る機会がなくなる。
|
|
19
18
|
*/
|
|
20
19
|
export const applyEnvironments = async (): Promise<void> => {
|
|
21
|
-
await backupEnvironments(false);
|
|
22
|
-
|
|
23
20
|
const environments = await readEnvironmentFiles();
|
|
24
21
|
|
|
25
22
|
for (const environment of environments) {
|
|
@@ -37,17 +34,15 @@ export const applyEnvironments = async (): Promise<void> => {
|
|
|
37
34
|
for (const environment of applied) {
|
|
38
35
|
const str = JSON.stringify(environment, undefined, 2);
|
|
39
36
|
|
|
37
|
+
// `settingsFilePath` が `environmentsDir` の直下であることを確かめている。
|
|
40
38
|
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
|
41
39
|
await fs.writeFile(
|
|
42
|
-
|
|
40
|
+
settingsFilePath(environmentsDir, environment.name),
|
|
43
41
|
str,
|
|
44
42
|
);
|
|
45
43
|
}
|
|
46
44
|
|
|
47
|
-
|
|
48
|
-
// 呼び直しているのは、消えた環境のファイルが残らないようにするため。
|
|
49
|
-
// 整形もそこでまとめて走る。
|
|
50
|
-
await backupEnvironments();
|
|
45
|
+
await formatUncommittedFiles();
|
|
51
46
|
}
|
|
52
47
|
};
|
|
53
48
|
|
|
@@ -1,29 +1,30 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import 'dotenv/config';
|
|
3
3
|
import * as fs from 'node:fs/promises';
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
formatUncommittedFiles,
|
|
7
|
-
isDirectlyExecuted,
|
|
8
|
-
makeEmptyDir,
|
|
9
|
-
} from 'ts-repo-utils';
|
|
4
|
+
import { formatUncommittedFiles, isDirectlyExecuted } from 'ts-repo-utils';
|
|
5
|
+
import { clearJsonFilesIn } from '../clear-json-files.mjs';
|
|
10
6
|
import { environmentsDir } from '../constants.mjs';
|
|
7
|
+
import { settingsFilePath } from '../settings-file-path.mjs';
|
|
11
8
|
import { getAllEnvironments } from './api/index.mjs';
|
|
12
9
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Settings > Environments の現在値を宣言ファイルへ撮り直す。
|
|
12
|
+
*
|
|
13
|
+
* ruleset と同じく、先に直下の `*.json` を消してから書く。理由は
|
|
14
|
+
* {@link clearJsonFilesIn} を参照。
|
|
15
|
+
*/
|
|
16
16
|
export const backupEnvironments = async (
|
|
17
17
|
fmt: boolean = true,
|
|
18
18
|
): Promise<void> => {
|
|
19
|
-
await makeEmptyDir(backupDir);
|
|
20
|
-
|
|
21
19
|
const environments = await getAllEnvironments();
|
|
22
20
|
|
|
21
|
+
await clearJsonFilesIn(environmentsDir);
|
|
22
|
+
|
|
23
23
|
for (const environment of environments) {
|
|
24
|
+
// `settingsFilePath` が `environmentsDir` の直下であることを確かめている。
|
|
24
25
|
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
|
25
26
|
await fs.writeFile(
|
|
26
|
-
|
|
27
|
+
settingsFilePath(environmentsDir, environment.name),
|
|
27
28
|
JSON.stringify(environment, undefined, 2),
|
|
28
29
|
);
|
|
29
30
|
}
|
|
@@ -59,7 +59,7 @@ export const EnvironmentSettings = t.record({
|
|
|
59
59
|
/**
|
|
60
60
|
* `custom_branch_policies` が `true` のときの pattern 一覧。
|
|
61
61
|
*
|
|
62
|
-
*
|
|
62
|
+
* それ以外のときは空配列でなければならない(`applyEnvironments` が拒否する)。
|
|
63
63
|
* GitHub 側は別エンドポイントだが、「どの ref から deploy できるか」を
|
|
64
64
|
* 決めているのは選択と pattern の組で、片方だけ見ても意味を成さない。
|
|
65
65
|
*/
|
|
@@ -10,10 +10,6 @@ export const readEnvironmentFiles = async (): Promise<
|
|
|
10
10
|
readonly EnvironmentSettings[]
|
|
11
11
|
> => readFilesIn(environmentsDir);
|
|
12
12
|
|
|
13
|
-
export const readEnvironmentBackupFiles = async (): Promise<
|
|
14
|
-
readonly EnvironmentSettings[]
|
|
15
|
-
> => readFilesIn(path.resolve(environmentsDir, './bk'));
|
|
16
|
-
|
|
17
13
|
const readFilesIn = async (
|
|
18
14
|
dir: string,
|
|
19
15
|
): Promise<readonly EnvironmentSettings[]> => {
|
package/src/github/index.mts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
export * from './actions-settings/index.mjs';
|
|
2
|
+
export * from './clear-json-files.mjs';
|
|
2
3
|
export * from './constants.mjs';
|
|
3
4
|
export * from './environments/index.mjs';
|
|
4
5
|
export * from './pages/index.mjs';
|
|
5
6
|
export * from './repository/index.mjs';
|
|
6
7
|
export * from './resolve-target-repo.mjs';
|
|
7
8
|
export * from './ruleset/index.mjs';
|
|
9
|
+
export * from './settings-file-path.mjs';
|
|
8
10
|
export * from './variables/index.mjs';
|
|
9
11
|
export * from './vulnerability-alerts/index.mjs';
|
|
@@ -43,12 +43,6 @@ export const applyPagesSettings = async (): Promise<void> => {
|
|
|
43
43
|
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
|
44
44
|
await fs.writeFile(settingsPath, str);
|
|
45
45
|
|
|
46
|
-
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
|
47
|
-
await fs.writeFile(
|
|
48
|
-
path.resolve(pagesSettingsDir, 'bk', settingsJsonName),
|
|
49
|
-
str,
|
|
50
|
-
);
|
|
51
|
-
|
|
52
46
|
await formatUncommittedFiles();
|
|
53
47
|
}
|
|
54
48
|
};
|
|
@@ -2,35 +2,44 @@
|
|
|
2
2
|
import 'dotenv/config';
|
|
3
3
|
import * as fs from 'node:fs/promises';
|
|
4
4
|
import * as path from 'node:path';
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
isDirectlyExecuted,
|
|
8
|
-
makeEmptyDir,
|
|
9
|
-
} from 'ts-repo-utils';
|
|
5
|
+
import { formatUncommittedFiles, isDirectlyExecuted } from 'ts-repo-utils';
|
|
6
|
+
import { clearJsonFilesIn } from '../clear-json-files.mjs';
|
|
10
7
|
import { pagesSettingsDir, settingsJsonName } from '../constants.mjs';
|
|
11
8
|
import { getPagesSettings } from './api/index.mjs';
|
|
12
9
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Settings > Pages の現在値を宣言ファイルへ撮り直す。
|
|
12
|
+
*
|
|
13
|
+
* **Pages が無効なら宣言も消える。** 他のターゲットと同じ規則にしてある — 撮り
|
|
14
|
+
* 直したあとに在るものが live から取れたものそのもの、という性質を、ここだけ
|
|
15
|
+
* 崩さない。無効になったことが `git status` に削除として出る。
|
|
16
|
+
*
|
|
17
|
+
* 無効化と読み取り失敗を区別できないという弱点は残るが、`getPagesSettings` が
|
|
18
|
+
* `undefined` を返すのは 404 のときだけで、それ以外の失敗は例外になる。消えた
|
|
19
|
+
* 宣言はコミットしなければ失われない。
|
|
20
|
+
*/
|
|
16
21
|
export const backupPagesSettings = async (
|
|
17
22
|
fmt: boolean = true,
|
|
18
23
|
): Promise<void> => {
|
|
19
|
-
await makeEmptyDir(backupDir);
|
|
20
|
-
|
|
21
24
|
const settings = await getPagesSettings();
|
|
22
25
|
|
|
26
|
+
await clearJsonFilesIn(pagesSettingsDir);
|
|
27
|
+
|
|
23
28
|
if (settings === undefined) {
|
|
24
29
|
console.warn(
|
|
25
|
-
'GitHub Pages is not enabled for this repository;
|
|
30
|
+
'GitHub Pages is not enabled for this repository; the declaration was removed.',
|
|
26
31
|
);
|
|
27
32
|
|
|
33
|
+
if (fmt) {
|
|
34
|
+
await formatUncommittedFiles();
|
|
35
|
+
}
|
|
36
|
+
|
|
28
37
|
return;
|
|
29
38
|
}
|
|
30
39
|
|
|
31
40
|
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
|
32
41
|
await fs.writeFile(
|
|
33
|
-
path.resolve(
|
|
42
|
+
path.resolve(pagesSettingsDir, settingsJsonName),
|
|
34
43
|
JSON.stringify(settings, undefined, 2),
|
|
35
44
|
);
|
|
36
45
|
|