t-comm
Version:
专业、稳定、纯粹的工具库
328 lines (325 loc) • 12 kB
JavaScript
import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
import _regeneratorRuntime from '@babel/runtime/regenerator';
import { _ as __awaiter } from '../tslib.es6-848120af.js';
import { resolveBaseUrl, instance } from './helper.mjs';
import 'axios';
// ---------------------------------------------------------------------------
// Group Detail & List
// ---------------------------------------------------------------------------
/**
* 获取项目组的详细信息以及项目组下所有项目。
*
* 对应 API: `GET /api/v3/groups/:id`
*
* @see https://code.tencent.com/help/api/group#获取项目组的详细信息以及项目组下所有项目
* @example
*
* fetchGroupDetail({
* groupId: 'pmd-mobile',
* privateToken: 'xxxxx',
* includeSubgroups: true,
* }).then((detail) => {
* console.log(detail.projects);
* console.log(detail.sub_projects);
* })
*/
function fetchGroupDetail(_ref) {
var groupId = _ref.groupId,
privateToken = _ref.privateToken,
baseUrl = _ref.baseUrl,
_ref$includeSubgroups = _ref.includeSubgroups,
includeSubgroups = _ref$includeSubgroups === void 0 ? false : _ref$includeSubgroups;
return __awaiter(this, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
var url;
return _regeneratorRuntime.wrap(function (_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
url = "/api/v3/groups/".concat(encodeURIComponent(String(groupId)));
url = resolveBaseUrl(baseUrl, url);
return _context.abrupt("return", instance({
url: url,
method: 'GET',
params: {
include_subgroups: includeSubgroups
},
headers: {
'PRIVATE-TOKEN': privateToken
}
}).then(function (res) {
return res.data;
}));
case 1:
case "end":
return _context.stop();
}
}, _callee);
}));
}
/**
* 获取 / 搜索项目组列表。
*
* 对应 API: `GET /api/v3/groups`
*
* @see https://code.tencent.com/help/api/group#获取项目组列表
* @example
*
* // 搜索名称包含 'pmd' 的项目组
* fetchGroups({
* privateToken: 'xxxxx',
* search: 'pmd',
* page: 1,
* perPage: 20,
* }).then((groups) => {
* console.log(groups.length);
* })
*/
function fetchGroups(_ref2) {
var privateToken = _ref2.privateToken,
baseUrl = _ref2.baseUrl,
search = _ref2.search,
owned = _ref2.owned,
minAccessLevel = _ref2.minAccessLevel,
createdByMe = _ref2.createdByMe,
excludeOrgGroup = _ref2.excludeOrgGroup,
_ref2$page = _ref2.page,
page = _ref2$page === void 0 ? 1 : _ref2$page,
_ref2$perPage = _ref2.perPage,
perPage = _ref2$perPage === void 0 ? 20 : _ref2$perPage;
return __awaiter(this, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
var url;
return _regeneratorRuntime.wrap(function (_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
url = '/api/v3/groups';
url = resolveBaseUrl(baseUrl, url);
return _context2.abrupt("return", instance({
url: url,
method: 'GET',
params: {
search: search,
owned: owned,
min_access_level: minAccessLevel,
created_by_me: createdByMe,
exclude_org_group: excludeOrgGroup,
page: page,
per_page: perPage
},
headers: {
'PRIVATE-TOKEN': privateToken
}
}).then(function (res) {
return res.data;
}));
case 1:
case "end":
return _context2.stop();
}
}, _callee2);
}));
}
/**
* 分页获取全部项目组列表(自动翻页)。
*
* 基于 {@link fetchGroups} 封装,自动遍历所有分页。
* @example
*
* // 一次拿到当前 token 权限下的所有项目组
* fetchAllGroups({
* privateToken: 'xxxxx',
* }).then((groups) => {
* console.log(groups.length);
* })
*/
function fetchAllGroups(_ref3) {
var privateToken = _ref3.privateToken,
baseUrl = _ref3.baseUrl,
search = _ref3.search,
owned = _ref3.owned,
minAccessLevel = _ref3.minAccessLevel,
createdByMe = _ref3.createdByMe,
excludeOrgGroup = _ref3.excludeOrgGroup;
return __awaiter(this, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
var perPage, allGroups, page, groups;
return _regeneratorRuntime.wrap(function (_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
perPage = 100;
allGroups = [];
page = 1; // eslint-disable-next-line no-constant-condition
case 1:
_context3.next = 2;
return fetchGroups({
privateToken: privateToken,
baseUrl: baseUrl,
search: search,
owned: owned,
minAccessLevel: minAccessLevel,
createdByMe: createdByMe,
excludeOrgGroup: excludeOrgGroup,
page: page,
perPage: perPage
});
case 2:
groups = _context3.sent;
allGroups.push.apply(allGroups, _toConsumableArray(groups));
if (!(groups.length < perPage)) {
_context3.next = 3;
break;
}
return _context3.abrupt("continue", 4);
case 3:
page += 1;
_context3.next = 1;
break;
case 4:
return _context3.abrupt("return", allGroups);
case 5:
case "end":
return _context3.stop();
}
}, _callee3);
}));
}
// ---------------------------------------------------------------------------
// Group Projects
// ---------------------------------------------------------------------------
/**
* 获取某个组下所有项目(通过 `GET /api/v3/groups/:id` 接口,速度更快)。
*
* 当 `includeSubgroups` 为 true 时,会同时返回子组下的项目(`sub_projects`)。
*
* 兼容旧调用方式:返回值既是数组,又带有 `projects` 属性。
* - 旧方式:`res.projects.map(item => ...)`
* - 新方式:`res.map(item => ...)`
* @example
*
* // 获取 pmd-mobile 组下(含子组)所有项目
* fetchAllProjectsInGroup({
* groupName: 'pmd-mobile',
* privateToken: 'xxxxx',
* includeSubgroups: true,
* }).then((res) => {
* res.forEach(p => console.log(p.path_with_namespace));
* })
*/
function fetchAllProjectsInGroup(_ref4) {
var groupName = _ref4.groupName,
privateToken = _ref4.privateToken,
baseUrl = _ref4.baseUrl,
_ref4$includeSubgroup = _ref4.includeSubgroups,
includeSubgroups = _ref4$includeSubgroup === void 0 ? true : _ref4$includeSubgroup;
return __awaiter(this, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
var detail, allProjects, result;
return _regeneratorRuntime.wrap(function (_context4) {
while (1) switch (_context4.prev = _context4.next) {
case 0:
_context4.next = 1;
return fetchGroupDetail({
groupId: groupName,
privateToken: privateToken,
baseUrl: baseUrl,
includeSubgroups: includeSubgroups
});
case 1:
detail = _context4.sent;
allProjects = [].concat(_toConsumableArray(detail.projects || []), _toConsumableArray(includeSubgroups ? detail.sub_projects || [] : [])); // 兼容旧调用方式 res.projects.map(...)
result = allProjects;
result.projects = allProjects;
return _context4.abrupt("return", result);
case 2:
case "end":
return _context4.stop();
}
}, _callee4);
}));
}
/**
* 递归获取某个组(含所有子组)下的全部仓库列表,支持多种过滤条件。
*
* 通过 `GET /api/v3/groups/:id`(`include_subgroups=true`)一次性获取
* 组及子组下所有项目,避免逐页遍历 `/projects` 接口,速度更快。
*
* @param {object} options 输入配置
* @param {string} options.groupName 组名称或完整路径,如 'pmd-mobile'
* @param {string} options.privateToken 密钥
* @param {string} [options.baseUrl] 自定义 API 基础路径,如 https://git.woa.com
* @param {IGroupProjectFilter} [options.filter] 过滤配置
* @returns {Promise<Array<IGroupProject>>} 过滤后的仓库列表
* @example
*
* // 获取 pmd-mobile 组下所有仓库,排除 test 子组、归档仓库,以及前一天没有活跃的仓库
* const yesterday = new Date();
* yesterday.setDate(yesterday.getDate() - 1);
*
* const projects = await getGroupProjectsRecursive({
* groupName: 'pmd-mobile',
* privateToken: 'xxxxx',
* baseUrl: 'https://git.woa.com',
* filter: {
* excludePathPrefixes: ['pmd-mobile/test/'],
* excludeArchived: true,
* lastActivityAfter: yesterday,
* filterFn: (project) => !project.name.startsWith('deprecated-'),
* },
* });
*
* console.log(projects);
*/
function getGroupProjectsRecursive(_ref5) {
var groupName = _ref5.groupName,
privateToken = _ref5.privateToken,
baseUrl = _ref5.baseUrl,
_ref5$filter = _ref5.filter,
filter = _ref5$filter === void 0 ? {} : _ref5$filter;
return __awaiter(this, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee5() {
var filterFn, _filter$excludePathPr, excludePathPrefixes, _filter$excludeArchiv, excludeArchived, lastActivityAfter, lastActivityThreshold, detail, allProjects;
return _regeneratorRuntime.wrap(function (_context5) {
while (1) switch (_context5.prev = _context5.next) {
case 0:
filterFn = filter.filterFn, _filter$excludePathPr = filter.excludePathPrefixes, excludePathPrefixes = _filter$excludePathPr === void 0 ? [] : _filter$excludePathPr, _filter$excludeArchiv = filter.excludeArchived, excludeArchived = _filter$excludeArchiv === void 0 ? true : _filter$excludeArchiv, lastActivityAfter = filter.lastActivityAfter;
lastActivityThreshold = lastActivityAfter ? new Date(lastActivityAfter).getTime() : null; // 通过 /groups/:id 接口一次性获取组及子组下的项目
_context5.next = 1;
return fetchGroupDetail({
groupId: groupName,
privateToken: privateToken,
baseUrl: baseUrl,
includeSubgroups: true
});
case 1:
detail = _context5.sent;
allProjects = [].concat(_toConsumableArray(detail.projects || []), _toConsumableArray(detail.sub_projects || [])); // 应用过滤条件
return _context5.abrupt("return", allProjects.filter(function (project) {
// 过滤已归档
if (excludeArchived && project.archived) {
return false;
}
// 过滤路径前缀
if (excludePathPrefixes.length > 0) {
var matched = excludePathPrefixes.some(function (prefix) {
return project.path_with_namespace.startsWith(prefix);
});
if (matched) {
return false;
}
}
// 过滤最后活跃时间
if (lastActivityThreshold !== null && project.last_activity_at) {
var projectTime = new Date(project.last_activity_at).getTime();
if (projectTime < lastActivityThreshold) {
return false;
}
}
// 自定义过滤函数
if (filterFn && !filterFn(project)) {
return false;
}
return true;
}));
case 2:
case "end":
return _context5.stop();
}
}, _callee5);
}));
}
export { fetchAllGroups, fetchAllProjectsInGroup, fetchGroupDetail, fetchGroups, getGroupProjectsRecursive };