cli-helpers-engine

This is the engine used by plugin modules in the @dhis2/cli
commandline interface ecosystem.
A few common utilities:
These helpers assume a node.js CLI context. There are other under-the-hood helpers as well, but they are currently undocumented.
const { reporter, chalk, prompt, exec } = require('@dhis2/cli-helpers-engine')
reporter.print('This is a test')
reporter.print(chalk.dim('This is a less important test'))
reporter.print(
chalk.green(
`Chalk can be used to ${chalk.bold(
'style text'
)} which will be printed to the console.`
)
)
reporter.info('This is something important')
reporter.error('An error occurred')
reporter.warn('Something non-critical went wrong')
reporter.debug('This will only be printed when --verbose is passed')
const answers = await prompt([
{
type: 'list',
name: 'theme',
message: 'What do you want to do?',
choices: [
'Order a pizza',
'Make a reservation',
new inquirer.Separator(),
'Ask for opening hours',
{
name: 'Contact support',
disabled: 'Unavailable at this time',
},
'Talk to the receptionist',
],
},
{
type: 'list',
name: 'size',
message: 'What size do you need?',
choices: ['Jumbo', 'Large', 'Standard', 'Medium', 'Small', 'Micro'],
filter: function (val) {
return val.toLowerCase()
},
when: function (answers) {
return answers.theme === 'Order a pizza'
},
},
])
if (answers.theme === 'Order a pizza') {
reporter.info(`Ordering a ${answers.size} pizza`)
} else {
reporter.info(`Ok, let's ${answers.theme}`)
}
const textContents = await exec({
cmd: 'cat',
args: ['./test.txt'],
cwd: './myDirectory',
captureOut: true,
})
There's a lot more you can do with these utilities - check the source code in the ./libs
folder or the many CLI module examples at dhis2/cli for inspiration.
How to use the d2 Cache
Any CLI command instantiated with @dhis2/cli-helpers-engine
will have an injected getCache
argument. This is a powerful, simple cache engine for downloading, caching, and accessing files in the global d2
cache.
The most handy method of the d2
Cache is get
, which allows the developer to fetch a remote URL, optionally extract it if the download is a zip file, and store it in the cache. If a copy already exists in the cache, the download is skipped (unless force: true
is specified):
const { makeEntryPoint } = require('@dhis2/cli-helpers-engine')
const handler = async ({ force, getCache }) => {
const cache = getCache()
const url =
'https://spreadsheets.google.com/feeds/list/1Fd-vBoJPjp5wdCyJc7d_LOJPOg5uqdzVa3Eq5-VFR-g/2/public/values?alt=json'
const dataCachePath = 'dhis2-in-action-countries.json'
try {
await cache.get(url, dataCachePath, { force: true })
} catch (e) {
const exists = await cache.exists(dataCachePath)
if (!exists) {
reporter.error('Failed to download new in-action data, and no cached data exists')
process.exit(1)
}
const modifiedTime = (await cache.stat(dataCachePath)).mtime.toISOString()
reporter.debug(`Failed to update in-action data cache, using previously-cached data from ${modifiedTime}`)
}
const dbUrl =
'https://databases.dhis2.org/sierra-leone/2.35.0/dhis2-db-sierra-leone.sql.gz'
await cache.get(dbUrl, 'databases/2.35.0.sql.gz', { raw: true, force: force })
const dirStat = (await cache.exists('databases'))
? await cache.stat('databases')
: null
if (dirStat && dirStat.children) {
Object.entries(dirStat.children)
.forEach(([name, stat]) => {
reporter.print(`${chalk.bold(name)} (${stat.size})`)
})
} else {
reporter.print('No databases found')
}
}
const command = {
builder: yargs => {
yargs.option('force', {
alias: 'f',
type: 'boolean',
description: 'force re-download of all cached items',
default: false
}
},
handler
})
makeEntryPoint(command)
For examples of the cache in action, check out its use in d2 cluster and d2 debug cache
Report an issue
The issue tracker can be found in DHIS2 JIRA
under the CLI project.
Deep links: