UNPKG

@tamara027/lerna-terminal

Version:
169 lines (142 loc) 3.87 kB
'use strict'; var path = require('path'); var keypress = require('keypress'); var chalk = require('chalk'); var _require = require('../store'), getUiState = _require.getUiState, getState = _require.getState; var getLernaPackages = require('../getLernaPackages'); var _require2 = require('../commander'), getProgram = _require2.getProgram; var getPackage = require('../getPackage'); var _require3 = require('../executeCmd'), COMMANDS = _require3.COMMANDS; keypress(process.stdin); var buffer = ''; var history = []; var currentSelectedHistory = 0; var onCtrlC = function onCtrlC() { buffer = ''; var state = getState(); Object.keys(state).forEach(function (terminalId) { // stop all child processes state[terminalId].terminal.stop(); }); process.exit(); }; var onBackspace = function onBackspace() { buffer = buffer.substring(0, buffer.length - 1); getUiState().onChange(buffer); }; var onUp = function onUp() { var uiState = getUiState(); if (history[currentSelectedHistory]) { buffer = history[currentSelectedHistory]; uiState.onChange(buffer); } else { buffer = ''; uiState.onChange(buffer); } if (currentSelectedHistory >= history.length) { currentSelectedHistory = 0; } else { currentSelectedHistory += 1; } }; var onDown = function onDown() { var uiState = getUiState(); if (currentSelectedHistory >= history.length - 1) { currentSelectedHistory = history.length - 2; } else if (currentSelectedHistory <= -1) { currentSelectedHistory = -1; } else { currentSelectedHistory -= 1; } if (history[currentSelectedHistory]) { buffer = history[currentSelectedHistory]; uiState.onChange(buffer); } else { buffer = ''; uiState.onChange(buffer); } }; var onReturn = function onReturn(onCommandEntered) { if (buffer.length > 0) { onCommandEntered(buffer.trim().replace(/\n/g, '').replace(/\t/g, '')); history.reverse(); history.push(buffer); history.reverse(); } buffer = ''; currentSelectedHistory = 0; getUiState().onChange(''); }; var onTab = function onTab() { var availablePackages = Object.values(COMMANDS); getLernaPackages(function (packagePath) { // eslint-disable-next-line var packageData = getPackage(packagePath); if (packageData && packageData.scripts && packageData.scripts[getProgram().script]) { availablePackages.push(path.basename(packagePath)); } }); var filteredPackages = availablePackages.filter(function (availablePackage) { return new RegExp('^' + buffer).exec(availablePackage) !== null; }); if (filteredPackages.length === 1) { buffer = filteredPackages[0]; getUiState().onChange(filteredPackages[0]); return; } if (filteredPackages.length > 1) { var originalBuffer = buffer; buffer = 'commands: ' + chalk.blue(filteredPackages.join(', ')); getUiState().onChange('commands: ' + chalk.blue(filteredPackages.join(', '))); setTimeout(function () { buffer = originalBuffer; getUiState().onChange(originalBuffer); }, 1500); } }; var onRecieveLetter = function onRecieveLetter(letter) { if (!letter) { return; } buffer += letter; getUiState().onChange(buffer); }; var keyNameMap = { backspace: onBackspace, up: onUp, down: onDown, return: onReturn, tab: onTab }; /** * @param {Function<string>} onCommandEntered - the callback function * @returns {void} **/ function commandListener(onCommandEntered) { process.stdin.setEncoding('utf8'); process.stdin.setRawMode(true); process.stdin.on('keypress', function (letter, key) { if (!key && letter) { onRecieveLetter(letter); return; } if (key) { if (key.ctrl && key.name) { onCtrlC(); return; } /* istanbul ignore else case */ if (keyNameMap[key.name]) { keyNameMap[key.name](onCommandEntered); return; } } onRecieveLetter(letter); }); process.stdin.resume(); } module.exports = commandListener;