UNPKG

del-repos

Version:

A command-line tool for bulk deleting GitHub or Gitee repositories

103 lines (102 loc) 4.57 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.deleteGithubRepos = exports.fetchGithubRepos = void 0; const axios_1 = __importDefault(require("axios")); const ora_1 = __importDefault(require("ora")); const fs_1 = __importDefault(require("fs")); const utils_1 = require("../utils"); const GITHUB_API_BASE = 'https://api.github.com'; /** * 获取 Github 仓库 * @param token Github token * @param type 仓库类型: owner || all * @returns 仓库列表 */ const fetchGithubRepos = (token, type) => __awaiter(void 0, void 0, void 0, function* () { let page = 1; let repos = []; let hasMore = true; while (hasMore) { // more information: https://docs.github.com/en/rest/repos/repos?apiVersion=2022-11-28#list-repositories-for-the-authenticated-user const response = yield axios_1.default.get(`${GITHUB_API_BASE}/user/repos`, { headers: { Authorization: `token ${token}`, }, params: { type: type, sort: 'updated', direction: 'desc', page, per_page: 100, }, }); repos = repos.concat(response.data); hasMore = response.data.length === 100; page++; } // 将 repos 写成一个 json 文件,放到当前目录下 fs_1.default.writeFileSync('./repos.json', JSON.stringify(repos, null, 2)); return repos.map(repo => `${repo.full_name} \u001b]8;;${repo.html_url}\u0007🔗\u001b]8;;\u0007`); }); exports.fetchGithubRepos = fetchGithubRepos; /** * 删除 Github 仓库 * @param token Github token * @param repos 待删除的仓库 * @returns 删除结果 */ const deleteGithubRepos = (token, repos) => __awaiter(void 0, void 0, void 0, function* () { var _a, _b, _c, _d; const spinner = (0, ora_1.default)(); let username = ''; try { const response = yield axios_1.default.get(`${GITHUB_API_BASE}/user`, { headers: { Authorization: `token ${token}`, }, }); username = response.data.login; } catch (error) { spinner.fail(`Failed to get username. ${((_b = (_a = error.response) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.message) || error.message}`); return; } for (let repo of repos) { spinner.start(`Deleting repository ${repo}...`); try { repo = (0, utils_1.extractPath)(repo); const deleteUrl = `${GITHUB_API_BASE}/repos/${username}/${repo}`; // more information: https://docs.github.com/en/rest/repos/repos?apiVersion=2022-11-28#get-a-repository yield axios_1.default.get(deleteUrl, { headers: { Authorization: `token ${token}`, }, }); // more information: https://docs.github.com/en/rest/repos/repos?apiVersion=2022-11-28#delete-a-repository yield axios_1.default.delete(deleteUrl, { headers: { Authorization: `token ${token}`, }, }); spinner.succeed(`Deleted repository ${repo}.`); } catch (error) { const errorMessage = ((_d = (_c = error.response) === null || _c === void 0 ? void 0 : _c.data) === null || _d === void 0 ? void 0 : _d.message) || error.message; spinner.fail(`Failed to delete repository ${repo}. ${errorMessage}`); console.error(`Error details: ${errorMessage}`); } } }); exports.deleteGithubRepos = deleteGithubRepos;