diff --git a/bin/babel-external-helpers b/bin/babel-external-helpers index 35eab0ca6a..87e1247d9c 100755 --- a/bin/babel-external-helpers +++ b/bin/babel-external-helpers @@ -2,7 +2,7 @@ var commander = require("commander"); var util = require("../lib/babel/util"); -var runtime = require("../lib/babel/build-external-helpers"); +var runtime = require("../lib/babel/tools/build-external-helpers"); commander.option("-l, --whitelist [whitelist]", "Whitelist of helpers to ONLY include", util.list); commander.option("-t, --output-type [type]", "Type of output (global|umd|var)", "global"); diff --git a/src/babel/api/node.js b/src/babel/api/node.js index 8512a90e73..920fb898c0 100644 --- a/src/babel/api/node.js +++ b/src/babel/api/node.js @@ -9,7 +9,7 @@ export { canCompile } from "../util"; export { default as acorn } from "acorn-babel"; export { default as transform } from "../transformation"; export { default as traverse } from "../traversal"; -export { default as buildExternalHelpers } from "../build-external-helpers"; +export { default as buildExternalHelpers } from "../tools/build-external-helpers"; export { default as types } from "../types"; export { version } from "../../../package"; diff --git a/src/babel/tools/build-external-helpers.js b/src/babel/tools/build-external-helpers.js new file mode 100644 index 0000000000..91c393fcc5 --- /dev/null +++ b/src/babel/tools/build-external-helpers.js @@ -0,0 +1,86 @@ +import generator from "./generation"; +import * as messages from "./messages"; +import * as util from "./util"; +import File from "./transformation/file"; +import each from "lodash/collection/each"; +import t from "./types"; + +function buildGlobal(namespace, builder) { + var body = []; + var container = t.functionExpression(null, [t.identifier("global")], t.blockStatement(body)); + var tree = t.program([t.expressionStatement(t.callExpression(container, [util.template("self-global")]))]); + + body.push(t.variableDeclaration("var", [ + t.variableDeclarator( + namespace, + t.assignmentExpression("=", t.memberExpression(t.identifier("global"), namespace), t.objectExpression([])) + ) + ])); + + builder(body); + + return tree; +} + +function buildUmd(namespace, builder) { + var body = []; + body.push(t.variableDeclaration("var", [ + t.variableDeclarator(namespace, t.identifier("global")) + ])); + + builder(body); + + var container = util.template("umd-commonjs-strict", { + FACTORY_PARAMETERS: t.identifier("global"), + BROWSER_ARGUMENTS: t.assignmentExpression("=", t.memberExpression(t.identifier("root"), namespace), t.objectExpression({})), + COMMON_ARGUMENTS: t.identifier("exports"), + AMD_ARGUMENTS: t.arrayExpression([t.literal("exports")]), + FACTORY_BODY: body, + UMD_ROOT: t.identifier("this") + }); + return t.program([container]); +} + +function buildVar(namespace, builder) { + var body = []; + body.push(t.variableDeclaration("var", [ + t.variableDeclarator(namespace, t.objectExpression({})) + ])); + builder(body); + return t.program(body); +} + +function buildHelpers(body, namespace, whitelist = []) { + each(File.helpers, function (name) { + if (whitelist.length && whitelist.indexOf(name) === -1) return; + + var key = t.identifier(t.toIdentifier(name)); + body.push(t.expressionStatement( + t.assignmentExpression("=", t.memberExpression(namespace, key), util.template(name)) + )); + }); +} + +export default function (whitelist, outputType = "global") { + var namespace = t.identifier("babelHelpers"); + + var builder = function (body) { + return buildHelpers(body, namespace, whitelist); + }; + + var tree; + + var build = { + global: buildGlobal, + umd: buildUmd, + var: buildVar + }[outputType]; + + if (build) { + tree = build(namespace, builder); + } else { + throw new Error(messages.get("unsupportedOutputType", outputType)); + } + + return generator(tree).code; +}; diff --git a/test/_transformation-helper.js b/test/_transformation-helper.js index 45b942b723..bcad6fdba8 100644 --- a/test/_transformation-helper.js +++ b/test/_transformation-helper.js @@ -1,6 +1,6 @@ var genHelpers = require("./_generator-helpers"); var transform = require("../lib/babel/transformation"); -var buildExernalHelpers = require("../lib/babel/build-external-helpers"); +var buildExernalHelpers = require("../lib/babel/tools/build-external-helpers"); var sourceMap = require("source-map"); var codeFrame = require("../lib/babel/helpers/code-frame"); var Module = require("module"); diff --git a/test/api.js b/test/api.js index 2bcd2d0ff3..f8e9312a23 100644 --- a/test/api.js +++ b/test/api.js @@ -1,4 +1,4 @@ -var buildExternalHelpers = require("../lib/babel/build-external-helpers"); +var buildExternalHelpers = require("../lib/babel/tools/build-external-helpers"); var transform = require("../lib/babel/transformation"); var assert = require("assert"); var File = require("../lib/babel/transformation/file");