Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[RFC DRAFT WIP ...] refactor eval("require") workaround hack #7515

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
19 changes: 2 additions & 17 deletions scripts/build/babel-plugins/transform-custom-require.js
Expand Up @@ -19,37 +19,22 @@ module.exports = function(babel) {
visitor: {
CallExpression(path) {
const { node } = path;
if (isEvalRequire(node.callee) && node.arguments.length === 1) {
if (isEvalRequire(node) && node.arguments.length === 1) {
let arg = node.arguments[0];
if (t.isLiteral(arg) && arg.value.startsWith(".")) {
const value = "." + arg.value.slice(arg.value.lastIndexOf("/"));
arg = t.stringLiteral(value);
}
path.replaceWith(t.callExpression(t.identifier("require"), [arg]));
}
},
MemberExpression(path) {
const { node } = path;
if (isEvalRequire(node.object)) {
path.replaceWith(
t.memberExpression(
t.identifier("require"),
node.property,
node.compute,
node.optional
)
);
}
}
}
};

function isEvalRequire(node) {
return (
t.isCallExpression(node) &&
t.isIdentifier(node.callee, { name: "eval" }) &&
node.arguments.length === 1 &&
t.isLiteral(node.arguments[0], { value: "require" })
t.isIdentifier(node.callee, { name: "requireModule" })
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't try this way, even it works, we need hard code this function name.

);
}
};
4 changes: 3 additions & 1 deletion src/cli/util.js
Expand Up @@ -24,6 +24,8 @@ const thirdParty = require("../common/third-party");
const arrayify = require("../utils/arrayify");
const isTTY = require("../utils/is-tty");

const requireModule = eval("require");

const OPTION_USAGE_THRESHOLD = 25;
const CHOICE_USAGE_MARGIN = 3;
const CHOICE_USAGE_INDENTATION = 2;
Expand Down Expand Up @@ -203,7 +205,7 @@ function format(context, input, opt) {
if (context.argv["debug-benchmark"]) {
let benchmark;
try {
benchmark = eval("require")("benchmark");
benchmark = requireModule("benchmark");
} catch (err) {
context.logger.debug(
"'--debug-benchmark' requires the 'benchmark' package to be installed."
Expand Down
62 changes: 30 additions & 32 deletions src/common/internal-plugins.js
@@ -1,8 +1,6 @@
"use strict";

// We need to use `eval("require")()` to prevent rollup from hoisting the requires. A babel
// plugin will look for `eval("require")()` and transform to `require()` in the bundle,
// and rewrite the paths to require from the top-level.
const requireModule = eval("require");

// We need to list the parsers and getters so we can load them only when necessary.
module.exports = [
Expand All @@ -12,71 +10,71 @@ module.exports = [
parsers: {
// JS - Babel
get babel() {
return eval("require")("../language-js/parser-babylon").parsers.babel;
return requireModule("../language-js/parser-babylon").parsers.babel;
},
get "babel-flow"() {
return eval("require")("../language-js/parser-babylon").parsers[
return requireModule("../language-js/parser-babylon").parsers[
"babel-flow"
];
},
get "babel-ts"() {
return eval("require")("../language-js/parser-babylon").parsers[
return requireModule("../language-js/parser-babylon").parsers[
"babel-ts"
];
},
get babylon() {
return eval("require")("../language-js/parser-babylon").parsers.babel;
return requireModule("../language-js/parser-babylon").parsers.babel;
},
get json() {
return eval("require")("../language-js/parser-babylon").parsers.json;
return requireModule("../language-js/parser-babylon").parsers.json;
},
get json5() {
return eval("require")("../language-js/parser-babylon").parsers.json5;
return requireModule("../language-js/parser-babylon").parsers.json5;
},
get "json-stringify"() {
return eval("require")("../language-js/parser-babylon").parsers[
return requireModule("../language-js/parser-babylon").parsers[
"json-stringify"
];
},
get __js_expression() {
return eval("require")("../language-js/parser-babylon").parsers
return requireModule("../language-js/parser-babylon").parsers
.__js_expression;
},
get __vue_expression() {
return eval("require")("../language-js/parser-babylon").parsers
return requireModule("../language-js/parser-babylon").parsers
.__vue_expression;
},
get __vue_event_binding() {
return eval("require")("../language-js/parser-babylon").parsers
return requireModule("../language-js/parser-babylon").parsers
.__vue_event_binding;
},
// JS - Flow
get flow() {
return eval("require")("../language-js/parser-flow").parsers.flow;
return requireModule("../language-js/parser-flow").parsers.flow;
},
// JS - TypeScript
get typescript() {
return eval("require")("../language-js/parser-typescript").parsers
return requireModule("../language-js/parser-typescript").parsers
.typescript;
},
// JS - Angular Action
get __ng_action() {
return eval("require")("../language-js/parser-angular").parsers
return requireModule("../language-js/parser-angular").parsers
.__ng_action;
},
// JS - Angular Binding
get __ng_binding() {
return eval("require")("../language-js/parser-angular").parsers
return requireModule("../language-js/parser-angular").parsers
.__ng_binding;
},
// JS - Angular Interpolation
get __ng_interpolation() {
return eval("require")("../language-js/parser-angular").parsers
return requireModule("../language-js/parser-angular").parsers
.__ng_interpolation;
},
// JS - Angular Directive
get __ng_directive() {
return eval("require")("../language-js/parser-angular").parsers
return requireModule("../language-js/parser-angular").parsers
.__ng_directive;
}
}
Expand All @@ -88,13 +86,13 @@ module.exports = [
parsers: {
// TODO: switch these to just `postcss` and use `language` instead.
get css() {
return eval("require")("../language-css/parser-postcss").parsers.css;
return requireModule("../language-css/parser-postcss").parsers.css;
},
get less() {
return eval("require")("../language-css/parser-postcss").parsers.css;
return requireModule("../language-css/parser-postcss").parsers.css;
},
get scss() {
return eval("require")("../language-css/parser-postcss").parsers.css;
return requireModule("../language-css/parser-postcss").parsers.css;
}
}
},
Expand All @@ -104,7 +102,7 @@ module.exports = [
{
parsers: {
get glimmer() {
return eval("require")("../language-handlebars/parser-glimmer").parsers
return requireModule("../language-handlebars/parser-glimmer").parsers
.glimmer;
}
}
Expand All @@ -115,7 +113,7 @@ module.exports = [
{
parsers: {
get graphql() {
return eval("require")("../language-graphql/parser-graphql").parsers
return requireModule("../language-graphql/parser-graphql").parsers
.graphql;
}
}
Expand All @@ -126,15 +124,15 @@ module.exports = [
{
parsers: {
get remark() {
return eval("require")("../language-markdown/parser-markdown").parsers
return requireModule("../language-markdown/parser-markdown").parsers
.remark;
},
get markdown() {
return eval("require")("../language-markdown/parser-markdown").parsers
return requireModule("../language-markdown/parser-markdown").parsers
.remark;
},
get mdx() {
return eval("require")("../language-markdown/parser-markdown").parsers
return requireModule("../language-markdown/parser-markdown").parsers
.mdx;
}
}
Expand All @@ -145,19 +143,19 @@ module.exports = [
parsers: {
// HTML
get html() {
return eval("require")("../language-html/parser-html").parsers.html;
return requireModule("../language-html/parser-html").parsers.html;
},
// Vue
get vue() {
return eval("require")("../language-html/parser-html").parsers.vue;
return requireModule("../language-html/parser-html").parsers.vue;
},
// Angular
get angular() {
return eval("require")("../language-html/parser-html").parsers.angular;
return requireModule("../language-html/parser-html").parsers.angular;
},
// Lightning Web Components
get lwc() {
return eval("require")("../language-html/parser-html").parsers.lwc;
return requireModule("../language-html/parser-html").parsers.lwc;
}
}
},
Expand All @@ -167,7 +165,7 @@ module.exports = [
{
parsers: {
get yaml() {
return eval("require")("../language-yaml/parser-yaml").parsers.yaml;
return requireModule("../language-yaml/parser-yaml").parsers.yaml;
}
}
}
Expand Down
4 changes: 3 additions & 1 deletion src/common/load-plugins.js
Expand Up @@ -9,6 +9,8 @@ const resolve = require("resolve");
const thirdParty = require("./third-party");
const internalPlugins = require("./internal-plugins");

const requireModule = eval("require");

function loadPlugins(plugins, pluginSearchDirs) {
if (!plugins) {
plugins = [];
Expand Down Expand Up @@ -84,7 +86,7 @@ function loadPlugins(plugins, pluginSearchDirs) {
)
.map(externalPluginInfo => ({
name: externalPluginInfo.name,
...eval("require")(externalPluginInfo.requirePath)
...requireModule(externalPluginInfo.requirePath)
}))
.concat(externalPluginInstances);

Expand Down
4 changes: 3 additions & 1 deletion src/config/resolve-config.js
Expand Up @@ -9,6 +9,8 @@ const mem = require("mem");
const resolveEditorConfig = require("./resolve-config-editorconfig");
const loadToml = require("../utils/load-toml");

const requireModule = eval("require");

const getExplorerMemoized = mem(
opts => {
const cosmiconfig = thirdParty["cosmiconfig" + (opts.sync ? "Sync" : "")];
Expand All @@ -20,7 +22,7 @@ const getExplorerMemoized = mem(
const modulePath = resolve.sync(result.config, {
basedir: path.dirname(result.filepath)
});
result.config = eval("require")(modulePath);
result.config = requireModule(modulePath);
}

if (typeof result.config !== "object") {
Expand Down
4 changes: 3 additions & 1 deletion src/main/parser.js
Expand Up @@ -4,6 +4,8 @@ const path = require("path");
const { ConfigError } = require("../common/errors");
const jsLoc = require("../language-js/loc");

const requireModule = eval("require");

const { locStart, locEnd } = jsLoc;

// Use defineProperties()/getOwnPropertyDescriptor() to prevent
Expand Down Expand Up @@ -51,7 +53,7 @@ function resolveParser(opts, parsers) {
} else {
try {
return {
parse: eval("require")(path.resolve(process.cwd(), opts.parser)),
parse: requireModule(path.resolve(process.cwd(), opts.parser)),
astFormat: "estree",
locStart,
locEnd
Expand Down