Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
September 21, 2022 08:36 pm GMT

Creating a CLI tool using NodeJS and npm (part 2)

September 21, 2022

In Creating a CLI tool using NodeJS and npm (part 1) I talked about the bare minimum requirements to create a CLI tool with npm and NodeJS.

In summary, our goal is to have two files:

  • package.json that includes "name", "bin", "version", and "fields".
  • path/to/bin/index.js (must include the node "shebang")

In this blog post, I want to talk about how to quickly start using the latest ECMAScript features without worrying about setting up bundlers of any kind such as webpack or rollup and make it 100% compatible across platforms.

How?

Using TypeScript!

Using TypeScript, we can bundle our code into a JavaScript "binary" (not really a binary), have access to the latest ECMAScript features, and export types to make it easy for other developers to work with our tool.

First, we modify our package.json to have types, and a build script (see Creating a CLI tool using NodeJS and npm (part 1) for Node CLI minimum viable product):

./package.json

{  "name": "cli-tool",  "version": "1.0.0",  "fields": ["./dist/"],  "bin": "./dist/index.js",+ "types": "./dist/index.d.ts",+ "script": {+   "build": "rm -rf dist && tsc index.ts --declaration --allowJs --outDir dist"+ }}

Second, we create an index.ts file that will have our source code:

./index.ts

#!/usr/bin/env nodeexport default function ourTool(options: { message: string }) {  console.log(`Hello ${options.message}`);}if (require.main === module) {  // run directly from the command line as in "node xxx.js"  const program = require("commander");  const defaults = { message: "World" };  program    .version("0.1.0")    .option("-m, --message [value]", "Message", defaults.message)    .parse(process.argv);  const options = program.opts();  ourTool(options);} else {  // probably loaded by as a module or something else.}

Notice that we use require.main === module to detect if the script is being executed as a command, otherwise we assume it is being imported as a module.

Also, I'm using commander to help us define the behavior of our CLI tool with ease.

Usage

Now we can build and run the tool like:

$ npm run build$ node ./dist/index.js

Our you could also publish it to https://www.npmjs.com/ and install it our use it with npx:

$ npm i -g cli-tool$ cli-tool --version0.1.0$ cli-toolHello World$ cli-tool -m PabloHello Pablo$ npx cli-tool --helpUsage: cli-tool [options]Options:  -V, --version          output the version number  -m, --message [value]  Message (default: "World")  -h, --help             output usage information

Conclusion / What next?

Being able to use a single tool (i.e. TypeScript) to create an MVP and set us up and running is essential and underrated for a power developer.

Also, because we avoid magic (Babel, Webpack, Rollup, ...) and focus only on using a compiler to bundle our code, it's now easier to understand the barebones needed for NodeJS to work. This is extremely helpful for beginner NodeJS developers.


Original Link: https://dev.to/pgarciacamou/creating-a-cli-tool-using-nodejs-and-npm-part-2-8h7

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To