- History (up/down arrows)
- Progress Bar
- Loading/busy spinner
- Password input
- Confirmation
- Prompt
- Parse command line args
- help menu, and sub help menu
- Multi-line tables
- Build flexible commands via beanpole
- OR statement
- Middleware
- Parameters
- Trees
- Exposing Javascript, and calling it from the command line - inspired by mongo's CLI utilitiy
- Help menu api
- Title View
- Custom colors for each view (input, loader, progress, table, etc.): exports.colors = {}
- Error handling (display of command not found)
- Add transports instead of depending on native stdin/stdout
- Ability to use online
Listens for a key (enter, up, left, backspace, etc.), or command. See beanpole for documentation.
varceleri=require('celeri');//an option with info for the help menuceleri.option({command: 'hello :person',description: 'Prints "hello [person]!"',optional: {'--age': 'The person\'s age','--gender': 'The person\'s gender'}},function(data){console.log("Hello %s!",data.person);if(data.age)console.log("%s is %d years old.",data.person,data.age);if(data.gender)console.log("%s is a %s.",data.person,data.gender);});//parse the command line argsceleri.parse(process.argv);Interactive in terminal:
# node ./cmd ↩
> hello craig ↩
hello craig!
passed as arguments:
# node ./hello hello craig --age=21 --gender=cat ↩
hello craig!
craig is 21 years old.
craig is a cat.
Help menu:
# node ./cmd help ↩
Usage: [command] --arg=value --arg2
Help:
help Show help menu
[cmd] help Show command help menu
Commands:
hello Prints "hello [person]!""
Command Specific help menu:
# node ./cmd hello help ↩
Prints "hello [person]!""
Usage: hello [person]
Optional Flags: --age The person's age
--gender The person's gender
Sets the help menu usage text
celeri.usage('[command] --arg=value');celeri.option('hello :name OR hi :name','some description',function(data){console.log('Hello '+data.name+'!');}).option('set address :zip OR set address :city :state :zip',function(data){console.log("City: %s, State: %s, Zip: %s ",data.city||'None provided',data.state||'None provided',data.zip);});You can easily expose javascript functions by providing an object:
varapi={sayHello: function(name){console.log("hello %s!",name||'craig');}}celeri.onJs({api: api});In terminal:
node ./hello ↩
> api.sayHello("john"); ↩
hello john!
vari=0;varinterval=setInterval(function(){celeri.progress('Label: ',i++);if(i==100)clearInterval(interval);},10);varspinner=celeri.loading('Processing: ');setTimeout(function(){spinner.done(true);//undefined = done, true = success, false = fail},1000);celeri.prompt('Username: ',function(input){});celeri.confirm("Do you want to continue?",function(yes){if(yes){//continue}});//mask = *celeri.password('Password: ','*',function(input){//password});//no maskceleri.password('Password: ',function(input){//password});celeri.auth(function(user,pass){//auth here});varobjects=[{name: 'Craig',age: 21,interests: 'Cooking, espresso, backpacking, coding'},{name: 'Tim',age: 21,interests: 'Design, Traveling, Photography'}];celeri.drawTable(objects,{columns: ['name','age','interests']});Gives you something like:
Here's a multi-line table:
Draws a tree
//print out the contents of the celeri objectceleri.drawTree(celeri);Here's another example:
varceleri=require('../lib');varcredentials;celeri.option('login OR login :user :pass',function(data){//reference to the current requestvarself=this;//called after auth credentials have been entered infunctiononAuth(creds){//credits wrong? DO NOT CONTINUEif(creds.user!='user'||creds.pass!='pass'){returnconsole.log("Incorrect user / pass".red);}//otherwise, add the user to the CURRENT request so it can be passed//onto the next route listenerself.user=creds.user;//cache the credentials so the user doesn't have to login each timecredentials=creds;//not another listener? display a success responseif(!self.next())console.log("Logged in as %s",creds.user.green);}//user already logged in? pass!if(credentials){onAuth(credentials);}//otherwise check if the user is passed in the routeelseif(data.user&&data.pass){onAuth(data);}//or prompt for authenticationelse{celeri.auth(function(user,pass){onAuth({user: user,pass: pass});});}});/** * This stuff's private. The user has to be authenticated *before* this command is executed */celeri.option('login -> account',function(){console.log('Here\'s your account info %s!',this.user.green);});celeri.open();celeri.parse(process.argv);Here's what you get:




