src/commands/config/set.js
'use strict'
const cli = require('heroku-cli-util')
const co = require('co')
function * run (context, heroku) {
if (context.args.length === 0) {
cli.exit(1, 'Usage: heroku config:set KEY1=VALUE1 [KEY2=VALUE2 ...]\nMust specify KEY and VALUE to set.')
}
const {reduce, pickBy, mapKeys} = require('lodash')
function lastRelease () {
return heroku.request({
method: 'GET',
partial: true,
path: `/apps/${context.app}/releases`,
headers: {Range: 'version ..; order=desc,max=1'}
}).then((releases) => releases[0])
}
let vars = reduce(context.args, function (vars, v) {
let idx = v.indexOf('=')
if (idx === -1) {
cli.error(`${cli.color.cyan(v)} is invalid. Must be in the format ${cli.color.cyan('FOO=bar')}.`)
process.exit(1)
}
vars[v.slice(0, idx)] = v.slice(idx + 1)
return vars
}, {})
let config
yield cli.action(
`Setting ${context.args.map((v) => cli.color.configVar(v.split('=')[0])).join(', ')} and restarting ${cli.color.app(context.app)}`,
{success: false},
co(function * () {
config = yield heroku.request({
method: 'patch',
path: `/apps/${context.app}/config-vars`,
body: vars
})
let release = yield lastRelease()
cli.action.done(`done, ${cli.color.release('v' + release.version)}`)
})
)
config = pickBy(config, (_, k) => vars[k])
config = mapKeys(config, (_, k) => cli.color.green(k))
cli.styledObject(config)
yield context.config.runHook('recache', {type: 'config', app: context.app})
}
let cmd = {
description: 'set one or more config vars',
examples: `$ heroku config:set RAILS_ENV=staging
Setting config vars and restarting example... done, v10
RAILS_ENV: staging
$ heroku config:set RAILS_ENV=staging RACK_ENV=staging
Setting config vars and restarting example... done, v11
RAILS_ENV: staging
RACK_ENV: staging`,
needsApp: true,
needsAuth: true,
variableArgs: true,
run: cli.command({preauth: true}, co.wrap(run))
}
module.exports = [
Object.assign({topic: 'config', command: 'set'}, cmd),
Object.assign({topic: 'config', command: 'add', hidden: true}, cmd)
]