UNPKG

2.53 kBJavaScriptView Raw
1'use strict'
2
3const cli = require('heroku-cli-util')
4const util = require('../lib/util')
5
6function displayDB (db, app) {
7 if (db.addon.attachment_names) {
8 cli.styledHeader(db.addon.attachment_names.map(c => cli.color.configVar(c + '_URL')).join(', '))
9 } else {
10 cli.styledHeader(db.configVars.map(c => cli.color.configVar(c)).join(', '))
11 }
12
13 if (db.addon.app.name !== app) {
14 db.db.info.push({ name: 'Billing App', values: [cli.color.cyan(db.addon.app.name)] })
15 }
16 db.db.info.push({ name: 'Add-on', values: [cli.color.addon(db.addon.name)] })
17
18 let info = db.db.info.reduce((info, i) => {
19 if (i.values.length > 0) {
20 if (i.resolve_db_name) {
21 info[i.name] = i.values.map(v => util.databaseNameFromUrl(v, db.config))
22 } else {
23 info[i.name] = i.values
24 }
25 info[i.name] = info[i.name].join(', ')
26 }
27 return info
28 }, {})
29 let keys = db.db.info.map(i => i.name)
30 cli.styledObject(info, keys)
31 cli.log()
32}
33
34async function run(context, heroku) {
35 const { sortBy } = require('lodash')
36 const host = require('../lib/host')
37 const fetcher = require('../lib/fetcher')(heroku)
38 const app = context.app
39 const db = context.args.database
40
41 let addons = []
42 let config = await heroku.get(`/apps/${app}/config-vars`)
43
44 if (db) {
45 addons = await Promise.all([fetcher.addon(app, db)])
46 } else {
47 addons = await fetcher.all(app)
48 if (addons.length === 0) {
49 cli.log(`${cli.color.app(app)} has no heroku-postgresql databases.`)
50 return
51 }
52 }
53
54 let dbs = await Promise.all(addons.map(async (addon) => {
55 return {
56 addon,
57 config,
58 db: await heroku.request({
59 host: host(addon),
60 method: 'get',
61 path: `/client/v11/databases/${addon.id}`
62 }).catch(err => {
63 if (err.statusCode !== 404) throw err
64 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.`)
65 })
66 }
67 }))
68
69 dbs = dbs.filter(db => db.db)
70 dbs.forEach(db => { db.configVars = util.configVarNamesFromValue(db.config, db.db.resource_url) })
71 dbs = sortBy(dbs, db => db.configVars[0] !== 'DATABASE_URL', 'configVars[0]')
72
73 dbs.forEach(db => displayDB(db, app))
74}
75
76let cmd = {
77 topic: 'pg',
78 description: 'show database information',
79 needsApp: true,
80 needsAuth: true,
81 args: [{ name: 'database', optional: true }],
82 run: cli.command({ preauth: true }, run)
83}
84
85module.exports = [
86 cmd,
87 Object.assign({ command: 'info' }, cmd)
88]