@tamara027/lerna-terminal
Version:
Powerful cli ui for monorepos
169 lines (142 loc) • 3.87 kB
JavaScript
;
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;