From c45ce58f0cc3943a24f4a58c599fa5c2e3164fc3 Mon Sep 17 00:00:00 2001 From: Ondrej Kraus Date: Mon, 2 Mar 2015 15:47:36 +0100 Subject: [PATCH 1/6] stop assigning to global in generated helpers code --- src/babel/build-external-helpers.js | 26 +++++++++++++------ .../templates/umd-commonjs-strict.js | 11 ++++++++ 2 files changed, 29 insertions(+), 8 deletions(-) create mode 100644 src/babel/transformation/templates/umd-commonjs-strict.js diff --git a/src/babel/build-external-helpers.js b/src/babel/build-external-helpers.js index 7feab4699b..ab2d705b32 100644 --- a/src/babel/build-external-helpers.js +++ b/src/babel/build-external-helpers.js @@ -6,18 +6,28 @@ import t from "./types"; export default function (whitelist) { var namespace = t.identifier("babelHelpers"); - 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")]))]); - + var body = []; body.push(t.variableDeclaration("var", [ - t.variableDeclarator( - namespace, - t.assignmentExpression("=", t.memberExpression(t.identifier("global"), namespace), t.objectExpression([])) - ) + t.variableDeclarator(namespace, t.identifier("global")) ])); buildHelpers(body, namespace, whitelist); + var globalHelpersDeclar = t.variableDeclaration("var", [ + t.variableDeclarator( + namespace, + t.objectExpression({}) + ) + ]); + var container = util.template("umd-commonjs-strict", { + AMD_ARGUMENTS: t.arrayExpression([t.literal("exports")]), + COMMON_ARGUMENTS: t.identifier("exports"), + BROWSER_ARGUMENTS: t.identifier("root"), + UMD_ROOT: namespace, + FACTORY_PARAMETERS: t.identifier("global"), + FACTORY_BODY: body + }); + var tree = t.program([globalHelpersDeclar, container]); + return generator(tree).code; }; diff --git a/src/babel/transformation/templates/umd-commonjs-strict.js b/src/babel/transformation/templates/umd-commonjs-strict.js new file mode 100644 index 0000000000..bd38d1e96b --- /dev/null +++ b/src/babel/transformation/templates/umd-commonjs-strict.js @@ -0,0 +1,11 @@ +(function (root, factory) { + if (typeof define === "function" && define.amd) { + define(AMD_ARGUMENTS, factory); + } else if (typeof exports === 'object') { + factory(COMMON_ARGUMENTS); + } else { + factory(BROWSER_ARGUMENTS); + } +})(UMD_ROOT, function (FACTORY_PARAMETERS) { + FACTORY_BODY +}); From 71b9f19e6a314da2ea7c128397a1ef708144f740 Mon Sep 17 00:00:00 2001 From: Ondrej Kraus Date: Mon, 2 Mar 2015 19:21:00 +0100 Subject: [PATCH 2/6] change to normal UMD (fixes bug with leaking variable in AMD mode) --- src/babel/build-external-helpers.js | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/babel/build-external-helpers.js b/src/babel/build-external-helpers.js index ab2d705b32..0db0f3be56 100644 --- a/src/babel/build-external-helpers.js +++ b/src/babel/build-external-helpers.js @@ -13,21 +13,15 @@ export default function (whitelist) { buildHelpers(body, namespace, whitelist); - var globalHelpersDeclar = t.variableDeclaration("var", [ - t.variableDeclarator( - namespace, - t.objectExpression({}) - ) - ]); var container = util.template("umd-commonjs-strict", { AMD_ARGUMENTS: t.arrayExpression([t.literal("exports")]), COMMON_ARGUMENTS: t.identifier("exports"), - BROWSER_ARGUMENTS: t.identifier("root"), - UMD_ROOT: namespace, + BROWSER_ARGUMENTS: t.assignmentExpression("=", t.memberExpression(t.identifier("root"), namespace), t.objectExpression({})), + UMD_ROOT: t.identifier("this"), FACTORY_PARAMETERS: t.identifier("global"), FACTORY_BODY: body }); - var tree = t.program([globalHelpersDeclar, container]); + var tree = t.program([container]); return generator(tree).code; }; From a0fb398ca28ebe4f5fbcacdd265a1ce3e8ba5165 Mon Sep 17 00:00:00 2001 From: Ondrej Kraus Date: Wed, 4 Mar 2015 02:09:31 +0100 Subject: [PATCH 3/6] add possibility to select format of external helpers --- bin/babel-external-helpers | 11 +++++- src/babel/build-external-helpers.js | 54 ++++++++++++++++++++++++++--- 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/bin/babel-external-helpers b/bin/babel-external-helpers index c60b3d36f6..35eab0ca6a 100755 --- a/bin/babel-external-helpers +++ b/bin/babel-external-helpers @@ -1,4 +1,13 @@ #!/usr/bin/env node +var commander = require("commander"); +var util = require("../lib/babel/util"); var runtime = require("../lib/babel/build-external-helpers"); -console.log(runtime()); + +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"); + +commander.usage("[options]"); +commander.parse(process.argv); + +console.log(runtime(commander.whitelist, commander.outputType)); diff --git a/src/babel/build-external-helpers.js b/src/babel/build-external-helpers.js index 0db0f3be56..dbde9d20a1 100644 --- a/src/babel/build-external-helpers.js +++ b/src/babel/build-external-helpers.js @@ -3,15 +3,30 @@ import generator from "./generation"; import * as util from "./util"; import t from "./types"; -export default function (whitelist) { - var namespace = t.identifier("babelHelpers"); +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")) ])); - buildHelpers(body, namespace, whitelist); + builder(body); var container = util.template("umd-commonjs-strict", { AMD_ARGUMENTS: t.arrayExpression([t.literal("exports")]), @@ -21,7 +36,38 @@ export default function (whitelist) { FACTORY_PARAMETERS: t.identifier("global"), FACTORY_BODY: body }); - var tree = t.program([container]); + 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); +} + +export default function (whitelist, outputType = "global") { + var namespace = t.identifier("babelHelpers"); + var builder = function (body) { + return buildHelpers(body, namespace, whitelist); + }; + + var tree; + switch (outputType) { + case "global": + tree = buildGlobal(namespace, builder); + break; + case "umd": + tree = buildUmd(namespace, builder); + break; + case "var": + tree = buildVar(namespace, builder); + break; + default: + throw new Error("Unsupported output type"); + } return generator(tree).code; }; From 3e6e86d0738f8f647c49b823b9030e6b5255dba3 Mon Sep 17 00:00:00 2001 From: Ondrej Kraus Date: Thu, 5 Mar 2015 13:05:37 +0100 Subject: [PATCH 4/6] order template keys by length --- src/babel/build-external-helpers.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/babel/build-external-helpers.js b/src/babel/build-external-helpers.js index dbde9d20a1..be9195d8c0 100644 --- a/src/babel/build-external-helpers.js +++ b/src/babel/build-external-helpers.js @@ -29,12 +29,12 @@ function buildUmd(namespace, builder) { builder(body); var container = util.template("umd-commonjs-strict", { - AMD_ARGUMENTS: t.arrayExpression([t.literal("exports")]), - COMMON_ARGUMENTS: t.identifier("exports"), - BROWSER_ARGUMENTS: t.assignmentExpression("=", t.memberExpression(t.identifier("root"), namespace), t.objectExpression({})), - UMD_ROOT: t.identifier("this"), FACTORY_PARAMETERS: t.identifier("global"), - FACTORY_BODY: body + 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]); } From 71f5c9791df3a97ebe387025d19ddc9a2e6d3e07 Mon Sep 17 00:00:00 2001 From: Ondrej Kraus Date: Thu, 5 Mar 2015 13:11:14 +0100 Subject: [PATCH 5/6] replace switch with if-else chain --- src/babel/build-external-helpers.js | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/babel/build-external-helpers.js b/src/babel/build-external-helpers.js index be9195d8c0..89fbb08bbd 100644 --- a/src/babel/build-external-helpers.js +++ b/src/babel/build-external-helpers.js @@ -55,17 +55,13 @@ export default function (whitelist, outputType = "global") { }; var tree; - switch (outputType) { - case "global": + if (outputType === "global") { tree = buildGlobal(namespace, builder); - break; - case "umd": + } else if (outputType === "umd") { tree = buildUmd(namespace, builder); - break; - case "var": + } else if (outputType === "var") { tree = buildVar(namespace, builder); - break; - default: + } else { throw new Error("Unsupported output type"); } From 623be068c48d6dd9f761ae32d19a39b484033d45 Mon Sep 17 00:00:00 2001 From: Ondrej Kraus Date: Thu, 5 Mar 2015 13:17:10 +0100 Subject: [PATCH 6/6] add unsupportedOutputType to messages.js --- src/babel/build-external-helpers.js | 3 ++- src/babel/messages.js | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/babel/build-external-helpers.js b/src/babel/build-external-helpers.js index 89fbb08bbd..b96579a27f 100644 --- a/src/babel/build-external-helpers.js +++ b/src/babel/build-external-helpers.js @@ -1,5 +1,6 @@ import buildHelpers from "./build-helpers"; import generator from "./generation"; +import * as messages from "./messages"; import * as util from "./util"; import t from "./types"; @@ -62,7 +63,7 @@ export default function (whitelist, outputType = "global") { } else if (outputType === "var") { tree = buildVar(namespace, builder); } else { - throw new Error("Unsupported output type"); + throw new Error(messages.get("unsupportedOutputType", outputType)); } return generator(tree).code; diff --git a/src/babel/messages.js b/src/babel/messages.js index cf00085320..0f70f1410f 100644 --- a/src/babel/messages.js +++ b/src/babel/messages.js @@ -20,7 +20,8 @@ export var messages = { didYouMean: "Did you mean $1?", evalInStrictMode: "eval is not allowed in strict mode", codeGeneratorDeopt: "Note: The code generator has deoptimised the styling of $1 as it exceeds the max of $2.", - missingTemplatesDirectory: "no templates directory - this is most likely the result of a broken `npm publish`. Please report to https://github.com/babel/babel/issues" + missingTemplatesDirectory: "no templates directory - this is most likely the result of a broken `npm publish`. Please report to https://github.com/babel/babel/issues", + unsupportedOutputType: "Unsupported output type $1" }; export function get(key) {