heroku/heroku-cli-addons

View on GitHub
commands/addons/create.js

Summary

Maintainability
A
2 hrs
Test Coverage
'use strict'

const cli = require('heroku-cli-util')
const co = require('co')

function parseConfig (args) {
  let config = {}
  while (args.length > 0) {
    let key = args.shift()
    if (!key.startsWith('--')) throw new Error(`Unexpected argument ${key}`)
    key = key.replace(/^--/, '')
    let val
    if (key.includes('=')) {
      [key, ...val] = key.split('=')
      val = val.join('=')
      if (val === 'true') { val = true }
      config[key] = val
    } else {
      val = args.shift()
      if (!val) {
        config[key] = true
      } else if (val.startsWith('--')) {
        config[key] = true
        args.unshift(val)
      } else {
        config[key] = val
      }
    }
  }
  return config
}

function * run (context, heroku) {
  let createAddon = require('../../lib/create_addon')

  let {app, flags, args} = context
  if (args.length === 0) {
    throw new Error('Usage: heroku addons:create SERVICE:PLAN')
  }

  let {name, as} = flags
  let config = parseConfig(args.slice(1))

  let addon = yield createAddon(heroku, app, args[0], context.flags.confirm, context.flags.wait, {config, name, as})

  yield context.config.runHook('recache', {type: 'addon', app, addon})
  cli.log(`Use ${cli.color.cmd('heroku addons:docs ' + addon.addon_service.name)} to view documentation`)
}

const cmd = {
  topic: 'addons',
  description: 'create a new add-on resource',
  needsAuth: true,
  needsApp: true,
  args: [{name: 'service:plan'}],
  variableArgs: true,
  flags: [
    {name: 'name', description: 'name for the add-on resource', hasValue: true},
    {name: 'as', description: 'name for the initial add-on attachment', hasValue: true},
    {name: 'confirm', description: 'overwrite existing config vars or existing add-on attachments', hasValue: true},
    {name: 'wait', description: 'watch add-on creation status and exit when complete'}
  ],
  run: cli.command({preauth: true}, co.wrap(run))
}

module.exports = [
  Object.assign({command: 'create'}, cmd),
  Object.assign({command: 'add', hidden: true}, cmd)
]