Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/dword-design/make-cli

Super easy declarative CLI framework with a single configuration object and a single function call.
https://github.com/dword-design/make-cli

argument-parser arguments cli command-line command-line-interface commander commanderjs declarative declarative-programming fp functional interface node nodejs npm npm-package option options

Last synced: about 2 months ago
JSON representation

Super easy declarative CLI framework with a single configuration object and a single function call.

Awesome Lists containing this project

README

        

# make-cli



npm version
Linux macOS Windows compatible
Build status

Coverage status

Dependency status
Renovate enabled

Open in Gitpod

Buy Me a Coffee

PayPal

Patreon

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](https://github.com/tj/commander.js) and supports most of its features. In case you're missing something, feel free to open up an [issue](https://github.com/dword-design/make-cli/issues).

## Install

```bash
# 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:

```js
// cli.js

#!/usr/bin/env node

import makeCli from 'make-cli'

makeCli({
version: '0.1.0',
name: 'my-cli',
usage: 'Usage description here',
arguments: ' [extra]',
options: [
{
name: '-y, --yes',
description: 'Skip questions',
},
{
name: '--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:

```bash
$ ./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](https://docs.npmjs.com/cli/v7/configuring-npm/package-json#bin) property, so it's installed to `node_modules/.bin`.

```json
{
"name": "my-cli",
"bin": "./cli.js"
}
```

### Subcommands

It is possible to define subcommands like so:

```js
makeCli({
commands: [
{
name: 'push',
description: 'Pushes to the repo',
arguments: '',
options: [
{
name: '-y, --yes',
},
],
handler: (remote, options) => { /* push the stuff */ },
},
{
name: 'pull',
// ...
},
],
})
```

Then you can call it:

```bash
$ ./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:

```js
makeCli({
options: [
'-y, --yes': { description: 'Skip questions' },
'--value ': {
description: 'Specifies the value',
defaultValue: 'foo',
choices: ['foo', 'bar'],
},
],
commands: {
push: {
description: 'Pushes to the repo',
arguments: '',
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:

```js
#!/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](https://github.com/dword-design/make-cli/issues) or a [pull request](https://github.com/dword-design/make-cli/pulls)! ⚙️

## 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:



Buy Me a Coffee
 If you want to send me a one time donation. The coffee is pretty good 😊.


PayPal
 Also for one time donations if you like PayPal.


Patreon
 Here you can support me regularly, which is great so I can steadily work on projects.

Thanks a lot for your support! ❤️

## License

[MIT License](https://opensource.org/license/mit/) © [Sebastian Landwehr](https://sebastianlandwehr.com)