UNPKG

takin

Version:

Front end engineering base toolchain and scaffold

95 lines 3.07 kB
"use strict"; 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