t-comm
Version:
专业、稳定、纯粹的工具库
107 lines (100 loc) • 4.13 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var axios = require('axios');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var axios__default = /*#__PURE__*/_interopDefaultLegacy(axios);
var instance = axios__default["default"];
var T_GIT_BASE_URL = 'https://git.woa.com/api/v3';
/**
* 处理 baseUrl,去掉尾部斜杠,并在 path 以 /api 开头时去掉 baseUrl 末尾可能重复的 /api/v3 后缀,然后拼接请求路径。
*
* 使用场景:tgit 中所有请求统一通过此函数拼接完整 URL,防止 baseUrl 末尾带 /api/v3 导致路径重复。
*
* @param {string} baseUrl 基础路径,如 https://git.woa.com 或 https://git.woa.com/api/v3
* @param {string} path 请求路径,如 /api/v3/projects/xxx/merge_requests
* @returns {string} 拼接后的完整 URL
* @example
*
* resolveBaseUrl('https://git.woa.com', '/api/v3/projects/xxx')
* // => 'https://git.woa.com/api/v3/projects/xxx'
*
* resolveBaseUrl('https://git.woa.com/api/v3', '/api/v3/projects/xxx')
* // => 'https://git.woa.com/api/v3/projects/xxx'
*
* resolveBaseUrl('https://git.woa.com/api/v3/', '/api/v3/projects/xxx')
* // => 'https://git.woa.com/api/v3/projects/xxx'
*
* // path 不以 /api 开头时,保留 baseUrl 末尾的 /api/v3
* resolveBaseUrl('https://git.woa.com/api/v3', '/projects/xxx')
* // => 'https://git.woa.com/api/v3/projects/xxx'
*
* // 不传 baseUrl 时,使用统一默认值 T_GIT_BASE_URL
* resolveBaseUrl(undefined, '/api/v3/projects/xxx')
* // => 'https://git.woa.com/api/v3/projects/xxx'
*/
function resolveBaseUrl() {
var baseUrl = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : T_GIT_BASE_URL;
var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
// 兼容显式传入空字符串的场景:fallback 到默认值
var effective = baseUrl || T_GIT_BASE_URL;
// 去掉尾部斜杠
var url = effective.replace(/\/+$/, '');
// 仅当 path 以 /api 开头时,才去掉 baseUrl 尾部的 /api/v3(防止重复)
if (path.startsWith('/api')) {
url = url.replace(/\/api\/v3$/, '');
}
return "".concat(url).concat(path);
}
/**
* 对 projectName(string | number)进行统一编码,用于拼接到 URL path 中。
*
* - 数字:直接转成字符串(项目 ID)
* - 字符串:按 path 段进行 URI 编码,例如 `group/sub/repo` -> `group%2Fsub%2Frepo`
*
* @param {string | number} projectName 项目名称或项目 ID
* @returns {string} 编码后的字符串
* @example
*
* encodeProject('group/sub/repo') // 'group%2Fsub%2Frepo'
* encodeProject(12345) // '12345'
*/
function encodeProject(projectName) {
return typeof projectName === 'number' ? String(projectName) : encodeURIComponent(projectName);
}
/**
* 将 base64 字符串按 utf-8 解码(兼容 Node 与浏览器环境)。
*
* 工蜂 GET /repository/files 接口返回的 `content` 字段是 base64 编码的,
* 调用方通常需要解码后再使用,本函数将该逻辑内聚到一处。
*
* @param {string} content base64 内容
* @returns {string} utf-8 解码后的字符串
* @example
*
* base64DecodeUtf8('aGVsbG8='); // 'hello'
* base64DecodeUtf8('5L2g5aW9'); // '你好'
*/
function base64DecodeUtf8(content) {
if (typeof Buffer !== 'undefined') {
return Buffer.from(content, 'base64').toString('utf-8');
}
// 浏览器兜底
// eslint-disable-next-line @typescript-eslint/no-explicit-any
var g = typeof globalThis !== 'undefined' ? globalThis : {};
if (typeof g.atob === 'function') {
var bin = g.atob(content);
try {
return decodeURIComponent(bin.split('').map(function (c) {
return "%".concat("00".concat(c.charCodeAt(0).toString(16)).slice(-2));
}).join(''));
} catch (_a) {
return bin;
}
}
return content;
}
exports.T_GIT_BASE_URL = T_GIT_BASE_URL;
exports.base64DecodeUtf8 = base64DecodeUtf8;
exports.encodeProject = encodeProject;
exports.instance = instance;
exports.resolveBaseUrl = resolveBaseUrl;