npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

myclt

v0.1.11

Published

Own Command Line Tool

Downloads

20

Readme

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>
  • namespace is the namespace of the command defined in the myclt.map.json file.
  • command is the command to run.
  • subCommands is the child command to run. (optional)
  • args is 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 myclt

Or 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 /list

Creating commands.

To create a command, two files are needed.

  1. The Command file (js or ts): The file where commands are defined.
  2. 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 maths

Run the command below to see the list of commands.

clt /list

You 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");
}