A Node CLI - in 2017
Hi I'm Gant
AKA
AKA
Why CLI?
CLI's Are Great For
- Tooling
- Lists
- Repetitive Tasks
- Composable Workflow
CLIs Collect Ideas
Open Source and Teams Unite!
CLI's by friends
Another CLI
The Worst Example Ever
Writing Node CLIs
How Google Tells You
1
Look at me CLI
#!/usr/bin/env node
console.log("I'm Mr. Meeseeks")
...
"author": "Gant Laborde",
"license": "MIT",
+ "bin": {
+ "looksy": "./meeseeks.js"
+ }
}
meeseeks.js
package.json
Writing Node CLIs
How a few hours of research tells you
2
Look at me CLI
const program = require('commander');
program
.arguments('<person>')
.option('-m, --me <me>', 'The person to look at')
.action((file) => {
console.log(`I'm Mr. ${person} look at ${program.me}!`
})
.parse(process.argv)
$ looksy Meeseeks -m me
# I'm Mr. Meeseeks look at me!
Writing Node CLIs
Using Gluegun
3
Look at me CLI
$ npm install -g gluegun@next
$ gluegun new looksy
$ cd looksy
$ npm link
$ looksy
Welcome to your CLI
modify src/commands/looksy.js
module.exports = {
name: 'looksy',
run: async (context) => {
const { print, parameters } = context
print.info(`I'm ${parameters.first} Look at ${parameters.options.me}`)
}
}
looksy.js
So why Gluegun?
Let's go back to hello world (looksy)
module.exports = {
name: 'looksy',
run: async (context) => {
// gluegun provides all these features and more!
const { system, print, filesystem, strings, parameters } = context
// ...and be the CLI you wish to see in the world
const awesome = strings.trim(system.run('whoami'))
const moreAwesome = strings.kebabCase(`${awesome} and a keyboard`)
const contents = `🚨 Warning! ${moreAwesome} coming thru! 🚨`
const home = process.env['HOME']
filesystem.write(`${home}/realtalk.json`, { contents })
print.info(`${print.checkmark} I'm ${parameters.first}`)
print.warning(`${print.checkmark} Look at`)
print.success(`${print.checkmark} ${parameters.options.me}`)
}
}
looksy.js 🌟
We fancy now
What else can Gluegun do?
CLIs Today
What are you building?
What makes Gluegun Better?
The Real World Story
The Problem
Have you ever come back to an old project, and it simply doesn't work now?
Can you the version when spreading objects was added to Node? Or even Async/Await?
Ever depend on an environment variable or CLI for your stack?
https://github.com/infinitered/solidarity
Solidarity
Why Gluegun?
Thinking Features
Thinking Plugins
Why Typescript?
Let's check the code!
🌟 Summary 🌟
-
CLIs are useful
-
CLIs are easy
-
Gluegun is scalable
-
Solidarity is Awesome
@GantLaborde
Slides Available
https://slides.com/gantlaborde/useful-cli
Articles on Medium
Updates on Twitter
Code on GitHub
Thanks GNO Code
AND THANK YOU!
Useful CLI
By Gant Laborde
Useful CLI
Using JavaScript to create a useful CLI. A tour through Node/JS/TypeScript/Solidarity and More.
- 2,303