Diogo Franco (Kovensky) cf5ab16ff9 Add useBuiltIns and useESModules options to transform-runtime
useBuiltIns uses versions of the helpers that do not import even
internal polyfills from core-js.

useESModules uses versions of the helpers that do not go through
transform-es2015-modules-commonjs. This allows for smaller builds in
module systems like webpack, as it doesn't need to preserve commonjs
semantics.

This includes changes to the babel-runtime build-dist script, which
will build the versions of the runtime helpers to be used by
combinations of useBuiltIns and useESModules.
2017-03-10 16:27:35 +09:00

133 lines
4.2 KiB
JavaScript

var outputFile = require("output-file-sync");
var kebabCase = require("lodash/kebabCase");
var fs = require("fs");
var coreDefinitions = require("babel-plugin-transform-runtime").definitions;
var paths = ["is-iterable", "get-iterator"];
Object.keys(coreDefinitions.builtins).forEach(function (key) {
const path = coreDefinitions.builtins[key];
paths.push(path);
});
Object.keys(coreDefinitions.methods).forEach(function (key) {
const props = coreDefinitions.methods[key];
Object.keys(props).forEach(function (key2) {
const path = props[key2];
paths.push(path);
});
});
paths.forEach(function (path) {
writeFile("core-js/" + path + ".js", defaultify('require("core-js/library/fn/' + path + '")'));
});
var helpers = require("babel-helpers");
var babel = require("../../babel-core");
var util = require("../../babel-core/lib/util");
var t = require("../../babel-types");
function relative(filename) {
return __dirname + "/../" + filename;
}
function defaultify(name) {
return 'module.exports = { "default": ' + name + ', __esModule: true };';
}
function writeRootFile(filename, content) {
filename = relative(filename);
//console.log(filename);
outputFile(filename, content);
}
function writeFile(filename, content) {
return writeRootFile(filename, content);
}
function makeTransformOpts(modules = "commonjs", useBuiltIns = false) {
const opts = {
presets: [
[require("../../babel-preset-es2015"), { modules: false }]
],
plugins: [
[require("../../babel-plugin-transform-runtime"), { useBuiltIns: useBuiltIns, useESModules: modules === false }]
]
}
if (modules === 'commonjs') {
opts.plugins.push([require("../../babel-plugin-transform-es2015-modules-commonjs"), { loose: true, strict: false }])
} else if (modules !== false) {
throw new Error('Unsupported module type')
}
return opts
}
function buildRuntimeRewritePlugin(relativePath, helperName) {
return {
pre: function (file) {
var original = file.get("helperGenerator");
file.set("helperGenerator", function(name) {
// make sure that helpers won't insert circular references to themselves
if (name === helperName) return false;
return original(name);
});
},
visitor: {
ImportDeclaration: function(path){
path.get("source").node.value = path.get("source").node.value
.replace(/^babel-runtime/, relativePath);
},
CallExpression: function(path){
if (!path.get("callee").isIdentifier({name: "require"}) ||
path.get("arguments").length !== 1 ||
!path.get("arguments")[0].isStringLiteral()) return;
// replace any reference to babel-runtime with a relative path
path.get("arguments")[0].node.value = path.get("arguments")[0].node.value
.replace(/^babel-runtime/, relativePath);
}
}
};
}
function buildHelper(helperName, modules = "commonjs", useBuiltIns = false) {
const helper = helpers.get(helperName)
// avoid an unneccessary TDZ in the easy case
if (helper.type === "FunctionExpression") {
helper.type = "FunctionDeclaration"
}
var tree = t.program([
t.exportDefaultDeclaration(helper)
]);
const transformOpts = makeTransformOpts(modules, useBuiltIns)
const relative = useBuiltIns ? "../.." : ".."
return babel.transformFromAst(tree, null, {
presets: transformOpts.presets,
plugins: transformOpts.plugins.concat([buildRuntimeRewritePlugin(modules === false ? `../${relative}` : relative, helperName)])
}).code;
}
for (const modules of ["commonjs", false]) {
for (const builtin of [false, true]) {
const dirname = `helpers/${builtin ? 'builtin/' : ''}${!modules ? 'es6/' : ''}`
for (const helperName of helpers.list) {
writeFile(`${dirname}${helperName}.js`, buildHelper(helperName, modules, builtin));
// compat
var helperAlias = kebabCase(helperName);
var content = !modules
? `export { default } from \"./${helperName}.js\";`
: "module.exports = require(\"./" + helperName + ".js\");";
writeFile(`${dirname}_${helperAlias}.js`, content);
if (helperAlias !== helperName) writeFile(`${dirname}${helperAlias}.js`, content);
}
}
}