takin
Version:
Front end engineering base toolchain and scaffold
95 lines • 3.07 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.download = exports.getName = exports.supportProtocol = exports.parseOptions = void 0;
const fs_extra_1 = __importDefault(require("fs-extra"));
const got_1 = __importDefault(require("got"));
const lodash_1 = __importDefault(require("lodash"));
const tar_fs_1 = __importDefault(require("tar-fs"));
const zlib_1 = __importDefault(require("zlib"));
const errors_1 = require("../errors");
const logger_1 = require("../logger");
const SUPPORT_PROTOCOLS = ['https:', 'http:', 'ftp:'];
/**
* 解析 tar 链接或选项
* @param urlOrOptions - 链接或选项
* @returns 解析后的 tar 链接或选项
*/
function parseOptions(urlOrOptions) {
var _a;
let url;
let options = {
followRedirect: true,
timeout: 120 * 1000,
method: 'get'
};
let strip = 1;
if (typeof urlOrOptions === 'string') {
url = urlOrOptions;
}
else {
url = urlOrOptions.url;
strip = (_a = urlOrOptions.strip) !== null && _a !== void 0 ? _a : strip;
options = { ...options, ...urlOrOptions };
}
if (!url)
throw new errors_1.DownloaderError('解析 tar 选项错误: 缺少 url');
return { ...options, url, strip };
}
exports.parseOptions = parseOptions;
/**
* 判断是否支持处理当前链接
* @param url - 链接
* @returns 是否支持该链接
*/
function supportProtocol(url) {
if (!url)
return false;
try {
const urlObj = new URL(url);
if (SUPPORT_PROTOCOLS.includes(urlObj.protocol))
return true;
return false;
}
catch (error) {
return false;
}
}
exports.supportProtocol = supportProtocol;
/**
* 基于 tar 压缩包选项获取名称
* @param tarOptions - tar 压缩包选项
* @returns 名称
*/
function getName(tarOptions) {
const url = new URL(tarOptions.url);
return (url.pathname || '').trim().replace(/^\//, '') || url.hostname;
}
exports.getName = getName;
/**
* 下载 tar 压缩包到指定目录
* @param tarOptions - tar 压缩包选项
* @param dest - 指定目录地址
*/
async function download(tarOptions, dest) {
// 这里只确保文件夹存在
// 因为支持 strip, 所以如果删除文件夹可能会导致解压缩的外层文件夹被删
await fs_extra_1.default.ensureDir(dest);
await new Promise((resolve, reject) => {
const url = tarOptions.url;
const strip = tarOptions.strip;
logger_1.logger.debug('Tar 下载信息: ', tarOptions);
got_1.default
.stream(url, lodash_1.default.omit(tarOptions, ['url', 'strip']))
.on('error', reject)
.pipe(zlib_1.default.createGunzip())
.pipe(tar_fs_1.default.extract(dest, {
strip
}))
.on('finish', resolve);
});
}
exports.download = download;
//# sourceMappingURL=tar.js.map