Guest User

Untitled

a guest
Feb 21st, 2018
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.38 KB | None | 0 0
  1. var readline = require("readline");
  2. var util = require("util");
  3.  
  4. require("colors");
  5. var espree = require("espree");
  6.  
  7. var complete = line => {
  8. var tokens = line.split(/ /).filter(i => i);
  9.  
  10. if (!tokens.length) return [[], line];
  11.  
  12. var targetToken = tokens[tokens.length - 1];
  13.  
  14. var namespace = global;
  15. var filterPrefix = targetToken;
  16.  
  17. var targetObject;
  18. if (targetToken.includes(".")) {
  19.  
  20. targetObject = targetToken.split('.');
  21. filterPrefix = targetObject.pop();
  22. targetObject = targetObject.join(".");
  23.  
  24. if (!targetObject) return [[], line];
  25.  
  26. try {
  27. namespace = eval(targetObject);
  28. } catch (e) {
  29. return [[], line];
  30. };
  31. };
  32.  
  33. var completions = Object
  34. .getOwnPropertyNames(namespace)
  35. .filter(i => i.startsWith(filterPrefix));
  36.  
  37. if (targetObject) {
  38. completions = completions.map(i => targetObject + "." + i);
  39. };
  40. return [completions, line];
  41. };
  42.  
  43. module.exports = async function () {
  44. console.log("interactive mode".yellow);
  45.  
  46. var rl = readline.createInterface({
  47. input: process.stdin,
  48. output: process.stdout,
  49. completer: complete,
  50. });
  51.  
  52. var origGlobals = {};
  53. var isFinished = false;
  54.  
  55. while (!isFinished) {
  56. isFinished = await new Promise((resolve, reject) => {
  57. rl.question("> ".red, answer => {
  58.  
  59. if (answer === "exit") {
  60. console.log("emergency exit".red)
  61. process.exit(1);
  62. };
  63.  
  64. if (answer === "go") {
  65. console.log("continue execution".green);
  66. resolve(true);
  67. return;
  68. };
  69.  
  70. if (["help", "h"].includes(answer)) {
  71. console.log(("In interactive mode you may execute any nodejs code.\n" +
  72. "Also next commands are available:\n" +
  73. "- h, help - show interactive mode help;\n" +
  74. "- go - continue code execution;\n" +
  75. "- exit - finish current nodejs process;").white);
  76. resolve(false);
  77. return;
  78. };
  79.  
  80. var ast, varName;
  81.  
  82. try {
  83. ast = espree.parse(answer, { ecmaVersion: 9 });
  84. varName = ast.body[0].expression.left.name;
  85. } catch (e) {
  86. try {
  87. varName = ast.body[0].declarations[0].id.name;
  88. } catch (e) {};
  89. };
  90.  
  91. Promise
  92. .resolve()
  93. .then(() => {
  94. var result = eval(answer);
  95. if (varName) {
  96. if (!Object.keys(origGlobals).includes(varName)) {
  97. origGlobals[varName] = global[varName];
  98. };
  99. global[varName] = eval(varName);
  100. };
  101. return result;
  102. })
  103. .then(result => console.log(util.format(result).yellow))
  104. .catch(e => console.log(util.format(e).red))
  105. .then(() => resolve(false));
  106. });
  107. });
  108. };
  109.  
  110. for (var [k, v] of Object.entries(origGlobals)) {
  111. global[k] = v;
  112. };
  113. };
Add Comment
Please, Sign In to add comment