mite-cli
Version:
command line tool for time tracking service mite.de
87 lines (74 loc) • 2.96 kB
JavaScript
;
const program = require('commander');
const DataOutput = require('./lib/data-output');
const pkg = require('./../package.json');
const config = require('./config');
const servicesCommand = require('./lib/commands/services');
const commandOptions = require('./lib/options');
const { handleError } = require('./lib/errors');
program
.version(pkg.version)
.description('list, filter & search for services')
.option.apply(program, commandOptions.toArgs(commandOptions.archived, 'filter for archived or unarchived services only', 'all'))
.option.apply(program, commandOptions.toArgs(commandOptions.billable, 'filter for billable or not-billable services only', 'all'))
.option.apply(program, commandOptions.toArgs(
commandOptions.columns,
commandOptions.columns.description(servicesCommand.columns.options),
config.get().servicesColumns
))
.option.apply(program, commandOptions.toArgs(commandOptions.json))
.option.apply(program, commandOptions.toArgs(commandOptions.plain))
.option.apply(program, commandOptions.toArgs(commandOptions.pretty))
.option.apply(program, commandOptions.toArgs(
commandOptions.sort,
commandOptions.sort.description(servicesCommand.sort.options),
servicesCommand.sort.default
))
.option(
'--search <regexp>',
'optional case-insensitive regular expression matching on the name'
)
.addHelpText('after', `
Examples:
show all services
mite service list
show all archived services
mite service list --archived true
search for services
mite service list --search "programming|coding"
show archived services with custom columns
mite service list --columns name,hourly_rate,created_at
export all archived services as json
mite service list --columns id,name,hourly_rate,billable --archived true --json > all_services.csv
`);
async function main() {
const opts = program.opts();
const miteApi = require('./lib/mite-api')(config.get());
const options = {
limit: 1000,
offset: 0,
...(opts.search && { query: opts.search }),
};
return miteApi.getServices(options)
.then(services => services
.filter(({ archived }) => opts.archived === 'all' ? true : archived === opts.archived)
.filter(({ billable }) => opts.billable === 'all' ? true : billable === opts.billable)
)
.then(items => miteApi.sort(
items,
commandOptions.sort.resolve(opts.sort, servicesCommand.sort.options),
))
.then(items => {
const format = DataOutput.getFormatFromOptions(opts, config);
const columns = commandOptions.columns.resolve(opts.columns, servicesCommand.columns.options);
const tableData = DataOutput.compileTableData(items, columns, format);
process.stdout.write(DataOutput.formatData(tableData, format, columns) + '\n');
})
.catch(handleError);
} // main
try {
program.action(main).parse();
} catch (err) {
handleError(err);
}