classopt is a command line arguments parser for deno based with decorators.
import { Arg, Command, Flag, Help, Name, Opt, Version } from "../mod.ts"; @Help("Help Text for Command") @Name("program") @Version("0.0.0") class Program extends Command { @Arg({ about: "user to login" }) username!: string; @Opt({ about: "password for user, if required", short: true }) password = ""; @Flag({ about: "debug mode" }) debug = false; execute() { console.log(`<username> = ${JSON.stringify(this.username)}`); console.log(`-p, --password = ${JSON.stringify(this.password)}`); console.log(`--debug = ${JSON.stringify(this.debug)}`); } } await Program.run(Deno.args);$ deno run examples/basic.ts --help program - Help Text for Command USAGE program [OPTIONS] <username> OPTIONS -p, --password <string> password for user, if required --debug debug mode -V, --version Prints version information -h, --help Prints help information ARGS <username> user to login $ deno run examples/basic.ts -p pass --debug stsysd <username> = "stsysd" -p, --password = "pass" --debug = trueimport { Command, Flag, Help, Name, Opt, Version } from "../mod.ts"; @Help("example of how to use `Opt`") @Name("program") @Version("0.0.0") class Program extends Command { @Flag({ about: "boolean option" }) flag = false; @Opt({ about: "string option as default" }) str = ""; @Opt({ about: "number option", type: "number" }) num = 0; @Opt({ about: "option that can be specified multiple times", type: "string", multiple: true, }) multiple!: string[]; @Opt({ about: "enable short key", short: true }) short1 = ""; @Opt({ about: "specify short key", short: "S" }) short2 = ""; @Opt({ about: "disable long key (need `short` option)", long: false, short: "L", }) long1 = ""; @Opt({ about: "specify long key", long: "long-key" }) long2 = ""; execute() { console.log(`--flag = ${this.flag}`); console.log(`--str = ${this.str}`); console.log(`--num = ${this.num}`); console.log(`--multiple = ${this.multiple}`); console.log(`-s, --short1 = ${this.short1}`); console.log(`-S, --short2 = ${this.short2}`); console.log(`-L = ${this.long1}`); console.log(`--long-key = ${this.long2}`); } } await Program.run(Deno.args);$ deno run examples/opt.ts --help program - example of how to use `Opt` USAGE program [OPTIONS] OPTIONS --flag boolean option --str <string> string option as default --num <number> number option --multiple <string> option that can be specified multiple times -s, --short1 <string> enable short key -S, --short2 <string> specify short key -L <string> disable long key (need `short` option) --long-key <string> specify long key -V, --version Prints version information -h, --help Prints help informationimport { Arg, Command, Help, Name, Version } from "../mod.ts"; @Help("example of how to use `Arg`") @Name("program") @Version("0.0.0") class Program extends Command { @Arg({ about: "required argument" }) req!: string; @Arg({ about: "`name` option is used in help", name: "named" }) str = ""; @Arg({ about: "optioanl argument", optional: true }) opt?: string; // The order of arguments is determined by the order in which they are defined // So required arguments cannot be defined after optional arguments // @Arg({ about: "required argument after optional" }) // invalid!: string; execute() { console.log(`<req> = ${this.req}`); console.log(`[opt] = ${this.opt}`); console.log(`<named> = ${this.str}`); } } await Program.run(Deno.args);$ deno run examples/arg.ts --help program - example of how to use `Arg` USAGE program [OPTIONS] <req> <named> [opt] OPTIONS -V, --version Prints version information -h, --help Prints help information ARGS <req> required argument <named> `name` option is used in help [opt] optioanl argumentimport { Arg, Cmd, Command, Flag, Help, Name, Version } from "../mod.ts"; @Help("Help Text for 'list' Command") class List extends Command { @Flag({ about: "Prints full path" }) fullPath = false; execute() { console.log(`List.fullPath = ${this.fullPath}`); } } @Name("get") @Help("Help Text for 'get' Command") class GetCommand extends Command { @Arg({ about: "Specify path to get" }) path!: string; execute() { console.log(`GetCommand.path = ${this.path}`); } } @Name("main") @Version("0.0.0") @Help("Help Text for Top Command") class Program extends Command { @Cmd(List, GetCommand) command?: Command; execute() { if (this.command == null) { console.log(this.help()); } else { this.command?.execute(); } } } await Program.run(Deno.args);$ deno run examples/cmd.ts --help main - Help Text for Top Command USAGE main [OPTIONS] <SUBCOMMAND> OPTIONS -h, --help Prints help information -V, --version Prints version information COMMANDS list Help Text for 'list' Command get Help Text for 'get' Command $ deno run examples/cmd.ts list --help list - Help Text for 'list' Command USAGE main list [OPTIONS] OPTIONS --full-path Prints full path -h, --help Prints help information $ deno run examples/cmd.ts get --help get - Help Text for 'get' Command USAGE main get [OPTIONS] <path> OPTIONS -h, --help Prints help information ARGS <path> Specify path to get