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

Fix custom require's #4766

Merged
merged 1 commit into from Jun 28, 2018
Merged
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
36 changes: 22 additions & 14 deletions scripts/build/babel-plugins/transform-custom-require.js
Expand Up @@ -2,32 +2,40 @@

//
// BEFORE:
// $$$r("path/to/file")
// eval("require")("./path/to/file")
// eval("require")(identifier)
//
// AFTER:
// require("./file")
// require(identifier)
//

module.exports = function(babel) {
const t = babel.types;

return {
visitor: {
CallExpression: function(path) {
CallExpression(path) {
const node = path.node;
if (
path.get("callee").isIdentifier({ name: "$$$r" }) &&
node.arguments.length === 1 &&
path.get("arguments.0").isStringLiteral()
) {
const value = node.arguments[0].value;
const parts = value.split("/");
path.replaceWith(
t.callExpression(t.identifier("require"), [
t.stringLiteral(`./${parts[parts.length - 1]}`)
])
);
if (isEvalRequire(node)) {
let arg = node.arguments[0];
if (t.isLiteral(arg) && arg.value.startsWith(".")) {
const value = "." + arg.value.substring(arg.value.lastIndexOf("/"));
arg = t.stringLiteral(value);
}
path.replaceWith(t.callExpression(t.identifier("require"), [arg]));
}
}
}
};

function isEvalRequire(node) {
return (
t.isCallExpression(node.callee) &&
node.arguments.length === 1 &&
t.isIdentifier(node.callee.callee, { name: "eval" }) &&
node.callee.arguments.length === 1 &&
t.isLiteral(node.callee.arguments[0], { value: "require" })
);
}
};
46 changes: 26 additions & 20 deletions src/common/internal-plugins.js
@@ -1,9 +1,8 @@
"use strict";

// We need to do this to prevent rollup from hoisting the requires. A babel
// plugin will look for `$$$r()` and transform to `require()` in the bundle,
// 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 $$$r = require;

// We need to list the parsers and getters so we can load them only when necessary.
module.exports = [
Expand All @@ -13,27 +12,30 @@ module.exports = [
parsers: {
// JS - Babylon
get babylon() {
return $$$r("../language-js/parser-babylon").parsers.babylon;
return eval("require")("../language-js/parser-babylon").parsers.babylon;
},
get json() {
return $$$r("../language-js/parser-babylon").parsers.json;
return eval("require")("../language-js/parser-babylon").parsers.json;
},
get json5() {
return $$$r("../language-js/parser-babylon").parsers.json5;
return eval("require")("../language-js/parser-babylon").parsers.json5;
},
get "json-stringify"() {
return $$$r("../language-js/parser-babylon").parsers["json-stringify"];
return eval("require")("../language-js/parser-babylon").parsers[
"json-stringify"
];
},
// JS - Flow
get flow() {
return $$$r("../language-js/parser-flow").parsers.flow;
return eval("require")("../language-js/parser-flow").parsers.flow;
},
// JS - TypeScript
get typescript() {
return $$$r("../language-js/parser-typescript").parsers.typescript;
return eval("require")("../language-js/parser-typescript").parsers
.typescript;
},
get "typescript-eslint"() {
return $$$r("../language-js/parser-typescript").parsers[
return eval("require")("../language-js/parser-typescript").parsers[
"typescript-eslint"
];
}
Expand All @@ -46,13 +48,13 @@ module.exports = [
parsers: {
// TODO: switch these to just `postcss` and use `language` instead.
get css() {
return $$$r("../language-css/parser-postcss").parsers.css;
return eval("require")("../language-css/parser-postcss").parsers.css;
},
get less() {
return $$$r("../language-css/parser-postcss").parsers.css;
return eval("require")("../language-css/parser-postcss").parsers.css;
},
get scss() {
return $$$r("../language-css/parser-postcss").parsers.css;
return eval("require")("../language-css/parser-postcss").parsers.css;
}
}
},
Expand All @@ -62,7 +64,8 @@ module.exports = [
{
parsers: {
get glimmer() {
return $$$r("../language-handlebars/parser-glimmer").parsers.glimmer;
return eval("require")("../language-handlebars/parser-glimmer").parsers
.glimmer;
}
}
},
Expand All @@ -72,7 +75,8 @@ module.exports = [
{
parsers: {
get graphql() {
return $$$r("../language-graphql/parser-graphql").parsers.graphql;
return eval("require")("../language-graphql/parser-graphql").parsers
.graphql;
}
}
},
Expand All @@ -82,11 +86,13 @@ module.exports = [
{
parsers: {
get remark() {
return $$$r("../language-markdown/parser-markdown").parsers.remark;
return eval("require")("../language-markdown/parser-markdown").parsers
.remark;
},
// TODO: Delete this in 2.0
get markdown() {
return $$$r("../language-markdown/parser-markdown").parsers.remark;
return eval("require")("../language-markdown/parser-markdown").parsers
.remark;
}
}
},
Expand All @@ -96,7 +102,7 @@ module.exports = [
{
parsers: {
get parse5() {
return $$$r("../language-html/parser-parse5").parsers.parse5;
return eval("require")("../language-html/parser-parse5").parsers.parse5;
}
}
},
Expand All @@ -106,7 +112,7 @@ module.exports = [
{
parsers: {
get vue() {
return $$$r("../language-vue/parser-vue").parsers.vue;
return eval("require")("../language-vue/parser-vue").parsers.vue;
}
}
},
Expand All @@ -116,7 +122,7 @@ module.exports = [
{
parsers: {
get yaml() {
return $$$r("../language-yaml/parser-yaml").parsers.yaml;
return eval("require")("../language-yaml/parser-yaml").parsers.yaml;
}
}
}
Expand Down