Guest User

Untitled

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