@ygyg/yg-cli
Version:
A simple CLI for front-end engineering automation construction tool.
138 lines (122 loc) • 5.63 kB
JavaScript
const axios = require('axios');
const semver = require('semver');
const chalk = require('chalk');
const utils = require('./utils');
const output = require('./output');
const packageConfig = require('../package.json');
const execa = require('execa');
// let arr = [];
function f(obj, arr) {
for (var i in obj) {
if (typeof obj[i].dependencies === 'object') {
f(obj[i].dependencies, arr);
} else {
arr.push(obj[i]);
}
}
}
const pkgRegistry = {
local: 'http://registry.ygego.prod/nexus/repository/npm/',
};
// registry="http://registry.ygego.prod/nexus/repository/npm/"
const getPkgRemoteInfo = async (pkg) => {
try {
// 'https://registry.npmjs.org/@ygyg/yg-cli',
const [err, pkgJsonData] = await utils.getPkgRegistry(`${pkgRegistry[pkg.registry]}${pkg.name}`);
if (err) {
output(`仓库中不存在此包 ${pkg.name}`);
return null;
}
const latestVersion = pkgJsonData['dist-tags'].latest;
const versions = Object.keys(pkgJsonData.versions).length;
const license = pkgJsonData.license || 'Proprietary';
const deps = Object.keys(pkgJsonData.versions[latestVersion].dependencies || {}).length;
// const localVersion = packageConfig.version;
// @yg-cube/biz-layout@0.7.5 | Proprietary | deps: 10 | versions: 96
const pubtime = pkgJsonData.time[latestVersion];
// '0.7.5': '2022-01-07T06:52:38.850Z',
// 远程已经获取完成
output('remote======================================================');
output(`${pkg.name}@${latestVersion} | ${chalk.green(license)} | deps: ${chalk.green(deps)} | versions: ${chalk.green(versions)} `);
output(`最新描述: ${chalk.green(pkgJsonData.description)} ,发表日期: ${chalk.green(pubtime)}`);
// output(`自身强依赖: ${chalk.green(JSON.stringify(pkgJsonData.versions[latestVersion].dependencies))}`);
// output(`自身可选依赖: ${chalk.green(JSON.stringify(pkgJsonData.versions[latestVersion].peerDependencies))}`);
return latestVersion;
} catch (err) {
console.error(err);
return null;
}
};
const getPkgLocalInfo = async (pkg) => {
// output(`local --${pkg.name}--------------------------------------------------`);
// npm ls -json @yg-cube/biz-enterprice-identity
// npm ls @yg-cube/biz-icon
try {
const stdout = execa.sync('npm', ['ls', '-json', pkg.name]).stdout;
const jsonLocal = JSON.parse(stdout);
const localDeps = Object.keys(jsonLocal.dependencies).length;
if (localDeps > 1) {
output(`存在多重依赖版本: ${chalk.red(localDeps)}`);
const pkgDepsArr = [];
f(jsonLocal.dependencies, pkgDepsArr);
const versions = pkgDepsArr.reduce(function(pre, cur) {
return pre.concat(cur.version);
}, []);
output(`工程依赖版本包括: ${chalk.yellow(JSON.stringify(versions))}`);
return versions[0];
}
const localVersion = jsonLocal.dependencies[pkg.name].version;
// output(`工程依赖版本: ${chalk.green(localVersion)}`);
return localVersion;
} catch (err) {
console.error(`npm ERR!!!请手工执行,便于检查. npm ls ${chalk.yellow(pkg.name)}`);
return null;
}
};
module.exports = async (check) => {
// Ensure minimum supported node version is used
utils.logStep(process.version);
utils.logStep(packageConfig.engines.node);
const pkgList = [
{name: '@yg-cube/biz-layout', registry: 'local'},
{name: '@yg-cube/biz-enterprice-identity', registry: 'local'},
{name: '@yg-cube/biz-login', registry: 'local'},
{name: '@yg-cube/biz-enterprise', registry: 'local'},
{name: '@yg-cube/biz-icon', registry: 'local'},
{name: '@yg-cube/biz-tag', registry: 'local'},
{name: '@yg-cube/pro-card', registry: 'local'},
{name: '@yg-cube/pro-page-container', registry: 'local', need: true},
{name: '@yg-cube/pro-permission', registry: 'local'},
{name: '@yg-cube/biz-workgroup', registry: 'local'},
{name: '@yg-cube/biz-upload', registry: 'local'},
{name: '@yg-cube/biz-chosen-member', registry: 'local'},
{name: '@yg-cube/biz-decision', registry: 'local'},
{name: '@yg-cube/biz-chosen-parameter', registry: 'local'},
{name: '@yg-cube/biz-chosen-scen', registry: 'local'},
{name: '@yg-cube/biz-rules', registry: 'local'},
{name: '@yg-cube/biz-rulebase', registry: 'local'},
{name: '@yg-cube/biz-shortcut-scene', registry: 'local'},
{name: '@yg-cube/biz-notification-bar', registry: 'local'},
{name: '@yg-cube/hwf-copyright-wrap', registry: 'local'},
{name: '@yg-cube/hwf-friend-link', registry: 'local'},
{name: '@yg-cube/hwf-swiper-bulletin', registry: 'local'},
{name: '@yg-cube-mobile/bpm-homepage', registry: 'local'},
{name: '@yg-cube-mobile/bpm-login', registry: 'local'},
{name: '@yg-cube-mobile/bpm-messagecenter', registry: 'local'},
{name: '@yg-cube-mobile/bpm-mymessage', registry: 'local'},
{name: '@yg-cube-mobile/bpm-noticemessage', registry: 'local'},
{name: '@yg-cube-mobile/bpm-settings', registry: 'local'},
{name: '@yg-cube-mobile/bpm-workbench', registry: 'local'},
// "@ygfish/umi-preset-mobile5": "latest",
// "@ygyg/rn-webview-bridge": "^0.0.6",
// {name: '@ygyg/common-services', registry: 'local'},
];
for (const pkg of pkgList) {
const latestVersion = await getPkgRemoteInfo(pkg);
const localVersion = await getPkgLocalInfo(pkg);
if (latestVersion && localVersion && semver.lt(localVersion, latestVersion)) {
output(chalk.yellow(` A newer version [${latestVersion}] of ${pkg.name} is available.`));
output();
}
}
};