src/commands/labs/index.js
'use strict'
const cli = require('heroku-cli-util')
const co = require('co')
function printJSON (features) {
cli.log(JSON.stringify(features, null, 2))
}
function printFeatures (features) {
const {sortBy} = require('lodash')
features = sortBy(features, 'name')
let longest = Math.max.apply(null, features.map((f) => f.name.length))
for (let f of features) {
let line = `${f.enabled ? '[+]' : '[ ]'} ${f.name.padEnd(longest)}`
if (f.enabled) line = cli.color.green(line)
line = `${line} ${f.description}`
cli.log(line)
}
}
function * run (context, heroku) {
let features = yield {
currentUser: heroku.get('/account'),
user: heroku.get('/account/features'),
app: context.app ? heroku.get(`/apps/${context.app}/features`) : null
}
// general features are managed via `features` not `labs`
features.user = features.user.filter((f) => f.state !== 'general')
if (features.app) features.app = features.app.filter((f) => f.state !== 'general')
if (context.flags.json) {
delete features.currentUser
printJSON(features)
} else {
cli.styledHeader(`User Features ${cli.color.cyan(features.currentUser.email)}`)
printFeatures(features.user)
if (features.app) {
cli.log()
cli.styledHeader(`App Features ${cli.color.app(context.app)}`)
printFeatures(features.app)
}
}
}
module.exports = {
topic: 'labs',
description: 'list experimental features',
flags: [
{name: 'json', description: 'display as json'}
],
needsAuth: true,
wantsApp: true,
run: cli.command(co.wrap(run))
}