bumped
Version:
Makes easy release software.
152 lines (117 loc) • 4.15 kB
text/coffeescript
async = require 'async'
CSON = require 'season'
fs = require 'fs-extra'
existsFile = require 'exists-file'
DEFAULT = require './Bumped.default'
MSG = require './Bumped.messages'
module.exports = class Config
constructor: (bumped) ->
= bumped
= require('rc') bumped.pkg.name, DEFAULT.scaffold(), null, (config) -> CSON.parse config
autodetect: ->
[opts, cb] = DEFAULT.args arguments
tasks = [
(next) =>
return next() unless .config
fs.remove .config, next
(next) =>
()
async.each DEFAULT.detect, (file, done) =>
file: file, outputMessage: false, (exists) =>
return done() unless exists
.logger.info MSG.DETECTED_FILE file if opts.outputMessage
file: file, done
, next
]
async.waterfall tasks, cb
detect: ->
[opts, cb] = DEFAULT.args arguments
existsFile "#{process.cwd()}/#{opts.file}", (err, exists) =>
return cb err if err
return cb exists unless opts.outputMessage
if exists
.logger.info MSG.DETECTED_FILE opts.file
else
.logger.error MSG.NOT_DETECTED_FILE opts.file
cb exists
add: =>
[opts, cb] = DEFAULT.args arguments
if opts.file
message = MSG.ADD_ALREADY_FILE opts.file
.logger.error message if opts.outputMessage
return cb message, .files
opts.outputMessageType = 'success'
tasks = [
(next) => unless opts.detect then next() else opts, next
(next) => opts, next
(next) => unless opts.save then next() else opts, next
]
async.waterfall tasks, (err, result) =>
cb err, .files
remove: =>
[opts, cb] = DEFAULT.args arguments
unless opts.file
message = MSG.NOT_REMOVE_FILE opts.file
.logger.error message if opts.outputMessage
return cb message, .files
tasks = [
(next) => opts, next
(next) => unless opts.save then next() else opts, next
]
async.waterfall tasks, (err, result) =>
cb(err, .files)
save: =>
[opts, cb] = DEFAULT.args arguments
.util.saveCSON
path : ".#{@bumped.pkg.name}rc"
data :
files: .files
plugins: .plugins
, cb
load: =>
[opts, cb] = DEFAULT.args arguments
.util.loadCSON
path: .config.rc.config
, (err, filedata) =>
throw err if err
filedata
cb()
detectFile: ->
[opts, cb] = DEFAULT.args arguments
opts, (exists) ->
return cb MSG.DETECTED_FILE opts.file unless exists
cb()
addFile: ->
[opts, cb] = DEFAULT.args arguments
.files.push opts.file
outputMessageType = opts.outputMessageType or 'info'
.logger[outputMessageType] MSG.ADD_FILE opts.file if opts.outputMessage
cb()
removeFile: ->
[opts, cb] = DEFAULT.args arguments
index = .files.indexOf opts.file
.files.splice index, 1
.logger.success MSG.REMOVE_FILE opts.file if opts.outputMessage
cb()
set: =>
[opts, cb] = DEFAULT.args arguments
setProperty = (file, done) =>
.util.updateJSON
filename : file
property : opts.property
value : opts.value
, done
return .logger.errorHandler MSG.NOT_SET_PROPERTY(), cb unless opts.property or opts.value
return .logger.errorHandler MSG.NOT_SET_VERSION(), cb if opts.property is 'version'
async.each .config.rc.files, setProperty, (err) =>
return .logger.errorHandler err, cb if err
.logger.success MSG.SET_PROPERTY opts.property if opts.outputMessage
cb null, opts
hasFile: (file) ->
.files.indexOf(file) isnt -1
saveScaffold: ->
[.files, .plugins] = [DEFAULT.scaffold().files, DEFAULT.scaffold().plugins]
loadScaffold: (filedata) ->
.config.rc.files = filedata.files
.config.rc.plugins = filedata.plugins