beekeeper-util
Version:
CLI utility for managing the beekeeper-service
121 lines (111 loc) • 5.03 kB
text/coffeescript
_ = require 'lodash'
path = require 'path'
url = require 'url'
yaml = require 'node-yaml'
colors = require 'colors'
fs = require 'fs'
debug = require('debug')('beekeeper-util:project-service')
class ProjectService
constructor: ({ config }) ->
throw new Error 'Missing config argument' unless config?
{ beekeeperUri, projectRoot } = config
throw new Error 'Missing beekeeperUri in config' unless ?
throw new Error 'Missing projectRoot in config' unless ?
= path.join projectRoot, '.travis.yml'
= path.join projectRoot, 'package.json'
= path.join projectRoot, 'Dockerfile'
= path.join projectRoot, '.dockerignore'
urlParts = url.parse beekeeperUri
_.set urlParts, 'slashes', true
delete urlParts.auth
delete urlParts.password
delete urlParts.username
_.set urlParts, 'pathname', '/webhooks/travis:ci'
= url.format urlParts
configure: ({ isPrivate }, callback) =>
{ isPrivate }, (error) =>
return callback error if error?
(error) =>
return callback error if error?
(error) =>
return callback error if error?
callback
_getPackage: =>
try
return _.cloneDeep require
catch error
debug 'package.json require error', error
_modifyPackage: (callback) =>
packageJSON = ()
return callback() unless packageJSON?
orgPackage = _.cloneDeep packageJSON
packageJSON.scripts ?= {}
packageJSON.scripts['test'] ?= 'mocha'
packageJSON.scripts['coverage'] ?= 'nyc npm test'
packageJSON.scripts['mocha:json'] ?= 'env NPM_ENV=test mocha --reporter json > coverage/mocha.json'
packageJSON.scripts['test:watch'] ?= 'mocha -w -R mocha-multi --reporter-options spec=-,mocha-osx-reporter=-'
packageJSON.devDependencies ?= {}
packageJSON.devDependencies['nyc'] ?= '^10.1.2'
packageJSON.devDependencies['mocha-osx-reporter'] ?= '^0.1.2'
packageJSON.devDependencies['mocha-multi'] ?= '^0.10.0'
packageJSON.devDependencies['mocha'] ?= '^3.2.0'
packageJSON.nyc ?= {
cache: true
reporter: [
'text-summary'
'lcov'
'json'
]
extension: [
'.coffee'
]
}
return callback null if _.isEqual packageJSON, orgPackage
console.log colors.magenta('NOTICE'), colors.white('modifying package.json - make sure you run npm install')
packageStr = JSON.stringify(packageJSON, null, 2)
fs.writeFile , "#{packageStr}\n", callback
_modifyTravis: ({ isPrivate }, callback) =>
yaml.read , (error, data) =>
return callback error if error?
return callback new Error('Missing .travis.yml') unless data?
orgData = _.cloneDeep data
type = 'pro' if isPrivate
type ?= 'org'
_.set data, 'notifications.webhooks', []
data.after_success ?= []
after_success = [
'npm run coverage'
'npm run mocha:json'
'bash <(curl -s https://codecov.io/bash)'
'bash <(curl -s https://codecov.octoblu.com/bash)'
]
_.pullAll data.after_success, after_success
data.after_success = _.concat data.after_success, after_success
return callback null if _.isEqual orgData, data
console.log colors.magenta('NOTICE'), colors.white('modifying .travis.yml')
yaml.write , data, callback
_modifyDockerfile: (callback) =>
, (error, contents) =>
return callback error if error?
if _.includes contents, 'FROM node'
console.log colors.magenta('NOTICE'), colors.white('use an octoblu base image in your Dockerfile')
console.log ' ', colors.cyan('Web Service:'), colors.white('`FROM octoblu/node:7-webservice-onbuild`')
console.log ' ', colors.cyan('Worker: '), colors.white('`FROM octoblu/node:7-worker-onbuild`')
console.log ' ', colors.cyan('Static Site:'), colors.white('`FROM octoblu/node:7-staticsite-onbuild`')
console.log ' ', colors.cyan('Other: '), colors.white('`FROM octoblu/node:7-alpine-gyp`')
callback null
_modifyDockerignore: (callback) =>
, (error, contents) =>
return callback error if error?
newContents = contents.replace('test\n', '')
return callback null if contents == newContents
console.log colors.magenta('NOTICE'), colors.white('modifying .dockerignore')
fs.writeFile , "#{newContents}\n", callback
_getFile: (filePath, callback) =>
fs.access filePath, fs.constants.R_OK, (error) =>
return callback null, '' if _.get(error, 'code') == 'ENOENT'
return callback error if error?
fs.readFile filePath, 'utf8', (error, contents='') =>
return callback error if error?
callback null, contents.toString()
module.exports = ProjectService