211 lines
6.8 KiB
JavaScript
211 lines
6.8 KiB
JavaScript
"use strict";
|
|
|
|
var _commander = _interopRequireDefault(require("commander"));
|
|
|
|
var _module = _interopRequireDefault(require("module"));
|
|
|
|
var _util = require("util");
|
|
|
|
var _path = _interopRequireDefault(require("path"));
|
|
|
|
var _repl = _interopRequireDefault(require("repl"));
|
|
|
|
var babel = _interopRequireWildcard(require("@babel/core"));
|
|
|
|
var _vm = _interopRequireDefault(require("vm"));
|
|
|
|
require("core-js/stable");
|
|
|
|
require("regenerator-runtime/runtime");
|
|
|
|
var _register = _interopRequireDefault(require("@babel/register"));
|
|
|
|
var _resolve = _interopRequireDefault(require("resolve"));
|
|
|
|
var _package = _interopRequireDefault(require("../package.json"));
|
|
|
|
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
|
|
|
|
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
const program = new _commander.default.Command("babel-node");
|
|
|
|
function collect(value, previousValue) {
|
|
if (typeof value !== "string") return previousValue;
|
|
const values = value.split(",");
|
|
return previousValue ? previousValue.concat(values) : values;
|
|
}
|
|
|
|
program.option("-e, --eval [script]", "Evaluate script");
|
|
program.option("--no-babelrc", "Specify whether or not to use .babelrc and .babelignore files");
|
|
program.option("-r, --require [module]", "Require module");
|
|
program.option("-p, --print [code]", "Evaluate script and print result");
|
|
program.option("-o, --only [globs]", "A comma-separated list of glob patterns to compile", collect);
|
|
program.option("-i, --ignore [globs]", "A comma-separated list of glob patterns to skip compiling", collect);
|
|
program.option("-x, --extensions [extensions]", "List of extensions to hook into [.es6,.js,.es,.jsx,.mjs]", collect);
|
|
program.option("--config-file [path]", "Path to the babel config file to use. Defaults to working directory babel.config.js");
|
|
program.option("--env-name [name]", "The name of the 'env' to use when loading configs and plugins. " + "Defaults to the value of BABEL_ENV, or else NODE_ENV, or else 'development'.");
|
|
program.option("--root-mode [mode]", "The project-root resolution mode. " + "One of 'root' (the default), 'upward', or 'upward-optional'.");
|
|
program.option("-w, --plugins [string]", "", collect);
|
|
program.option("-b, --presets [string]", "", collect);
|
|
program.version(_package.default.version);
|
|
program.usage("[options] [ -e script | script.js ] [arguments]");
|
|
program.parse(process.argv);
|
|
const babelOptions = {
|
|
caller: {
|
|
name: "@babel/node"
|
|
},
|
|
extensions: program.extensions,
|
|
ignore: program.ignore,
|
|
only: program.only,
|
|
plugins: program.plugins,
|
|
presets: program.presets,
|
|
configFile: program.configFile,
|
|
envName: program.envName,
|
|
rootMode: program.rootMode,
|
|
babelrc: program.babelrc === true ? undefined : program.babelrc
|
|
};
|
|
|
|
for (const key of Object.keys(babelOptions)) {
|
|
if (babelOptions[key] === undefined) {
|
|
delete babelOptions[key];
|
|
}
|
|
}
|
|
|
|
(0, _register.default)(babelOptions);
|
|
|
|
const replPlugin = ({
|
|
types: t
|
|
}) => ({
|
|
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");
|
|
}
|
|
},
|
|
|
|
Program(path) {
|
|
if (path.get("body").some(child => child.isExpressionStatement())) return;
|
|
path.pushContainer("body", t.expressionStatement(t.identifier("undefined")));
|
|
}
|
|
|
|
}
|
|
});
|
|
|
|
const _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.default.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();
|
|
const module = new _module.default(global.__filename);
|
|
module.filename = global.__filename;
|
|
module.paths = _module.default._nodeModulePaths(global.__dirname);
|
|
global.exports = module.exports;
|
|
global.module = module;
|
|
global.require = module.require.bind(module);
|
|
|
|
const result = _eval(code, global.__filename);
|
|
|
|
if (program.print) {
|
|
const output = typeof result === "string" ? result : (0, _util.inspect)(result);
|
|
process.stdout.write(output + "\n");
|
|
}
|
|
} else {
|
|
if (program.args.length) {
|
|
let args = process.argv.slice(2);
|
|
let i = 0;
|
|
let ignoreNext = false;
|
|
args.some(function (arg, i2) {
|
|
if (ignoreNext) {
|
|
ignoreNext = false;
|
|
return;
|
|
}
|
|
|
|
if (arg[0] === "-") {
|
|
const parsedOption = program.options.find(option => {
|
|
return option.long === arg || option.short === arg;
|
|
});
|
|
|
|
if (parsedOption === undefined) {
|
|
return;
|
|
}
|
|
|
|
const optionName = parsedOption.attributeName();
|
|
const parsedArg = program[optionName];
|
|
|
|
if (optionName === "require" || parsedArg && parsedArg !== true) {
|
|
ignoreNext = true;
|
|
}
|
|
} else {
|
|
i = i2;
|
|
return true;
|
|
}
|
|
});
|
|
args = args.slice(i);
|
|
|
|
if (program.require) {
|
|
require(_resolve.default.sync(program.require, {
|
|
basedir: process.cwd()
|
|
}));
|
|
}
|
|
|
|
const filename = args[0];
|
|
|
|
if (!_path.default.isAbsolute(filename)) {
|
|
args[0] = _path.default.join(process.cwd(), filename);
|
|
}
|
|
|
|
process.argv = ["node"].concat(args);
|
|
process.execArgv.unshift(__filename);
|
|
|
|
_module.default.runMain();
|
|
} else {
|
|
replStart();
|
|
}
|
|
}
|
|
|
|
function replStart() {
|
|
_repl.default.start({
|
|
prompt: "babel > ",
|
|
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);
|
|
}
|
|
|
|
result = _eval(code, filename);
|
|
} catch (e) {
|
|
err = e;
|
|
}
|
|
|
|
callback(err, result);
|
|
} |