UNPKG

jmms

Version:

Jmms cli tools, Jmms is a java meta-micro-service framework

152 lines (144 loc) 6.23 kB
const log = require('../log'); const fs = require('fs'); const jszip = require("jszip/lib"); const mvn = require('maven').create(); const shelljs = require('shelljs'); const tmp = require('tmp'); const cheerio = require('cheerio') const formatString = require('string-format') const pd = require('pretty-data').pd const BaseGenerator = require('../base'); let installJar = (filePath) => { return new Promise((resolve, reject) => { fs.readFile(filePath, function(err, data) { if (err) { reject(err); } else { jszip.loadAsync(data).then(function (zip) { Object.keys(zip.files).forEach(function (filename) { var file = zip.file(filename); if (filename.startsWith("META-INF/maven/") && filename.endsWith("/pom.xml")) { let pomFile = tmp.fileSync({postfix: ".pom"}); file.nodeStream().pipe(fs.createWriteStream(pomFile.name)).on('finish', function () { mvn.execute("install:install-file", {file: filePath, pomFile: pomFile.name}) .then(() => { pomFile.removeCallback(); resolve(); }) .catch((err) => { pomFile.removeCallback(); reject(err); }); }); } }); }).catch ((err) => { reject(err); }); } }); }); }; let addDependencyToPomFile = (pomFile, groupId, artifactId, version) => { return new Promise((resolve, reject) => { fs.exists(pomFile, (exists) => { if (exists) { fs.readFile(pomFile, "utf-8", (err, xml) => { if (err) { reject(err); } else { let $ = cheerio.load(xml, { xmlMode: true }); let project = $("project"); if (project.length != 1) { reject("Illegal pom file format, project element not found."); return; } let dependencies = project.find("> dependencies"); if (dependencies.length <= 0) { $("<dependencies />").appendTo(project); dependencies = project.children().last(); } let dependency = null; dependencies.find("> dependency").each((index, it) => { if ($(it).find("> groupId").text() == groupId && $(it).find("> artifactId").text() == artifactId) { dependency = $(it); } }); if (dependency) { let versionEl = dependency.find("> version"); if (versionEl.length > 0) { versionEl.text(version); } else { dependency.append(formatString("<version>{}</version>", version)); } } else { dependencies.append(formatString("<dependency><groupId>{}</groupId><artifactId>{}</artifactId><version>{}</version></dependency>", groupId, artifactId, version)); } pd.step = ' ' fs.writeFile(pomFile, pd.xml($.xml()), (err) => { if (err) { reject(err); } else { resolve(); } }); } }); } else { reject("./pom.xml file not exists"); } }); }); } module.exports = class extends BaseGenerator { constructor(args, opts) { super(args, opts); } prompting () { let packageName = this.args[0]; let cli = "npm install " + packageName; if (this.options.save) { cli = cli.concat(" --save"); } if (shelljs.exec(cli).code !== 0) { process.exit(1); } let jarsDir = "./node_modules/" + packageName + "/jars"; let installJars = []; if (fs.existsSync(jarsDir)) { let jarFiles = fs.readdirSync(jarsDir); jarFiles.forEach(filename => { if (filename.endsWith(".jar")) { installJars.push(installJar(jarsDir + "/" + filename)); } }); } Promise.all(installJars).catch(() => { process.exit(1); }).then(() => { let pomFile = "./node_modules/" + packageName + "/pom.xml"; if (fs.existsSync(pomFile)) { let groupId = null; let artifactId = null; let version = null; fs.readFile(pomFile, "utf-8", (err, xml) => { if (err) { log.error(err); } else { let $ = cheerio.load(xml); groupId = $("project > groupId").text(); artifactId = $("project > artifactId").text(); version = $("project > version").text(); if (groupId && artifactId && version) { addDependencyToPomFile("./pom.xml", groupId, artifactId, version).catch(err => { process.exit(1); }).then(() => { process.exit(0); }); } } }); } }); } }