myclt v0.1.11
MyClt
In most cases, bash wins when you want to create custom commands for your workflow.
But also in most cases, you will have to create a new file for each command and manage the files yourself.
bash is also limited in what you can do with it.
This is where myclt comes in as a framework that sets a structure for creating commands and managing them.
The good side is that you can use it alongside bash if you want to.
All you have to do is create a clt command that runs your bash command.
š
MyClt -
My command line tool is a cli framework
for creating custom/reusable commands.
The framework supports linking commands both locally and remotely from git repositories.
myclt or clt is the command to run the framework. clt is only available if installed globally.
clt <namespace>/<command>/<subCommands> <args>
# OR
myclt <namespace>/<command>/<subCommands> <args>namespaceis the namespace of the command defined in themyclt.map.jsonfile.commandis the command to run.subCommandsis the child command to run. (optional)argsis the arguments to pass to the command. (optional)
Menu
Installation
Note: This package is best used if installed globally.
npm install -g myclt
# OR
yarn global add mycltOr using npx: (This is not recommended as it will be slow to run commands and does not support the clt alias)
npx myclt <command>
# For example:
npx myclt /listCreating commands.
To create a command, two files are needed.
- The Command file (js or ts): The file where commands are defined.
- The Map file (json): The file where the command is mapped to the command file.
Javascript
Create a new project and install the myclt package.
The package is needed for type definitions but not required for the command to work.
Create a command file @ maths/index.js with the following content:
const { defineCommands } = require("myclt/functions/helpers");
module.exports = defineCommands({
add({ log, args }) {
const [x, y] = args.map(Number);
log.info(`${x} + ${y} = ${x + y}`);
},
subtract({ log, args }) {
const [x, y] = args.map(Number);
log.info(`${x} - ${y} = ${x - y}`);
}
});Create a map file @ maths/myclt.map.json with the following content:
{
"namespace": "maths",
"file": "./index.js",
"commands": {
"add": {
"desc": "Add two numbers"
},
"subtract": {
"desc": "Subtract x from y"
}
}
}Run the command below to link the command to myclt.
clt /link mathsRun the command below to see the list of commands.
clt /listYou should see the maths namespace with the commands add and subtract.
Typescript
myclt supports typescript out of the box.
All you need to do is change the file extension to .ts.
Note: it does not check for typescript errors, it only transpiles the file to javascript.
Your code editor should be able to check for typescript errors or you can use tsc to check for errors yourself.
Command Action
A command action is a function that is called when a command is run. This function is passed an object with the following properties:
| Property | Type | Description |
|---|---|---|
args | string[] | The arguments passed to the command. |
command | string | The command that is currently running. |
subCommands | string[] | The sub commands that are currently involved. |
log | object | The logger instance that contains several methods for logging content to the console. |
paths | object | The paths object contains all the helper properties and methods for path parsing and intelligence. |
self | function | A function that can be used to run other commands in same namespace. |
state | class | An object-collection instance. |
fromSelf | boolean | A boolean that is true if the command was run from the same namespace. |
myclt | function | A function that returns the myclt instance. |
store | object | A store object that contains methods for storing and retrieving persisted data. |
exec | function | A function for running command or multiple commands |
args
The args property is an array of strings that contains the arguments passed to the command.
For example, if the command is clt maths/add 1 2, the args property will be ["1", "2"].
function action({ args }) {
console.log(args); // ["1", "2"]
}command
The command property is the command that is currently running.
For example, if the command is clt maths/add 1 2, the command property will be maths/add.
function action({ command }) {
console.log(command); // "maths/add"
}subCommands
The subCommands property is an array of strings that follows the command when you split it by /.
For example, if the command is clt clt/link/git/update, command
will be clt/link while subCommands will be ["git", "update"].
function action({ subCommands }) {
console.log(subCommands); // ["git", "update"]
}log
The log property is an object that contains several methods for logging content to the console.
function action({ log }) {
log.log("This is a log message");
log.logAndExit("This is a log message and the process will exit");
log.success("This is a success message");
log.successAndExit("This is a success message and the process will exit");
log.info("This is an info message");
log.infoAndExit("This is an info message and the process will exit");
log.error("This is a warning message");
log.errorAndExit("This is a warning message and the process will exit");
log.warning("This is a warning message");
log.warningAndExit("This is a warning message and the process will exit");
log.emptyLine()
}Note:
these log functions can still be imported individually from
myclt/functions/loggers if you prefer to use them that way.
import { success, successAndExit } from "myclt/functions/loggers";
function action() {
success("This is a success message");
successAndExit("This is a success message and the process will exit");
}paths
The paths property is an object that contains all the helper properties and methods for path parsing and intelligence.
paths.cwd
The cwd property is the current working directory.
paths.cwdResolve
The cwdResolve property is a function that resolves a path relative to the current working directory.
self
The self property is a function that can be used to run other commands in same namespace.
For example:
export default defineCommands({
foo({ log, self }) {
// call the bar command
log.info("Calling bar command");
self("bar");
},
bar({ log }) {
log.info("Bar command called");
}
});state
The state property is an object-collection instance
that holds the state of the command.
State is only useful when you want to persist data between commands.
For example:
export default defineCommands({
foo({ state, self }) {
state.set("isFoo", true);
// call the bar command
self("bar");
},
bar({ state, args }) {
if (state.get("isFoo")) {
console.log("Foo is true");
}
}
});fromSelf
The fromSelf property is a boolean that is true if the command was called using a self function.
myclt
The myclt property is a function that returns the myclt instance.
store
The store property is an object that contains methods for storing and retrieving persisted data.
The type structure of the store object is as follows:
type MyCltStore = {
set(key: string | Record<string, any>, value?: any): void;
get<T = any>(key: string, def?: T): T;
has(key: string): boolean;
unset(key: string): void;
clear(): void;
commitChanges(): void;
collection<T extends Record<string, any>>(): ObjectCollection<T>;
};So it can be used like this:
function action({ store }) {
store.set("foo", "bar");
// or
store.set({ foo: "bar" });
store.get("foo"); // "bar"
store.has("foo"); // true
store.unset("foo");
store.clear();
store.commitChanges(); // commit changes to disk
store.collection().all(); // get all items
}exec
This function is just nodes child_process.execSync function with stdio: "inherit" option.
function action({ exec }) {
exec("npm install");
}