lib/utils.js
let _ = require('lodash')
let cli = require('heroku-cli-util')
let error = require('./error')
let getOwner = function (owner) {
if (isOrgApp(owner)) {
return owner.split('@herokumanager.com')[0]
}
return owner
}
let isOrgApp = function (owner) {
return (/@herokumanager\.com$/.test(owner))
}
let isValidEmail = function (email) {
return /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(email)
}
let printGroups = function (group, type = {label: 'Organization'}) {
group = _.sortBy(group, 'name')
cli.table(group, {
columns: [
{key: 'name', label: type.label, format: o => cli.color.green(o)},
{key: 'role', label: 'Role', format: r => r}
],
printHeader: false
})
}
let printGroupsJSON = function (group) {
cli.log(JSON.stringify(group, null, 2))
}
let orgInfo = function * (context, heroku) {
let teamOrOrgName = context.org || context.flags.team
if (!teamOrOrgName) error.exit(1, 'No team or org specified.\nRun this command with --team or --org')
return yield heroku.get(`/organizations/${context.org || context.flags.team}`)
}
let warnUsingOrgFlagInTeams = function (orgInfo, context) {
if ((orgInfo.type === 'team') && (!context.flags.team)) {
cli.warn(`${cli.color.cmd(context.org)} is a Heroku Team\nHeroku CLI now supports Heroku Teams.\nUse ${cli.color.cmd('-t')} or ${cli.color.cmd('--team')} for teams like ${cli.color.cmd(context.org)}`)
}
}
let addMemberToOrg = function * (email, role, groupName, heroku, method = 'PUT') {
let request = heroku.request({
method: method,
path: `/organizations/${groupName}/members`,
body: {email, role}
})
yield cli.action(`Adding ${cli.color.cyan(email)} to ${cli.color.magenta(groupName)} as ${cli.color.green(role)}`, request)
}
let warnIfAtTeamMemberLimit = async function (orgInfo, groupName, context, heroku) {
// Users receive `You'll be billed monthly for teams over 5 members.`
const FREE_TEAM_LIMIT = 6
if (orgInfo.type === 'team') {
let membersAndInvites = {
invites: await heroku.request({
headers: {
Accept: 'application/vnd.heroku+json; version=3.team-invitations'
},
method: 'GET',
path: `/organizations/${groupName}/invitations`
}),
members: await heroku.get(`/organizations/${groupName}/members`)
}
const membersCount = membersAndInvites.invites.length + membersAndInvites.members.length
if (membersCount === FREE_TEAM_LIMIT) cli.warn("You'll be billed monthly for teams over 5 members.")
}
}
module.exports = {
addMemberToOrg,
getOwner,
isOrgApp,
isValidEmail,
orgInfo,
printGroups,
printGroupsJSON,
warnIfAtTeamMemberLimit,
warnUsingOrgFlagInTeams
}