Opaline — a CLI tools framework and compiler. It draws inspiration from NextJS(and similar projects) and provides a quick, convention based, way of creating CLI tools.
- 
It looks for files in ./commandsfolder and treats them as commands for a CLI:- 
commands └── build.ts # Means it can be run as following: λ cli build
 
- 
- 
Command file must export a function (can be async function too): - 
export default function myCommand() {} // or module.exports = async function myCommand() {}; 
 
- 
- 
Uses JSDoc to describe parameters and documentation for a CLI. Read more on supported JSDoc syntax and how to use it here. 
Use a generator to bootstrap an Opaline based CLI:
λ npx @opaline/core create app
λ cd app
λ npm installCompile the CLI:
λ npm run build
λ npm run dev # for dev mode with watch and auto linkingBy default generator creates commands/index.js file, which is a default command, and can be run without specifying a command name:
λ cli --param1 20
But if required there might be multiple commands in one CLI. In order to do that, we just need to create another file in ./commands folder (or rename index.js, it's not required to have a default command):
// ./commands/build.js
export default function build() {
  console.log("hello build!");
}Opaline uses JSDoc to define parameters and documentation for a command.
Opaline can pass all non-flag arguments to a command, for this command needs to define an $inputs argument in the JSDoc as shown below:
// ./commands/build.js
/**
 * Description of a command is just a comment above the command's function.
 * Params are described as JSDoc params:
 *
 * @param {Array<string>} $inputs Any non-flag arguments are passed here
 */
export default function build($inputs) {
  console.log(`hello ${name}, language ${lang}`);
}It's also possible to define named (flag) arguments:
// ./commands/build.js
/**
 * Description of a command is just a comment above the command's function.
 * Params are described as JSDoc params:
 *
 * @param {Array<string>} $input Any non-flag arguments are passed here
 * @param {string} name Name of an app to build
 * @param {string} [lang="TypeScript"] A parameter with default value
 */
export default function build($inputs, name, lang) {
  console.log(`hello ${name}, language ${lang}`);
}Help will be generated for both default and this new command:
λ examples-for-docs --help # help for the whole cli, with list of commands
VERSION
  examples-for-docs/0.0.0
USAGE
  examples-for-docs inputs --param1 10 --param2 20
COMMANDS
  build     Description of a command is just a comment above the command's function. Params are described as JSDoc params:
> NOTE: To view the usage information for a specific command, run 'examples-for-docs [COMMAND] --help'
OPTIONS
  --param1      Some parameter for a CLI with a default value [number] [default: 20]
  --param2      Some parameter for a CLI [string]
  --help        Output usage information
  --version     Output the version number
λ examples-for-docs build --help # help for a subcommand
Description of a command is just a comment above the command's function. Params are described as JSDoc params:
OPTIONS
  --name     Name of an app to build [string]
  --lang     A parameter with default value [string] [default: "TypeScript"]
Opaline uses JSDoc to describe command's parameters and documentation.
| Tag | Description | 
|---|---|
| @param– https://jsdoc.app/tags-param.html | Supports primitive types: string,number,boolean. And arrays of stringsstring[] | 
| @example | Note: only one line examples: @example {cliName} --params 10 | 
| Tag | Description | 
|---|---|
| @param $inputs | Indicates that command receives unnamed arguments | 
| @usage | Similar to example, but outlines the main example on how to use a CLI command. @usage {cliName} build | 
| @short | Defines an alias (shortcut) for a parameter. @short name=n | 
| {cliName} | A variable that will be replaced by the name of a CLI tool described in package.json. Supported by@usageand@example | 
Opaline gets multiple things from a package.json file, to even more reduce configuration:
https://docs.npmjs.com/files/package.json#bin
There are 2 way of using the bin field in package.json:
// 1
{
  "name": "cli-name",
  "bin": "./cli/cli.js"
}
// 2
{
  "name": "cli-name",
  "bin": {
    "cli-name": "./cli/cli.js"
  }
}Opaline supports both of them. And uses those fields in a following way:
- Path to a CLI file – For both cases the file path is used as an output target for a CLI entry point, and will be automatically created by Opaline, no need to manually create it.
- Name of a CLI – For [1] the name will be package.json#name, if you need to have a different name than the name of a package, use an option 2. Name is used as{cliName}in JSDoc and also when linking packages in dev mode. Which makes them accessible globally, by this name:- cli-name [COMMAND]
 
Used as main description for a CLI tool.
Tools built with Opaline:




