takin
Version:
Front end engineering base toolchain and scaffold
143 lines • 5.28 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.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