Giter Club home page Giter Club logo

cac's Introduction

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

No-command app

In many cases your app is small and doesn't even need a command:

const cli = require('cac')()
// Use default command symbol '*'
cli.command('*', option, runMyApp)
cli.parse()

Instead of using a default command, you can skip adding and running command by:

const cli = require('cac')()
// cli.argv is a getter
// bascially it's the return value of cli.parse(null, { run: false })
const { input, flags } = cli.argv

runMyApp(input, flags)

Friends

Projects that use CAC:

  • SAO: ⚔️ Futuristic scaffolding tool.
  • Poi: ⚡️ Delightful web development.
  • bili: 🥂 Schweizer Armeemesser for bundling JavaScript libraries.
  • 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

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
  • 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.argv

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

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
})

FAQ

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

Commander.js and Caporal.js do not allow unknown options, Commander.js does not support chaining option.

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.

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 /kɑk/.

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

cac's People

Contributors

egoist avatar

Watchers

 avatar  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.