UNPKG

newkit-cli

Version:

Newkit cli tools.

164 lines (149 loc) 4.08 kB
'use strict'; 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 };