package org.jooby.assets; import static org.junit.Assert.assertEquals; import java.util.Arrays; import org.junit.Test; import com.typesafe.config.ConfigFactory; public class BabelTest { @Test public void name() throws Exception { assertEquals("babel", new Babel().name()); } @Test public void defaults() throws Exception { assertEquals("code();", new Babel() .process("/x.js", "code();", ConfigFactory.empty())); } @Test public void imports() throws Exception { assertEquals("\"use strict\";\n" + "\n" + "var _math = require(\"math\");\n" + "\n" + "var math = _interopRequireWildcard(_math);\n" + "\n" + "function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n" + "\n" + "alert(\"2 = \" + math.sum(math.pi, math.pi));", new Babel() .set("presets", Arrays.asList("es2015")) .process("/x.js", "import * as math from \"math\";\n" + "alert(\"2 = \" + math.sum(math.pi, math.pi));", ConfigFactory.empty())); } @Test(expected = AssetException.class) public void err() throws Exception { assertEquals("\"use strict\";\n" + "\n" + "code(;", new Babel() .process("/x.js", "co de(;", ConfigFactory.empty())); } @Test public void react() throws Exception { assertEquals("var myDivElement = React.createElement(\"div\", { className: \"foo\" });", new Babel() .set("presets", Arrays.asList("react")) .process("/x.js", "var myDivElement = <div className=\"foo\" />;", ConfigFactory.empty())); } @Test public void inlineSourceMaps() throws Exception { assertEquals("var myDivElement = React.createElement(\"div\", { className: \"foo\" });\n" + "//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInguanMiXSwibmFtZXMiOlsibXlEaXZFbGVtZW50Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxlQUFlLDZCQUFLLFdBQVUsS0FBZixHQUFuQiIsImZpbGUiOiJ4LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIG15RGl2RWxlbWVudCA9IDxkaXYgY2xhc3NOYW1lPVwiZm9vXCIgLz47Il19", new Babel() .set("sourceMaps", "inline") .set("presets", Arrays.asList("react")) .process("/x.js", "var myDivElement = <div className=\"foo\" />;", ConfigFactory.empty())); } @Test public void polyfill() throws Exception { assertEquals("\"use strict\";\n" + "\n" + "function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n" + "\n" + "var fibonacci = _defineProperty({}, Symbol.iterator, function () {\n" + " var pre = 0,\n" + " cur = 1;\n" + " return {\n" + " next: function next() {\n" + " var _ref = [cur, pre + cur];\n" + " pre = _ref[0];\n" + " cur = _ref[1];\n" + "\n" + " return { done: false, value: cur };\n" + " }\n" + " };\n" + "});\n" + "\n" + "var _iteratorNormalCompletion = true;\n" + "var _didIteratorError = false;\n" + "var _iteratorError = undefined;\n" + "\n" + "try {\n" + " for (var _iterator = fibonacci[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n" + " var n = _step.value;\n" + "\n" + " // truncate the sequence at 1000\n" + " if (n > 1000) break;\n" + " console.log(n);\n" + " }\n" + "} catch (err) {\n" + " _didIteratorError = true;\n" + " _iteratorError = err;\n" + "} finally {\n" + " try {\n" + " if (!_iteratorNormalCompletion && _iterator.return) {\n" + " _iterator.return();\n" + " }\n" + " } finally {\n" + " if (_didIteratorError) {\n" + " throw _iteratorError;\n" + " }\n" + " }\n" + "}", new Babel() .set("presets", Arrays.asList("es2015")) .process("/x.js", "let fibonacci = {\n" + " [Symbol.iterator]() {\n" + " let pre = 0, cur = 1;\n" + " return {\n" + " next() {\n" + " [pre, cur] = [cur, pre + cur];\n" + " return { done: false, value: cur }\n" + " }\n" + " }\n" + " }\n" + "}\n" + "\n" + "for (var n of fibonacci) {\n" + " // truncate the sequence at 1000\n" + " if (n > 1000)\n" + " break;\n" + " console.log(n);\n" + "}", ConfigFactory.empty())); } @Test public void polyfillWithExternalHelpers() throws Exception { assertEquals("\"use strict\";\n" + "\n" + "var fibonacci = babelHelpers.defineProperty({}, Symbol.iterator, function () {\n" + " var pre = 0,\n" + " cur = 1;\n" + " return {\n" + " next: function next() {\n" + " var _ref = [cur, pre + cur];\n" + " pre = _ref[0];\n" + " cur = _ref[1];\n" + "\n" + " return { done: false, value: cur };\n" + " }\n" + " };\n" + "});\n" + "\n" + "var _iteratorNormalCompletion = true;\n" + "var _didIteratorError = false;\n" + "var _iteratorError = undefined;\n" + "\n" + "try {\n" + " for (var _iterator = fibonacci[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n" + " var n = _step.value;\n" + "\n" + " // truncate the sequence at 1000\n" + " if (n > 1000) break;\n" + " console.log(n);\n" + " }\n" + "} catch (err) {\n" + " _didIteratorError = true;\n" + " _iteratorError = err;\n" + "} finally {\n" + " try {\n" + " if (!_iteratorNormalCompletion && _iterator.return) {\n" + " _iterator.return();\n" + " }\n" + " } finally {\n" + " if (_didIteratorError) {\n" + " throw _iteratorError;\n" + " }\n" + " }\n" + "}", new Babel() .set("presets", Arrays.asList("es2015")) .set("plugins", Arrays.asList("external-helpers")) .process("/x.js", "let fibonacci = {\n" + " [Symbol.iterator]() {\n" + " let pre = 0, cur = 1;\n" + " return {\n" + " next() {\n" + " [pre, cur] = [cur, pre + cur];\n" + " return { done: false, value: cur }\n" + " }\n" + " }\n" + " }\n" + "}\n" + "\n" + "for (var n of fibonacci) {\n" + " // truncate the sequence at 1000\n" + " if (n > 1000)\n" + " break;\n" + " console.log(n);\n" + "}", ConfigFactory.empty())); } @Test public void ecma6Arrow() throws Exception { assertEquals("\"use strict\";\n" + "\n" + "var odds = evens.map(function (v) {\n" + " return v + 1;\n" + "});", new Babel() .set("presets", Arrays.asList("es2015")) .process("/x.js", "var odds = evens.map(v => v + 1);", ConfigFactory.empty())); } @Test public void ecma6TemplateStr() throws Exception { assertEquals("\"use strict\";\n" + "\n" + "var name = \"Bob\",\n" + " time = \"today\";\n" + "\"Hello \" + name + \", how are you \" + time + \"?\";", new Babel() .set("presets", Arrays.asList("es2015")) .process("/x.js", "var name = \"Bob\", time = \"today\";\n" + "`Hello ${name}, how are you ${time}?`", ConfigFactory.empty())); } @Test public void ecma6LexicalThis() throws Exception { assertEquals("\"use strict\";\n" + "\n" + "var bob = {\n" + " _name: \"Bob\",\n" + " _friends: [],\n" + " printFriends: function printFriends() {\n" + " var _this = this;\n" + "\n" + " this._friends.forEach(function (f) {\n" + " return console.log(_this._name + \" knows \" + f);\n" + " });\n" + " }\n" + "};", new Babel() .set("presets", Arrays.asList("es2015")) .process("/x.js", "var bob = {\n" + " _name: \"Bob\",\n" + " _friends: [],\n" + " printFriends() {\n" + " this._friends.forEach(f =>\n" + " console.log(this._name + \" knows \" + f));\n" + " }\n" + "};", ConfigFactory.empty())); } public void externalHelpers() throws Exception { assertEquals("\"use strict\";\n" + "\n" + "var odds = evens.map(function (v) {\n" + " return v + 1;\n" + "});", new Babel() .set("plugins", Arrays.asList("external-helpers")) .process("/x.js", "var odds = evens.map(v => v + 1);", ConfigFactory.empty())); } }