diff --git a/lib/nodegen.js b/lib/nodegen.js index 07b1062..584db4f 100644 --- a/lib/nodegen.js +++ b/lib/nodegen.js @@ -38,6 +38,21 @@ function createCommonFiles(templateDirectory, data) { console.error(error); } } + try { + var icons = fs.readdirSync(templateDirectory + '/icons'); + icons.forEach(function (icon) { + try { + var buf = fs.readFileSync(templateDirectory + '/icons/' + icon); + fs.writeFileSync(data.dst + '/' + data.module + '/icons/' + icon, buf); + } catch (error) { + console.error(error); + } + }); + } catch (error) { + if (error.code !== 'ENOENT') { + console.error(error); + } + } try { fs.mkdirSync(data.dst + '/' + data.module + '/locales'); } catch (error) { @@ -61,19 +76,15 @@ function createCommonFiles(templateDirectory, data) { console.error(error); } } - - // Create icon.png - fs.createReadStream(templateDirectory + '/icons/icon.png').pipe(fs.createWriteStream(data.dst + '/' + data.module + '/icons/icon.png')); } function runNpmPack(data) { var npmCommand = process.platform === 'win32' ? 'npm.cmd' : 'npm'; - child_process.execFile(npmCommand, ['pack', data.module], { cwd: data.dst }, - function (error) { - if (error) { - console.error(error); - } - }); + try { + child_process.execFileSync(npmCommand, ['pack', './' + data.module], { cwd: data.dst }); + } catch (error) { + console.error(error); + } } function function2node(data, options) { diff --git a/test/lib/nodegen_spec.js b/test/lib/nodegen_spec.js new file mode 100644 index 0000000..09799cb --- /dev/null +++ b/test/lib/nodegen_spec.js @@ -0,0 +1,111 @@ +var fs = require('fs'); +var request = require('request'); +var should = require('should'); +var del = require('del'); +var nodegen = require('../../lib/nodegen'); + +describe('nodegen library', function () { + describe('function node', function () { + it('should have node files', function (done) { + var options = {}; + var data = { dst: '.' }; + data.src = fs.readFileSync('samples/lower-case.js'); + var result = nodegen.function2node(data, options); + var packageSourceCode = JSON.parse(fs.readFileSync(result + '/package.json')); + packageSourceCode.name.should.equal('node-red-contrib-lowercase'); + packageSourceCode.version.should.equal('0.0.1'); + fs.statSync(result + '/node.html').size.should.be.above(0); + fs.statSync(result + '/node.js').size.should.be.above(0); + fs.statSync(result + '/icons/icon.png').size.should.be.above(0); + fs.statSync(result + '/README.md').size.should.be.above(0); + fs.statSync(result + '/LICENSE').size.should.be.above(0); + del.sync(result); + done(); + }); + it('should handle parameters (node and module name)', function (done) { + var options = {}; + var data = { + name: 'nodename', + module: 'node-red-node-function-node', + dst: '.' + }; + data.src = fs.readFileSync('samples/lower-case.js'); + var result = nodegen.function2node(data, options); + var packageSourceCode = JSON.parse(fs.readFileSync(result + '/package.json')); + packageSourceCode.name.should.equal('node-red-node-function-node'); + packageSourceCode.version.should.equal('0.0.1'); + del.sync(result); + done(); + }); + it('should handle parameters (prefix and node name)', function (done) { + var options = {}; + var data = { + prefix: 'node-red-prefix-', + name: 'nodename', + dst: '.' + }; + data.src = fs.readFileSync('samples/lower-case.js'); + var result = nodegen.function2node(data, options); + var packageSourceCode = JSON.parse(fs.readFileSync(result + '/package.json')); + packageSourceCode.name.should.equal('node-red-prefix-nodename'); + packageSourceCode.version.should.equal('0.0.1'); + del.sync(result); + done(); + }); + it('should handle parameters (version)', function (done) { + var options = {}; + var data = { + version: '4.5.1', + dst: '.' + }; + data.src = fs.readFileSync('samples/lower-case.js'); + var result = nodegen.function2node(data, options); + var packageSourceCode = JSON.parse(fs.readFileSync(result + '/package.json')); + packageSourceCode.name.should.equal('node-red-contrib-lowercase'); + packageSourceCode.version.should.equal('4.5.1'); + del.sync(result); + done(); + }); + it('should handle options', function (done) { + var options = { + tgz: true, + obfuscate: true + }; + var data = { dst: '.' }; + data.src = fs.readFileSync('samples/lower-case.js'); + var result = nodegen.function2node(data, options); + fs.statSync(result).isFile().should.be.eql(true); + del.sync(result); + del.sync(result.replace(/-[0-9]+\.[0-9]+\.[0-9]+\.tgz$/, '')); + done(); + }); + }); + + describe('swagger node', function () { + it('should have node files', function (done) { + var options = {}; + var data = { dst: '.' }; + var sourcePath = 'http://petstore.swagger.io/v2/swagger.json'; + request(sourcePath, function (error, response, body) { + data.src = JSON.parse(body); + var result = nodegen.swagger2node(data, options); + var packageSourceCode = JSON.parse(fs.readFileSync(result + '/package.json')); + packageSourceCode.name.should.equal('node-red-contrib-swagger-petstore'); + packageSourceCode.version.should.equal('1.0.0'); + packageSourceCode.license.should.equal('Apache 2.0'); + fs.statSync(result + '/node.html').size.should.be.above(0); + fs.statSync(result + '/node.js').size.should.be.above(0); + fs.statSync(result + '/lib.js').size.should.be.above(0); + fs.statSync(result + '/icons/icon.png').size.should.be.above(0); + fs.statSync(result + '/locales/en-US/node.json').size.should.be.above(0); + fs.statSync(result + '/locales/ja/node.json').size.should.be.above(0); + fs.statSync(result + '/locales/zh-CN/node.json').size.should.be.above(0); + fs.statSync(result + '/README.md').size.should.be.above(0); + fs.statSync(result + '/LICENSE').size.should.be.above(0); + del.sync(result); + done(); + }); + }); + }); +}); +