Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
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: 26 days ago
JSON representation
Super easy declarative CLI framework with a single configuration object and a single function call.
- Host: GitHub
- URL: https://github.com/dword-design/make-cli
- Owner: dword-design
- License: other
- Created: 2019-07-30T14:55:45.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2024-05-01T15:20:37.000Z (6 months ago)
- Last Synced: 2024-05-01T15:32:40.469Z (6 months ago)
- Topics: argument-parser, arguments, cli, command-line, command-line-interface, commander, commanderjs, declarative, declarative-programming, fp, functional, interface, node, nodejs, npm, npm-package, option, options
- Language: JavaScript
- Homepage:
- Size: 2.75 MB
- Stars: 7
- Watchers: 2
- Forks: 2
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Funding: .github/FUNDING.yml
- License: LICENSE.md
Awesome Lists containing this project
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](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 nodeimport 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:
If you want to send me a one time donation. The coffee is pretty good 😊.
Also for one time donations if you like PayPal.
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)