• Stars
    star
    144
  • Rank 255,590 (Top 6 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created over 13 years ago
  • Updated about 6 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Command-Option-Argument: Get more from defining your command line interface

Command-Option-Argument

Yet another parser for command line options.

NPM Status Travis Status AppVeyor Status Coverage Status Dependency Status

What is it?

COA is a parser for command line options that aim to get maximum profit from formalization your program API. Once you write definition in terms of commands, options and arguments you automaticaly get:

  • Command line help text
  • Program API for use COA-based programs as modules
  • Shell completion

Other features

  • Rich types for options and arguments, such as arrays, boolean flags and required
  • Commands can be async throught using promising (powered by Q)
  • Easy submoduling some existing commands to new top-level one
  • Combined validation and complex parsing of values

TODO

  • Localization
  • Shell-mode
  • Configs
  • Aliases
  • Defaults

Examples

require('coa').Cmd() // main (top level) command declaration
    .name(process.argv[1]) // set top level command name from program name
    .title('My awesome command line util') // title for use in text messages
    .helpful() // make command "helpful", i.e. options -h --help with usage message
    .opt() // add some option
        .name('version') // name for use in API
        .title('Version') // title for use in text messages
        .short('v') // short key: -v
        .long('version') // long key: --version
        .flag() // for options without value
        .act(function(opts) { // add action for option
            // return message as result of action
            return JSON.parse(require('fs').readFileSync(__dirname + '/package.json'))
                .version;
        })
        .end() // end option chain and return to main command
    .cmd().name('subcommand').apply(require('./subcommand').COA).end() // load subcommand from module
    .cmd() // inplace subcommand declaration
        .name('othercommand').title('Awesome other subcommand').helpful()
        .opt()
            .name('input').title('input file, required')
            .short('i').long('input')
            .val(function(v) { // validator function, also for translate simple values
                return require('fs').createReadStream(v) })
            .req() // make option required
            .end() // end option chain and return to command
        .end() // end subcommand chain and return to parent command
    .run(process.argv.slice(2)); // parse and run on process.argv
// subcommand.js
exports.COA = function() {
    this
        .title('Awesome subcommand').helpful()
        .opt()
            .name('output').title('output file')
            .short('o').long('output')
            .output() // use default preset for "output" option declaration
            .end()
};

API reference

Cmd

Command is a top level entity. Commands may have options and arguments.

Cmd.api

Returns object containing all its subcommands as methods to use from other programs.
@returns {Object}

Cmd.name

Set a canonical command identifier to be used anywhere in the API.
@param String _name command name
@returns COA.Cmd this instance (for chainability)

Cmd.title

Set a long description for command to be used anywhere in text messages.
@param String _title command title
@returns COA.Cmd this instance (for chainability)

Cmd.cmd

Create new or add existing subcommand for current command.
@param COA.Cmd [cmd] existing command instance
@returns COA.Cmd new or added subcommand instance

Cmd.opt

Create option for current command.
@returns COA.Opt new option instance

Cmd.arg

Create argument for current command.
@returns COA.Opt new argument instance

Cmd.act

Add (or set) action for current command.
@param Function act action function, invoked in the context of command instance and has the parameters:
- Object opts parsed options
- Array args parsed arguments
- Object res actions result accumulator
It can return rejected promise by Cmd.reject (in case of error) or any other value treated as result.
@param {Boolean} [force=false] flag for set action instead add to existings
@returns COA.Cmd this instance (for chainability)

Cmd.apply

Apply function with arguments in context of command instance.
@param Function fn
@param Array args
@returns COA.Cmd this instance (for chainability)

Cmd.comp

Set custom additional completion for current command.
@param Function fn completion generation function, invoked in the context of command instance. Accepts parameters:
- Object opts completion options
It can return promise or any other value treated as result.
@returns COA.Cmd this instance (for chainability)

Cmd.helpful

Make command "helpful", i.e. add -h --help flags for print usage.
@returns COA.Cmd this instance (for chainability)

Cmd.completable

Adds shell completion to command, adds "completion" subcommand, that makes all the magic.
Must be called only on root command.
@returns COA.Cmd this instance (for chainability)

Cmd.usage

Build full usage text for current command instance.
@returns String usage text

Cmd.run

Parse arguments from simple format like NodeJS process.argv and run ahead current program, i.e. call process.exit when all actions done.
@param Array argv
@returns COA.Cmd this instance (for chainability)

Cmd.invoke

Invoke specified (or current) command using provided options and arguments.
@param String|Array cmds subcommand to invoke (optional)
@param Object opts command options (optional)
@param Object args command arguments (optional)
@returns Q.Promise

Cmd.reject

Return reject of actions results promise.
Use in .act() for return with error.
@param Object reason reject reason
You can customize toString() method and exitCode property of reason object.
@returns Q.promise rejected promise

Cmd.end

Finish chain for current subcommand and return parent command instance.
@returns COA.Cmd parent command

Opt

Option is a named entity. Options may have short and long keys for use from command line.
@namespace
@class Presents option

Opt.name

Set a canonical option identifier to be used anywhere in the API.
@param String _name option name
@returns COA.Opt this instance (for chainability)

Opt.title

Set a long description for option to be used anywhere in text messages.
@param String _title option title
@returns COA.Opt this instance (for chainability)

Opt.short

Set a short key for option to be used with one hyphen from command line.
@param String _short
@returns COA.Opt this instance (for chainability)

Opt.long

Set a short key for option to be used with double hyphens from command line.
@param String _long
@returns COA.Opt this instance (for chainability)

Opt.flag

Make an option boolean, i.e. option without value.
@returns COA.Opt this instance (for chainability)

Opt.arr

Makes an option accepts multiple values.
Otherwise, the value will be used by the latter passed.
@returns COA.Opt this instance (for chainability)

Opt.req

Makes an option req.
@returns COA.Opt this instance (for chainability)

Opt.only

Makes an option to act as a command, i.e. program will exit just after option action.
@returns COA.Opt this instance (for chainability)

Opt.val

Set a validation (or value) function for argument.
Value from command line passes through before becoming available from API.
Using for validation and convertion simple types to any values.
@param Function _val validating function, invoked in the context of option instance and has one parameter with value from command line
@returns COA.Opt this instance (for chainability)

Opt.def

Set a default value for option. Default value passed through validation function as ordinary value.
@param Object _def
@returns COA.Opt this instance (for chainability)

Opt.input

Make option value inputting stream. It's add useful validation and shortcut for STDIN. @returns {COA.Opt} this instance (for chainability)

Opt.output

Make option value outputing stream.
It's add useful validation and shortcut for STDOUT.
@returns COA.Opt this instance (for chainability)

Opt.act

Add action for current option command. This action is performed if the current option is present in parsed options (with any value).
@param Function act action function, invoked in the context of command instance and has the parameters:
- Object opts parsed options
- Array args parsed arguments
- Object res actions result accumulator
It can return rejected promise by Cmd.reject (in case of error) or any other value treated as result.
@returns COA.Opt this instance (for chainability)

Opt.comp

Set custom additional completion for current option.
@param Function fn completion generation function, invoked in the context of command instance. Accepts parameters:
- Object opts completion options
It can return promise or any other value treated as result.
@returns COA.Opt this instance (for chainability)

Opt.end

Finish chain for current option and return parent command instance.
@returns COA.Cmd parent command

Arg

Argument is a unnamed entity.
From command line arguments passed as list of unnamed values.

Arg.name

Set a canonical argument identifier to be used anywhere in text messages.
@param String _name argument name
@returns COA.Arg this instance (for chainability)

Arg.title

Set a long description for argument to be used anywhere in text messages.
@param String _title argument title
@returns COA.Arg this instance (for chainability)

Arg.arr

Makes an argument accepts multiple values.
Otherwise, the value will be used by the latter passed.
@returns COA.Arg this instance (for chainability)

Arg.req

Makes an argument req.
@returns COA.Arg this instance (for chainability)

Arg.val

Set a validation (or value) function for argument.
Value from command line passes through before becoming available from API.
Using for validation and convertion simple types to any values.
@param Function _val validating function, invoked in the context of argument instance and has one parameter with value from command line
@returns COA.Arg this instance (for chainability)

Arg.def

Set a default value for argument. Default value passed through validation function as ordinary value.
@param Object _def
@returns COA.Arg this instance (for chainability)

Arg.output

Make argument value outputing stream.
It's add useful validation and shortcut for STDOUT.
@returns COA.Arg this instance (for chainability)

Arg.comp

Set custom additional completion for current argument.
@param Function fn completion generation function, invoked in the context of command instance. Accepts parameters:
- Object opts completion options
It can return promise or any other value treated as result.
@returns COA.Arg this instance (for chainability)

Arg.end

Finish chain for current option and return parent command instance.
@returns COA.Cmd parent command

More Repositories

1

xjst

Extensible JavaScript Transformations
JavaScript
203
star
2

krasota.js

Syntactic transformations of JavaScript code, with taking care of whitespaces and comments.
JavaScript
96
star
3

dotfiles

Personal configs
Lua
14
star
4

shmakowiki

Yet another wiki dialect, inspired by WackoWiki and WikiCreole
JavaScript
13
star
5

ometa-highlighter

Code highlighter based on Ometa/JS (little inspired by Pygments)
JavaScript
9
star
6

yajsh

Yet Another JavaScript Highlighter
JavaScript
8
star
7

jquery.jsonrpc

Yet another JSON-RPC plugin
7
star
8

bem-components-react

EXPERIMENT, DO NOT USE
JavaScript
7
star
9

tinyjira

Tiny interface for Atlassian JIRA based on JSON-RPC
JavaScript
7
star
10

jscreole

JavaScript Creole 1.0 Wiki Markup Parser
JavaScript
4
star
11

ChicoryScript

Do we need yet another CoffeeScript or what?
4
star
12

jquery.hashhistory

jQuery hash change event
JavaScript
3
star
13

icfpc2013

ICFPC 2013
Java
3
star
14

nme

Nyctergatis Markup Engine
C
2
star
15

thaipass-check

Check for ThaiPass status
TypeScript
2
star
16

json4xml

Yet another JSON to XML convention
JavaScript
2
star
17

ometa-js-old

Fork http://www.tinlizzie.org/~awarth/svn/ometa-js/
JavaScript
2
star
18

odessajs-bem

My talk for OdessaJS 2015
JavaScript
2
star
19

veged.github.com

My GitHub Page
2
star
20

bem-i18n

BEM internationalization
JavaScript
2
star
21

bablo

Personal finance tracker (frozen project)
Python
2
star
22

touchide

Programming on iPhone
JavaScript
2
star
23

bem-react-core-todomvc

TodoMVC with help of bem-react-core
2
star
24

test-webpack-bem

EXPERIMENT
JavaScript
1
star
25

morninggrace.ru

Morning Grace music band site
JavaScript
1
star
26

ya-shri-bem-pract

Примеры для лекции в ШРИ "БЭМ: Практика"
JavaScript
1
star
27

narwhal-v8cgi

v8cgi engine support for Narwhal
JavaScript
1
star
28

icfpc2012

http://icfpcontest2012.wordpress.com/
JavaScript
1
star
29

bemhtml2other-stub

Use BEMHTML for generate other templates
JavaScript
1
star