JSPM

@kreijstal/readline-browser

0.0.4
  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • 0
  • Score
    100M100P100Q9710F
  • License ISC

forked from readline

Package Exports

  • @kreijstal/readline-browser
  • @kreijstal/readline-browser/lib/index.js

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@kreijstal/readline-browser) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

readline-browser

This library is designed with same APIs as the node.js core module readline.

Which supports you start a repl in a browser environment.

Example

with xterm.js

const { Terminal } = require("xterm");
const rl = require("readline-browser");
const getStringWidth = require("string-width");


const term = new Terminal();
term.open(document.getElementById("terminal"));


function getMappedKeyName(rawName){
    if(rawName == "Backspace"){
        return "backspace";
    }else if(rawName == "ArrowLeft"){
        return 'left';
    }else if(rawName == "ArrowRight"){
        return 'right';
    }else if(rawName == "ArrowUp"){
        return 'up';
    }else if(rawName == "ArrowDown"){
        return 'down';
    }else if(rawName == "Delete"){
        return 'delete';
    }else if(rawName == "Enter"){
        return 'enter';
    }else if(rawName == "Tab"){
        return 'tab';
    }else if(rawName == "Home"){
        return 'home';
    }else if(rawName == "End"){
        return 'end';
    }else if(rawName == "Return"){
        return 'return';
    }
    return rawName;
}
const input = {
    on(event,listener){
        if(event == "data"){

        }else if(event == "keypress"){
            term.onData((char)=>{
                if(getStringWidth(char)>=2){
                    listener(char,{
                        sequence:char,
                        name:undefined,
                        ctrl:false,
                        meta:false,
                        shift:false,
                    })
                }
            });

            term.onKey(({key,domEvent})=>{

                const name = getMappedKeyName(domEvent.key);
                const ctrl = domEvent.ctrlKey;
                const shift = domEvent.shiftKey;

                listener(key,{
                    sequence:name,
                    name,
                    ctrl,
                    shift
                });
            });
        }        
    },
    resume(){
        console.log("resume");
    },
    pause(){
        console.log("pause");

    }
}

const output = {
    isTTY:true,
    get columns(){
        return term.cols;
    },
    on(event,listener){
        if(event == "resize"){
            term.onResize(listener);
        }
    },
    write(data){
        term.write(data);
    }
}

const intf = rl.createInterface(input,output);

async function startRepl(){
    while(true){
        console.log(await new Promise((resolve)=>intf.question("$ > ",resolve)));
    }
}

startRepl();

replace builtin module

//const rl = require("readline");
const rl = require("readline-browser");

//some other things