imcuttle / cac

Simple yet powerful framework for building command-line interface.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

2017-07-26 9 27 05

NPM version NPM downloads CircleCI donate chat

Introduction

Command And Conquer, the queen living in your command line, is a minimalistic but pluggable CLI framework.

Install

yarn add cac

Table of contents

Usage

Use ./examples/simple.js as example:

const cac = require('cac')

const cli = cac()

// Add a default command
const defaultCommand = cli.command('*', {
  desc: 'The default command'
}, (input, flags) => {
  if (flags.age) {
    console.log(`${input[0]} is ${flags.age} years old`)
  }
})

defaultCommand.option('age', {
  desc: 'tell me the age'
})

// Add a sub command
cli.command('bob', {
  desc: 'Command for bob'
}, () => {
  console.log('This is a command dedicated to bob!')
})

// Bootstrap the CLI app
cli.parse()

Then run it:

2017-07-26 2 29 46

And the Help Documentation is ready out of the box:

2017-07-26 4 29 36

Friends

Projects that use CAC:

  • SAO: ⚔️ Futuristic scaffolding tool.
  • Poi: ⚡️ Delightful web development.
  • bili: 🥂 Schweizer Armeemesser for bundling JavaScript libraries.
  • lass: 💁🏻 Scaffold a modern package boilerplate for Node.js.
  • Feel free to add yours here...

Documentation

cli.option(name, [option])

Register an option globally, i.e. for all commands

  • name: string option name
  • option: object string
    • desc: string description
    • alias: string Array<string> option name alias
    • type: string option type, valid values: boolean string
    • default: any option default value
    • required: boolean mark option as required
    • choices: Array<any> limit valid values for the option

cli.command(name, [option], [handler])

  • name: string
  • option: object string (string is used as desc)
    • desc: string description
    • alias: string Array<string> command name alias
    • examples: Array<string> command examples
    • match: (name: string) => boolean A custom command matcher
  • handler: function command handler
    • input: Array<string> cli arguments
    • flags: object cli flags
const command = cli.command('init', 'init a new project', (input, flags) => {
  const folderName = input[0]
  console.log(`init project in folder ${folderName}`)
})

cli.command returns a command instance.

command

command.option(name, [option])

Same as cli.option but it adds options for specified command.

cli.parse([argv], [option])

  • argv: Array<string> Defaults to process.argv.slice(2)
  • option
    • run: boolean Defaults to true Run command after parsed argv.

cli.showHelp()

Display cli helps, must be called after cli.parse()

cli.use(plugin)

  • plugin: Plugin Array<Plugin>

Apply a plugin to cli instance:

cli.use(plugin(options))

function plugin(options) {
  return cli => {
    // do something...
  }
}

cli.bin

Type: string

The filename of executed file.

e.g. It's cli.js when you run node ./cli.js.

cli.argv

A getter which simply returns cli.parse(null, { run: false })

cli.extraHelp(help)

Add extra help messages to the bottom of help.

help

Type: string object

The help could be a string or in { title, body } format.

Events

error

Error handler for errors in your command handler:

cli.on('error', err => {
  console.error('command failed:', err)
  process.exit(1)
})

parsed

Emit after CAC parsed cli arguments:

cli.on('parsed', (command, input, flags) => {
  // command might be undefined
})

executed

Emit after CAC executed commands or outputed help / version number:

cli.on('executed', (command, input, flags) => {
  // command might be undefined
})

FAQ

Why not commander.js yargs caporal.js or meow ?

CAC is simpler and less opinionated comparing to commander.js yargs caporal.js.

Commander.js does not support chaining option which is a feature I like a lot. It's not really actively maintained at the time of writing either.

Yargs has a powerful API, but it's so massive that my brain trembles. Meow is simple and elegant but I have to manully construct the help message, which will be annoying. And I want it to support sub-command too.

And none of them are pluggable.

So why creating a new thing instead of pull request?

I would ask me myself why there's preact instead of PR to react, and why yarn instead of PR to npm? It's obvious.

CAC is kind of like a combination of the simplicity of Meow and the powerful features of the rest. And our help log is inspired by Caporal.js, I guess it might be the most elegant one out there?

preview

How is the name written and pronounced?

CAC, not Cac or cac, pronounced C-A-C.

And this project is dedicated to our lovely C.C. sama. Maybe CAC stands for C&C as well :P

Contributing

  1. Fork it!
  2. Create your feature branch: git checkout -b my-new-feature
  3. Commit your changes: git commit -am 'Add some feature'
  4. Push to the branch: git push origin my-new-feature
  5. Submit a pull request :D

Author

cac © egoist, Released under the MIT License.
Authored and maintained by egoist with help from contributors (list).

egoist.moe · GitHub @egoist · Twitter @_egoistlily

About

Simple yet powerful framework for building command-line interface.

License:MIT License


Languages

Language:JavaScript 100.0%