From dffcef785a16d8e2f32445632213322ccc868db6 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Fri, 1 Dec 2017 17:11:11 -0800 Subject: [PATCH] Lazy-initialize helper templates. --- packages/babel-helpers/src/helpers.js | 180 +++++++++++++------------- 1 file changed, 88 insertions(+), 92 deletions(-) diff --git a/packages/babel-helpers/src/helpers.js b/packages/babel-helpers/src/helpers.js index 8cfabc8f64..8b89f2e55d 100644 --- a/packages/babel-helpers/src/helpers.js +++ b/packages/babel-helpers/src/helpers.js @@ -5,11 +5,7 @@ import template from "@babel/template"; const helpers = {}; export default helpers; -// Helpers never include placeholders, so we disable placeholder pattern -// matching to allow us to use pattern-like variable names. -const defineHelper = template.program({ placeholderPattern: false }); - -helpers.typeof = defineHelper(` +helpers.typeof = () => template.program.ast` export default function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function (obj) { return typeof obj; }; @@ -23,9 +19,9 @@ helpers.typeof = defineHelper(` return _typeof(obj); } -`); +`; -helpers.jsx = defineHelper(` +helpers.jsx = () => template.program.ast` var REACT_ELEMENT_TYPE; export default function _createRawReactElement(type, props, key, children) { @@ -72,9 +68,9 @@ helpers.jsx = defineHelper(` _owner: null, }; } -`); +`; -helpers.asyncIterator = defineHelper(` +helpers.asyncIterator = () => template.program.ast` export default function _asyncIterator(iterable) { if (typeof Symbol === "function") { if (Symbol.asyncIterator) { @@ -87,15 +83,15 @@ helpers.asyncIterator = defineHelper(` } throw new TypeError("Object is not async iterable"); } -`); +`; -helpers.AwaitValue = defineHelper(` +helpers.AwaitValue = () => template.program.ast` export default function _AwaitValue(value) { this.wrapped = value; } -`); +`; -helpers.AsyncGenerator = defineHelper(` +helpers.AsyncGenerator = () => template.program.ast` import AwaitValue from "AwaitValue"; export default function AsyncGenerator(gen) { @@ -177,9 +173,9 @@ helpers.AsyncGenerator = defineHelper(` 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); }; -`); +`; -helpers.wrapAsyncGenerator = defineHelper(` +helpers.wrapAsyncGenerator = () => template.program.ast` import AsyncGenerator from "AsyncGenerator"; export default function _wrapAsyncGenerator(fn) { @@ -187,17 +183,17 @@ helpers.wrapAsyncGenerator = defineHelper(` return new AsyncGenerator(fn.apply(this, arguments)); }; } -`); +`; -helpers.awaitAsyncGenerator = defineHelper(` +helpers.awaitAsyncGenerator = () => template.program.ast` import AwaitValue from "AwaitValue"; export default function _awaitAsyncGenerator(value) { return new AwaitValue(value); } -`); +`; -helpers.asyncGeneratorDelegate = defineHelper(` +helpers.asyncGeneratorDelegate = () => template.program.ast` export default function _asyncGeneratorDelegate(inner, awaitWrap) { var iter = {}, waiting = false; @@ -237,9 +233,9 @@ helpers.asyncGeneratorDelegate = defineHelper(` return iter; } -`); +`; -helpers.asyncToGenerator = defineHelper(` +helpers.asyncToGenerator = () => template.program.ast` export default function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; @@ -267,17 +263,17 @@ helpers.asyncToGenerator = defineHelper(` }); }; } -`); +`; -helpers.classCallCheck = defineHelper(` +helpers.classCallCheck = () => template.program.ast` export default function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -`); +`; -helpers.createClass = defineHelper(` +helpers.createClass = () => template.program.ast` function _defineProperties(target, props) { for (var i = 0; i < props.length; i ++) { var descriptor = props[i]; @@ -293,9 +289,9 @@ helpers.createClass = defineHelper(` if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } -`); +`; -helpers.defineEnumerableProperties = defineHelper(` +helpers.defineEnumerableProperties = () => template.program.ast` export default function _defineEnumerableProperties(obj, descs) { for (var key in descs) { var desc = descs[key]; @@ -319,9 +315,9 @@ helpers.defineEnumerableProperties = defineHelper(` } return obj; } -`); +`; -helpers.defaults = defineHelper(` +helpers.defaults = () => template.program.ast` export default function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { @@ -333,9 +329,9 @@ helpers.defaults = defineHelper(` } return obj; } -`); +`; -helpers.defineProperty = defineHelper(` +helpers.defineProperty = () => template.program.ast` 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 @@ -354,9 +350,9 @@ helpers.defineProperty = defineHelper(` } return obj; } -`); +`; -helpers.extends = defineHelper(` +helpers.extends = () => template.program.ast` export default function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { @@ -372,9 +368,9 @@ helpers.extends = defineHelper(` return _extends.apply(this, arguments); } -`); +`; -helpers.objectSpread = defineHelper(` +helpers.objectSpread = () => template.program.ast` import defineProperty from "defineProperty"; export default function _objectSpread(target) { @@ -392,9 +388,9 @@ helpers.objectSpread = defineHelper(` } return target; } -`); +`; -helpers.get = defineHelper(` +helpers.get = () => template.program.ast` export default function _get(object, property, receiver) { if (object === null) object = Function.prototype; @@ -420,9 +416,9 @@ helpers.get = defineHelper(` return getter.call(receiver); } } -`); +`; -helpers.inherits = defineHelper(` +helpers.inherits = () => template.program.ast` export default function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); @@ -437,18 +433,18 @@ helpers.inherits = defineHelper(` }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -`); +`; -helpers.inheritsLoose = defineHelper(` +helpers.inheritsLoose = () => template.program.ast` export default function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } -`); +`; // Based on https://github.com/WebReflection/babel-plugin-transform-builtin-classes -helpers.wrapNativeSuper = defineHelper(` +helpers.wrapNativeSuper = () => template.program.ast` var _gPO = Object.getPrototypeOf || function _gPO(o) { return o.__proto__ }; var _sPO = Object.setPrototypeOf || function _sPO(o, p) { o.__proto__ = p; return o }; var _construct = (typeof Reflect === "object" && Reflect.construct) || @@ -490,9 +486,9 @@ helpers.wrapNativeSuper = defineHelper(` ) ); } -`); +`; -helpers.instanceof = defineHelper(` +helpers.instanceof = () => template.program.ast` export default function _instanceof(left, right) { if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) { return right[Symbol.hasInstance](left); @@ -500,15 +496,15 @@ helpers.instanceof = defineHelper(` return left instanceof right; } } -`); +`; -helpers.interopRequireDefault = defineHelper(` +helpers.interopRequireDefault = () => template.program.ast` export default function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -`); +`; -helpers.interopRequireWildcard = defineHelper(` +helpers.interopRequireWildcard = () => template.program.ast` export default function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; @@ -532,23 +528,23 @@ helpers.interopRequireWildcard = defineHelper(` return newObj; } } -`); +`; -helpers.newArrowCheck = defineHelper(` +helpers.newArrowCheck = () => template.program.ast` export default function _newArrowCheck(innerThis, boundThis) { if (innerThis !== boundThis) { throw new TypeError("Cannot instantiate an arrow function"); } } -`); +`; -helpers.objectDestructuringEmpty = defineHelper(` +helpers.objectDestructuringEmpty = () => template.program.ast` export default function _objectDestructuringEmpty(obj) { if (obj == null) throw new TypeError("Cannot destructure undefined"); } -`); +`; -helpers.objectWithoutProperties = defineHelper(` +helpers.objectWithoutProperties = () => template.program.ast` export default function _objectWithoutProperties(source, excluded) { if (source == null) return {}; @@ -574,18 +570,18 @@ helpers.objectWithoutProperties = defineHelper(` return target; } -`); +`; -helpers.assertThisInitialized = defineHelper(` +helpers.assertThisInitialized = () => template.program.ast` export default function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } -`); +`; -helpers.possibleConstructorReturn = defineHelper(` +helpers.possibleConstructorReturn = () => template.program.ast` export default function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; @@ -598,9 +594,9 @@ helpers.possibleConstructorReturn = defineHelper(` } return self; } -`); +`; -helpers.set = defineHelper(` +helpers.set = () => template.program.ast` export default function _set(object, property, value, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); @@ -622,9 +618,9 @@ helpers.set = defineHelper(` return value; } -`); +`; -helpers.slicedToArray = defineHelper(` +helpers.slicedToArray = () => template.program.ast` // Broken out into a separate function to avoid deoptimizations due to the try/catch for the // array iterator case. function _sliceIterator(arr, i) { @@ -669,9 +665,9 @@ helpers.slicedToArray = defineHelper(` throw new TypeError("Invalid attempt to destructure non-iterable instance"); } } -`); +`; -helpers.slicedToArrayLoose = defineHelper(` +helpers.slicedToArrayLoose = () => template.program.ast` export default function _slicedToArrayLoose(arr, i) { if (Array.isArray(arr)) { return arr; @@ -686,26 +682,26 @@ helpers.slicedToArrayLoose = defineHelper(` throw new TypeError("Invalid attempt to destructure non-iterable instance"); } } -`); +`; -helpers.taggedTemplateLiteral = defineHelper(` +helpers.taggedTemplateLiteral = () => template.program.ast` export default function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); } -`); +`; -helpers.taggedTemplateLiteralLoose = defineHelper(` +helpers.taggedTemplateLiteralLoose = () => template.program.ast` export default function _taggedTemplateLiteralLoose(strings, raw) { if (!raw) { raw = strings.slice(0); } strings.raw = raw; return strings; } -`); +`; -helpers.temporalRef = defineHelper(` +helpers.temporalRef = () => template.program.ast` import undef from "temporalUndefined"; export default function _temporalRef(val, name) { @@ -715,31 +711,31 @@ helpers.temporalRef = defineHelper(` return val; } } -`); +`; -helpers.readOnlyError = defineHelper(` +helpers.readOnlyError = () => template.program.ast` export default function _readOnlyError(name) { throw new Error("\\"" + name + "\\" is read-only"); } -`); +`; -helpers.classNameTDZError = defineHelper(` +helpers.classNameTDZError = () => template.program.ast` export default function _classNameTDZError(name) { throw new Error("Class \\"" + name + "\\" cannot be referenced in computed property keys."); } -`); +`; -helpers.temporalUndefined = defineHelper(` +helpers.temporalUndefined = () => template.program.ast` export default {}; -`); +`; -helpers.toArray = defineHelper(` +helpers.toArray = () => template.program.ast` export default function _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); } -`); +`; -helpers.toConsumableArray = defineHelper(` +helpers.toConsumableArray = () => template.program.ast` export default function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; @@ -748,9 +744,9 @@ helpers.toConsumableArray = defineHelper(` return Array.from(arr); } } -`); +`; -helpers.skipFirstGeneratorNext = defineHelper(` +helpers.skipFirstGeneratorNext = () => template.program.ast` export default function _skipFirstGeneratorNext(fn) { return function () { var it = fn.apply(this, arguments); @@ -758,9 +754,9 @@ helpers.skipFirstGeneratorNext = defineHelper(` return it; } } -`); +`; -helpers.toPropertyKey = defineHelper(` +helpers.toPropertyKey = () => template.program.ast` export default function _toPropertyKey(key) { if (typeof key === "symbol") { return key; @@ -768,13 +764,13 @@ helpers.toPropertyKey = defineHelper(` return String(key); } } -`); +`; /** * Add a helper that will throw a useful error if the transform fails to detect the class * property assignment, so users know something failed. */ -helpers.initializerWarningHelper = defineHelper(` +helpers.initializerWarningHelper = () => template.program.ast` export default function _initializerWarningHelper(descriptor, context){ throw new Error( 'Decorating class property failed. Please ensure that ' + @@ -783,12 +779,12 @@ helpers.initializerWarningHelper = defineHelper(` 'the next major version of decorators in stage 2.' ); } -`); +`; /** * Add a helper to call as a replacement for class property definition. */ -helpers.initializerDefineProperty = defineHelper(` +helpers.initializerDefineProperty = () => template.program.ast` export default function _initializerDefineProperty(target, property, descriptor, context){ if (!descriptor) return; @@ -799,13 +795,13 @@ helpers.initializerDefineProperty = defineHelper(` value: descriptor.initializer ? descriptor.initializer.call(context) : void 0, }); } -`); +`; /** * Add a helper to take an initial descriptor, apply some decorators to it, and optionally * define the property. */ -helpers.applyDecoratedDescriptor = defineHelper(` +helpers.applyDecoratedDescriptor = () => template.program.ast` export default function _applyDecoratedDescriptor(target, property, decorators, descriptor, context){ var desc = {}; Object['ke' + 'ys'](descriptor).forEach(function(key){ @@ -835,4 +831,4 @@ helpers.applyDecoratedDescriptor = defineHelper(` return desc; } -`); +`;