cli-kit
A command line application toolkit for Node.js.
Features
- Command line parsing
- Support for dynamic command hierarchies
- Auto-generated help
- CLI template engine
- External CLI extensions
- Client and server for remote CLI session such as xterm.js
- Automatic Node.js version enforcement
Installation
npm install cli-kit --save
Usage
import CLI from 'cli-kit';
(async () => {
const { argv, _ } = await new CLI({
options: {
'-f, --force': 'use the force',
'--timeout [value]': {
desc: 'the timeout duration',
type: 'int'
}
}
}).exec();
console.log('options:', argv);
console.log('args:', _);
})();
Architecture
In cli-kit, commands and options are grouped into "contexts". The main CLI instance defines the
"global context". Each command defines a new context. Each context can have its own commands,
options, and arguments. What you end up with is a hierarchy of contexts.
When cli-kit parses the command line arguments, it will check each argument against the global
context to see if the argument can be identified as a known command, option, or argument. If it
finds a command, it adds the command's context to a stack and re-parses any unidentified arguments.
This allows you to create deep and dynamic hierarchies of commands, options, and arguments.
Pseudo-Terminal Support
cli-kit extensions can be native binary executables or other Node.js scripts. When the extension is
a native executable, then it is executed using Node's spawn()
. Note that spawned child processes
do not have a TTY and thus things like prompting will not work.
API
class CLI
A CLI
intance defines a global context for which you add commands, options, and arguments.
Extends Context
> HookEmitter
.
constuctor(opts)
Example
const cli = new CLI({
args: [
'<arg1>',
'[arg2]',
'arg3',
{
name: 'arg4',
desc: undefined,
hidden: false,
multiple: false,
required: false,
type: 'string'
},
'arg4...'
],
camelCase: true,
commands: {
'some-command': {
action({ argv, _ }) {
console.log('options:', argv);
console.log('args:', _);
},
aliases: [ 'another-command' ],
args: [],
camelCase: true,
commands: {},
desc: undefined,
hidden: false,
options: {},
title: undefined
}
},
defaultCommand: undefined,
desc: undefined,
help: true,
helpExitCode: undefined,
name: 'program',
options: {
},
title: 'Global',
version: null
});
exec(args)
Parses the command line args and executes a command, if found.
-
args
: Array<String>
(optional)
An array of arguments. Each argument is expected to be a string.
Defaults to process.argv.slice(2)
.
Returns a Promise
that resolves an Arguments
object. This object will contain the parsed options
in argv
and arguments in _
.
Example
cli.exec()
.then(({ argv, _ }) => {
console.log('options:', argv);
console.log('args:', _);
});
class Context
Base class for CLI
and Command
classes.
Extends HookEmitter
.
argument(arg)
Adds an argument to a CLI
or Command
.
-
arg
: Argument
, Object
, or String
.
An argument descriptor. Either an Argument
instance or an Object
to pass into a Argument
constructor.
An argument requires a name
.
Returns a reference to the CLI
or Command
.
Example
cli.argument('foo');
cli.argument('[wiz]');
cli.argument('<pow>');
cli.argument({
name: 'bar',
type: 'int'
});
cli.argument(new Argument('baz'));
command(cmd, opts)
Adds a command to a CLI
or Command
.
TODO
option(optOrFormat, group, params)
Adds an option or group of options to a CLI
or Command
.
TODO
Who Uses cli-kit?
License
MIT