UNPKG

node-plantuml

Version:

A Node.js module and CLI for running PlantUML

92 lines (76 loc) 2.37 kB
'use strict' var childProcess = require('child_process') var path = require('path') var nailgun = require('node-nailgun-server') var ngClient = require('node-nailgun-client') var INCLUDED_PLANTUML_JAR = path.join(__dirname, '../vendor/plantuml.jar') var PLANTUML_JAR = process.env.PLANTUML_HOME || INCLUDED_PLANTUML_JAR var PLANTUML_NAIL_JAR = path.join(__dirname, '../nail/plantumlnail.jar') var PLANTUML_NAIL_CLASS = 'PlantumlNail' var LOCALHOST = 'localhost' var GENERATE_PORT = 0 var nailgunServer var clientOptions var nailgunRunning = false module.exports.useNailgun = function (callback) { var options = { address: LOCALHOST, port: GENERATE_PORT } nailgunServer = nailgun.createServer(options, function (port) { clientOptions = { host: LOCALHOST, port: port } ngClient.exec('ng-cp', [PLANTUML_JAR], clientOptions) ngClient.exec('ng-cp', [PLANTUML_NAIL_JAR], clientOptions) // Give Nailgun some time to load the classpath setTimeout(function () { nailgunRunning = true if (typeof callback === 'function') { callback() } }, 50) }) return nailgunServer } // TODO: proper error handling function execWithNailgun (argv, cwd, cb) { clientOptions.cwd = cwd || process.cwd() return ngClient.exec(PLANTUML_NAIL_CLASS, argv, clientOptions) } // TODO: proper error handling function execWithSpawn (argv, cwd, cb) { cwd = cwd || process.cwd() var opts = [ '-Dplantuml.include.path=' + cwd, '-Djava.awt.headless=true', '-jar', PLANTUML_JAR ].concat(argv) return childProcess.spawn('java', opts) } module.exports.exec = function (argv, cwd, callback) { if (typeof argv === 'function') { callback = argv argv = undefined cwd = undefined } else if (typeof cwd === 'function') { callback = cwd cwd = undefined } var task if (nailgunRunning) { task = execWithNailgun(argv, cwd, callback) } else { task = execWithSpawn(argv, cwd, callback) } if (typeof callback === 'function') { var chunks = [] task.stdout.on('data', function (chunk) { chunks.push(chunk) }) task.stdout.on('end', function () { var data = Buffer.concat(chunks) callback(null, data) }) task.stdout.on('error', function () { callback(new Error('error while reading plantuml output'), null) }) } return task }