takin
Version:
Front end engineering base toolchain and scaffold
173 lines • 6.19 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.tryDownloadByUrl = exports.autoDetectDownloaderTypeAndOptions = exports.parseAndDownload = exports.download = exports.parseOptions = exports.getAllDownloadTypes = exports.chooseDownloadType = exports.getModuleName = exports.registerDownloader = exports.npm = exports.tar = exports.git = exports.link = exports.file = void 0;
const lodash_1 = __importDefault(require("lodash"));
const errors_1 = require("../errors");
const logger_1 = require("../logger");
const file = __importStar(require("./file"));
exports.file = file;
const git = __importStar(require("./git"));
exports.git = git;
const link = __importStar(require("./link"));
exports.link = link;
const npm = __importStar(require("./npm"));
exports.npm = npm;
const tar = __importStar(require("./tar"));
exports.tar = tar;
const DOWNLOADERS = new Map();
/**
* 注册新的下载器
* @param type - 下载器类型
* @param downloader - 下载器
*/
function registerDownloader(type, downloader) {
DOWNLOADERS.set(type, downloader);
}
exports.registerDownloader = registerDownloader;
/**
* 获取下载模块名称
* @param type - 下载类型
* @param options - 下载配置
* @returns 模块名称
*/
function getModuleName(type, options) {
return getDownloader(type).getName(options);
}
exports.getModuleName = getModuleName;
function getDownloader(type) {
const downloader = DOWNLOADERS.get(type);
if (!downloader)
throw new errors_1.DownloaderError(`不支持的下载类型: ${type}`);
return downloader;
}
/**
* 基于下载配置选择下载方式
* @param options - 下载配置
* @returns 下载类型
*/
function chooseDownloadType(options) {
for (const [type] of DOWNLOADERS) {
if (lodash_1.default.isEmpty(options === null || options === void 0 ? void 0 : options[type]))
continue;
return type;
}
}
exports.chooseDownloadType = chooseDownloadType;
/**
* 获取所有下载类型
*/
function getAllDownloadTypes() {
return Array.from(DOWNLOADERS.keys());
}
exports.getAllDownloadTypes = getAllDownloadTypes;
/**
* 解析下载链接或选项
* @param type - 下载类型
* @param options - 下载链接或选项
* @returns 解析后的下载配置
*/
function parseOptions(type, options) {
return getDownloader(type).parseOptions(options);
}
exports.parseOptions = parseOptions;
/**
* 尝试通过不同的方式下载模块
* @param type - 下载方式
* @param options - 下载配置
* @param dest - 下载地址
*/
async function download(type, options, dest) {
await getDownloader(type).download(options, dest);
}
exports.download = download;
/**
* 基于不同的下载方式解析下载链接或选项,并下载
* @param type - 下载方式
* @param urlOrOptions - 下载链接或选项
* @param dest - 下载地址
*/
async function parseAndDownload(type, urlOrOptions, dest) {
const downloader = getDownloader(type);
await downloader.download(downloader.parseOptions(urlOrOptions), dest);
}
exports.parseAndDownload = parseAndDownload;
/**
* 基于 url 自动判断支持的下载器类型及下载选项
* @param url - 下载链接或地址
* @returns 下载器类型及下载选项
*/
function autoDetectDownloaderTypeAndOptions(url) {
var _a;
const protocalsRegExp = new RegExp(`^(${Array.from(DOWNLOADERS.keys()).join('|')}):`);
// 尝试直接抽取协议头
let type = (_a = protocalsRegExp.exec(url)) === null || _a === void 0 ? void 0 : _a[1];
let opts;
if (type) {
opts = parseOptions(type,
// 移除链接的协议头
url.replace(new RegExp(`^${type}:`), ''));
}
else {
for (const [downloaderType, downloader] of DOWNLOADERS) {
if (downloader.supportProtocol(url)) {
type = downloaderType;
opts = downloader.parseOptions(
// 移除链接的协议头
url.replace(new RegExp(`^${downloaderType}:`), ''));
break;
}
}
}
if (!type || !opts)
throw new errors_1.DownloaderError(`不支持的下载链接: ${url}`);
logger_1.logger.debug(`匹配到下载器: ${type} => ${url}`, `下载选项:`, opts);
return {
type,
options: opts
};
}
exports.autoDetectDownloaderTypeAndOptions = autoDetectDownloaderTypeAndOptions;
/**
* 自动基于不同的协议来下载模块
* @param url - 下载链接
* @param dest - 下载地址
*/
async function tryDownloadByUrl(url, dest) {
const { type, options } = autoDetectDownloaderTypeAndOptions(url);
await download(type, options, dest);
}
exports.tryDownloadByUrl = tryDownloadByUrl;
// 注册默认下载器
// 注册的顺序会影响 tryDownloadByUrl 的协议解析逻辑
registerDownloader('npm', npm);
registerDownloader('git', git);
registerDownloader('tar', tar);
registerDownloader('link', link);
registerDownloader('file', file);
//# sourceMappingURL=index.js.map