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

@imballinstack/cliff

v0.3.1

Published

A somewhat test project to see if it's possible to extend a CLI's functionality without rebuilding it.

Downloads

4

Readme

@imballinstack/cliff

A somewhat test project to see if it's possible to extend a CLI's functionality without rebuilding it.

Installation

npm install -g @imballinstack/cliff

Demo

The CLI demo can be seen in this sandbox: https://codesandbox.io/p/sandbox/peaceful-joana-jp4w9h. Feel free forking the sandbox and playing on your own.

Concepts

cliff is a single CLI app, but instead of having to rebuild the app every time, we can "add on top of it". How? cliff will read out this path: $HOME/.imballinstack/cliff. The folder should have this kind of structure (example can be adjusted according to needs):

cli-extension
├── commands
│   ├── helloworld.mjs
│   └── sum.mjs
├── entry.json
├── node_modules
│   └── ...
├── package.json
└── yarn.lock

So we have this simple JS project here, with the package.json and all that. This folder will be used to "expand" the commands of cliff. It will read entry.json when the CLI starts, then itw ill seek out the available commands (if exist). The entry.json has this kind of JSON structure:

{
  "commands": {
    "helloworld": {
      "filePath": "./commands/helloworld.mjs",
      "helpText": "Print hello using the $HELLO environment variable",
      "examples": ["helloworld"]
    },
    "sum": {
      "filePath": "./commands/sum.mjs",
      "helpText": "Sum 2 numbers",
      "examples": ["sum 1 2"]
    }
  }
}

See, we have a commands, which is a dictionary of command keys. By default it only has few default commands, but we can extend it by using cliff import.

➜ cliff

  Usage
    $ cliff <command>

  Commands
    env      View and modify environment variables (for cliff)
    import   Import commands from another repository
    reset    Reset to default settings

  Examples
    $ cliff env view
    $ cliff env add
    $ cliff import helloworld
    $ cliff reset

Importing command

Using the sandbox repository as an example, we can do this:

➜ cliff import cli-extension/
? Select commands that you want to import helloworld   Print hello using the $HELLO
environment variable
{ chalk: '5.3.0' }
These dependencies are going to be added: [email protected]. Please go to /home/node/.imballinstack/cliff and then re-install the dependencies.

The helloworld command contains something like this:

import chalk from 'chalk';

export default function helloworld({ env }) {
  console.info('Running with env:', env);
  console.info(chalk.yellow('hello'));
}

As we could see, it requires chalk imports, which is also defined in the extension's package.json. We will need to install the dependencies there first, using your preferred package manager. After installing the dependency, running cliff the second time will output this:

➜ cliff

  Usage
    $ cliff <command>

  Commands
    env          View and modify environment variables (for cliff)
    import       Import commands from another repository
    reset        Reset to default settings
    helloworld   Print hello using the $HELLO environment variable

  Examples
    $ cliff env view
    $ cliff env add
    $ cliff import helloworld
    $ cliff reset
    $ cliff helloworld

There is a command cliff helloworld, which is the command that we just imported. If we execute it:

➜ cliff helloworld
Running with env: {}
hello

It works!