@tuzki/cli
Version:
🐇 lowcode-cli is an efficient cli tool for Rabbitpre plugin component secondary development. ❤️
78 lines (77 loc) • 2.99 kB
JavaScript
/*
* cli 版本相关工具方法
*
* @Author: xu.jin
* @Date: 2023-08-24 11:30:29
*
* Copyright © 2014-2023 Rabbitpre.com. All Rights Reserved.
*/
import semver from 'semver';
import boxen from 'boxen';
import chalk from 'chalk';
import Logger from '@tuzki/scaffold-logger';
import shell from 'shelljs';
import config from './config.js';
const logger = Logger.get('cli:utils:version');
/**
* Check node version
*
* @export
* @param {string} pkgName package name
* @param {string} wanted wanted version
*/
export function checkNodeVersion(pkgName, wanted) {
if (!semver.satisfies(process.version, wanted, { includePrerelease: true })) {
logger.warn(chalk.red(`You are using Node ${process.version}, but this version of ${pkgName} requires Node ${wanted}.`));
logger.warn(chalk.red('Please upgrade your Node version.'));
process.exit(1);
}
}
/**
* 1.判断当前根据配置文件判断执行检查版本对应的 dist-tag;
* 2.shell 执行 `tuzki -v` 获取本地cli版本;
* 3.shell 执行 `npm dist-tags ls @tuzki/cli` 获取所有 dist-tag 对应的最新版本;
* 4.通过对应配置 dist-tag 获取最新版本,与本地版本对比,提示更新;
*/
export function checkCliVersion(cmd) {
const updateTag = config.cliCheckUpdateTag;
const cmdNoNeedCheck = ['config', 'test', 'lint'].includes(cmd);
if ((!updateTag && !cmdNoNeedCheck) || cmdNoNeedCheck) {
if (!cmdNoNeedCheck) {
logger.warn(chalk.yellow('You have closed the cli update check.'));
}
return;
}
logger.info(chalk.yellow('Cli 版本更新检查中,请稍候......'));
// 获取本地 cli 版本
const versionStdout = getShellStdout('tuzki -v');
const curVersion = versionStdout[0];
// 获取 cli 所有 dist-tag 对应版本
const distTagsStdouts = getShellStdout('npm dist-tags ls @tuzki/cli');
const distTags = distTagsStdouts.reduce((acc, cur) => {
const splitCur = cur.split(':');
if (splitCur.length > 1) {
acc.push({ [splitCur[0]]: splitCur[1].trim() });
}
return acc;
}, []);
// dist-tag 对应最新版本
const tagVersion = distTags.find(item => {
return item[updateTag];
});
// 本地版本与 dist-tag 对应最新版本对比, 如果本地版本小于 dist-tag 对应最新版本,则提示更新
if (semver.lt(curVersion, tagVersion[updateTag])) {
console.log(boxen(chalk.yellow(`A newer version of @tuzki/cli is available.
Please update @tuzki/cli by running: ${chalk.magenta(`npm install -g @tuzki/cli@${tagVersion[updateTag]}`)}`), { padding: 1, margin: 1, borderStyle: 'round' }));
}
}
/**
* 转换 shell 执行命令后的 stdout 为数组
* @param cmd 命令
* @returns
*/
function getShellStdout(cmd) {
const { stdout } = shell.exec(cmd, { silent: true });
const lines = stdout.split('\n');
return lines.filter(line => !!line).map(item => item.trim());
}