newkit-cli
Version:
Newkit cli tools.
164 lines (149 loc) • 4.08 kB
JavaScript
;
var fs = require('fs');
var path = require('path');
var request = require('request');
var fse = require('fs-extra');
var JSZip = require('jszip');
var ProgressBar = require('progress');
var colors = require('colors');
colors.setTheme({
info: 'green',
error: 'red'
});
const tempFolder = path.join(__dirname, '../temp');
// 确保临时目录存在
fse.ensureDirSync(tempFolder);
// 清空临时目录
fse.emptyDirSync(tempFolder);
var config = require('./../config.json');
var info = (msg) => console.log(colors.info(msg));
var error = (msg) => console.log(colors.error(msg));
/**
* 下载文件,返回下载文件的路径
*/
var downloadFile = (url) => {
var downloadPath = path.join(tempFolder, `${Date.now()}.zip`);
return new Promise((resolve, reject) => {
request(url)
.on('error', (err) => reject(err))
.on('end', () => {
resolve(downloadPath);
})
.pipe(fs.createWriteStream(downloadPath));
});
};
/**
* 解压zip文件到目录(可以指定目录)
*/
var unzip = (zipFilePath, targetFolderPath) => {
var folderPath = targetFolderPath || path.join(tempFolder, Date.now());
// 确保目录存在
fse.ensureDirSync(folderPath);
return JSZip.loadAsync(fse.readFileSync(zipFilePath), { base64: false, createFolders: true })
.then((zip) => {
var keys = Object.keys(zip.files);
info(`Total file count: ${keys.length}`);
var bar = new ProgressBar(' Unzip [:bar] :percent :etas', {
complete: '=',
incomplete: ' ',
width: 20,
total: keys.length
});
let total = keys.length;
var pArr = [];
// 循环输出文件
keys.forEach((key, i) => {
var zipFile = zip.files[key];
var tmpPath = path.join(folderPath, zipFile.name);
if (zipFile.dir) {
fse.ensureDirSync(tmpPath);
bar.tick();
return;
}
let p = zipFile.async('binarystring').
then((b) => {
fs.writeFileSync(tmpPath, b, 'binary');
bar.tick();
});
pArr.push(p);
});
return Promise.all(pArr);
});
};
var copyTo = (sourceFolder, targetFolder) => {
return new Promise((resolve, reject) => {
fse.copy(sourceFolder, targetFolder, (err) => {
if (err) {
return reject(err);
}
resolve(true);
});
});
};
var getJson = (uri) => {
return new Promise((resolve, reject) => {
request({
uri: uri,
}, (err, res, body) => {
if (err) {
return reject(err);
}
resolve(JSON.parse(body));
});
});
};
/**
* 获取本地版本
*/
var getLocalVersion = (folderPath) => {
var pkgFilePath = path.join(folderPath, 'package.json');
if (fs.existsSync(pkgFilePath)) {
var pkgInfo = JSON.parse(fs.readFileSync(pkgFilePath, 'utf8'));
return pkgInfo.version + (pkgInfo.patchVersion ? '.' + pkgInfo.patchVersion : '');
}
return null;
};
var checkCliVersion = (callback) => {
getJson(config.newkitCliRegistryUrl)
.then(json => {
var latestVersion = json['dist-tags'].latest;
var localVersion = require('./../package.json').version;
if (latestVersion !== localVersion) {
error(`Newkit-cli new version ${latestVersion} is available, please use [npm install newkit-cli -g] to install.`);
}
callback && callback();
}).catch(error);
};
const compareVersion = (v1, v2) => {
if (v1 === v2) {
return 0;
}
let v1Arr = v1.split('.').map(x => +x);
let v2Arr = v2.split('.').map(x => +x);
if (v1Arr.length !== 3 || v2Arr.length !== 3) {
throw new Error('Invalid params in function `compareVersion`');
}
if (v1Arr[0] > v2Arr[0]) {
return 1;
} else if (v1Arr[0] === v2Arr[0]) {
if (v1Arr[1] > v2Arr[1]) {
return 1;
} else if (v1Arr[1] === v2Arr[1]) {
if (v1Arr[2] > v2Arr[2]) {
return 1;
}
}
}
return -1;
};
module.exports = {
error,
info,
downloadFile,
unzip,
copyTo,
getJson,
getLocalVersion,
checkCliVersion,
compareVersion
};