nestjs-eclih v0.0.15
Nestjs Elegant Command Line Interface Hammer
nestjs-eclih aims to provide the tools to build powerful CLI with simple(only two) decorators. Nestjs provides the powerful dependency injection system. Commander provides the flexible and concrete CLI tools. nestjs-commander combines their advantanges together!
Commander.js
nestjs-eclih utilized commander.js as CLI driver. All grammers of command and option are excatly same.
Features
Full support of Commander.js
Partial Command Definition
See examples/provider-of-provider
Command of Command
See examples/provider-of-provider
Example
Create a typescript file hello.ts with following:
import { Module } from "@nestjs/common";
import { CommandProvider, Command, CommanderModule, bootstrapCli } from "nestjs-eclih";
@CommandProvider()
class HelloProvider {
@Command({
options: [
{ nameAndArgs: "-n, --name <name>" }
]
})
hello(options){
console.log("hello", options.name);
}
}
@Module({
imports: [
CommanderModule
],
providers:[
HelloProvider
]
})
export class AppModule {}
bootstrapCli(AppModule);
Now your first CLI is ready!
$ ts-node hello.ts --help
Usage: hello [options] [command]
Options:
-h, --help display help for command
Commands:
hello [options]
help [command] display help for command
$ ts-node hello.ts hello -n husky
hello husky
See more examples in examples
Tutorial
@CommandProvider
@CommandProvider is a class decorator, it accepts null, a string or a CommandConfig
A null/undefined (which means just @CommandProvider()
)
A string infers a CommandConfig
and its nameAndArgs
is class name.
Examples
@CommanderProvider()
class SomeClass {}
// So anything under this class will be the subcommand of command hello
@CommanderProvider({
nameAndArgs: "hello",
description: "hello's description",
alias: "h"
})
class SomeClass {}
@Command
@Command is a class methold decorator, it accepts either a string or a CommandConfig
A string infers a CommandConfig
and its nameAndArgs
is method name.
Examples
@CommanderProvider()
class SomeClass {
@Command({
// Omit nameAndArgs, since by default it is the method name
options: [
{ nameAndArgs: "-n, --name <name>" }
]
})
hello(options){
console.log("hello", options.name);
}
}
CommandConfig
interface CommandConfig {
nameAndArgs?: string;
description?: string;
options?: OptionConfig[];
alias?: string;
aliases?: string[];
}
OptionConfig
interface OptionConfig {
nameAndArgs: string;
description?: string;
mandatory?: boolean;
default?: string;
choices?: string[];
}