Transform your typescript module into a CLI
Transform your typescript module into a CLI
typescript-to-cli leverages the typescript type system to generate a CLI based on the exported function signature of your module.
:warning:
This is an experimental project! A lot of features are missing and it probably contains some bugs. If one of your use case is not supported, please create an issue or contact me on twitter.
:warning:
Let's take the following module as an example.
send-ships.ts
/**
* Send ships to the specified destination
*
* @param destination the ships target
* @param numberOfShips the number of ships to send
* @param armed whether the ships are equipped with weapons or not
*/
export default function(
destination: string,
numberOfShips: number,
armed: boolean
) {
console.log(
`You sent ${numberOfShips} ${armed ? "armed" : ""} ships to ${destination}.`
);
}
$ npx typescript-to-cli ./send-ships.ts
send-ships.js CLI has been generated.
If typescript-to-cli
detects a tsconfig.json
in the current folder, it will use it to generate the CLI. If you want to use a custom tsconfig.json
, you can use the command line option --project
(or just -p
) that specifies the path of a directory containing a tsconfig.json
file, or a path to a valid .json file containing the configurations.
$ npx typescript-to-cli ./send-ships.ts --project ./path-to-config/tsconfig.json
send-ships.js CLI has been generated.
$ ./send-ships.js --destination Mars --number-of-ships 5 --armed
You sent 5 armed ships to Mars.
Or with the =
symbol between options and values
$ ./send-ships.js --destination=Europa --number-of-ships=2
You sent 2 ships to Europa.
$ ./send-ships.js --number-of-ships 5 --armed
Missing option --destination
$ ./send-ships.js --destination Mars --number-of-ships X --armed
--number-of-ships should be a number
export default function(option: string | undefined) {}
or
export default function(option?: string) {}
// cli.ts
export default function(primaryColor: "cyan" | "magenta" | "yellow") {}
$ npx typescript-to-cli ./cli.ts
cli.js CLI has been generated.
$ ./cli.js --primary-color green
--primary-color does not accept the value "green". Allowed values: cyan, magenta, yellow
$ ./send-ships.js --help
Usage send-ships.js [options]
Send ships to the specified destination
Options:
--help output usage information
--destination <string> the ships destination
--number-of-ship <number> the number of ships to send
--armed whether the ships are equipped with weapons or not
typescript-to-cli
can also infer the parameters types from JSDoc annotations. However, your tsconfig.json
should allow js files with "allowJs": true
and an outDir
to avoid overriding the input file. Let's take the same previous example but with JSDoc type annotations instead.
send-ships.js
/**
* Send ships to the specified destination
*
* @param {string} destination the ships target
* @param {number} numberOfShips the number of ships to send
* @param {boolean} armed whether the ships are equipped with weapons or not
*/
export default function(destination, numberOfShips, armed) {
console.log(
`You sent ${numberOfShips} ${armed ? "armed" : ""} ships to ${destination}.`
);
}
tsconfig.json
{
"compilerOptions": {
"allowJs": true,
"outDir": "dist"
}
}
$ npx typescript-to-cli ./send-ships.js
./dist/send-ships.js CLI has been generated.