Giter Club home page Giter Club logo

args's Introduction

args Gitter Build Status

This package makes creating command line interfaces a breeze.

While there might be many alternatives out there, all ones I used are still based on old best practises. But since I'm not trying to reinvent the wheel here, I've decided to take advantage of minimist for all of the actual parsing.

If you'd like to ask the user for input, you can use args in combination with something like inquirer or prompt.

Features

  • Git-style sub commands (e.g. pizza cheese executes the "pizza-cheese" binary)
  • Auto-generated usage information
  • Determines type of option by checking type of default value (e.g. ['hi'] => <list>)
  • Clean syntax for defining options and commands
  • The core only contains a few hundred lines of code (even after transpiling)
  • Easily retrieve values of options

Usage

Firstly, you need to install the package:

npm install --save args

Once you're done, you can start using it within your binaries:

#!/usr/bin/env node

import args from 'args'

args
  .option('port', 'The port on which the app will be running', 3000)
  .option('reload', 'Enable/disable livereloading')
  .command('serve', 'Serve your static site')

const flags = args.parse(process.argv)

The upper code defines two options called "port" and "reload" for the current binary, as well as a new sub command named "serve". So if you want to check for the value of the "port" option, just do this:

// This also works with "config.p", because the short name of the "port" option is "p"

if (flags.port) {
  console.log(`I'll be running on port ${flags.port}`)
}

In turn, this is how the auto-generated usage information will look like:


  Usage: haha [options] [command]


  Commands:

    serve  Serve your static site
    help   Display help

  Options:

    -v, --version  Output the version number
    -r, --reload   Enable/disable livereloading
    -h, --help     Output usage information
    -p, --port     The port on which the app will be running

API

.option(name, description, default, init)

Register a new option for the binary in which it's being called.

  • name: Takes a string which defines the name of the option. In this case, the first letter will be used as the short version (port => -p, --port). However, it can also be an array in which the first value defines the short version (p => -p) and the second one the long version (packages => --packages).
  • description: A short explanation of what the option shall be used for. Will be outputted along with help.
  • default: If it's defined, args will not only use it as a default value for the property, but it will also determine the type and append it to the usage info when the help gets outputted. For example: If the default param of an option named "package" contains an array, the usage information will look like this: -p, --package <list>.
  • init: A function through which the option's value will be passed when used. The first paramater within said function will contain the option's value. If the parameter "default" is defined, args will provide a default initializer depending on the type of its value. For example: If "default" contains an integer, "init" will be parseInt.

.command(name, description, init)

Register a new sub command. Args requires all binaries to be defined in the style of git's. That means each sub command should be a separate binary called "<parent-command>-<sub-command>".

For example: If your main binary is called "muffin", the binary of the subcommand "muffin list" should be called "muffin-list". And all of them should be defined as such in your package.json.

  • name: Takes a string which defines the name of the command. This value will be used when outputting the help.
  • description: A short explanation of what the command shall be used for. Will be outputted along with help.
  • init: If a function was passed through at this parameter, args will call it instead of running the binary related to that command. The function receives three arguments:
function aCommand (name, sub, options) {
  name // The name of the command
  sub // The output of .sub
  options // An object containing the options that have been used
}

Using an initializer is currently only recommended if your command doesn't need special/different options than the binary in which you're defining it. The reason for this is that the "options" argument of the upper function will contain the options registered within the current binary.

.parse(argv, options)

This method takes the process' command line arguments (command and options) and uses the internal methods to get their values and assign them to the current instance of args. It needs to be run after all of the .option and .command calls. If you run it before them, the method calls after it won't take effect.

The methods also returns all options that have been used and their respective values.

  • argv: Should be the process' argv: process.argv, for example.
  • options: This parameter accepts an object containing several configuration options.

.sub

This property exposes all sub arguments that have been parsed by minimist. This is useful when trying to get the value after the command, for example:

pizza ./directory

The upper path can now be loaded by doing:

// Contains "./directory"
const path = args.sub[0]

This also works completely fine with sub commands: After you've registered a new command using .command(), you can easily check the following sub argument within its binary like mentioned above:

pizza eat ./directory

.showHelp()

Outputs the usage information based on the options and comments you've registered so far.

Configuration

By default, the module already registers some default options (e.g. "version" and "help"), as well as a command named "help". These things have been implemented to make creating CLIs easier for beginners. However, they can also be disabled by taking advantage of the following properties:

Property Description Default value Type
help Automatically render the usage information when running help, -h or --help true Boolean
version Outputs the version tag of your package.json true Boolean
usageFilter Allows you to specify a filter through which the usage information will be passed before it gets outputted null Function
 value Suffix for the "Usage" section of the usage information (example) null  String

You can pass the configuration object as the second paramater of .parse().

Contribute

  1. Fork this repository to your own GitHub account and then clone it to your local device
  2. Link the package to the global module directory: npm link
  3. Transpile the source code and watch for changes: gulp
  4. Within the module you want to test your local development instance of args, just link it to the dependencies: npm link args. Instead of the default one from npm, node will now use your clone of args!

As always, you can run the AVA and ESLint tests using: npm test

Special thanks

... to Dmitry Smolin who donated the package name. If you're looking for the old content (before I've added my stuff) of the package, you can find it here.

args's People

Contributors

greenkeeperio-bot avatar julianduque avatar leo avatar

Stargazers

 avatar  avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.