Socket
Socket
Sign inDemoInstall

makitso-prompt

Package Overview
Dependencies
11
Maintainers
1
Versions
10
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

    makitso-prompt

a terminal prompt


Version published
Weekly downloads
9
increased by200%
Maintainers
1
Install size
380 kB
Created
Weekly downloads
 

Readme

Source

Makitso Prompt

The terminal prompt used by Makitso.

yeh, yeh.. I started with Commander, it calls process.exit() for various reasons which made it difficult to use in a REPL. I then converted Makitso use Inquirer, but it doesn't like promises so much and I needed moar async. Enquirer was better in this respect, but then I got to implementing autocomplete and things got tricky again. I had varying success overriding parts of these modules, but it was harder to bend to them my will than I liked. The inbuilt Node readline module was much the same, so I started from scratch, pulling in some of the complex bits from readline and filling in the gaps.

The essential part of a commandline prompt is being able to act on key presses and modify the output in the terminal accordingly. I've attempted to make this as simple as possible with makitso-prompt by allowing pure functions to be used as key-press processors which modify a state object which is then rendered to the terminal. Much of the logic is also broken into easily replaceable functions for customisation.

Usage

Simple

This will simply echo entered commands

const Prompt = require("makitso-prompt");
const prompt = Prompt();
const command = prompt.start().then(console.log);

Custom prompt

const prompt = Prompt({ prompt: chalk`{blue aPrompt> }` });
const command = prompt.start().then(console.log);
const prompt = Prompt();
const header = "A line above the prompt";
const footer = "A line below the prompt\nAnother line";
const command = prompt.start({ header, footer }).then(console.log);

Add a custom keypress handler

const history = require("makitso-prompt/key-press-history");
const prompt = Prompt();
Object.assign(prompt, { keyPressers: [...prompt.keyPressers, history] });
const command = prompt.start().then(console.log);

Keypress handlers

A keypress handler is an object with a keyPress method.

Keypress handlers keyPress methods are called each time a key is pressed.

Keypress handlers are called in the order of the keypressers array.

The keyPress method is called with the app state object and a press object.

Keypress handlers use the press and/or state objects to decide what, if anything, needs to be changed in the state object. Changes are made using state methods or using the applyPatch function from makitso-prompt/immutably on state.plain.

const _filter = require("lodash/filter");
const { applyPatch } = require("makitso-prompt/immutably");

// available as `makitso-prompt/key-press-autocomplete` but you'll likely want
// to build your own
function AutoComplete(choices) {
  return {
    keyPress: async function(state, press) {
      if (state.mode === "command") {
        let command = state.command;

        const matches = _filter(choices, choice => choice.startsWith(command));

        if (press.key && press.key.name === "tab" && matches.length === 1) {
          state.command = matches[0] + " ";
          state.cursorCols = null;
        } else {
          // state.plain = applyPatch(state.plain, { footer: matches.join(" ") });
          state.footer = matches.join(" ");
        }
      }
      return state;
    }
  };
}

const complete = AutoComplete(["abc1", "ab12", "abcdefg", "a123"]);

const prompt = Prompt();
Object.assign(prompt, { keyPressers: [...prompt.keyPressers, complete] });

const command = prompt.start().then(console.log);

FAQs

Last updated on 21 Feb 2018

Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Packages

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc