del-repos
Version:
A command-line tool for bulk deleting GitHub or Gitee repositories
103 lines (102 loc) • 4.57 kB
JavaScript
;
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;