diff --git a/packages/babel-cli/test/fixtures/babel-external-helpers/--whitelist/stdout.txt b/packages/babel-cli/test/fixtures/babel-external-helpers/--whitelist/stdout.txt index 7f1e7f327f..1068d127fe 100644 --- a/packages/babel-cli/test/fixtures/babel-external-helpers/--whitelist/stdout.txt +++ b/packages/babel-cli/test/fixtures/babel-external-helpers/--whitelist/stdout.txt @@ -1,21 +1,21 @@ (function (global) { var babelHelpers = global.babelHelpers = {}; - babelHelpers.createClass = function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); } + } - return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps); - if (staticProps) defineProperties(Constructor, staticProps); - return Constructor; - }; - }(); + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + babelHelpers.createClass = _createClass })(typeof global === "undefined" ? self : global); diff --git a/packages/babel-core/src/tools/build-external-helpers.js b/packages/babel-core/src/tools/build-external-helpers.js index bdd3ea1c9b..ea04163924 100644 --- a/packages/babel-core/src/tools/build-external-helpers.js +++ b/packages/babel-core/src/tools/build-external-helpers.js @@ -29,7 +29,18 @@ function buildGlobal(namespace, builder) { ); const tree = t.program([ t.expressionStatement( - t.callExpression(container, [helpers.get("selfGlobal")]), + t.callExpression(container, [ + // typeof global === "undefined" ? self : global + t.conditionalExpression( + t.binaryExpression( + "===", + t.unaryExpression("typeof", t.identifier("global")), + t.stringLiteral("undefined"), + ), + t.identifier("self"), + t.identifier("global"), + ), + ]), ), ]); @@ -131,16 +142,12 @@ function buildHelpers(body, namespace, whitelist) { helpers.list.forEach(function(name) { if (whitelist && whitelist.indexOf(name) < 0) return; - const key = t.identifier(name); - body.push( - t.expressionStatement( - t.assignmentExpression( - "=", - t.memberExpression(namespace, key), - helpers.get(name), - ), - ), + const { nodes } = helpers.get( + name, + t.memberExpression(namespace, t.identifier(name)), ); + + body.push(...nodes); }); } export default function( diff --git a/packages/babel-core/src/transformation/file/index.js b/packages/babel-core/src/transformation/file/index.js index c4895f6c0f..ecff41c24b 100644 --- a/packages/babel-core/src/transformation/file/index.js +++ b/packages/babel-core/src/transformation/file/index.js @@ -241,24 +241,18 @@ export default class File extends Store { return t.memberExpression(runtime, t.identifier(name)); } - const ref = getHelper(name); + const ownBindingNames = Object.keys(this.scope.getAllBindings()); const uid = (this.declarations[name] = this.scope.generateUidIdentifier( name, )); - if (t.isFunctionExpression(ref) && !ref.id) { - ref.body._compact = true; - ref.id = uid; - ref.type = "FunctionDeclaration"; - this.path.unshiftContainer("body", ref); - } else { - ref._compact = true; - this.scope.push({ - id: uid, - init: ref, - unique: true, - }); - } + const { nodes } = getHelper(name, uid, ownBindingNames); + + nodes.forEach(node => { + node._compact = true; + }); + + this.path.unshiftContainer("body", nodes); return uid; } diff --git a/packages/babel-core/test/fixtures/transformation/misc/regression-2892/expected.js b/packages/babel-core/test/fixtures/transformation/misc/regression-2892/expected.js index cab001a0b6..0324d6ce0a 100644 --- a/packages/babel-core/test/fixtures/transformation/misc/regression-2892/expected.js +++ b/packages/babel-core/test/fixtures/transformation/misc/regression-2892/expected.js @@ -5,8 +5,6 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = void 0; -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - var foo = function () { var _ref2 = _asyncToGenerator( /*#__PURE__*/ @@ -55,6 +53,10 @@ function _asyncToGenerator(fn) { return function () { var _this = this, _argumen function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + var Foo = /*#__PURE__*/ function () { diff --git a/packages/babel-helpers/package.json b/packages/babel-helpers/package.json index f8786caab9..966b3a87d1 100644 --- a/packages/babel-helpers/package.json +++ b/packages/babel-helpers/package.json @@ -8,6 +8,8 @@ "repository": "https://github.com/babel/babel/tree/master/packages/babel-helpers", "main": "lib/index.js", "dependencies": { - "babel-template": "7.0.0-beta.0" + "babel-template": "7.0.0-beta.0", + "babel-traverse": "7.0.0-beta.0", + "babel-types": "7.0.0-beta.0" } } diff --git a/packages/babel-helpers/src/helpers.js b/packages/babel-helpers/src/helpers.js index 010c3c75f4..8d3ab32f3a 100644 --- a/packages/babel-helpers/src/helpers.js +++ b/packages/babel-helpers/src/helpers.js @@ -5,64 +5,75 @@ import template from "babel-template"; const helpers = {}; export default helpers; -helpers.typeof = template(` - (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") - ? function (obj) { return typeof obj; } - : function (obj) { +function defineHelper(str) { + return template(str, { sourceType: "module" }); +} + +helpers.typeof = defineHelper(` + export default function _typeof(obj) { + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function (obj) { return typeof obj; }; + } else { + _typeof = function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + } + + return _typeof(obj); + } `); -helpers.jsx = template(` - (function () { - var REACT_ELEMENT_TYPE = (typeof Symbol === "function" && Symbol.for && Symbol.for("react.element")) || 0xeac7; +helpers.jsx = defineHelper(` + var REACT_ELEMENT_TYPE; - return function createRawReactElement (type, props, key, children) { - var defaultProps = type && type.defaultProps; - var childrenLength = arguments.length - 3; + export default function _createRawReactElement(type, props, key, children) { + if (!REACT_ELEMENT_TYPE) { + REACT_ELEMENT_TYPE = (typeof Symbol === "function" && Symbol.for && Symbol.for("react.element")) || 0xeac7; + } - if (!props && childrenLength !== 0) { - // If we're going to assign props.children, we create a new object now - // to avoid mutating defaultProps. - props = {}; - } - if (props && defaultProps) { - for (var propName in defaultProps) { - if (props[propName] === void 0) { - props[propName] = defaultProps[propName]; - } + var defaultProps = type && type.defaultProps; + var childrenLength = arguments.length - 3; + + if (!props && childrenLength !== 0) { + // If we're going to assign props.children, we create a new object now + // to avoid mutating defaultProps. + props = {}; + } + if (props && defaultProps) { + for (var propName in defaultProps) { + if (props[propName] === void 0) { + props[propName] = defaultProps[propName]; } - } else if (!props) { - props = defaultProps || {}; } + } else if (!props) { + props = defaultProps || {}; + } - if (childrenLength === 1) { - props.children = children; - } else if (childrenLength > 1) { - var childArray = Array(childrenLength); - for (var i = 0; i < childrenLength; i++) { - childArray[i] = arguments[i + 3]; - } - props.children = childArray; + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 3]; } + props.children = childArray; + } - return { - $$typeof: REACT_ELEMENT_TYPE, - type: type, - key: key === undefined ? null : '' + key, - ref: null, - props: props, - _owner: null, - }; + return { + $$typeof: REACT_ELEMENT_TYPE, + type: type, + key: key === undefined ? null : '' + key, + ref: null, + props: props, + _owner: null, }; - - })() + } `); -helpers.asyncIterator = template(` - (function (iterable) { +helpers.asyncIterator = defineHelper(` + export default function _asyncIterator(iterable) { if (typeof Symbol === "function") { if (Symbol.asyncIterator) { var method = iterable[Symbol.asyncIterator]; @@ -73,106 +84,103 @@ helpers.asyncIterator = template(` } } throw new TypeError("Object is not async iterable"); - }) + } `); -helpers.asyncGenerator = template(` - (function () { - function AwaitValue(value) { - this.value = value; - } +helpers.asyncGenerator = defineHelper(` + function AwaitValue(value) { + this.value = value; + } - function AsyncGenerator(gen) { - var front, back; + function AsyncGenerator(gen) { + var front, back; - function send(key, arg) { - return new Promise(function (resolve, reject) { - var request = { - key: key, - arg: arg, - resolve: resolve, - reject: reject, - next: null - }; - - if (back) { - back = back.next = request; - } else { - front = back = request; - resume(key, arg); - } - }); - } - - function resume(key, arg) { - try { - var result = gen[key](arg) - var value = result.value; - if (value instanceof AwaitValue) { - Promise.resolve(value.value).then( - function (arg) { resume("next", arg); }, - function (arg) { resume("throw", arg); }); - } else { - settle(result.done ? "return" : "normal", result.value); - } - } catch (err) { - settle("throw", err); - } - } - - function settle(type, value) { - switch (type) { - case "return": - front.resolve({ value: value, done: true }); - break; - case "throw": - front.reject(value); - break; - default: - front.resolve({ value: value, done: false }); - break; - } - - front = front.next; - if (front) { - resume(front.key, front.arg); - } else { - back = null; - } - } - - this._invoke = send; - - // Hide "return" method if generator return is not supported - if (typeof gen.return !== "function") { - this.return = undefined; - } - } - - if (typeof Symbol === "function" && Symbol.asyncIterator) { - AsyncGenerator.prototype[Symbol.asyncIterator] = function () { return this; }; - } - - AsyncGenerator.prototype.next = function (arg) { return this._invoke("next", arg); }; - AsyncGenerator.prototype.throw = function (arg) { return this._invoke("throw", arg); }; - AsyncGenerator.prototype.return = function (arg) { return this._invoke("return", arg); }; - - return { - wrap: function (fn) { - return function () { - return new AsyncGenerator(fn.apply(this, arguments)); + function send(key, arg) { + return new Promise(function (resolve, reject) { + var request = { + key: key, + arg: arg, + resolve: resolve, + reject: reject, + next: null }; - }, - await: function (value) { - return new AwaitValue(value); - } - }; - })() + if (back) { + back = back.next = request; + } else { + front = back = request; + resume(key, arg); + } + }); + } + + function resume(key, arg) { + try { + var result = gen[key](arg) + var value = result.value; + if (value instanceof AwaitValue) { + Promise.resolve(value.value).then( + function (arg) { resume("next", arg); }, + function (arg) { resume("throw", arg); }); + } else { + settle(result.done ? "return" : "normal", result.value); + } + } catch (err) { + settle("throw", err); + } + } + + function settle(type, value) { + switch (type) { + case "return": + front.resolve({ value: value, done: true }); + break; + case "throw": + front.reject(value); + break; + default: + front.resolve({ value: value, done: false }); + break; + } + + front = front.next; + if (front) { + resume(front.key, front.arg); + } else { + back = null; + } + } + + this._invoke = send; + + // Hide "return" method if generator return is not supported + if (typeof gen.return !== "function") { + this.return = undefined; + } + } + + if (typeof Symbol === "function" && Symbol.asyncIterator) { + AsyncGenerator.prototype[Symbol.asyncIterator] = function () { return this; }; + } + + AsyncGenerator.prototype.next = function (arg) { return this._invoke("next", arg); }; + AsyncGenerator.prototype.throw = function (arg) { return this._invoke("throw", arg); }; + AsyncGenerator.prototype.return = function (arg) { return this._invoke("return", arg); }; + + export default { + wrap: function (fn) { + return function () { + return new AsyncGenerator(fn.apply(this, arguments)); + }; + }, + await: function (value) { + return new AwaitValue(value); + } + }; `); -helpers.asyncGeneratorDelegate = template(` - (function (inner, awaitWrap) { +helpers.asyncGeneratorDelegate = defineHelper(` + export default function _asyncGeneratorDelegate(inner, awaitWrap) { var iter = {}, waiting = false; function pump(key, value) { @@ -210,11 +218,11 @@ helpers.asyncGeneratorDelegate = template(` } return iter; - }) + } `); -helpers.asyncToGenerator = template(` - (function (fn) { +helpers.asyncToGenerator = defineHelper(` + export default function _asyncToGenerator(fn) { return function () { return new Promise((resolve, reject) => { var gen = fn.apply(this, arguments); @@ -239,39 +247,37 @@ helpers.asyncToGenerator = template(` _next(); }); }; - }) + } `); -helpers.classCallCheck = template(` - (function (instance, Constructor) { +helpers.classCallCheck = defineHelper(` + export default function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } - }); + } `); -helpers.createClass = template(` - (function() { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i ++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } +helpers.createClass = defineHelper(` + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i ++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); } + } - return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps); - if (staticProps) defineProperties(Constructor, staticProps); - return Constructor; - }; - })() + export default function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } `); -helpers.defineEnumerableProperties = template(` - (function (obj, descs) { +helpers.defineEnumerableProperties = defineHelper(` + export default function _defineEnumerableProperties(obj, descs) { for (var key in descs) { var desc = descs[key]; desc.configurable = desc.enumerable = true; @@ -293,11 +299,11 @@ helpers.defineEnumerableProperties = template(` } } return obj; - }) + } `); -helpers.defaults = template(` - (function (obj, defaults) { +helpers.defaults = defineHelper(` + export default function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; @@ -307,11 +313,11 @@ helpers.defaults = template(` } } return obj; - }) + } `); -helpers.defineProperty = template(` - (function (obj, key, value) { +helpers.defineProperty = defineHelper(` + export default function _defineProperty(obj, key, value) { // Shortcircuit the slow defineProperty path when possible. // We are trying to avoid issues where setters defined on the // prototype cause side effects under the fast path of simple @@ -328,25 +334,29 @@ helpers.defineProperty = template(` obj[key] = value; } return obj; - }); + } `); -helpers.extends = template(` - Object.assign || (function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; +helpers.extends = defineHelper(` + export default function _extends() { + _extends = Object.assign || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } } } - } - return target; - }) + return target; + }; + + return _extends.apply(this, arguments); + } `); -helpers.get = template(` - (function get(object, property, receiver) { +helpers.get = defineHelper(` + export default function _get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); @@ -357,7 +367,7 @@ helpers.get = template(` if (parent === null) { return undefined; } else { - return get(parent, property, receiver); + return _get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; @@ -370,11 +380,11 @@ helpers.get = template(` return getter.call(receiver); } - }); + } `); -helpers.inherits = template(` - (function (subClass, superClass) { +helpers.inherits = defineHelper(` + export default function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } @@ -387,35 +397,35 @@ helpers.inherits = template(` } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; - }) + } `); -helpers.inheritsLoose = template(` - (function (subClass, superClass) { +helpers.inheritsLoose = defineHelper(` + export default function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; - }) + } `); -helpers.instanceof = template(` - (function (left, right) { +helpers.instanceof = defineHelper(` + export default function _instanceof(left, right) { if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) { return right[Symbol.hasInstance](left); } else { return left instanceof right; } - }); + } `); -helpers.interopRequireDefault = template(` - (function (obj) { +helpers.interopRequireDefault = defineHelper(` + export default function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; - }) + } `); -helpers.interopRequireWildcard = template(` - (function (obj) { +helpers.interopRequireWildcard = defineHelper(` + export default function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { @@ -428,25 +438,25 @@ helpers.interopRequireWildcard = template(` newObj.default = obj; return newObj; } - }) + } `); -helpers.newArrowCheck = template(` - (function (innerThis, boundThis) { +helpers.newArrowCheck = defineHelper(` + export default function _newArrowCheck(innerThis, boundThis) { if (innerThis !== boundThis) { throw new TypeError("Cannot instantiate an arrow function"); } - }); + } `); -helpers.objectDestructuringEmpty = template(` - (function (obj) { +helpers.objectDestructuringEmpty = defineHelper(` + export default function _objectDestructuringEmpty(obj) { if (obj == null) throw new TypeError("Cannot destructure undefined"); - }); + } `); -helpers.objectWithoutProperties = template(` - (function (source, excluded) { +helpers.objectWithoutProperties = defineHelper(` + export default function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = {}; @@ -470,11 +480,11 @@ helpers.objectWithoutProperties = template(` } return target; - }) + } `); -helpers.possibleConstructorReturn = template(` - (function (self, call) { +helpers.possibleConstructorReturn = defineHelper(` + export default function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } @@ -482,22 +492,18 @@ helpers.possibleConstructorReturn = template(` throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; - }); + } `); -helpers.selfGlobal = template(` - typeof global === "undefined" ? self : global -`); - -helpers.set = template(` - (function set(object, property, value, receiver) { +helpers.set = defineHelper(` + export default function _set(object, property, value, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent !== null) { - set(parent, property, value, receiver); + _set(parent, property, value, receiver); } } else if ("value" in desc && desc.writable) { desc.value = value; @@ -510,60 +516,58 @@ helpers.set = template(` } return value; - }); + } `); -helpers.slicedToArray = template(` - (function () { - // Broken out into a separate function to avoid deoptimizations due to the try/catch for the - // array iterator case. - function sliceIterator(arr, i) { - // this is an expanded form of \`for...of\` that properly supports abrupt completions of - // iterators etc. variable names have been minimised to reduce the size of this massive - // helper. sometimes spec compliancy is annoying :( - // - // _n = _iteratorNormalCompletion - // _d = _didIteratorError - // _e = _iteratorError - // _i = _iterator - // _s = _step +helpers.slicedToArray = defineHelper(` + // Broken out into a separate function to avoid deoptimizations due to the try/catch for the + // array iterator case. + function _sliceIterator(arr, i) { + // this is an expanded form of \`for...of\` that properly supports abrupt completions of + // iterators etc. variable names have been minimised to reduce the size of this massive + // helper. sometimes spec compliancy is annoying :( + // + // _n = _iteratorNormalCompletion + // _d = _didIteratorError + // _e = _iteratorError + // _i = _iterator + // _s = _step - var _arr = []; - var _n = true; - var _d = false; - var _e = undefined; + var _arr = []; + var _n = true; + var _d = false; + var _e = undefined; + try { + for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { try { - for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; + if (!_n && _i["return"] != null) _i["return"](); } finally { - try { - if (!_n && _i["return"] != null) _i["return"](); - } finally { - if (_d) throw _e; - } + if (_d) throw _e; } - return _arr; } + return _arr; + } - return function (arr, i) { - if (Array.isArray(arr)) { - return arr; - } else if (Symbol.iterator in Object(arr)) { - return sliceIterator(arr, i); - } else { - throw new TypeError("Invalid attempt to destructure non-iterable instance"); - } - }; - })(); + export default function _slicedToArray(arr, i) { + if (Array.isArray(arr)) { + return arr; + } else if (Symbol.iterator in Object(arr)) { + return _sliceIterator(arr, i); + } else { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + } + } `); -helpers.slicedToArrayLoose = template(` - (function (arr, i) { +helpers.slicedToArrayLoose = defineHelper(` + export default function _slicedToArrayLoose(arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { @@ -576,71 +580,71 @@ helpers.slicedToArrayLoose = template(` } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } - }); + } `); -helpers.taggedTemplateLiteral = template(` - (function (strings, raw) { +helpers.taggedTemplateLiteral = defineHelper(` + export default function _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); - }); + } `); -helpers.taggedTemplateLiteralLoose = template(` - (function (strings, raw) { +helpers.taggedTemplateLiteralLoose = defineHelper(` + export default function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; - }); + } `); -helpers.temporalRef = template(` - (function (val, name, undef) { +helpers.temporalRef = defineHelper(` + export default function _temporalRef(val, name, undef) { if (val === undef) { throw new ReferenceError(name + " is not defined - temporal dead zone"); } else { return val; } - }) + } `); -helpers.temporalUndefined = template(` - ({}) +helpers.temporalUndefined = defineHelper(` + export default {}; `); -helpers.toArray = template(` - (function (arr) { +helpers.toArray = defineHelper(` + export default function _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); - }); + } `); -helpers.toConsumableArray = template(` - (function (arr) { +helpers.toConsumableArray = defineHelper(` + export default function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } - }); + } `); -helpers.skipFirstGeneratorNext = template(` - (function (fn) { +helpers.skipFirstGeneratorNext = defineHelper(` + export default function _skipFirstGeneratorNext(fn) { return function () { var it = fn.apply(this, arguments); it.next(); return it; } - }); + } `); -helpers.toPropertyKey = template(` - (function (key) { +helpers.toPropertyKey = defineHelper(` + export default function _toPropertyKey(key) { if (typeof key === "symbol") { return key; } else { return String(key); } - }); + } `); diff --git a/packages/babel-helpers/src/index.js b/packages/babel-helpers/src/index.js index 58dc5e85aa..dbde7a6b95 100644 --- a/packages/babel-helpers/src/index.js +++ b/packages/babel-helpers/src/index.js @@ -1,10 +1,202 @@ +import traverse from "babel-traverse"; +import * as t from "babel-types"; import helpers from "./helpers"; -export function get(name) { - const fn = helpers[name]; - if (!fn) throw new ReferenceError(`Unknown helper ${name}`); +function makePath(path) { + const parts = []; - return fn().expression; + for (; path.parentPath; path = path.parentPath) { + parts.push(path.key); + if (path.inList) parts.push(path.listKey); + } + + return parts.reverse().join("."); +} + +/** + * Given a file AST for a given helper, get a bunch of metadata about it so that Babel can quickly render + * the helper is whatever context it is needed in. + */ +function getHelperMetadata(file) { + const localBindingNames = new Set(); + + let exportName; + let exportPath; + const exportBindingAssignments = []; + + traverse(file, { + ImportDeclaration(child) { + throw child.buildCodeFrameError("Helpers may import anything."); + }, + ExportDefaultDeclaration(child) { + const decl = child.get("declaration"); + + if (decl.isFunctionDeclaration()) { + if (!decl.node.id) { + throw decl.buildCodeFrameError( + "Helpers should give names to their exported func declaration", + ); + } + + exportName = decl.node.id.name; + } + exportPath = makePath(child); + }, + ExportAllDeclaration(child) { + throw child.buildCodeFrameError("Helpers can only export default"); + }, + ExportNamedDeclaration(child) { + throw child.buildCodeFrameError("Helpers can only export default"); + }, + Statement(child) { + if (child.isModuleDeclaration()) return; + + child.skip(); + }, + }); + + traverse(file, { + Program(path) { + const bindings = path.scope.getAllBindings(); + + Object.keys(bindings).forEach(name => { + if (name === exportName) return; + + localBindingNames.add(name); + }); + }, + AssignmentExpression(child) { + const left = child.get("left"); + + if (!(exportName in left.getBindingIdentifiers())) return; + + if (!left.isIdentifier()) { + throw left.buildCodeFrameError( + "Only simple assignments to exports are allowed in helpers", + ); + } + + const binding = child.scope.getBinding(exportName); + + if (binding && binding.scope.path.isProgram()) { + exportBindingAssignments.push(makePath(child)); + } + }, + }); + + if (!exportPath) throw new Error("Helpers must default-export something."); + + // Process these in reverse so that mutating the references does not invalidate any later paths in + // the list. + exportBindingAssignments.reverse(); + + return { + localBindingNames: Array.from(localBindingNames), + exportBindingAssignments, + exportPath, + exportName, + }; +} + +/** + * Given a helper AST and information about how it will be used, update the AST to match the usage. + */ +function permuteHelperAST(file, metadata, id, localBindings) { + if (localBindings && !id) { + throw new Error("Unexpected local bindings for module-based helpers."); + } + + if (!id) return; + + const { + localBindingNames, + exportBindingAssignments, + exportPath, + exportName, + } = metadata; + + const toRename = {}; + const bindings = new Set(localBindings || []); + localBindingNames.forEach(name => { + let newName = name; + while (bindings.has(newName)) newName = "_" + newName; + + if (newName !== name) toRename[name] = newName; + }); + + if (id.type === "Identifier" && exportName !== id.name) { + toRename[exportName] = id.name; + } + + traverse(file, { + Program(path) { + const exp = path.get(exportPath); + const decl = exp.get("declaration"); + if (id.type === "Identifier") { + if (decl.isFunctionDeclaration()) { + exp.replaceWith(decl); + } else { + exp.replaceWith( + t.variableDeclaration("var", [t.variableDeclarator(id, decl.node)]), + ); + } + } else if (id.type === "MemberExpression") { + if (decl.isFunctionDeclaration()) { + exportBindingAssignments.forEach(assignPath => { + const assign = path.get(assignPath); + assign.replaceWith(t.assignmentExpression("=", id, assign.node)); + }); + exp.replaceWith(decl); + path.pushContainer( + "body", + t.assignmentExpression("=", id, t.identifier(exportName)), + ); + } else { + exp.replaceWith(t.assignmentExpression("=", id, decl.node)); + } + } else { + throw new Error("Unexpected helper format."); + } + + Object.keys(toRename).forEach(name => { + path.scope.rename(name, toRename[name]); + }); + + // We only use "traverse" for all the handy scoping helpers, so we can stop immediately without + // actually doing the traversal. + path.stop(); + }, + }); +} + +const helperData = {}; +function loadHelper(name) { + if (!helperData[name]) { + if (!helpers[name]) throw new ReferenceError(`Unknown helper ${name}`); + + const fn = () => { + const ast = helpers[name](); + return t.file(t.program(Array.isArray(ast) ? ast : [ast])); + }; + + const metadata = getHelperMetadata(fn()); + + helperData[name] = function(id, localBindings) { + const file = fn(); + permuteHelperAST(file, metadata, id, localBindings); + + return { + nodes: file.program.body, + }; + }; + } + + return helperData[name]; +} + +export function get(name, id?, localBindings?: Array) { + const helper = loadHelper(name); + return helper(id, localBindings); } export const list = Object.keys(helpers) diff --git a/packages/babel-plugin-transform-class-properties/test/fixtures/regression/6154/expected.js b/packages/babel-plugin-transform-class-properties/test/fixtures/regression/6154/expected.js index 7e0fda36df..d5eee7869c 100644 --- a/packages/babel-plugin-transform-class-properties/test/fixtures/regression/6154/expected.js +++ b/packages/babel-plugin-transform-class-properties/test/fixtures/regression/6154/expected.js @@ -1,8 +1,6 @@ "use strict"; -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } @@ -10,6 +8,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return _get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } + var Test = function Test() { var _this2 = this; diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T7537/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T7537/expected.js index 8ea99e3b89..408af2ccbc 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T7537/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T7537/expected.js @@ -1,6 +1,6 @@ "use strict"; -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/regression/T7199/expected.js b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/regression/T7199/expected.js index 1178539e40..47c9568251 100644 --- a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/regression/T7199/expected.js +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/regression/T7199/expected.js @@ -2,10 +2,12 @@ var _foo = _interopRequireDefault(require("foo")); -var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } +function _sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function _slicedToArray(arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return _sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } } + const _bar = bar, _bar2 = _slicedToArray(_bar, 1), x = _bar2[0]; diff --git a/packages/babel-plugin-transform-es2015-object-super/test/fixtures/object-super/super-exponentiation/expected.js b/packages/babel-plugin-transform-es2015-object-super/test/fixtures/object-super/super-exponentiation/expected.js index 72b1fd1302..574f0873de 100644 --- a/packages/babel-plugin-transform-es2015-object-super/test/fixtures/object-super/super-exponentiation/expected.js +++ b/packages/babel-plugin-transform-es2015-object-super/test/fixtures/object-super/super-exponentiation/expected.js @@ -1,8 +1,8 @@ var _obj; -var _set = function set(object, property, value, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent !== null) { set(parent, property, value, receiver); } } else if ("value" in desc && desc.writable) { desc.value = value; } else { var setter = desc.set; if (setter !== undefined) { setter.call(receiver, value); } } return value; }; +function _set(object, property, value, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent !== null) { _set(parent, property, value, receiver); } } else if ("value" in desc && desc.writable) { desc.value = value; } else { var setter = desc.set; if (setter !== undefined) { setter.call(receiver, value); } } return value; } -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; +function _get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return _get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } foo = _obj = { bar: function () { diff --git a/packages/babel-plugin-transform-es2015-parameters/test/fixtures/regression/6057-expanded/expected.js b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/regression/6057-expanded/expected.js index 9da87d567f..449084ade2 100644 --- a/packages/babel-plugin-transform-es2015-parameters/test/fixtures/regression/6057-expanded/expected.js +++ b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/regression/6057-expanded/expected.js @@ -7,14 +7,16 @@ exports.default = void 0; var _args = _interopRequireDefault(require("utils/url/args")); -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } diff --git a/packages/babel-plugin-transform-es2015-typeof-symbol/src/index.js b/packages/babel-plugin-transform-es2015-typeof-symbol/src/index.js index 2a10a7de5b..9c6a3d1d2a 100644 --- a/packages/babel-plugin-transform-es2015-typeof-symbol/src/index.js +++ b/packages/babel-plugin-transform-es2015-typeof-symbol/src/index.js @@ -31,7 +31,10 @@ export default function({ types: t }) { const helper = this.addHelper("typeof"); const isUnderHelper = path.findParent(path => { - return path.isVariableDeclarator() && path.node.id === helper; + return ( + (path.isVariableDeclarator() && path.node.id === helper) || + (path.isFunctionDeclaration() && path.node.id.name === helper.name) + ); }); if (isUnderHelper) { diff --git a/packages/babel-plugin-transform-es2015-typeof-symbol/test/fixtures/symbols/shadow/expected.js b/packages/babel-plugin-transform-es2015-typeof-symbol/test/fixtures/symbols/shadow/expected.js index 542bc331f8..fc5cee7b35 100644 --- a/packages/babel-plugin-transform-es2015-typeof-symbol/test/fixtures/symbols/shadow/expected.js +++ b/packages/babel-plugin-transform-es2015-typeof-symbol/test/fixtures/symbols/shadow/expected.js @@ -1,4 +1,4 @@ -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function (obj) { return typeof obj; }; } else { _typeof = function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } var _Symbol = foo(); diff --git a/packages/babel-plugin-transform-exponentiation-operator/test/fixtures/regression/4349/expected.js b/packages/babel-plugin-transform-exponentiation-operator/test/fixtures/regression/4349/expected.js index 7087bc7de1..c2e50b70ee 100644 --- a/packages/babel-plugin-transform-exponentiation-operator/test/fixtures/regression/4349/expected.js +++ b/packages/babel-plugin-transform-exponentiation-operator/test/fixtures/regression/4349/expected.js @@ -1,8 +1,8 @@ var _obj; -var _set = function set(object, property, value, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent !== null) { set(parent, property, value, receiver); } } else if ("value" in desc && desc.writable) { desc.value = value; } else { var setter = desc.set; if (setter !== undefined) { setter.call(receiver, value); } } return value; }; +function _set(object, property, value, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent !== null) { _set(parent, property, value, receiver); } } else if ("value" in desc && desc.writable) { desc.value = value; } else { var setter = desc.set; if (setter !== undefined) { setter.call(receiver, value); } } return value; } -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; +function _get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return _get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } foo = _obj = { bar() { diff --git a/packages/babel-plugin-transform-function-bind/test/fixtures/regression/T6984/expected.js b/packages/babel-plugin-transform-function-bind/test/fixtures/regression/T6984/expected.js index 1564466f4d..2d5326366b 100644 --- a/packages/babel-plugin-transform-function-bind/test/fixtures/regression/T6984/expected.js +++ b/packages/babel-plugin-transform-function-bind/test/fixtures/regression/T6984/expected.js @@ -1,7 +1,9 @@ -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + function _one() {} function _two() {} diff --git a/packages/babel-plugin-transform-function-sent/test/fixtures/generator-kinds/async-generator/expected.js b/packages/babel-plugin-transform-function-sent/test/fixtures/generator-kinds/async-generator/expected.js index e413b12d51..5e11a85a1f 100644 --- a/packages/babel-plugin-transform-function-sent/test/fixtures/generator-kinds/async-generator/expected.js +++ b/packages/babel-plugin-transform-function-sent/test/fixtures/generator-kinds/async-generator/expected.js @@ -1,5 +1,3 @@ -var _asyncGenerator = function () { function AwaitValue(value) { this.value = value; } function AsyncGenerator(gen) { var front, back; function send(key, arg) { return new Promise(function (resolve, reject) { var request = { key: key, arg: arg, resolve: resolve, reject: reject, next: null }; if (back) { back = back.next = request; } else { front = back = request; resume(key, arg); } }); } function resume(key, arg) { try { var result = gen[key](arg); var value = result.value; if (value instanceof AwaitValue) { Promise.resolve(value.value).then(function (arg) { resume("next", arg); }, function (arg) { resume("throw", arg); }); } else { settle(result.done ? "return" : "normal", result.value); } } catch (err) { settle("throw", err); } } function settle(type, value) { switch (type) { case "return": front.resolve({ value: value, done: true }); break; case "throw": front.reject(value); break; default: front.resolve({ value: value, done: false }); break; } front = front.next; if (front) { resume(front.key, front.arg); } else { back = null; } } this._invoke = send; if (typeof gen.return !== "function") { this.return = undefined; } } if (typeof Symbol === "function" && Symbol.asyncIterator) { AsyncGenerator.prototype[Symbol.asyncIterator] = function () { return this; }; } AsyncGenerator.prototype.next = function (arg) { return this._invoke("next", arg); }; AsyncGenerator.prototype.throw = function (arg) { return this._invoke("throw", arg); }; AsyncGenerator.prototype.return = function (arg) { return this._invoke("return", arg); }; return { wrap: function (fn) { return function () { return new AsyncGenerator(fn.apply(this, arguments)); }; }, await: function (value) { return new AwaitValue(value); } }; }(); - let foo = (() => { var _ref = _asyncGenerator.wrap(_skipFirstGeneratorNext(function* () { let _functionSent = yield; @@ -13,3 +11,17 @@ let foo = (() => { })(); function _skipFirstGeneratorNext(fn) { return function () { var it = fn.apply(this, arguments); it.next(); return it; }; } + +function AwaitValue(value) { this.value = value; } + +function AsyncGenerator(gen) { var front, back; function send(key, arg) { return new Promise(function (resolve, reject) { var request = { key: key, arg: arg, resolve: resolve, reject: reject, next: null }; if (back) { back = back.next = request; } else { front = back = request; resume(key, arg); } }); } function resume(key, arg) { try { var result = gen[key](arg); var value = result.value; if (value instanceof AwaitValue) { Promise.resolve(value.value).then(function (arg) { resume("next", arg); }, function (arg) { resume("throw", arg); }); } else { settle(result.done ? "return" : "normal", result.value); } } catch (err) { settle("throw", err); } } function settle(type, value) { switch (type) { case "return": front.resolve({ value: value, done: true }); break; case "throw": front.reject(value); break; default: front.resolve({ value: value, done: false }); break; } front = front.next; if (front) { resume(front.key, front.arg); } else { back = null; } } this._invoke = send; if (typeof gen.return !== "function") { this.return = undefined; } } + +if (typeof Symbol === "function" && Symbol.asyncIterator) { AsyncGenerator.prototype[Symbol.asyncIterator] = function () { return this; }; } + +AsyncGenerator.prototype.next = function (arg) { return this._invoke("next", arg); }; + +AsyncGenerator.prototype.throw = function (arg) { return this._invoke("throw", arg); }; + +AsyncGenerator.prototype.return = function (arg) { return this._invoke("return", arg); }; + +var _asyncGenerator = { wrap: function (fn) { return function () { return new AsyncGenerator(fn.apply(this, arguments)); }; }, await: function (value) { return new AwaitValue(value); } }; diff --git a/packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-spread/assignment/expected.js b/packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-spread/assignment/expected.js index 9ce8f96e82..b5926abf94 100644 --- a/packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-spread/assignment/expected.js +++ b/packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-spread/assignment/expected.js @@ -1,4 +1,4 @@ -var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; +function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } z = _extends({ x diff --git a/packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-spread/expression/expected.js b/packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-spread/expression/expected.js index d88737de75..5d69448744 100644 --- a/packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-spread/expression/expected.js +++ b/packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-spread/expression/expected.js @@ -1,4 +1,4 @@ -var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; +function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } _extends({ x diff --git a/packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-spread/variable-declaration/expected.js b/packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-spread/variable-declaration/expected.js index da081be7b7..73be92643e 100644 --- a/packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-spread/variable-declaration/expected.js +++ b/packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-spread/variable-declaration/expected.js @@ -1,3 +1,3 @@ -var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; +function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } var z = _extends({}, x); diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/inline-elements/expected.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/inline-elements/expected.js index 433bd99101..016d9a8f0d 100644 --- a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/inline-elements/expected.js +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/inline-elements/expected.js @@ -1,4 +1,6 @@ -var _jsx = function () { var REACT_ELEMENT_TYPE = typeof Symbol === "function" && Symbol.for && Symbol.for("react.element") || 0xeac7; return function createRawReactElement(type, props, key, children) { var defaultProps = type && type.defaultProps; var childrenLength = arguments.length - 3; if (!props && childrenLength !== 0) { props = {}; } if (props && defaultProps) { for (var propName in defaultProps) { if (props[propName] === void 0) { props[propName] = defaultProps[propName]; } } } else if (!props) { props = defaultProps || {}; } if (childrenLength === 1) { props.children = children; } else if (childrenLength > 1) { var childArray = Array(childrenLength); for (var i = 0; i < childrenLength; i++) { childArray[i] = arguments[i + 3]; } props.children = childArray; } return { $$typeof: REACT_ELEMENT_TYPE, type: type, key: key === undefined ? null : '' + key, ref: null, props: props, _owner: null }; }; }(); +var REACT_ELEMENT_TYPE; + +function _jsx(type, props, key, children) { if (!REACT_ELEMENT_TYPE) { REACT_ELEMENT_TYPE = typeof Symbol === "function" && Symbol.for && Symbol.for("react.element") || 0xeac7; } var defaultProps = type && type.defaultProps; var childrenLength = arguments.length - 3; if (!props && childrenLength !== 0) { props = {}; } if (props && defaultProps) { for (var propName in defaultProps) { if (props[propName] === void 0) { props[propName] = defaultProps[propName]; } } } else if (!props) { props = defaultProps || {}; } if (childrenLength === 1) { props.children = children; } else if (childrenLength > 1) { var childArray = Array(childrenLength); for (var i = 0; i < childrenLength; i++) { childArray[i] = arguments[i + 3]; } props.children = childArray; } return { $$typeof: REACT_ELEMENT_TYPE, type: type, key: key === undefined ? null : '' + key, ref: null, props: props, _owner: null }; } var _ref = _jsx("foo", {}); diff --git a/packages/babel-runtime/helpers/builtin/es6/toArray.js b/packages/babel-runtime/helpers/builtin/es6/toArray.js index 74e53155b9..5443502a98 100644 --- a/packages/babel-runtime/helpers/builtin/es6/toArray.js +++ b/packages/babel-runtime/helpers/builtin/es6/toArray.js @@ -1,3 +1,3 @@ -export default function (arr) { +export default function _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); } \ No newline at end of file diff --git a/packages/babel-runtime/helpers/builtin/toArray.js b/packages/babel-runtime/helpers/builtin/toArray.js index 3fb92a065b..96df336ff8 100644 --- a/packages/babel-runtime/helpers/builtin/toArray.js +++ b/packages/babel-runtime/helpers/builtin/toArray.js @@ -1,6 +1,6 @@ exports.__esModule = true; -exports.default = _default; +exports.default = _toArray; -function _default(arr) { +function _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); } \ No newline at end of file diff --git a/packages/babel-runtime/helpers/es6/toArray.js b/packages/babel-runtime/helpers/es6/toArray.js index 8aa5479738..e14a0feb30 100644 --- a/packages/babel-runtime/helpers/es6/toArray.js +++ b/packages/babel-runtime/helpers/es6/toArray.js @@ -1,4 +1,4 @@ import _Array$from from "../../core-js/array/from"; -export default function (arr) { +export default function _toArray(arr) { return Array.isArray(arr) ? arr : _Array$from(arr); } \ No newline at end of file diff --git a/packages/babel-runtime/helpers/toArray.js b/packages/babel-runtime/helpers/toArray.js index fd0d1228cf..8b61c3a119 100644 --- a/packages/babel-runtime/helpers/toArray.js +++ b/packages/babel-runtime/helpers/toArray.js @@ -1,10 +1,10 @@ exports.__esModule = true; -exports.default = _default; +exports.default = _toArray; var _from = _interopRequireDefault(require("../core-js/array/from")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -function _default(arr) { +function _toArray(arr) { return Array.isArray(arr) ? arr : (0, _from.default)(arr); } \ No newline at end of file diff --git a/packages/babel-runtime/scripts/build-dist.js b/packages/babel-runtime/scripts/build-dist.js index 52b4d38f3c..54c419842f 100644 --- a/packages/babel-runtime/scripts/build-dist.js +++ b/packages/babel-runtime/scripts/build-dist.js @@ -104,12 +104,7 @@ function buildRuntimeRewritePlugin(relativePath, helperName) { } function buildHelper(helperName, modules, useBuiltIns) { - const helper = helpers.get(helperName); - // avoid an unneccessary TDZ in the easy case - if (helper.type === "FunctionExpression") { - helper.type = "FunctionDeclaration"; - } - const tree = t.program([t.exportDefaultDeclaration(helper)]); + const tree = t.program(helpers.get(helperName).nodes); const transformOpts = makeTransformOpts(modules, useBuiltIns);