UNPKG

@heroku-cli/plugin-pg-v5

Version:
94 lines (78 loc) 2.54 kB
'use strict' const cli = require('heroku-cli-util') const util = require('../lib/util') function displayDB(db, app) { if (db.addon.attachment_names) { cli.styledHeader(db.addon.attachment_names.map(c => cli.color.configVar(c + '_URL')).join(', ')) } else { cli.styledHeader(db.configVars.map(c => cli.color.configVar(c)).join(', ')) } if (db.addon.app.name !== app) { db.db.info.push({name: 'Billing App', values: [cli.color.cyan(db.addon.app.name)]}) } db.db.info.push({name: 'Add-on', values: [cli.color.addon(db.addon.name)]}) let info = db.db.info.reduce((info, i) => { if (i.values.length > 0) { if (i.resolve_db_name) { info[i.name] = i.values.map(v => util.databaseNameFromUrl(v, db.config)) } else { info[i.name] = i.values } info[i.name] = info[i.name].join(', ') } return info }, {}) let keys = db.db.info.map(i => i.name) cli.styledObject(info, keys) cli.log() } async function run(context, heroku) { const {sortBy} = require('lodash') const host = require('../lib/host') const fetcher = require('../lib/fetcher')(heroku) const app = context.app const db = context.args.database let addons = [] let config = await heroku.get(`/apps/${app}/config-vars`) if (db) { addons = await Promise.all([fetcher.addon(app, db)]) } else { addons = await fetcher.all(app) if (addons.length === 0) { cli.log(`${cli.color.app(app)} has no heroku-postgresql databases.`) return } } let dbs = await Promise.all(addons.map(async addon => { return { addon, config, db: await heroku.request({ host: host(addon), method: 'get', path: `/client/v11/databases/${addon.id}`, }).catch(error => { if (error.statusCode !== 404) throw error cli.warn(`${cli.color.addon(addon.name)} is not yet provisioned.\nRun ${cli.color.cmd('heroku addons:wait')} to wait until the db is provisioned.`) }), } })) dbs = dbs.filter(db => db.db) dbs.forEach(db => { db.configVars = util.configVarNamesFromValue(db.config, db.db.resource_url) }) dbs = sortBy(dbs, db => db.configVars[0] !== 'DATABASE_URL', 'configVars[0]') dbs.forEach(db => displayDB(db, app)) } let cmd = { topic: 'pg', description: 'show database information', needsApp: true, needsAuth: true, args: [{name: 'database', optional: true}], run: cli.command({preauth: true}, run), } module.exports = [ cmd, Object.assign({command: 'info'}, cmd), ]