157 lines
3.8 KiB
JavaScript
157 lines
3.8 KiB
JavaScript
import pathIsAbsolute from "path-is-absolute";
|
|
import commander from "commander";
|
|
import Module from "module";
|
|
import { inspect } from "util";
|
|
import path from "path";
|
|
import repl from "repl";
|
|
import { util } from "babel-core";
|
|
import * as babel from "babel-core";
|
|
import vm from "vm";
|
|
import _ from "lodash";
|
|
import "babel-polyfill";
|
|
import register from "babel-register";
|
|
|
|
let program = new commander.Command("babel-node");
|
|
|
|
program.option("-e, --eval [script]", "Evaluate script");
|
|
program.option("-p, --print [code]", "Evaluate script and print result");
|
|
program.option("-o, --only [globs]", "");
|
|
program.option("-i, --ignore [globs]", "");
|
|
program.option("-x, --extensions [extensions]", "List of extensions to hook into [.es6,.js,.es,.jsx]");
|
|
program.option("-w, --plugins [string]", "", util.list);
|
|
program.option("-b, --presets [string]", "", util.list);
|
|
|
|
let pkg = require("../package.json");
|
|
program.version(pkg.version);
|
|
program.usage("[options] [ -e script | script.js ] [arguments]");
|
|
program.parse(process.argv);
|
|
|
|
//
|
|
|
|
register({
|
|
extensions: program.extensions,
|
|
ignore: program.ignore,
|
|
only: program.only,
|
|
plugins: program.plugins,
|
|
presets: program.presets,
|
|
});
|
|
|
|
//
|
|
|
|
let replPlugin = () => ({
|
|
visitor: {
|
|
ModuleDeclaration(path) {
|
|
throw path.buildCodeFrameError("Modules aren't supported in the REPL");
|
|
},
|
|
|
|
VariableDeclaration(path) {
|
|
if (path.node.kind !== "var") {
|
|
throw path.buildCodeFrameError("Only `var` variables are supported in the REPL");
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
//
|
|
|
|
let _eval = function (code, filename) {
|
|
code = code.trim();
|
|
if (!code) return undefined;
|
|
|
|
code = babel.transform(code, {
|
|
filename: filename,
|
|
presets: program.presets,
|
|
plugins: (program.plugins || []).concat([replPlugin])
|
|
}).code;
|
|
|
|
return vm.runInThisContext(code, {
|
|
filename: filename
|
|
});
|
|
};
|
|
|
|
if (program.eval || program.print) {
|
|
let code = program.eval;
|
|
if (!code || code === true) code = program.print;
|
|
|
|
global.__filename = "[eval]";
|
|
global.__dirname = process.cwd();
|
|
|
|
let module = new Module(global.__filename);
|
|
module.filename = global.__filename;
|
|
module.paths = Module._nodeModulePaths(global.__dirname);
|
|
|
|
global.exports = module.exports;
|
|
global.module = module;
|
|
global.require = module.require.bind(module);
|
|
|
|
let result = _eval(code, global.__filename);
|
|
if (program.print) {
|
|
let output = _.isString(result) ? result : inspect(result);
|
|
process.stdout.write(output + "\n");
|
|
}
|
|
} else {
|
|
if (program.args.length) {
|
|
// slice all arguments up to the first filename since they're babel args that we handle
|
|
let args = process.argv.slice(2);
|
|
|
|
let i = 0;
|
|
let ignoreNext = false;
|
|
_.each(args, function (arg, i2) {
|
|
if (ignoreNext) {
|
|
ignoreNext = false;
|
|
return;
|
|
}
|
|
|
|
if (arg[0] === "-") {
|
|
let parsedArg = program[arg.slice(2)];
|
|
if (parsedArg && parsedArg !== true) {
|
|
ignoreNext = true;
|
|
}
|
|
} else {
|
|
i = i2;
|
|
return false;
|
|
}
|
|
});
|
|
args = args.slice(i);
|
|
|
|
// make the filename absolute
|
|
let filename = args[0];
|
|
if (!pathIsAbsolute(filename)) args[0] = path.join(process.cwd(), filename);
|
|
|
|
// add back on node and concat the sliced args
|
|
process.argv = ["node"].concat(args);
|
|
process.execArgv.unshift(__filename);
|
|
|
|
Module.runMain();
|
|
} else {
|
|
replStart();
|
|
}
|
|
}
|
|
|
|
function replStart() {
|
|
repl.start({
|
|
prompt: "> ",
|
|
input: process.stdin,
|
|
output: process.stdout,
|
|
eval: replEval,
|
|
useGlobal: true
|
|
});
|
|
}
|
|
|
|
function replEval(code, context, filename, callback) {
|
|
let err;
|
|
let result;
|
|
|
|
try {
|
|
if (code[0] === "(" && code[code.length - 1] === ")") {
|
|
code = code.slice(1, -1); // remove "(" and ")"
|
|
}
|
|
|
|
result = _eval(code, filename);
|
|
} catch (e) {
|
|
err = e;
|
|
}
|
|
|
|
callback(err, result);
|
|
}
|