UNPKG

@bingosoft/cli

Version:

bingo framework cli

138 lines (126 loc) 4.99 kB
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 }