UNPKG

takin

Version:

Front end engineering base toolchain and scaffold

143 lines 5.28 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.download = exports.getName = exports.supportProtocol = exports.parseOptions = exports.setRegistryUrl = void 0; const fs_extra_1 = __importDefault(require("fs-extra")); const get_npm_tarball_url_1 = __importDefault(require("get-npm-tarball-url")); const got_1 = __importDefault(require("got")); const registry_url_1 = __importDefault(require("registry-url")); const logger_1 = require("../logger"); const tar = __importStar(require("./tar")); const NPM_URL_REGEXP = /^(?:npm:)?(@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*(?:@[~^]?([\dvx*]+(?:[-.](?:[\dx*]+|alpha|beta))*))?$/; // 保存 npm registry let REGISTRY_URL; /** * 设置自定义 npm registry 地址 * @param url - 自定义 npm registry 地址 */ function setRegistryUrl(url) { if (!url) return; REGISTRY_URL = url; } exports.setRegistryUrl = setRegistryUrl; /** * 返回 特定 scope 的 npm registry 地址 * @param scope - npm 分组 * @returns npm registry */ function getRegistryUrl(scope) { if (REGISTRY_URL) return REGISTRY_URL; return (0, registry_url_1.default)(scope); } function parseNpmUrl(url) { let npmOptions; const npmArgs = url.split('/'); if (npmArgs.length === 1) { const [name, version] = npmArgs[0].split('@'); npmOptions = { name, version }; } else { const scope = npmArgs[0]; const [name, version] = npmArgs[1].split('@'); npmOptions = { name: `${scope}/${name}`, version }; } return npmOptions; } async function getNpmVersion(name, registry, version) { const url = new URL(`-/package/${name}/dist-tags`, registry); return (0, got_1.default)(url.toString()) .json() .then((distTags) => { const distVersion = version ? distTags[version] : undefined; const latestVersion = distTags['latest']; const selectedVersion = distVersion || version || latestVersion; logger_1.logger.debug('NPM dist-tags 信息: ', distTags); logger_1.logger.debug('用户版本: ', version || '未指定'); logger_1.logger.debug('选择版本: ', selectedVersion, selectedVersion === latestVersion ? '最新版' : ''); return selectedVersion; }); } /** * 解析 npm 链接或选项 * @param urlOrOptions npm 链接或选项 * @returns npm 选项 */ function parseOptions(urlOrOptions) { let npm; if (typeof urlOrOptions === 'string') { npm = parseNpmUrl(urlOrOptions); } else { npm = urlOrOptions; } return npm; } exports.parseOptions = parseOptions; /** * 判断是否支持处理当前链接 * @param url - 链接 * @returns 是否支持该链接 */ function supportProtocol(url) { if (!url) return false; return NPM_URL_REGEXP.test(url); } exports.supportProtocol = supportProtocol; /** * 从 npm 选项中获取名称 * @param options - npm 选项 * @returns 名称 */ function getName(npmOptions) { return `${npmOptions.name}@${npmOptions.version || 'latest'}`; } exports.getName = getName; /** * 下载 npm 到指定的目录 * @param npmOptions - npm 下载链接或选项 * @param dest - 下载目录 * @returns 下载并解压后的目录 */ async function download(npmOptions, dest) { var _a, _b, _c; await fs_extra_1.default.ensureDir(dest); await fs_extra_1.default.emptyDir(dest); const npmScope = ((_b = (_a = npmOptions.name) === null || _a === void 0 ? void 0 : _a.startsWith) === null || _b === void 0 ? void 0 : _b.call(_a, '@')) ? npmOptions.name.split('/')[0] : undefined; const registry = (_c = npmOptions.registry) !== null && _c !== void 0 ? _c : getRegistryUrl(npmScope); const version = await getNpmVersion(npmOptions.name, registry, npmOptions.version); const url = (0, get_npm_tarball_url_1.default)(npmOptions.name, version, { registry }); logger_1.logger.debug(`NPM 下载链接: ${url}`); await tar.download(tar.parseOptions({ url: url, strip: 1 }), dest); } exports.download = download; //# sourceMappingURL=npm.js.map