Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var readline = require("readline");
- var util = require("util");
- require("colors");
- var espree = require("espree");
- var complete = line => {
- var tokens = line.split(/ /).filter(i => i);
- if (!tokens.length) return [[], line];
- var targetToken = tokens[tokens.length - 1];
- var namespace = global;
- var filterPrefix = targetToken;
- var targetObject;
- if (targetToken.includes(".")) {
- targetObject = targetToken.split('.');
- filterPrefix = targetObject.pop();
- targetObject = targetObject.join(".");
- if (!targetObject) return [[], line];
- try {
- namespace = eval(targetObject);
- } catch (e) {
- return [[], line];
- };
- };
- var completions = Object
- .getOwnPropertyNames(namespace)
- .filter(i => i.startsWith(filterPrefix));
- if (targetObject) {
- completions = completions.map(i => targetObject + "." + i);
- };
- return [completions, line];
- };
- module.exports = async function () {
- console.log("interactive mode".yellow);
- var rl = readline.createInterface({
- input: process.stdin,
- output: process.stdout,
- completer: complete,
- });
- var origGlobals = {};
- var isFinished = false;
- while (!isFinished) {
- isFinished = await new Promise((resolve, reject) => {
- rl.question("> ".red, answer => {
- if (answer === "exit") {
- console.log("emergency exit".red)
- process.exit(1);
- };
- if (answer === "go") {
- console.log("continue execution".green);
- resolve(true);
- return;
- };
- if (["help", "h"].includes(answer)) {
- console.log(("In interactive mode you may execute any nodejs code.\n" +
- "Also next commands are available:\n" +
- "- h, help - show interactive mode help;\n" +
- "- go - continue code execution;\n" +
- "- exit - finish current nodejs process;").white);
- resolve(false);
- return;
- };
- var ast, varName;
- try {
- ast = espree.parse(answer, { ecmaVersion: 9 });
- varName = ast.body[0].expression.left.name;
- } catch (e) {
- try {
- varName = ast.body[0].declarations[0].id.name;
- } catch (e) {};
- };
- Promise
- .resolve()
- .then(() => {
- var result = eval(answer);
- if (varName) {
- if (!Object.keys(origGlobals).includes(varName)) {
- origGlobals[varName] = global[varName];
- };
- global[varName] = eval(varName);
- };
- return result;
- })
- .then(result => console.log(util.format(result).yellow))
- .catch(e => console.log(util.format(e).red))
- .then(() => resolve(false));
- });
- });
- };
- for (var [k, v] of Object.entries(origGlobals)) {
- global[k] = v;
- };
- };
Add Comment
Please, Sign In to add comment