make-cli
v4.0.0
Published
Super easy declarative CLI framework with a single configuration object and a single function call.
Downloads
3,307
Maintainers
Readme
make-cli
Super easy declarative CLI framework with a single configuration object and a single function call.
There are so many command line interface libraries around that it's hard to find the right one for your needs. But there aren't many that expose a single function with a single config object like most other Node.js packages do. That's why there is make-cli
! Call a single function, pass a single config object and you're good to go.
Based on Commander.js and supports most of its features. In case you're missing something, feel free to open up an issue.
Install
# npm
$ npm install make-cli
# Yarn
$ yarn add make-cli
Usage
Create a .js
file with Shebang and import make-cli
. Then configure your command line tool like so:
// cli.js
#!/usr/bin/env node
import makeCli from 'make-cli'
makeCli({
version: '0.1.0',
name: 'my-cli',
usage: 'Usage description here',
arguments: '<remote> [extra]',
options: [
{
name: '-y, --yes',
description: 'Skip questions',
},
{
name: '--value <value>',
description: 'Specifies the value',
defaultValue: 'foo',
choices: ['foo', 'bar'],
},
],
action: (remote, extra, options) => {
// options.value and options.yes
// contain the options.
},
})
Give it execution rights via chmod +x cli.js
.
Then you can call it via the shell of your choice:
$ ./cli.js --yes
$ ./cli.js foo
$ ./cli.js --help
$ ./cli.js --version
When publishing your command line tool via NPM, you'll probably want to add the file to the bin property, so it's installed to node_modules/.bin
.
{
"name": "my-cli",
"bin": "./cli.js"
}
Subcommands
It is possible to define subcommands like so:
makeCli({
commands: [
{
name: 'push',
description: 'Pushes to the repo',
arguments: '<remote>',
options: [
{
name: '-y, --yes',
},
],
handler: (remote, options) => { /* push the stuff */ },
},
{
name: 'pull',
// ...
},
],
})
Then you can call it:
$ ./cli.js push origin
Declaring options and commands as objects
Instead of an array you can declare options and commands as objects, which is sometimes more convenient:
makeCli({
options: [
'-y, --yes': { description: 'Skip questions' },
'--value <value>': {
description: 'Specifies the value',
defaultValue: 'foo',
choices: ['foo', 'bar'],
},
],
commands: {
push: {
description: 'Pushes to the repo',
arguments: '<remote>',
options: [
{
name: '-y, --yes',
},
],
handler: (remote, options) => { /* ... */ },
},
pull: () => { /* ... */ },
}
})
Unknown options
You can also allow to pass unknown options, which are then available in the action like so:
#!/usr/bin/env node
import makeCli from 'make-cli'
makeCli({
// ...
allowUnknownOption: true,
options: [
{
name: '-y, --yes',
description: 'Skip questions',
},
],
action: (options, command) => {
// options.yes = true
// command.args = ['--foo']
},
})
If you now run $ ./cli.js --yes --foo
, command.args
will contain ['--foo']
.
Contribute
Are you missing something or want to contribute? Feel free to file an issue or a pull request! ⚙️
Support
Hey, I am Sebastian Landwehr, a freelance web developer, and I love developing web apps and open source packages. If you want to support me so that I can keep packages up to date and build more helpful tools, you can donate here:
Thanks a lot for your support! ❤️