@heroku/heroku-cli-util
A set of helpful CLI utilities for Heroku and oclif-based Node.js CLIs. This
package provides convenient wrappers and helpers for user interaction, output
formatting, and color styling.
Features
- User prompts and confirmations (yes/no, input)
- Styled output (headers, JSON, objects, tables)
- Wait indicators for async operations
- Colors for consistent, semantic CLI styling
Installation
npm install @heroku/heroku-cli-util
Usage
Import only the utilities you need for better performance and smaller bundle sizes.
import * as color from '@heroku/heroku-cli-util/color';
import { confirm, table } from '@heroku/heroku-cli-util/hux';
import { DatabaseResolver } from '@heroku/heroku-cli-util/utils/pg';
import { AddonResolver } from '@heroku/heroku-cli-util/utils/addons';
Available import paths:
@heroku/heroku-cli-util/color - Color utilities
@heroku/heroku-cli-util/hux - UX utilities (prompts, tables, output formatting)
@heroku/heroku-cli-util/utils - All utility functions
@heroku/heroku-cli-util/utils/pg - PostgreSQL-specific utilities
@heroku/heroku-cli-util/utils/addons - Addon-specific utilities
Output Utilities
import { styledHeader, styledJSON, styledObject, table, wait } from '@heroku/heroku-cli-util/hux';
styledHeader('My CLI Header');
styledJSON({ foo: 'bar' });
styledObject({ foo: 'bar' });
table([
{name: 'Alice', age: 30},
{name: 'Bob', age: 25},
], {
name: {header: 'Name'},
age: {header: 'Age'},
});
const stop = wait('Processing...');
stop();
User Interaction
import { prompt, confirm } from '@heroku/heroku-cli-util/hux';
const name = await prompt('What is your name?');
const proceed = await confirm('Continue?');
Colors
import * as color from '@heroku/heroku-cli-util/color';
console.log(color.app('my-awesome-app'));
console.log(color.pipeline('staging'));
console.log(color.space('production'));
console.log(color.addon('heroku-postgresql'));
console.log(color.datastore('postgresql-123'));
console.log(color.success('Deploy complete'));
console.log(color.failure('Build failed'));
console.log(color.warning('Deprecated feature'));
console.log(color.team('my-team'));
console.log(color.user('user@example.com'));
console.log(color.label('Name'));
console.log(color.info('Help text'));
console.log(color.command('heroku apps:list'));
See the COLORS.md documentation for the complete color palette and usage guide.
Types
Error Classes
import { AmbiguousError, NotFound } from '@heroku/heroku-cli-util/utils';
try {
throw new AmbiguousError([{ name: 'foo' }, { name: 'bar' }], 'addon');
} catch (err) {
if (err instanceof AmbiguousError) {
console.error('Ambiguous:', err.message);
}
}
try {
throw new NotFound();
} catch (err) {
if (err instanceof NotFound) {
console.error('Not found:', err.message);
}
}
PostgreSQL Types (TypeScript)
Import PG types using the pg namespace:
import type { pg } from '@heroku/heroku-cli-util';
const connection: pg.ConnectionDetails = {
database: 'mydb',
host: 'localhost',
password: 'pass',
pathname: '/mydb',
port: '5432',
url: 'postgres://...',
user: 'admin'
};
function processDatabase(details: pg.ConnectionDetailsWithAttachment) {
}
const addon: pg.AddOnWithRelatedData = { };
const link: pg.Link = { };
const tunnel: pg.TunnelConfig = { };
Alternatively, you can import types directly:
import type {
ConnectionDetails,
AddOnWithRelatedData,
ExtendedAddonAttachment,
Link,
TunnelConfig
} from '@heroku/heroku-cli-util';
Database and Utility Helpers
import { DatabaseResolver, PsqlService, getHost, getPsqlConfigs } from '@heroku/heroku-cli-util/utils/pg';
import { AddonResolver, isPostgresAddon } from '@heroku/heroku-cli-util/utils/addons';
const resolver = new DatabaseResolver(herokuApiClient, app, db);
const database = await resolver.resolve();
const host = getHost();
const psql = new PsqlService(database);
const isPg = isPostgresAddon(addon);
const addonResolver = new AddonResolver(herokuApiClient, app, addonName);
const addon = await addonResolver.resolve();
Development
- Build:
npm run build
- Test:
npm test
- Lint:
npm run lint