UNPKG

ci-bones

Version:

A project skeleton layout for continuous integration with Travis CI, coveralls.io and mocha

322 lines (309 loc) 10.9 kB
var inquirer = require("inquirer") var fs = require('fs') var async = require('async') var mkdirp = require('mkdirp') var jsonfile = require('jsonfile') var argv = require('minimist')(process.argv.slice(2)) require('shelljs/global') var ui = new inquirer.ui.BottomBar() var packaged = "unknown" var packageJson = "unknown" var gitRepo = "unknown" if(fs.existsSync("package.json")){ packaged = jsonfile.readFileSync('package.json') fs.readFile("package.json", function (err, data) { packageJson = data; }) } var packageName = "unknown" var packageDesc = "unknown" var appFile = "unknown" var foundRedis = false var overwriteTravis = false if(argv.v){ console.log("Version 0.1.1") process.exit(0) } if(argv.help){ console.log("KAPPA") process.exit(0) } ui.log.write("Welcome to ci-bones. Lets get started!") if (!which('npm')) { echo('ci-bones requires npm to be installed') exit(1) } function exitIfFailure(code,output){ if(code==1){ console.error(output) process.exit(1) } } setTimeout(function(){ async.series([ function(callback){ if (!which('mocha')) { ui.log.write("Installing mocha.....") exec('npm install mocha -g', function(code, output) { exitIfFailure(code,output) setTimeout(callback,100) }) }else{ setTimeout(callback,100) } }, function(callback){ if (!which('istanbul')) { ui.log.write("Installing istanbul.....") exec('npm install istanbul -g', function(code, output) { exitIfFailure(code,output) setTimeout(callback,100) }) }else{ setTimeout(callback,100) } }, function(callback){ if (!which('coveralls')) { ui.log.write("Installing coveralls.....") exec('npm install coveralls -g', function(code, output) { exitIfFailure(code,output) setTimeout(callback,100) }) }else{ setTimeout(callback,100) } }, function(callback){ if(packaged){ prompt("Your package name is '"+packaged.name+"' is this correct","confirm",true,function(a){ if(a){ packageName = packaged.name if(packaged.description) packageDesc = packaged.description if(packaged.main) appFile = packaged.main } setTimeout(callback,100) }); }else{ echo('ci-bones requires a existing package.json. Please run "npm init"') exit(1) } }, function(callback){ if(!packaged.repository){ setTimeout(callback,100) return } if(fs.existsSync(".git")){ setTimeout(callback,100) }else{ prompt("Do you want to setup a git repository","confirm",true,function(a){ if(a){ ui.log.write("Example: https://github.com/michaeldegroot/testrepo.git") inquirer.prompt([{ type: "input", name: "a", message: "What's your git HTTPS or GIT repository URL ?" }], function( answers ) { gitRepo = answers.a exec('git init', function(code, output) { exitIfFailure(code,output) exec('git remote add origin '+gitRepo, function(code, output){ setTimeout(callback,100) }) }) }) } }) } }, function(callback){ if(packageName=="unknown"){ inquirer.prompt([{ type: "input", name: "a", message: "What's the name of your package ?" }], function( answers ) { packageName = answers.a setTimeout(callback,100) }) }else{ setTimeout(callback,100) } }, function(callback){ if(packageJson.indexOf('redis') >= 1){ ui.log.write("Redis found in package.json") foundRedis = true } setTimeout(callback,100) }, function(callback){ if(fs.existsSync(".travis.yml")){ prompt("Found existing .travis.yml. Do you want to overwrite","confirm",false,function(a){ overwriteTravis = a if(a){ fs.unlinkSync('.travis.yml') setTimeout(callback,100) }else{ setTimeout(callback,100) } }) }else{ overwriteTravis = true setTimeout(callback,100) } }, function(callback){ if(!overwriteTravis){ setTimeout(callback,100) return } var s = fs.createWriteStream('.travis.yml', {'flags': 'a'}) s.write('language: node_js\r\n') if(foundRedis){ s.write('services:\r\n') s.write(' - redis-server\r\n') } s.write('node_js:\r\n') s.write(' - "5.0"\r\n') s.write(' - "4.1"\r\n') s.write(' - "4.0"\r\n') s.write(' - "0.12"\r\n') s.write(' - "0.11"\r\n') s.write(' - "0.10"\r\n') s.end('after_script: NODE_ENV=test istanbul cover ./node_modules/mocha/bin/_mocha -- -R spec ./test/* && node node_modules/coveralls/bin/coveralls.js < coverage/lcov.info\r\n') setTimeout(callback,100) }, function(callback){ if(fs.existsSync(".coveralls.yml")){ prompt("Found existing .coveralls.yml. Do you want to overwrite","confirm",false,function(a){ if(a){ fs.unlinkSync('.coveralls.yml') tokenPrompt(callback) }else{ setTimeout(callback,100) } }) }else{ tokenPrompt(callback) } }, function(callback){ if(!fs.existsSync("test")){ ui.log.write("Creating mocha test suite folder.....") mkdirp('test', function(err) { if(err) throw new Error(err) var s = fs.createWriteStream('test/test.js', {'flags': 'a'}) s.write("var assert = require('assert');\r\n") s.write("var assert = require('assert-plus');\r\n") s.write("var myApp = require('../"+appFile+"');\r\n") s.write("\r\n") s.write("describe('test', function() {\r\n") s.write(" it('tests', function() {\r\n") s.write(" assert.equal(1,1);\r\n") s.write(" });\r\n") s.end("});\r\n") setTimeout(callback,100) }) }else{ ui.log.write("Test folder already exists. Skipping.") setTimeout(callback,100) } }, function(callback){ if (!packaged.scripts) packaged.scripts = {} packaged.scripts["test"] = "mocha" packaged.scripts["cover"] = "istanbul cover ./node_modules/mocha/bin/_mocha -- -R spec ./test/*" packaged.scripts["coveralls"] = "npm bin /istanbul cover ./node_modules/mocha/bin/_mocha -- -R spec ./test/* && node node_modules/coveralls/bin/coveralls.js < coverage/lcov.info" jsonfile.writeFileSync('package.json', packaged, {spaces: 2}) setTimeout(callback,100) }, function(callback){ if(!fs.existsSync("README.md")){ ui.log.write("Creating README.md.....") var s = fs.createWriteStream('README.md', {'flags': 'a'}) if(packageDesc=="unknown") s.end("## "+packageName+"\r\n") if(packageDesc!="unknown"){ s.write("## "+packageName+"\r\n"); s.write("\r\n"); s.end(packageDesc+"\r\n"); } setTimeout(callback,100) }else{ ui.log.write("README.md already exists. Skipping.") setTimeout(callback,100) } }, function(callback){ var calledCb = false installApps = ['assert','assert-plus','coveralls','istanbul','mocha','mocha-lcov-reporter'] for(i=0;i<installApps.length;i++){ if(packageJson.indexOf('"'+installApps[i]+'":') <= 0){ ui.log.write("Installing "+installApps[i]+"....") exec('npm install '+installApps[i]+' --save-dev', function(code, output) { exitIfFailure(code,output) if(installApps.length==i && calledCb == false){ setTimeout(callback,100) calledCb = true } }) } } }, function(callback){ fs.readFile(".gitignore", function (err, data) { var s = fs.createWriteStream('.gitignore', {'flags': 'a'}) if(!err){ if(data.indexOf('coveralls') <= 0) s.write(".coveralls.yml\r\n") if(data.indexOf('node_modules') <= 0) s.write("node_modules\r\n") }else{ s.write(".coveralls.yml\r\n") s.write("node_modules\r\n") } s.end() setTimeout(callback,3000) }) }, function(callback){ ui.log.write("") ui.log.write("------------------------") ui.log.write("ci-bones is done!") ui.log.write("") ui.log.write("") ui.log.write("You can begin with your CI adventures:") ui.log.write(" npm test - starts mocha tests") ui.log.write(" npm run-script cover - produces a report in the 'coverage' folder") ui.log.write(" npm run-script coveralls - sends coverage data to coveralls.io") ui.log.write("") ui.log.write("") ui.log.write("") ui.log.write("And whenever you push your repository, coveralls.io will be automatically updated with the new coverage and travis CI will check if your build passes") ui.log.write("") ui.log.write("Dont forget to initialize coveralls.io and travis ci via the websites itself.") ui.log.write("Happy coding :)") } ]) },300) function tokenPrompt(callback){ inquirer.prompt([{ type: "input", name: "a", message: "What's your coveralls.io repo token ?" }], function( answers ) { var s = fs.createWriteStream('.coveralls.yml', {'flags': 'a'}) s.write('repo_token: ') s.end(answers.a) callback() }) } function prompt(question,type,def,cb){ inquirer.prompt([{ type: type, name: "a", message: question+" ?", default: def }], function( answers ) { setTimeout(cb,100,answers.a) }) }