diff --git a/README.md b/README.md index cd0f90af6a..9267bf1703 100644 --- a/README.md +++ b/README.md @@ -451,3 +451,15 @@ Steps: ## LICENSE - [MIT](https://github.com/kintone/cli-kintone/blob/main/LICENSE) + +## Author + +Cybozu, Inc. + +## Contributors + + + +[tasshi-me avatar](https://github.com/tasshi-me) [hung-cybo avatar](https://github.com/hung-cybo) [tuanphamcybozu avatar](https://github.com/tuanphamcybozu) [chick-p avatar](https://github.com/chick-p) [shisama avatar](https://github.com/shisama) [zaki-yama avatar](https://github.com/zaki-yama) [koba04 avatar](https://github.com/koba04) [b4h0-c4t avatar](https://github.com/b4h0-c4t) [nakajmg avatar](https://github.com/nakajmg) [shintaroNagata avatar](https://github.com/shintaroNagata) [kjmnmt avatar](https://github.com/kjmnmt) [ueokande avatar](https://github.com/ueokande) [ksm-cy avatar](https://github.com/ksm-cy) [ryounasso avatar](https://github.com/ryounasso) [jesslynvc avatar](https://github.com/jesslynvc) [ahandsel avatar](https://github.com/ahandsel) + + diff --git a/package.json b/package.json index 73f5166a5d..1a1288d838 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,8 @@ "clean": "rimraf lib bin artifacts dist", "clean:test": "rimraf allure-results allure-report", "doc:start": "pnpm --filter ./website start", - "doc:build": "pnpm --filter ./website build" + "doc:build": "pnpm --filter ./website build", + "update-contributors": "ts-node ./scripts/update-contributors.ts" }, "repository": { "type": "git", @@ -68,15 +69,21 @@ "@cucumber/cucumber": "^10.8.0", "@cybozu/eslint-config": "^23.0.0", "@cybozu/license-manager": "^1.2.1", + "@octokit/rest": "^20.1.1", "@types/inquirer": "^8.2.10", "@types/jest": "^29.5.12", "@types/node": "^18.19.34", "@types/rollup-plugin-auto-external": "^2.0.5", "@types/yargs": "^17.0.32", "@vercel/ncc": "^0.38.1", + "ajv": "^8.16.0", + "allure-commandline": "^2.29.0", + "allure-cucumberjs": "^2.15.1", + "allure-jest": "^2.15.1", "babel-jest": "^29.7.0", "cross-env": "^7.0.3", "eslint": "^8.57.0", + "glob": "^10.4.1", "jest": "^29.7.0", "npm-run-all": "^4.1.5", "pkg": "^5.8.1", @@ -84,12 +91,7 @@ "rimraf": "^5.0.7", "ts-node": "^10.9.2", "typescript": "^5.4.5", - "zx": "^8.1.2", - "ajv": "^8.16.0", - "allure-commandline": "^2.29.0", - "allure-cucumberjs": "^2.15.1", - "allure-jest": "^2.15.1", - "glob": "^10.4.1" + "zx": "^8.1.2" }, "dependencies": { "@kintone/rest-api-client": "^5.5.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f375aafd99..8c35b30934 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -54,6 +54,9 @@ importers: '@cybozu/license-manager': specifier: ^1.2.1 version: 1.2.1 + '@octokit/rest': + specifier: ^20.1.1 + version: 20.1.1 '@types/inquirer': specifier: ^8.2.10 version: 8.2.10 @@ -4465,6 +4468,109 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 + /@octokit/auth-token@4.0.0: + resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} + engines: {node: '>= 18'} + dev: true + + /@octokit/core@5.2.0: + resolution: {integrity: sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==} + engines: {node: '>= 18'} + dependencies: + '@octokit/auth-token': 4.0.0 + '@octokit/graphql': 7.1.0 + '@octokit/request': 8.4.0 + '@octokit/request-error': 5.1.0 + '@octokit/types': 13.5.0 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.1 + dev: true + + /@octokit/endpoint@9.0.5: + resolution: {integrity: sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==} + engines: {node: '>= 18'} + dependencies: + '@octokit/types': 13.5.0 + universal-user-agent: 6.0.1 + dev: true + + /@octokit/graphql@7.1.0: + resolution: {integrity: sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==} + engines: {node: '>= 18'} + dependencies: + '@octokit/request': 8.4.0 + '@octokit/types': 13.5.0 + universal-user-agent: 6.0.1 + dev: true + + /@octokit/openapi-types@22.2.0: + resolution: {integrity: sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==} + dev: true + + /@octokit/plugin-paginate-rest@11.3.1(@octokit/core@5.2.0): + resolution: {integrity: sha512-ryqobs26cLtM1kQxqeZui4v8FeznirUsksiA+RYemMPJ7Micju0WSkv50dBksTuZks9O5cg4wp+t8fZ/cLY56g==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '5' + dependencies: + '@octokit/core': 5.2.0 + '@octokit/types': 13.5.0 + dev: true + + /@octokit/plugin-request-log@4.0.1(@octokit/core@5.2.0): + resolution: {integrity: sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '5' + dependencies: + '@octokit/core': 5.2.0 + dev: true + + /@octokit/plugin-rest-endpoint-methods@13.2.2(@octokit/core@5.2.0): + resolution: {integrity: sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': ^5 + dependencies: + '@octokit/core': 5.2.0 + '@octokit/types': 13.5.0 + dev: true + + /@octokit/request-error@5.1.0: + resolution: {integrity: sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==} + engines: {node: '>= 18'} + dependencies: + '@octokit/types': 13.5.0 + deprecation: 2.3.1 + once: 1.4.0 + dev: true + + /@octokit/request@8.4.0: + resolution: {integrity: sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==} + engines: {node: '>= 18'} + dependencies: + '@octokit/endpoint': 9.0.5 + '@octokit/request-error': 5.1.0 + '@octokit/types': 13.5.0 + universal-user-agent: 6.0.1 + dev: true + + /@octokit/rest@20.1.1: + resolution: {integrity: sha512-MB4AYDsM5jhIHro/dq4ix1iWTLGToIGk6cWF5L6vanFaMble5jTX/UBQyiv05HsWnwUtY8JrfHy2LWfKwihqMw==} + engines: {node: '>= 18'} + dependencies: + '@octokit/core': 5.2.0 + '@octokit/plugin-paginate-rest': 11.3.1(@octokit/core@5.2.0) + '@octokit/plugin-request-log': 4.0.1(@octokit/core@5.2.0) + '@octokit/plugin-rest-endpoint-methods': 13.2.2(@octokit/core@5.2.0) + dev: true + + /@octokit/types@13.5.0: + resolution: {integrity: sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==} + dependencies: + '@octokit/openapi-types': 22.2.0 + dev: true + /@pkgjs/parseargs@0.11.0: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -6021,6 +6127,10 @@ packages: /batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + /before-after-hook@2.2.3: + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + dev: true + /big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} @@ -7073,6 +7183,10 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} + /deprecation@2.3.1: + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + dev: true + /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -13889,6 +14003,10 @@ packages: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 + /universal-user-agent@6.0.1: + resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} + dev: true + /universalify@0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} diff --git a/scripts/update-contributors.ts b/scripts/update-contributors.ts new file mode 100644 index 0000000000..be8e0bfea0 --- /dev/null +++ b/scripts/update-contributors.ts @@ -0,0 +1,50 @@ +// eslint-disable-next-line node/no-unpublished-import +import { Octokit } from "@octokit/rest"; +import * as fs from "fs/promises"; + +const ignoredUsers = [ + "renovate[bot]", + "github-actions[bot]", + "trigger-github-actions-release[bot]", + "renovate-bot", +]; + +const file = "README.md"; + +(async () => { + const octokit = new Octokit(); + + // We use stats because the response of octokit.repos.listContributors is missing some contributors. + const resp = await octokit.repos.getContributorsStats({ + owner: "kintone", + repo: "cli-kintone", + }); + + const contributors = resp.data + .filter( + (c) => + c.author?.type === "User" && !ignoredUsers.includes(c.author.login), + ) + .sort((c1, c2) => c2.total - c1.total) + .map((c) => ({ + login: c.author?.login, + avatar_url: c.author?.avatar_url, + html_url: c.author?.html_url, + })); + + const contributorIcons = contributors + .map( + (contributor) => + `[${contributor.login} avatar](${contributor.html_url})`, + ) + .join(" "); + const newCredits = `\n\n${contributorIcons}\n\n`; + + const content = await fs.readFile(file, { encoding: "utf-8" }); + const newContent = content.replace( + /.+/gs, + newCredits, + ); + + await fs.writeFile(file, newContent); +})();