@bingosoft/cli
Version:
bingo framework cli
138 lines (126 loc) • 4.99 kB
JavaScript
const fs = require("fs");
const request = require('request');
const path = require("path");
const ora = require('ora');
const logSymbols = require("log-symbols");
const chalk = require("chalk");
const admZip = require('adm-zip');
const isURL = (s) => {
return /^http[s]?:\/\/.*/.test(s)
}
const suffix = ".zip"; //文件格式后缀
const config = {
tempJsonName: "swagger.json", //临时存储文件名
tempZipName: `temp${suffix}`, //临时存储压缩包文件名
serveUrl: "https://dfuse-dev.bingosoft.net/scm-convert/convert/sdk", //远程服务器地址
downloadFileName: `sdk${suffix}`, //下载回来的文件名
}
async function main(sdkMessage) {
//判断本地templats文件夹是否存在
if (sdkMessage.template && !fs.existsSync(path.resolve(sdkMessage.template))) {
console.error(logSymbols.error, chalk.red(`no such directory:${path.resolve(sdkMessage.template)}`));
return;
}
if (isURL(sdkMessage.swagger)) {
await downloadFile(sdkMessage.swagger); //下载远程文件到本地
zipFile(config.tempJsonName, sdkMessage.template, true);
} else {
//读取本地资源
zipFile(sdkMessage.swagger, sdkMessage.template, false);
}
await uploadFile(config.tempZipName, sdkMessage.destination);
//解压
const zip = new admZip(path.resolve(config.downloadFileName));
zip.extractAllTo(path.resolve(sdkMessage.destination), true);
fs.unlinkSync(path.resolve(config.downloadFileName));
ora(`SDK生成成功,请进入sdk目录,使用dara命令编译生成各种语言的SDK,如: dara install && dara codegen java ./src/java`)
.start()
.succeed();
}
const downloadFile = async url => { //下载或者读取json文件
return new Promise((resolve, reject) => {
const spinner = ora(`下载swagger文件`)
spinner.start();
const writeStream = fs.createWriteStream(config.tempJsonName);
const readStream = request({
url: url,
strictSSL: false
})
readStream.pipe(writeStream);
readStream.on('end', function () {
spinner.succeed();
});
readStream.on('error', function (err) {
spinner.fail();
console.error(logSymbols.error, chalk.red(`请检查地址:${url}是否正确`));
reject(err);
if (fs.existsSync(config.tempJsonName)) {
fs.unlinkSync(config.tempJsonName);
}
})
writeStream.on("finish", function () {
writeStream.end();
resolve(config.tempJsonName);
});
})
}
//1:jsonPath json文件路径 2:templatesPath templates路径 3:是否需要删除临时的json文件,如果为远程下载的则删除,如果为本地则不删除(根据--swagger判断)
//根据jsonPath和templatesPath来压缩文件
function zipFile(jsonPath, templatesPath, toBeDelete = false) { //压缩文件
const spinner = ora(`开始上传本地模板`);
spinner.start();
var zip = new admZip();
// 为zip添加刚才下载到的json文件
zip.addLocalFile(jsonPath,"","swagger.json");
// 为zip添加本地文件夹
if (templatesPath && fs.existsSync(templatesPath)) {
zip.addLocalFolder(path.resolve(templatesPath), "_templates");
}
// 生成zip文件
zip.writeZip(config.tempZipName);
spinner.succeed();
//删除下载的临时swagger
if (fs.existsSync(jsonPath) && toBeDelete) {
fs.unlinkSync(jsonPath);
}
}
//uploadFilePath 需要上传的文件地址
function uploadFile(uploadFilePath) {
//判断文件是否存在
return new Promise((resolve, reject) => {
uploadFilePath = path.resolve(uploadFilePath);
if (!fs.existsSync(uploadFilePath)) {
throw new Error(`no such file or directory:${uploadFilePath}`);
}
const spinner = ora(`开始生成darabonba语言的SDK`)
spinner.start();
const writeStream = fs.createWriteStream(config.downloadFileName);
const readStream = request({
strictSSL: false,
method: 'post',
url: config.serveUrl,
formData: {
file: fs.createReadStream(uploadFilePath)
}
})
readStream.pipe(writeStream);
readStream.on('end', function () {
//删除临时文件
spinner.succeed();
if (fs.existsSync(uploadFilePath)) {
fs.unlinkSync(uploadFilePath);
}
});
readStream.on('error', function (err) {
spinner.fail();
reject(err);
})
writeStream.on("finish", function () {
writeStream.end();
resolve();
});
})
}
module.exports = {
main
}