diff --git a/.gitignore b/.gitignore index fe3e360527..f6275555de 100644 --- a/.gitignore +++ b/.gitignore @@ -11,8 +11,6 @@ test/core/tmp coverage dist .package.json -packages/babel-runtime/es5/helpers/*.js -packages/babel-runtime/es5/regenerator/*.js -packages/babel-runtime/es3/helpers/*.js -packages/babel-runtime/es3/regenerator/*.js +packages/babel-runtime/helpers/*.js +packages/babel-runtime/regenerator/*.js lib diff --git a/package.json b/package.json index 764cff6be7..216c0d7a95 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "ast-types": "~0.7.0", "chalk": "^1.0.0", "convert-source-map": "^0.5.0", - "core-js": "^0.6.0", + "core-js": "^0.8.0", "debug": "^2.1.1", "detect-indent": "^3.0.0", "estraverse": "^1.9.1", diff --git a/packages/babel-runtime/es5/core-js.js b/packages/babel-runtime/core-js.js similarity index 100% rename from packages/babel-runtime/es5/core-js.js rename to packages/babel-runtime/core-js.js diff --git a/packages/babel-runtime/es3/core-js.js b/packages/babel-runtime/es3/core-js.js deleted file mode 100644 index 263d7c1fbe..0000000000 --- a/packages/babel-runtime/es3/core-js.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - "default": require("core-js/client/library"), - __esModule: true -}; diff --git a/packages/babel-runtime/package.json b/packages/babel-runtime/package.json index 0d0d41e8aa..a18b7a2ec0 100644 --- a/packages/babel-runtime/package.json +++ b/packages/babel-runtime/package.json @@ -5,6 +5,6 @@ "repository": "babel/babel", "author": "Sebastian McKenzie ", "dependencies": { - "core-js": "^0.6.0" + "core-js": "^0.8.0" } -} \ No newline at end of file +} diff --git a/packages/build-runtime.js b/packages/build-runtime.js index 1f0f07e893..6698b06f43 100644 --- a/packages/build-runtime.js +++ b/packages/build-runtime.js @@ -39,39 +39,34 @@ function writeRootFile(filename, content) { outputFile(filename, content); } -function doVersion(version) { - var transformer = version + ".runtime"; - function writeFile(filename, content) { - return writeRootFile(version + "/" + filename, content); - } - - function selfContainify(code) { - return transform(code, { - optional: [transformer] - }).code; - } - - function buildHelper(helperName) { - var tree = t.program( - util.template("self-contained-helpers-head", { - HELPER: util.template("helper-" + helperName) - }) - ); - - return transform.fromAst(tree, null, { - optional: [transformer] - }).code; - } - - each(File.helpers, function (helperName) { - writeFile("helpers/" + helperName + ".js", buildHelper(helperName)); - }); - - writeFile("regenerator/index.js", readFile("regenerator-babel/runtime-module", true)); - writeFile("regenerator/runtime.js", selfContainify(readFile("regenerator-babel/runtime"))); +function writeFile(filename, content) { + return writeRootFile(filename, content); } -doVersion("es3"); -doVersion("es5"); +function selfContainify(code) { + return transform(code, { + optional: ["runtime"] + }).code; +} + +function buildHelper(helperName) { + var tree = t.program( + util.template("self-contained-helpers-head", { + HELPER: util.template("helper-" + helperName) + }) + ); + + return transform.fromAst(tree, null, { + optional: ["runtime"] + }).code; +} + +each(File.helpers, function (helperName) { + writeFile("helpers/" + helperName + ".js", buildHelper(helperName)); +}); + +writeFile("regenerator/index.js", readFile("regenerator-babel/runtime-module", true)); +writeFile("regenerator/runtime.js", selfContainify(readFile("regenerator-babel/runtime"))); + updatePackage(); diff --git a/src/babel/transformation/helpers/build-runtime-transformer.js b/src/babel/transformation/helpers/build-runtime-transformer.js deleted file mode 100644 index 0a24a75b9a..0000000000 --- a/src/babel/transformation/helpers/build-runtime-transformer.js +++ /dev/null @@ -1,101 +0,0 @@ -import includes from "lodash/collection/includes"; -import * as util from "../../util"; -import has from "lodash/object/has"; -import * as t from "../../types"; - -var isSymbolIterator = t.buildMatchMemberExpression("Symbol.iterator"); - -var ALIASABLE_CONSTRUCTORS = [ - "Symbol", - "Promise", - "Map", - "WeakMap", - "Set", - "WeakSet" -]; - -export default function (exports, core, prefix) { - var moduleName = `babel-runtime/${prefix}`; - - function coreHas(node) { - return node.name !== "_" && has(core, node.name); - } - - var astVisitor = { - enter(node, parent, scope, file) { - var prop; - - if (this.isMemberExpression() && this.isReferenced()) { - // Array.from -> _core.Array.from - var obj = node.object; - prop = node.property; - - if (!t.isReferenced(obj, node)) return; - - if (!node.computed && coreHas(obj) && has(core[obj.name], prop.name) && !scope.getBindingIdentifier(obj.name)) { - this.skip(); - return t.prependToMemberExpression(node, file.get("coreIdentifier")); - } - } else if (this.isReferencedIdentifier() && !t.isMemberExpression(parent) && includes(ALIASABLE_CONSTRUCTORS, node.name) && !scope.getBindingIdentifier(node.name)) { - // Symbol() -> _core.Symbol(); new Promise -> new _core.Promise - return t.memberExpression(file.get("coreIdentifier"), node); - } else if (this.isCallExpression()) { - // arr[Symbol.iterator]() -> _core.$for.getIterator(arr) - - var callee = node.callee; - if (node.arguments.length) return false; - - if (!t.isMemberExpression(callee)) return false; - if (!callee.computed) return false; - - prop = callee.property; - if (!isSymbolIterator(prop)) return false; - - return util.template("corejs-iterator", { - CORE_ID: file.get("coreIdentifier"), - VALUE: callee.object - }); - } else if (this.isBinaryExpression()) { - // Symbol.iterator in arr -> core.$for.isIterable(arr) - - if (node.operator !== "in") return; - - var left = node.left; - if (!isSymbolIterator(left)) return; - - return util.template("corejs-is-iterator", { - CORE_ID: file.get("coreIdentifier"), - VALUE: node.right - }); - } - } - }; - - exports.metadata = { - optional: true - }; - - exports.Program = function (node, parent, scope, file) { - this.traverse(astVisitor, file); - }; - - exports.pre = function (file) { - file.set("helperGenerator", function (name) { - return file.addImport(`${moduleName}/helpers/${name}`, name); - }); - - file.setDynamic("coreIdentifier", function () { - return file.addImport(`${moduleName}/core-js`, "core"); - }); - - file.setDynamic("regeneratorIdentifier", function () { - return file.addImport(`${moduleName}/regenerator`, "regeneratorRuntime"); - }); - }; - - exports.Identifier = function (node, parent, scope, file) { - if (this.isReferencedIdentifier({ name: "regeneratorRuntime" })) { - return file.get("regeneratorIdentifier"); - } - }; -}; diff --git a/src/babel/transformation/templates/corejs-is-iterator.js b/src/babel/transformation/templates/corejs-is-iterator.js index 6a18378f0f..3253109846 100644 --- a/src/babel/transformation/templates/corejs-is-iterator.js +++ b/src/babel/transformation/templates/corejs-is-iterator.js @@ -1 +1 @@ -CORE_ID.$for.isIterable(VALUE); +CORE_ID.isIterable(VALUE); diff --git a/src/babel/transformation/templates/corejs-iterator.js b/src/babel/transformation/templates/corejs-iterator.js index c30ea8a4c2..24cb36c354 100644 --- a/src/babel/transformation/templates/corejs-iterator.js +++ b/src/babel/transformation/templates/corejs-iterator.js @@ -1 +1 @@ -CORE_ID.$for.getIterator(VALUE); +CORE_ID.getIterator(VALUE); diff --git a/src/babel/transformation/transformers/es3/runtime.js b/src/babel/transformation/transformers/es3/runtime.js deleted file mode 100644 index f258307c44..0000000000 --- a/src/babel/transformation/transformers/es3/runtime.js +++ /dev/null @@ -1,4 +0,0 @@ -import core from "core-js/client/library"; -import buildRuntimeTransformer from "../../helpers/build-runtime-transformer"; - -buildRuntimeTransformer(exports, core, "es3"); diff --git a/src/babel/transformation/transformers/index.js b/src/babel/transformation/transformers/index.js index 373c956936..42ccc1d6b5 100644 --- a/src/babel/transformation/transformers/index.js +++ b/src/babel/transformation/transformers/index.js @@ -83,7 +83,6 @@ export default { // needs to be after `regenerator` due to needing `regeneratorRuntime` references // needs to be after `es6.forOf` due to needing `Symbol.iterator` references // needs to be before `es6.modules` due to dynamic imports - "es3.runtime": require("./es3/runtime"), runtime: require("./other/runtime"), // needs to be before `_blockHoist` due to function hoisting etc diff --git a/src/babel/transformation/transformers/other/runtime.js b/src/babel/transformation/transformers/other/runtime.js index 6d775a93f0..c13b37d2c0 100644 --- a/src/babel/transformation/transformers/other/runtime.js +++ b/src/babel/transformation/transformers/other/runtime.js @@ -1,4 +1,99 @@ import core from "core-js/library"; -import buildRuntimeTransformer from "../../helpers/build-runtime-transformer"; +import includes from "lodash/collection/includes"; +import * as util from "../../util"; +import has from "lodash/object/has"; +import * as t from "../../types"; -buildRuntimeTransformer(exports, core, "es5"); +var isSymbolIterator = t.buildMatchMemberExpression("Symbol.iterator"); + +var ALIASABLE_CONSTRUCTORS = [ +"Symbol", +"Promise", +"Map", +"WeakMap", +"Set", +"WeakSet" +]; + +function coreHas(node) { + return node.name !== "_" && has(core, node.name); +} + +var astVisitor = { + enter(node, parent, scope, file) { + var prop; + + if (this.isMemberExpression() && this.isReferenced()) { + // Array.from -> _core.Array.from + var obj = node.object; + prop = node.property; + + if (!t.isReferenced(obj, node)) return; + + if (!node.computed && coreHas(obj) && has(core[obj.name], prop.name) && !scope.getBindingIdentifier(obj.name)) { + this.skip(); + return t.prependToMemberExpression(node, file.get("coreIdentifier")); + } + } else if (this.isReferencedIdentifier() && !t.isMemberExpression(parent) && includes(ALIASABLE_CONSTRUCTORS, node.name) && !scope.getBindingIdentifier(node.name)) { + // Symbol() -> _core.Symbol(); new Promise -> new _core.Promise + return t.memberExpression(file.get("coreIdentifier"), node); + } else if (this.isCallExpression()) { + // arr[Symbol.iterator]() -> _core.$for.getIterator(arr) + + var callee = node.callee; + if (node.arguments.length) return false; + + if (!t.isMemberExpression(callee)) return false; + if (!callee.computed) return false; + + prop = callee.property; + if (!isSymbolIterator(prop)) return false; + + return util.template("corejs-iterator", { + CORE_ID: file.get("coreIdentifier"), + VALUE: callee.object + }); + } else if (this.isBinaryExpression()) { + // Symbol.iterator in arr -> core.$for.isIterable(arr) + + if (node.operator !== "in") return; + + var left = node.left; + if (!isSymbolIterator(left)) return; + + return util.template("corejs-is-iterator", { + CORE_ID: file.get("coreIdentifier"), + VALUE: node.right + }); + } + } +}; + +exports.metadata = { + optional: true +}; + +exports.Program = function (node, parent, scope, file) { + this.traverse(astVisitor, file); +}; + +exports.pre = function (file) { + file.set("helperGenerator", function (name) { + return file.addImport(`babel-runtime/helpers/${name}`, name); + }); + + file.setDynamic("coreIdentifier", function () { + return file.addImport("babel-runtime/core-js", "core"); + }); + + file.setDynamic("regeneratorIdentifier", function () { + return file.addImport("babel-runtime/regenerator", "regeneratorRuntime"); + }); +}; + +exports.Identifier = function (node, parent, scope, file) { + if (this.isReferencedIdentifier({ name: "regeneratorRuntime" })) { + return file.get("regeneratorIdentifier"); + } +}; +}; diff --git a/test/core/fixtures/transformation/es3.runtime/aliases-array-is-array/actual.js b/test/core/fixtures/transformation/es3.runtime/aliases-array-is-array/actual.js deleted file mode 100644 index 1db49eee1e..0000000000 --- a/test/core/fixtures/transformation/es3.runtime/aliases-array-is-array/actual.js +++ /dev/null @@ -1 +0,0 @@ -Array.isArray(foo); diff --git a/test/core/fixtures/transformation/es3.runtime/aliases-array-is-array/expected.js b/test/core/fixtures/transformation/es3.runtime/aliases-array-is-array/expected.js deleted file mode 100644 index ee0a0e4007..0000000000 --- a/test/core/fixtures/transformation/es3.runtime/aliases-array-is-array/expected.js +++ /dev/null @@ -1,5 +0,0 @@ -"use strict"; - -var _core = require("babel-runtime/es3/core-js")["default"]; - -_core.Array.isArray(foo); diff --git a/test/core/fixtures/transformation/es3.runtime/options.json b/test/core/fixtures/transformation/es3.runtime/options.json deleted file mode 100644 index 6b5bc2daf9..0000000000 --- a/test/core/fixtures/transformation/es3.runtime/options.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "optional": ["es3.runtime"], - "stage": 0 -} diff --git a/test/core/fixtures/transformation/runtime/es6-for-of/expected.js b/test/core/fixtures/transformation/runtime/es6-for-of/expected.js index 85e91885e1..020a30f981 100644 --- a/test/core/fixtures/transformation/runtime/es6-for-of/expected.js +++ b/test/core/fixtures/transformation/runtime/es6-for-of/expected.js @@ -7,7 +7,7 @@ var _didIteratorError = false; var _iteratorError = undefined; try { - for (var _iterator = _core.$for.getIterator(arr), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + for (var _iterator = _core.getIterator(arr), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var i = _step.value; } } catch (err) { diff --git a/test/core/fixtures/transformation/runtime/es7-array-comprehensions/expected.js b/test/core/fixtures/transformation/runtime/es7-array-comprehensions/expected.js index 24853c0bff..dced63de98 100644 --- a/test/core/fixtures/transformation/runtime/es7-array-comprehensions/expected.js +++ b/test/core/fixtures/transformation/runtime/es7-array-comprehensions/expected.js @@ -9,7 +9,7 @@ var arr = (function () { var _iteratorError = undefined; try { - for (var _iterator = _core.$for.getIterator(nums), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + for (var _iterator = _core.getIterator(nums), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var i = _step.value; _arr.push(i * i); diff --git a/test/core/fixtures/transformation/runtime/full/expected.js b/test/core/fixtures/transformation/runtime/full/expected.js index 8b22f49ba2..99f72acb8b 100644 --- a/test/core/fixtures/transformation/runtime/full/expected.js +++ b/test/core/fixtures/transformation/runtime/full/expected.js @@ -8,7 +8,7 @@ var _interopRequire = require("babel-runtime/es5/helpers/interop-require")["defa var _interopRequireWildcard = require("babel-runtime/es5/helpers/interop-require-wildcard")["default"]; -Object.defineProperty(exports, "__esModule", { +_core.Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/test/core/fixtures/transformation/runtime/symbol-iterator-in/expected.js b/test/core/fixtures/transformation/runtime/symbol-iterator-in/expected.js index 7193cbaee9..d7d8007291 100644 --- a/test/core/fixtures/transformation/runtime/symbol-iterator-in/expected.js +++ b/test/core/fixtures/transformation/runtime/symbol-iterator-in/expected.js @@ -2,4 +2,4 @@ var _core = require("babel-runtime/es5/core-js")["default"]; -_core.$for.isIterable(Object(arr)); +_core.isIterable(Object(arr));