_babel-node.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. "use strict";
  2. var _module = require("module");
  3. var _util = require("util");
  4. var _path = require("path");
  5. var _repl = require("repl");
  6. var babel = require("@babel/core");
  7. var _vm = require("vm");
  8. require("core-js/stable/index.js");
  9. require("regenerator-runtime/runtime.js");
  10. var _register = require("@babel/register");
  11. var _url = require("url");
  12. var _programSetup = require("./program-setup.js");
  13. _programSetup.program.parse(process.argv);
  14. const opts = _programSetup.program.opts();
  15. const babelOptions = {
  16. caller: {
  17. name: "@babel/node"
  18. },
  19. extensions: opts.extensions,
  20. ignore: opts.ignore,
  21. only: opts.only,
  22. plugins: opts.plugins,
  23. presets: opts.presets,
  24. configFile: opts.configFile,
  25. envName: opts.envName,
  26. rootMode: opts.rootMode,
  27. babelrc: opts.babelrc === true ? undefined : opts.babelrc
  28. };
  29. for (const key of Object.keys(babelOptions)) {
  30. if (babelOptions[key] === undefined) {
  31. delete babelOptions[key];
  32. }
  33. }
  34. (0, _register.default)(babelOptions);
  35. let hasTopLevelAwait = false;
  36. const replPlugin = ({
  37. types: t
  38. }) => ({
  39. visitor: {
  40. Program(path) {
  41. hasTopLevelAwait = path.node.extra.topLevelAwait;
  42. let hasExpressionStatement;
  43. for (const bodyPath of path.get("body")) {
  44. if (bodyPath.isExpressionStatement()) {
  45. hasExpressionStatement = true;
  46. } else if (bodyPath.isExportDeclaration() || bodyPath.isImportDeclaration()) {
  47. throw bodyPath.buildCodeFrameError("Modules aren't supported in the REPL");
  48. }
  49. }
  50. if (hasTopLevelAwait) {
  51. const body = path.node.body;
  52. for (let i = body.length - 1; i >= 0; i--) {
  53. if (t.isExpressionStatement(body[i])) {
  54. body[i] = t.returnStatement(body[i].expression);
  55. break;
  56. }
  57. }
  58. return;
  59. }
  60. if (hasExpressionStatement) return;
  61. path.pushContainer("body", t.expressionStatement(t.identifier("undefined")));
  62. }
  63. }
  64. });
  65. const _eval = function (code, filename) {
  66. code = code.trim();
  67. if (!code) return undefined;
  68. hasTopLevelAwait = false;
  69. code = babel.transformSync(code, Object.assign({
  70. filename: filename
  71. }, babelOptions, {
  72. parserOpts: {
  73. allowAwaitOutsideFunction: true
  74. },
  75. plugins: (opts.plugins || []).concat([replPlugin])
  76. })).code;
  77. if (hasTopLevelAwait) {
  78. code = `(async () => { ${code} })()`;
  79. }
  80. return _vm.runInThisContext(code, {
  81. filename: filename
  82. });
  83. };
  84. if (opts.eval || opts.print) {
  85. let code = opts.eval;
  86. if (!code || code === true) code = opts.print;
  87. global.__filename = "[eval]";
  88. global.__dirname = process.cwd();
  89. const module = new _module(global.__filename);
  90. module.filename = global.__filename;
  91. module.paths = _module._nodeModulePaths(global.__dirname);
  92. global.exports = module.exports;
  93. global.module = module;
  94. global.require = module.require.bind(module);
  95. const result = _eval(code, global.__filename);
  96. if (opts.print) {
  97. const output = typeof result === "string" ? result : (0, _util.inspect)(result);
  98. process.stdout.write(output + "\n");
  99. }
  100. } else {
  101. if (_programSetup.program.args.length) {
  102. let args = process.argv.slice(2);
  103. let i = 0;
  104. let ignoreNext = false;
  105. args.some(function (arg, i2) {
  106. if (ignoreNext) {
  107. ignoreNext = false;
  108. return;
  109. }
  110. if (arg[0] === "-") {
  111. const parsedOption = _programSetup.program.options.find(option => {
  112. return option.long === arg || option.short === arg;
  113. });
  114. if (parsedOption === undefined) {
  115. return;
  116. }
  117. const optionName = parsedOption.attributeName();
  118. const parsedArg = opts[optionName];
  119. if (optionName === "require" || parsedArg && parsedArg !== true) {
  120. ignoreNext = true;
  121. }
  122. } else {
  123. i = i2;
  124. return true;
  125. }
  126. });
  127. args = args.slice(i);
  128. requireArgs();
  129. const filename = args[0];
  130. if (!_path.isAbsolute(filename)) {
  131. args[0] = _path.join(process.cwd(), filename);
  132. }
  133. process.argv = ["node", ...args];
  134. process.execArgv.push(__filename);
  135. _module.runMain();
  136. } else {
  137. requireArgs();
  138. replStart();
  139. }
  140. }
  141. function requireArgs() {
  142. if (opts.require) {
  143. require((((v, w) => (v = v.split("."), w = w.split("."), +v[0] > +w[0] || v[0] == w[0] && +v[1] >= +w[1]))(process.versions.node, "8.9") ? require.resolve : (r, {
  144. paths: [b]
  145. }, M = require("module")) => {
  146. let f = M._findPath(r, M._nodeModulePaths(b).concat(b));
  147. if (f) return f;
  148. f = new Error(`Cannot resolve module '${r}'`);
  149. f.code = "MODULE_NOT_FOUND";
  150. throw f;
  151. })(opts.require, {
  152. paths: [process.cwd()]
  153. }));
  154. }
  155. }
  156. function replEval(code, context, filename, callback) {
  157. let err;
  158. let result;
  159. try {
  160. if (code[0] === "(" && code[code.length - 1] === ")") {
  161. code = code.slice(1, -1);
  162. }
  163. result = _eval(code, filename);
  164. } catch (e) {
  165. err = e;
  166. }
  167. if (hasTopLevelAwait && !err) {
  168. result.then(v => {
  169. callback(null, v);
  170. }).catch(e => {
  171. callback(e, null);
  172. });
  173. } else {
  174. callback(err, result);
  175. }
  176. }
  177. function replStart() {
  178. const replServer = _repl.start({
  179. prompt: "babel > ",
  180. input: process.stdin,
  181. output: process.stdout,
  182. eval: replEval,
  183. useGlobal: true,
  184. preview: true
  185. });
  186. const NODE_REPL_HISTORY = process.env.NODE_REPL_HISTORY;
  187. {
  188. replServer.setupHistory == null || replServer.setupHistory(NODE_REPL_HISTORY, () => {});
  189. }
  190. }
  191. //# sourceMappingURL=_babel-node.js.map