UNPKG

takin

Version:

Front end engineering base toolchain and scaffold

173 lines 6.19 kB
"use strict"; 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