UNPKG

vue-egret

Version:
3,817 lines 106 kB
/*!
  * vue-egret.js v1.4.2
  * Copyright (c) 2020-present, Hsuna
  * Released code under the China License.
  */
(function (global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
  typeof define === 'function' && define.amd ? define(factory) :
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.VueEgret = factory());
}(this, (function () { 'use strict';

  function _typeof(obj) {
    "@babel/helpers - typeof";

    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);
  }

  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 _defineProperty(obj, key, value) {
    if (key in obj) {
      Object.defineProperty(obj, key, {
        value: value,
        enumerable: true,
        configurable: true,
        writable: true
      });
    } else {
      obj[key] = value;
    }

    return obj;
  }

  function ownKeys(object, enumerableOnly) {
    var keys = Object.keys(object);

    if (Object.getOwnPropertySymbols) {
      var symbols = Object.getOwnPropertySymbols(object);
      if (enumerableOnly) symbols = symbols.filter(function (sym) {
        return Object.getOwnPropertyDescriptor(object, sym).enumerable;
      });
      keys.push.apply(keys, symbols);
    }

    return keys;
  }

  function _objectSpread2(target) {
    for (var i = 1; i < arguments.length; i++) {
      var source = arguments[i] != null ? arguments[i] : {};

      if (i % 2) {
        ownKeys(Object(source), true).forEach(function (key) {
          _defineProperty(target, key, source[key]);
        });
      } else if (Object.getOwnPropertyDescriptors) {
        Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
      } else {
        ownKeys(Object(source)).forEach(function (key) {
          Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
        });
      }
    }

    return target;
  }

  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,
        writable: true,
        configurable: true
      }
    });
    if (superClass) _setPrototypeOf(subClass, superClass);
  }

  function _getPrototypeOf(o) {
    _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
      return o.__proto__ || Object.getPrototypeOf(o);
    };
    return _getPrototypeOf(o);
  }

  function _setPrototypeOf(o, p) {
    _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
      o.__proto__ = p;
      return o;
    };

    return _setPrototypeOf(o, p);
  }

  function _isNativeReflectConstruct() {
    if (typeof Reflect === "undefined" || !Reflect.construct) return false;
    if (Reflect.construct.sham) return false;
    if (typeof Proxy === "function") return true;

    try {
      Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
      return true;
    } catch (e) {
      return false;
    }
  }

  function _assertThisInitialized(self) {
    if (self === void 0) {
      throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
    }

    return self;
  }

  function _possibleConstructorReturn(self, call) {
    if (call && (typeof call === "object" || typeof call === "function")) {
      return call;
    }

    return _assertThisInitialized(self);
  }

  function _createSuper(Derived) {
    var hasNativeReflectConstruct = _isNativeReflectConstruct();

    return function _createSuperInternal() {
      var Super = _getPrototypeOf(Derived),
          result;

      if (hasNativeReflectConstruct) {
        var NewTarget = _getPrototypeOf(this).constructor;

        result = Reflect.construct(Super, arguments, NewTarget);
      } else {
        result = Super.apply(this, arguments);
      }

      return _possibleConstructorReturn(this, result);
    };
  }

  function _slicedToArray(arr, i) {
    return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
  }

  function _toArray(arr) {
    return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest();
  }

  function _toConsumableArray(arr) {
    return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
  }

  function _arrayWithoutHoles(arr) {
    if (Array.isArray(arr)) return _arrayLikeToArray(arr);
  }

  function _arrayWithHoles(arr) {
    if (Array.isArray(arr)) return arr;
  }

  function _iterableToArray(iter) {
    if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter);
  }

  function _iterableToArrayLimit(arr, i) {
    if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;
    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 _unsupportedIterableToArray(o, minLen) {
    if (!o) return;
    if (typeof o === "string") return _arrayLikeToArray(o, minLen);
    var n = Object.prototype.toString.call(o).slice(8, -1);
    if (n === "Object" && o.constructor) n = o.constructor.name;
    if (n === "Map" || n === "Set") return Array.from(o);
    if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
  }

  function _arrayLikeToArray(arr, len) {
    if (len == null || len > arr.length) len = arr.length;

    for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];

    return arr2;
  }

  function _nonIterableSpread() {
    throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  function _nonIterableRest() {
    throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  function _createForOfIteratorHelper(o, allowArrayLike) {
    var it;

    if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) {
      if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
        if (it) o = it;
        var i = 0;

        var F = function () {};

        return {
          s: F,
          n: function () {
            if (i >= o.length) return {
              done: true
            };
            return {
              done: false,
              value: o[i++]
            };
          },
          e: function (e) {
            throw e;
          },
          f: F
        };
      }

      throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
    }

    var normalCompletion = true,
        didErr = false,
        err;
    return {
      s: function () {
        it = o[Symbol.iterator]();
      },
      n: function () {
        var step = it.next();
        normalCompletion = step.done;
        return step;
      },
      e: function (e) {
        didErr = true;
        err = e;
      },
      f: function () {
        try {
          if (!normalCompletion && it.return != null) it.return();
        } finally {
          if (didErr) throw err;
        }
      }
    };
  }

  /* @flow */

  /**
   * unicode letters used for parsing html tags, component names and property paths.
   * using https://www.w3.org/TR/html53/semantics-scripting.html#potentialcustomelementname
   * skipping \u10000-\uEFFFF due to it freezing up PhantomJS
   */
  var UNICODE_REG_EXP = /a-zA-Z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD/;
  /**
   * Define a property.
   */

  function def(obj, key, val, enumerable) {
    Object.defineProperty(obj, key, {
      value: val,
      enumerable: !!enumerable,
      writable: true,
      configurable: true
    });
  }
  /**
   * Parse simple path.
   */

  var BAIL_RE = new RegExp("[^".concat(UNICODE_REG_EXP.source, ".$_\\d]"));
  function parsePath(path) {
    if (BAIL_RE.test(path)) {
      return;
    }

    var segments = path.split('.');
    return function (obj) {
      for (var i = 0; i < segments.length; i++) {
        if (!obj) return;
        obj = obj[segments[i]];
      }

      return obj;
    };
  }

  /**
   * Perform no operation.
   * Stubbing args to make Flow happy without leaving useless transpiled code
   * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/).
   */
  function noop(a, b, c) {} // can we use __proto__?

  var hasProto = ('__proto__' in {});
  var emptyObject = Object.freeze({}); // these helpers produces better vm code in JS engines due to their
  // explicitness and function inlining

  function isUndef(v) {
    return v === undefined || v === null;
  }
  /**
   * Quick object check - this is primarily used to tell
   * Objects from primitive values when we know the value
   * is a JSON-compliant type.
   */

  function isObject(obj) {
    return obj !== null && _typeof(obj) === 'object';
  }
  /**
   * Convert a value to a string that is actually rendered.
   */

  function toString(val) {
    return val == null ? '' : Array.isArray(val) || isPlainObject(val) && val.toString === _toString ? JSON.stringify(val, null, 2) : String(val);
  }
  /**
   * Convert an input value to a number for persistence.
   * If the conversion fails, return original string.
   */

  function toNumber(val) {
    var n = Number(String(val));
    return Array.isArray(val) || isNaN(n) || '' === val ? val : n;
  }
  /**
   * Merge an Array of Objects into a single Object.
   */

  function toObject(arr) {
    var res = {};

    for (var i = 0; i < arr.length; i++) {
      if (arr[i]) {
        res = _objectSpread2(_objectSpread2({}, res), arr[i]);
      }
    }

    return res;
  }
  /**
   * Get the raw type string of a value, e.g., [object Object].
   */

  var _toString = Object.prototype.toString;
  /**
   * Strict object type check. Only returns true
   * for plain JavaScript objects.
   */

  function isPlainObject(obj) {
    return _toString.call(obj) === '[object Object]';
  }
  /**
   * Check if val is a valid array index.
   */

  function isValidArrayIndex(val) {
    var n = parseFloat(String(val));
    return n >= 0 && Math.floor(n) === n && isFinite(val);
  }
  var HOOK_RE = /^hook:/;
  function isHook(n) {
    return HOOK_RE.test(n);
  }
  /* istanbul ignore next */

  function isNative(Ctor) {
    return typeof Ctor === 'function' && /native code/.test(Ctor.toString());
  }
  var hasSymbol = typeof Symbol !== 'undefined' && isNative(Symbol) && typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys);
  /**
   * Check whether an object has the property.
   */

  var hasOwnProperty = Object.prototype.hasOwnProperty;
  function hasOwn(obj, key) {
    return hasOwnProperty.call(obj, key);
  }
  /**
   * Check if two values are loosely equal - that is,
   * if they are plain objects, do they have the same shape?
   */

  function looseEqual(a, b) {
    if (a === b) return true;
    var isObjectA = isObject(a);
    var isObjectB = isObject(b);

    if (isObjectA && isObjectB) {
      try {
        var isArrayA = Array.isArray(a);
        var isArrayB = Array.isArray(b);

        if (isArrayA && isArrayB) {
          return a.length === b.length && a.every(function (e, i) {
            return looseEqual(e, b[i]);
          });
        } else if (a instanceof Date && b instanceof Date) {
          return a.getTime() === b.getTime();
        } else if (!isArrayA && !isArrayB) {
          var keysA = Object.keys(a);
          var keysB = Object.keys(b);
          return keysA.length === keysB.length && keysA.every(function (key) {
            return looseEqual(a[key], b[key]);
          });
        } else {
          return false;
        }
      } catch (e) {
        return false;
      }
    } else if (!isObjectA && !isObjectB) {
      return String(a) === String(b);
    } else {
      return false;
    }
  }
  /**
   * Return the first index at which a loosely equal value can be
   * found in the array (if value is a plain object, the array must
   * contain an object of the same shape), or -1 if it is not present.
   */

  function looseIndexOf(arr, val) {
    for (var i = 0; i < arr.length; i++) {
      if (looseEqual(arr[i], val)) return i;
    }

    return -1;
  }
  /**
   * Make a map and return a function for checking if a key
   * is in that map.
   */

  function makeMap(str, expectsLowerCase) {
    var map = Object.create(null);
    var list = str.split(',');

    for (var i = 0; i < list.length; i++) {
      map[list[i]] = true;
    }

    return expectsLowerCase ? function (val) {
      return map[val.toLowerCase()];
    } : function (val) {
      return map[val];
    };
  }
  /**
   * Create a cached version of a pure function.
   */

  function cached(fn) {
    var cache = {};
    return function cachedFn(str) {
      var hit = cache[str];
      return hit || (cache[str] = fn(str));
    };
  }

  var SIMPLE_NORMALIZE = 1;
  var ALWAYS_NORMALIZE = 2;
  function normalizeChildren() {
    var children = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
    return Array.isArray(children) ? normalizeArrayChildren(children) : undefined;
  }
  function normalizeArrayChildren() {
    var children = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
    return children.reduce(function (pre, vnode) {
      return pre.concat(Array.isArray(vnode) ? normalizeArrayChildren(vnode) : vnode);
    }, []);
  }
  function simpleNormalizeChildren() {
    var children = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];

    for (var i = 0; i < children.length; i++) {
      if (Array.isArray(children[i])) {
        return Array.prototype.concat.apply([], children);
      }
    }

    return children;
  }
  function createVNode(tag) {
    var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
    var children = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
    var normalizationType = arguments.length > 3 ? arguments[3] : undefined;

    if (Array.isArray(data)) {
      normalizationType = children;
      children = data;
      data = {};
    }

    if (normalizationType === ALWAYS_NORMALIZE) {
      children = normalizeChildren(children);
    } else if (normalizationType === SIMPLE_NORMALIZE) {
      children = simpleNormalizeChildren(children);
    }

    var Ctrl;

    if ('function' === typeof tag) ; else if (isObject(tag)) {
      Ctrl = VueEgret.extend(tag);
    }

    var vnode = _objectSpread2(_objectSpread2(_objectSpread2({}, data), Ctrl ? {
      Ctrl: Ctrl,
      tag: "vue-component-".concat(Ctrl.cid).concat(data.name ? "-".concat(data.name) : '')
    } : {
      tag: tag
    }), {}, {
      children: children.filter(Boolean)
    });

    return vnode;
  }
  function createFnInvoker(fns, thisObject) {
    var invoker = function invoker() {
      var fns = invoker.fns;

      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
        args[_key] = arguments[_key];
      }

      if (Array.isArray(fns)) {
        var cloned = _toConsumableArray(fns);

        var fn = cloned.shift();

        while (fn) {
          // eslint-disable-next-line prefer-spread
          fn.apply(thisObject || this, args);
          fn = cloned.shift();
        }
      } else {
        // eslint-disable-next-line prefer-spread
        return fns.apply(thisObject || this, args);
      }
    };

    invoker.fns = fns;
    return invoker;
  }

  /**
   * Check if a tag is a built-in tag.
   */

  makeMap('slot,component', true);
  /**
   * Check if an attribute is a reserved attribute.
   */

  makeMap('key,ref,slot,slot-scope,is');
  /**
   * Runtime helper for merging v-bind="object" into a VNode's data.
   */

  function bindObjectProps(data, value, isSync) {
    if (value) {
      if (!isObject(value)) ; else {
        if (Array.isArray(value)) {
          value = toObject(value);
        }

        var attrs = data.attrs || (data.attrs = {});

        var _loop = function _loop(key) {
          attrs[key] = value[key];

          if (isSync) {
            var on = data.on || (data.on = {});
            on["update:".concat(key)] = createFnInvoker(function ($event) {
              value[key] = $event;
            });
          }
        };

        for (var key in value) {
          _loop(key);
        }
      }
    }

    return data;
  }
  function bindObjectListeners(data, value) {
    if (value) {
      if (!isPlainObject(value)) ; else {
        var on = data.on = _objectSpread2({}, data.on);

        for (var key in value) {
          var existing = on[key];
          var ours = value[key];
          on[key] = existing ? [].concat(existing, ours) : ours;
        }
      }
    }

    return data;
  } // helper to dynamically append modifier runtime markers to event names.
  // ensure only append when value is already string, otherwise it will be cast
  // to string and cause the type check to miss.

  function prependModifier(value, symbol) {
    return typeof value === 'string' ? symbol + value : value;
  }
  /**
   * 列表渲染
   * @author Hsuna
   * @param { any } val   渲染数据,可递归数据
   * @param { Function } render     渲染函数
   * @return { Array<T> } 渲染后列表
   */

  function renderList(val, render) {
    if (Array.isArray(val) || 'string' === typeof val) {
      return Array.from(val).map(function (v, i) {
        return render(v, i);
      });
    } else if ('number' === typeof val) {
      return Array.from({
        length: val
      }).map(function (v, i) {
        return render(i + 1, i);
      });
    } else if (isObject(val)) {
      if (hasSymbol && val[Symbol.iterator]) {
        var ret = [];
        var iterator = val[Symbol.iterator]();
        var result = iterator.next();

        while (!result.done) {
          ret.push(render(result.value, ret.length));
          result = iterator.next();
        }

        return ret;
      } else {
        return Object.keys(val).map(function (k, i) {
          return render(val[k], k, i);
        });
      }
    }

    return [];
  }

  // dep实例的ID
  var uid$1 = 0;

  var Dep = /*#__PURE__*/function () {
    function Dep() {
      _classCallCheck(this, Dep);

      this.id = uid$1++;
      this.subs = [];
    }

    _createClass(Dep, [{
      key: "depend",
      value: function depend() {
        if (Dep.target) {
          Dep.target.addDep(this);
        }
      }
    }, {
      key: "addSub",
      value: function addSub(sub) {
        this.subs.push(sub);
      }
    }, {
      key: "removeSub",
      value: function removeSub(sub) {
        var index = this.subs.indexOf(sub);

        if (index > -1) {
          this.subs.splice(index, 1);
        }
      }
    }, {
      key: "notify",
      value: function notify() {
        this.subs.forEach(function (e) {
          e.update();
        });
      }
    }]);

    return Dep;
  }(); // The current target watcher being evaluated.
  Dep.target = null;
  var targetStack = [];
  function pushTarget(target) {
    targetStack.push(target);
    Dep.target = target;
  }
  function popTarget() {
    targetStack.pop();
    Dep.target = targetStack[targetStack.length - 1];
  }

  var DIR_REG = /^v-|^@|^:|^#/; // v-foo=

  var BIND_REG = /^(v-bind:|:)/; // v-bind:foo | :foo

  var ON_REG = /^(v-on:|@)/; // v-on:type | @type

  var DYNAMIC_ARG_RE = /^\[.*\]$/; // v-on:[arg]

  function parseAttrList(ast) {
    var astData = {
      tag: ast.tag,
      key: ast.key,
      ref: ast.ref,
      refInFor: false,
      attrs: [],
      on: [],
      nativeOn: [],
      directives: [],
      wrapDir: []
    };
    ast.attrsList.forEach(function (attr) {
      if (DIR_REG.test(attr.name)) {
        var dir = parseDirective(attr.name, attr.value);

        if (BIND_REG.test(attr.name)) {
          astData.attrs.push(dir);

          if (dir.modifiers && dir.modifiers.sync) {
            astData.on.push(_objectSpread2(_objectSpread2({}, dir), {}, {
              name: 'sync'
            }));
          }
        } else if (ON_REG.test(attr.name)) {
          if (dir.modifiers.native) {
            astData.nativeOn.push(dir);
          } else {
            astData.on.push(dir);
          }
        } else {
          astData.directives.push(dir);
        }
      } else {
        astData.attrs.push({
          name: 'bind',
          arg: attr.name,
          expression: "_n(\"".concat(attr.value, "\")")
        });
      }
    });

    if (ast.text) {
      astData.attrs.push({
        name: 'text',
        arg: "\"text\"",
        expression: ast.text
      });
    }

    if (ast.ref) {
      astData.refInFor = checkInFor(ast);
    }

    return astData;
  }
  function parseDirective(directive, expression) {
    var name = '',
        arg = '',
        modifiers = []; // @type => v-on:type, :type =>

    directive = directive.replace(BIND_REG, 'v-bind:').replace(ON_REG, 'v-on:'); // v-my-directive:key.foo.bar => ['v-my-directive:key', 'foo', 'bar']

    var _directive$split = directive.split('.');

    var _directive$split2 = _toArray(_directive$split);

    directive = _directive$split2[0];
    modifiers = _directive$split2.slice(1);

    var _directive$split3 = directive.split(':');

    var _directive$split4 = _slicedToArray(_directive$split3, 2);

    name = _directive$split4[0];
    arg = _directive$split4[1];
    return {
      name: name.replace(DIR_REG, ''),
      expression: expression,
      arg: arg ? DYNAMIC_ARG_RE.test(arg) ? arg.slice(1, -1) : "\"".concat(arg, "\"") : '',
      rawArg: arg || '',
      modifiers: modifiers.reduce(function (o, k) {
        return Object.assign(o, _defineProperty({}, k, true));
      }, {})
    };
  }
  var parseEvent = cached(function (name) {
    var once = name.charAt(0) === '~'; // Prefixed last, checked first

    name = once ? name.slice(1) : name;
    var capture = name.charAt(0) === '!';
    name = capture ? name.slice(1) : name;
    return {
      name: name,
      once: once,
      capture: capture
    };
  });
  function parseModel(val) {
    // eslint-disable-next-line prefer-const
    var len, str, index, expressionPos, expressionEndPos;

    function next() {
      return str.charCodeAt(++index);
    }

    function eof() {
      return index >= len;
    }

    function isStringStart(chr) {
      return chr === 0x22 || chr === 0x27;
    }

    function parseBracket(chr) {
      var inBracket = 1;
      expressionPos = index;

      while (!eof()) {
        chr = next();

        if (isStringStart(chr)) {
          parseString(chr);
          continue;
        }

        if (chr === 0x5b) inBracket++;
        if (chr === 0x5d) inBracket--;

        if (inBracket === 0) {
          expressionEndPos = index;
          break;
        }
      }
    }

    function parseString(chr) {
      var stringQuote = chr;

      while (!eof()) {
        chr = next();

        if (chr === stringQuote) {
          break;
        }
      }
    }

    val = val.trim();

    if (val.indexOf('[') < 0 || val.lastIndexOf(']') < len - 1) {
      index = val.lastIndexOf('.');

      if (index > -1) {
        return {
          exp: val.slice(0, index),
          key: '"' + val.slice(index + 1) + '"'
        };
      } else {
        return {
          exp: val,
          key: null
        };
      }
    }

    str = val;
    index = expressionPos = expressionEndPos = 0;

    while (index < len) {
      var _chr = str.charCodeAt(++index);
      /* istanbul ignore if */


      if (isStringStart(_chr)) {
        parseString(_chr);
      } else if (_chr === 0x5b) {
        parseBracket(_chr);
      }
    }

    return {
      exp: val.slice(0, expressionPos),
      key: val.slice(expressionPos + 1, expressionEndPos)
    };
  }

  function checkInFor(ast) {
    var parent = ast;

    while (parent) {
      if (parent.for !== undefined) {
        return true;
      }

      parent = parent.parent;
    }

    return false;
  }

  function on(data, dir) {
    data.wrapDir.push(function (code) {
      return "_g(".concat(code, ",").concat(dir.expression, ")");
    });
  }

  function bind(data, dir) {
    data.wrapDir.push(function (code) {
      return "_b(".concat(code, ",").concat(dir.expression).concat(dir.modifiers && dir.modifiers.sync ? ',true' : '', ")");
    });
  }

  function normalizeDirectives(dirs) {
    return dirs.reduce(function (obj, dir) {
      return obj[dir.name] = dir, obj;
    }, {});
  }
  var baseDirectives = {
    on: on,
    bind: bind
  };

  var fnExpRE = /^([\w$_]+|\([^)]*?\))\s*=>|^function(?:\s+[\w$]+)?\s*\(/;
  var fnInvokeRE = /\([^)]*?\);*$/;
  var simplePathRE = /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/;

  var delComma = function delComma(str) {
    return str.replace(/,$/, '');
  };

  function genData(ast) {
    var data = parseAttrList(ast);
    var str = '{'; // directives first.

    if (data.directives && data.directives.length) {
      str += genDirectives(data.directives, data);
    } // key


    if (data.key) {
      str += "key:".concat(data.key, ",");
    } // ref


    if (data.ref) {
      str += "ref:".concat(data.ref, ",");
    }

    if (data.refInFor) {
      str += "refInFor:true,";
    } // attributes


    if (data.attrs && data.attrs.length) {
      str += "attrs:".concat(genProps(data.attrs), ",");
    } // on


    if (data.on && data.on.length) {
      str += "on:".concat(genHandlers(data.on), ",");
    } // nativeOn


    if (data.nativeOn && data.nativeOn.length) {
      str += "nativeOn:".concat(genHandlers(data.nativeOn), ",");
    }

    str = delComma(str) + '}';

    if (data.wrapDir && data.wrapDir.length) {
      data.wrapDir.forEach(function (wrap) {
        str = wrap(str);
      });
    }

    return str;
  }
  function genSync(expression) {
    var res = parseModel(expression);

    if (res.key === null) {
      return "".concat(expression, "=$event");
    } else {
      return "$set(".concat(res.exp, ", ").concat(res.key, ", $event)");
    }
  }
  function genProps(dirs) {
    var res = '';
    dirs.forEach(function (dir) {
      if ('text' === dir.name) {
        res += "".concat(dir.rawArg || dir.arg, ":_s(").concat(dir.expression, "),");
      } else {
        res += "".concat(dir.rawArg || dir.arg, ":").concat(dir.expression, ",");
      }
    });
    return res ? "{".concat(delComma(res), "}") : '';
  }
  function genHandlers(dirs) {
    var res = '';
    dirs.forEach(function (dir) {
      var isSync = 'sync' == dir.name;
      var isDynamic = false;
      var name = dir.arg;

      if (isSync) {
        name = "_p(".concat(name, ", \"update:\")");
        isDynamic = true;
      } // check modifier


      if (dir.modifiers) {
        if (dir.modifiers.capture) {
          name = "_p(".concat(name, ", \"!\")");
          isDynamic = true;
        }

        if (dir.modifiers.once) {
          name = "_p(".concat(name, ", \"~\")");
          isDynamic = true;
        }
      }

      if (isDynamic) {
        name = "[".concat(name, "]");
      }

      res += "".concat(name, ":").concat(genHandler(dir, isSync), ",");
    });
    return res ? "{".concat(delComma(res), "}") : '';
  }

  var genGuard = function genGuard(condition) {
    return "if(".concat(condition, ")return null;");
  };

  var modifierCode = {
    stop: '$event.stopPropagation();',
    prevent: '$event.preventDefault();',
    self: genGuard("$event.target !== $event.currentTarget")
  };
  function genHandler(dir, isSync) {
    var expression = (isSync ? genSync(dir.expression) : dir.expression) || '';
    var isMethodPath = simplePathRE.test(expression); // @touchTap="doSomething"

    var isFunctionExpression = fnExpRE.test(expression); // @touchTap="() => {}" or @touchTap="function(){}"

    var isFunctionInvocation = simplePathRE.test(expression.replace(fnInvokeRE, '')); // @touchTap="doSomething($event)"
    // 在没有修饰符的情况下

    if (!dir.modifiers) {
      if (isMethodPath || isFunctionExpression) {
        return expression;
      }

      return "function($event){".concat(isFunctionInvocation ? "return ".concat(expression) : expression, "}");
    } else {
      var code = '';

      for (var key in dir.modifiers) {
        if (modifierCode[key]) {
          code += modifierCode[key];
        }
      }

      var handlerCode = isMethodPath ? "return ".concat(expression, "($event)") : isFunctionExpression ? "return (".concat(expression, ")($event)") : isFunctionInvocation ? "return ".concat(expression) : expression;
      return "function($event){".concat(code).concat(handlerCode, "}");
    }
  }
  function genDirectives(dirs, astData) {
    var res = '';
    dirs.forEach(function (dir) {
      var needRuntime = true;
      var gen = baseDirectives[dir.name];

      if (gen) {
        needRuntime = !!gen(astData, dir);
      }

      if (needRuntime) {
        res += "{name:\"".concat(dir.name, "\",value:_n(").concat(dir.expression, "),expression:\"").concat(dir.expression, "\"").concat(dir.arg ? ",arg:".concat(dir.arg) : '').concat(dir.modifiers ? ",modifiers:".concat(JSON.stringify(dir.modifiers)) : '', "},");
      }
    });
    return res ? "directives:[".concat(delComma(res), "],") : '';
  }
  function genVNode(ast) {
    var isCheck = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
    var forRes = ast.for;

    if (isCheck && forRes && forRes.for) {
      return "_l((".concat(forRes.for, "), function(").concat([forRes.alias, forRes.iterator1, forRes.iterator2].filter(Boolean).join(','), "){return ").concat(genVNode(ast, false), "})");
    } else if (isCheck && ast.ifConditions) {
      return '(' + ast.ifConditions.map(function (_ref) {
        var exp = _ref.exp,
            target = _ref.target;
        return "".concat(exp, "?").concat(genVNode(target, false), ":");
      }).join('') + '"")';
    } else {
      if (isUndef(ast.component) && 'template' === ast.tag) {
        return ast.children.length > 0 ? "[].concat(".concat(ast.children.map(function (ast) {
          return genVNode(ast);
        }), ")") : '';
      } else {
        var dataStr = genData(ast);
        var normalizationType = getNormalizationType(ast.children);
        return "_c(".concat(ast.component || "\"".concat(ast.tag, "\"")).concat('{}' !== dataStr ? ",".concat(dataStr) : '').concat(ast.children.length > 0 ? ",[].concat(".concat(ast.children.map(function (ast) {
          return genVNode(ast);
        }), ")") : '').concat(normalizationType ? ",".concat(normalizationType) : '', ")");
      }
    }
  }

  function needsNormalization(ast) {
    return ast.for !== undefined || ast.tag === 'template' || ast.tag === 'slot';
  }

  function maybeComponent(ast) {
    return !!ast.component;
  }

  function getNormalizationType(children) {
    var res = 0;

    for (var i = 0; i < children.length; i++) {
      var ast = children[i];

      if (needsNormalization(ast) || ast.ifConditions && ast.ifConditions.some(function (c) {
        return needsNormalization(c.target);
      })) {
        res = ALWAYS_NORMALIZE;
        break;
      }

      if (maybeComponent(ast) || ast.ifConditions && ast.ifConditions.some(function (c) {
        return maybeComponent(c.target);
      })) {
        res = SIMPLE_NORMALIZE;
      }
    }

    return res;
  }

  /**
   * Not type-checking this file because it's mostly vendor code.
   */
  var START_TAG_CLOSE = /\/\s*>/;
  var START_TAG_RE = /^<([^>\s\/]+)((\s+[^=>\s]+(\s*=\s*((\"[^"]*\")|(\'[^']*\')|[^>\s]+))?)*)\s*\/?\s*>/m;
  var ATTR_RE = /([^=\s]+)(\s*=\s*((\"([^"]*)\")|(\'([^']*)\')|[^>\s]+))?/gm;
  var END_TAG_RE = /^<\/([^>\s]+)[^>]*>/m;

  var ParseHtml = /*#__PURE__*/function () {
    function ParseHtml(s, options) {
      _classCallCheck(this, ParseHtml);

      this.options = options;

      this._parse(s);
    }

    _createClass(ParseHtml, [{
      key: "_parse",
      value: function _parse(s) {
        var index;
        var treatAsChars = false;

        while (s.length > 0) {
          // Comment
          if (s.substring(0, 4) == '<!--') {
            index = s.indexOf('-->');

            if (index != -1) {
              this.options.comment(s.substring(4, index));
              s = s.substring(index + 3);
              treatAsChars = false;
            } else {
              treatAsChars = true;
            }
          } // end tag
          else if (s.substring(0, 2) == '</') {
              if (END_TAG_RE.test(s)) {
                s = s.replace(END_TAG_RE, this.parseEndTag.bind(this));
                treatAsChars = false;
              } else {
                treatAsChars = true;
              }
            } // start tag
            else if (s.charAt(0) == '<') {
                if (START_TAG_RE.test(s)) {
                  s = s.replace(START_TAG_RE, this.parseStartTag.bind(this));
                  treatAsChars = false;
                } else {
                  treatAsChars = true;
                }
              }

          if (treatAsChars) {
            index = s.indexOf('<');

            if (index == -1) {
              this.options.characters(s);
              s = '';
            } else {
              this.options.characters(s.substring(0, index));
              s = s.substring(index);
            }
          }

          treatAsChars = true;
        }
      }
    }, {
      key: "parseStartTag",
      value: function parseStartTag(sTag, sTagName, sRest) {
        var attrs = this.parseAttributes(sTagName, sRest);
        var unary = START_TAG_CLOSE.test(sTag);
        this.options.startElement(sTagName, attrs, unary);
        return '';
      }
    }, {
      key: "parseEndTag",
      value: function parseEndTag(sTag, sTagName) {
        this.options.endElement(sTagName);
        return '';
      }
    }, {
      key: "parseAttributes",
      value: function parseAttributes(sTagName, sRest) {
        var _this = this;

        var attrs = [];
        sRest.replace(ATTR_RE, function () {
          var _this$parseAttribute;

          for (var _len = arguments.length, arg = new Array(_len), _key = 0; _key < _len; _key++) {
            arg[_key] = arguments[_key];
          }

          var attr = (_this$parseAttribute = _this.parseAttribute).call.apply(_this$parseAttribute, [_this, sTagName].concat(arg));

          if (attr.name && '/' !== attr.name) attrs.push(attr);
          return '';
        });
        return attrs;
      }
    }, {
      key: "parseAttribute",
      value: function parseAttribute(sTagName, sAttribute, sName) {
        var value = '';
        if (arguments[7]) value = arguments[8];else if (arguments[5]) value = arguments[6];else if (arguments[3]) value = arguments[4];
        var empty = !value && !arguments[3];
        return {
          name: sName,
          value: empty ? null : value
        };
      }
    }]);

    return ParseHtml;
  }();

  var FOR_ALIAS_RE = /([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/;
  var FOR_ITERATOR_RE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/;
  var STRIP_PARENS_RE = /^\(|\)$/g;
  function parseFor(exp) {
    var inMatch = exp.match(FOR_ALIAS_RE);
    if (!inMatch) return;
    var res = {
      for: '',
      alias: ''
    };
    res.for = inMatch[2].trim();
    var alias = inMatch[1].trim().replace(STRIP_PARENS_RE, '');
    var iteratorMatch = alias.match(FOR_ITERATOR_RE);

    if (iteratorMatch) {
      res.alias = alias.replace(FOR_ITERATOR_RE, '').trim();
      res.iterator1 = iteratorMatch[1].trim();

      if (iteratorMatch[2]) {
        res.iterator2 = iteratorMatch[2].trim();
      }
    } else {
      res.alias = alias;
    }

    return res;
  }
  function getBindingAttr(node, name) {
    var dynamicValue = getAndRemoveAttr(node, ':' + name) || getAndRemoveAttr(node, 'v-bind:' + name);
    if (dynamicValue != null) return dynamicValue;
    var staticValue = getAndRemoveAttr(node, name);
    if (staticValue != null) return JSON.stringify(staticValue);
  }
  function getAndRemoveAttr(node, name) {
    var val = node.attrsMap[name];
    var list = node.attrsList;

    for (var i = 0, l = list.length; i < l; i++) {
      if (list[i].name === name) {
        list.splice(i, 1);
        break;
      }
    }

    return val;
  }

  /**
   * 创建语法树节点
   * @param { string } tag 标签名
   * @param { Array<ASTAttr> } attrs 属性列表
   * @param { ASTNode } parent 父语法树节点
   * @return { ASTNode } 新语法树节点
   */
  function createASTNode(tag, attrs, parent) {
    return {
      tag: tag,
      text: '',
      attrsList: attrs,
      attrsMap: attrs.reduce(function (m, i) {
        return Object.assign(m, _defineProperty({}, i.name, i.value));
      }, {}),
      parent: parent,
      children: []
    };
  }

  /**
   * 模板解析工厂
   * @description 将模板解析成AST
   * @author Hsuna
   */

  var REG_TRIM = /^\s+|\s+$/g; //去掉头尾空白

  var REG_BREAK = /^\s*\n+|\n+\s*$/g; //去掉前后的空白行

  var REG_INTERPOLATE = /{{([^}]+?)}}/; //{{text}}

  var ParserFactory = /*#__PURE__*/function () {
    function ParserFactory() {
      _classCallCheck(this, ParserFactory);
    }

    _createClass(ParserFactory, [{
      key: "startElement",
      value: function startElement(tagName, attrs, unary) {
        this._parent = this._target;
        this._target = createASTNode(tagName, attrs, this._parent);

        if (!this._root) {
          this._root = this._target;
        } else if (!this._parent) {
          throw new Error('tow root');
        }

        if (unary) {
          this.endElement(tagName);
        }
      }
    }, {
      key: "endElement",
      value: function endElement(tagName) {
        var exp;
        if (exp = getBindingAttr(this._target, 'is')) this._target.component = exp;
        if (exp = getBindingAttr(this._target, 'key')) this._target.key = exp;
        if (exp = getBindingAttr(this._target, 'ref')) this._target.ref = exp;
        if (exp = getAndRemoveAttr(this._target, 'v-for')) this._target.for = parseFor(exp);
        if (exp = getAndRemoveAttr(this._target, 'v-if')) this._target.if = this.addIfConditions(exp);else if (exp = getAndRemoveAttr(this._target, 'v-else-if')) this._target.elseif = this.addIfConditions(exp, true);else if ('undefined' !== typeof (exp = getAndRemoveAttr(this._target, 'v-else'))) this._target.else = this.addIfConditions(true, true);

        if (this._parent && this._target !== this._root && !this._target.elseif && !this._target.else) {
          this._parent.children.push(this._target);
        }

        this._target = this._parent;

        if (this._parent) {
          this._parent = this._parent.parent;
        }
      }
    }, {
      key: "comment",
      value: function comment(text) {}
      /**
       *
       * @param { string } text
       */

    }, {
      key: "characters",
      value: function characters(text) {
        if (this._target) {
          var content = text.replace(REG_BREAK, '') // 去掉前后的空白行
          .split('\n').map(function (s) {
            return s.replace(REG_TRIM, '');
          }).join('\n'); // 去掉每行头尾空白

          var m = content.match(REG_INTERPOLATE);
          var templateArr = [];

          while (m) {
            templateArr.push(JSON.stringify(content.slice(0, m.index)));
            templateArr.push(m[1].replace(REG_TRIM, ''));
            content = content.slice(m.index + m[0].length);
            m = content.match(REG_INTERPOLATE);
          }

          if (content.length) {
            templateArr.push(JSON.stringify(content));
          }

          if (templateArr.length) {
            this._target.text = "''.concat(".concat(templateArr.join(','), ")");
          }
        }
      }
      /**
       *
       * @param exp
       * @param prev 前置
       */

    }, {
      key: "addIfConditions",
      value: function addIfConditions(exp) {
        var prev = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
        var target;

        if (prev) {
          var parent = this._target.parent;

          if (parent) {
            var curTarget = parent.children[parent.children.length - 1];

            if (curTarget) {
              target = curTarget;
            }
          }
        } else {
          target = this._target;
        }

        if (target) {
          if (!target.ifConditions) target.ifConditions = [];
          target.ifConditions.push({
            exp: exp,
            target: this._target
          });
        }

        return exp;
      }
      /**
       * 获取根语法树节点
       * @get { ASTNode } root
       */

    }, {
      key: "root",
      get: function get() {
        return this._root;
      }
    }], [{
      key: "created",
      value: function created(template) {
        var parser = new ParserFactory();
        new ParseHtml(template, parser);
        return parser;
      }
    }]);

    return ParserFactory;
  }();

  function astStrRender(template) {
    // 通过模板解析,将模板转化为AST
    var ast = genVNode(ParserFactory.created(template).root);
    return "with(this){ return ".concat(ast, ";}");
  }

  function ev(data) {
    var str = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
    var arr = str.split('.');

    var _iterator = _createForOfIteratorHelper(arr),
        _step;

    try {
      for (_iterator.s(); !(_step = _iterator.n()).done;) {
        var key = _step.value;
        if (data[key]) data = data[key];else return null;
      }
    } catch (err) {
      _iterator.e(err);
    } finally {
      _iterator.f();
    }

    return data;
  }

  function installRender(target) {
    target._c = createVNode;
    target._n = toNumber;
    target._s = toString;
    target._q = looseEqual;
    target._i = looseIndexOf;
    target._l = renderList;
    target._b = bindObjectProps;
    target._g = bindObjectListeners;
    target._p = prependModifier; // 返回render创建方法

    target.$createVNode = createVNode;
  }
  var DEFAULT_ATTR = '__VUE_EGRET_DEFAULT__';
  /**
   * 渲染器
   * @author Hsuna
   */

  var Render = /*#__PURE__*/function () {
    /** 新虚拟节点 */
    // private _newVnode:VNode;
    function Render(vm) {
      _classCallCheck(this, Render);

      this._vm = vm;
      this._components = Object.assign({}, VueEgret._components, this._vm._components);
      this._directives = Object.assign({}, VueEgret._directives, this._vm._directives);

      this._init();
    }

    _createClass(Render, [{
      key: "_init",
      value: function _init() {
        // 安装渲染器AST运行方法
        installRender(this._vm);
        this._render = 'function' === typeof this._vm.$options.render // 如果存在渲染器这渲染,否则渲染模板
        ? this._vm.$options.render : Function.prototype.constructor(astStrRender(this._vm.$options.template));

        this._tick();
      }
    }, {
      key: "_tick",
      value: function _tick() {
        if (this._vm) {
          var newVNode = this._createVNode();

          this._vnode = this._patch(this._vnode, newVNode);
        }
      }
    }, {
      key: "inserted",
      value: function inserted() {
        // 触发指令:被绑定元素插入父节点时调用
        this._triggerDirective('inserted', this._vnode);
      }
    }, {
      key: "update",
      value: function update() {
        this._tick();
      }
    }, {
      key: "destroy",
      value: function destroy() {
        this._vnode && this._destroyDisObj(this._vnode);
        this._vm = null;
      }
      /**
       *
       * @param { VNode } oldVNode
       * @param { VNode } newVNode
       * @return { VNode }
       */

    }, {
      key: "_patch",
      value: function _patch(oldVNode, newVNode) {
        if (!oldVNode) {
          //如果不存在旧节点的情况下,说明还未初始化,则初始化页面
          // 创建新节点
          this._vm.$el = this._createDisObj(newVNode);
        } else if (this._sameVNode(oldVNode, newVNode)) {
          //相似节点采用更新的方式
          this._patchVNode(oldVNode, newVNode);
        } else {
          //非相似节点直接替换
          // 获取父节点
          var parent = oldVNode.sp.$parent;

          if (parent) {
            // 创建新节点
            var sp = this._createDisObj(newVNode);

            parent.addChildAt(sp, parent.getChildIndex(oldVNode.sp));

            this._destroyDisObj(oldVNode);
          }
        }

        return newVNode;
      }
      /**
       * 比较替换新旧节点
       * @param { VNode } oldVNode
       * @param { VNode } newVNode
       */

    }, {
      key: "_patchVNode",
      value: function _patchVNode(oldVNode, newVNode) {
        newVNode.sp = oldVNode.sp;
        newVNode.vm = oldVNode.vm;

        this._updateDisObj(oldVNode, newVNode);
      }
      /**
       * 通过diff算法,最小粒度更新节点
       * @param { Array<VNode> } oldCh 虚拟节点旧子列表
       * @param { Array<VNode> } newCh 虚拟节点新子列表
       * @param { egret.DisplayObjectContainer } parent 节点显示对象
       */

    }, {
      key: "_updateChildren",
      value: function _updateChildren(oldCh, newCh, parent) {
        if (oldCh === newCh) return;
        var oldStartIdx = 0;
        var newStartIdx = 0;
        var oldEndIdx = oldCh.length - 1;
        var newEndIdx = newCh.length - 1;
        var oldStartVNode = oldCh[0];
        var oldEndVNode = oldCh[oldEndIdx];
        var newStartVNode = newCh[0];
        var newEndVNode = newCh[newEndIdx];

        while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
          if (!oldStartVNode) {
            oldStartVNode = oldCh[++oldStartIdx];
          } else if (!oldEndVNode) {
            oldEndVNode = oldCh[--oldEndIdx];
          } else if (this._sameVNode(oldStartVNode, newStartVNode)) {
            // 头部节点相似,头部指针移动
            this._patchVNode(oldStartVNode, newStartVNode);

            oldStartVNode = oldCh[++oldStartIdx];
            newStartVNode = newCh[++newStartIdx];
          } else if (this._sameVNode(oldEndVNode, newEndVNode)) {
            // 底部节点相似,底部指针移动
            this._patchVNode(oldEndVNode, newEndVNode);

            oldEndVNode = oldCh[--oldEndIdx];
            newEndVNode = newCh[--newEndIdx];
          } else {
            var sp = void 0;

            for (var i = oldStartIdx; i <= oldEndIdx; i++) {
              if (this._sameVNode(newStartVNode, oldCh[i])) {
                // 查找旧显示列表是否有与当前位置相似的新节点
                this._patchVNode(oldCh[i], newStartVNode); // 将相似的旧节点插入到新节点对应位置
                // 修改显示对象位置


                sp = newStartVNode.sp;
                parent.setChildIndex(sp, newStartIdx); // 修改虚拟节点位置

                var oldVNode = oldCh.splice(i, 1)[0];
                oldCh.splice(newStartIdx, 0, oldVNode);
                oldStartVNode = oldCh[++oldStartIdx];
                break;
              }
            }

            if (!sp) {
              sp = this._createDisObj(newStartVNode);
              parent.addChildAt(sp, newStartIdx);
            }

            newStartVNode = newCh[++newStartIdx];
          }
        }

        if (oldStartIdx > oldEndIdx) {
          // 新增缺少的显示对象列表
          var _sp;

          for (; newStartIdx <= newEndIdx; ++newStartIdx) {
            newStartVNode = newCh[newStartIdx];
            _sp = this._createDisObj(newStartVNode);
            parent.addChildAt(_sp, newStartIdx);
          }
        } else if (newStartIdx > newEndIdx) {
          // 删除多余的显示对象列表
          for (; oldStartIdx <= oldEndIdx; ++oldStartIdx) {
            oldStartVNode = oldCh[oldStartIdx];

            this._destroyDisObj(oldStartVNode);
          }
        }
      }
      /**
       * 获取虚拟节点
       * @return { VNode }
       */

    }, {
      key: "_createVNode",
      value: function _createVNode() {
        return this._render.call(this._vm, createVNode);
      }
      /**
       * 判断新旧节点是否一致
       * @param { VNode } oldVNode 旧节点
       * @param { VNode } newVNode 新节点
       * @return { boolean }
       */

    }, {
      key: "_sameVNode",
      value: function _sameVNode(oldVNode, newVNode) {
        return oldVNode.key === newVNode.key && // VM实例时生成的key值
        oldVNode.tag === newVNode.tag && // 类名
        (oldVNode.attrs || {}).key === (newVNode.attrs || {}).key // 属性key值,当属性使用key时,进行强制比对,特别是循环列表,进行强制替换
        ;
      }
      /**
       * 创建新的显示对象
       * @param { VNode } vnode 对象虚拟节点
       * @return { egret.DisplayObject } 返回新的显示对象
       */

    }, {
      key: "_createDisObj",
      value: function _createDisObj(vnode) {
        var _this = this;

        var VClass = vnode.Ctrl || this._components[vnode.tag];
        pushTarget(); //阻断所有更新监听
        // Component

        if (VClass) {
          var parentOptions = {
            parent: this._vm,
            propsData: {},
            _propsKeys: [],
            attrs: {},
            listeners: {}
          };
          var props = VClass.options.props;

          for (var key in props) {
            parentOptions._propsKeys.push(key);

            if (hasOwn(this._vm.$props, key)) parentOptions.propsData[key] = this._vm.$props[key];
            if (hasOwn(vnode.attrs, key)) parentOptions.propsData[key] = vnode.attrs[key];
          }

          for (var _key in vnode.attrs) {
            if (!hasOwn(parentOptions.propsData, _key)) parentOptions.attrs[_key] = vnode.attrs[_key];
          } // 创建虚拟dom节点


          vnode.vm = new VClass(parentOptions); // 将实际显示对象关联虚拟节点

          vnode.sp = vnode.vm.$el; // 新增组件内部事件

          for (var type in vnode.on) {
            parentOptions.listeners[type] = vnode.on[type] = this._addInvoker(type, vnode);
          } // 新增原生事件


          for (var _type in vnode.nativeOn) {
            vnode.nativeOn[_type] = this._addInvoker(_type, vnode, true);
          } // 如果inheritAttrs不为false,则禁用 Attribute 继承


          if (false !== vnode.vm.$options.inheritAttrs) {
            this._addAttrs(vnode, parentOptions.attrs);
          }
        } else {
          VClass = egret[vnode.tag] || ev(window, vnode.tag);

          if (VClass) {
            vnode.sp = new VClass();

            for (var _type2 in vnode.on) {
              vnode.on[_type2] = this._addInvoker(_type2, vnode);
            }

            this._addAttrs(vnode, vnode.attrs);
          }
        }

        if (!VClass) throw new Error("Then [".concat(vnode.tag, "] Node is undefined!!!")); // 实例节点

        if (vnode.ref) {
          var refs = this._vm.$refs;
          var ref = vnode.vm || vnode.sp;

          if (vnode.refInFor) {
            if (!Array.isArray(refs[vnode.ref])) {
              refs[vnode.ref] = [ref];
            } else {
              var refList = refs[vnode.ref];
              if (refList.indexOf(ref) < 0) refList.push(ref);
            }
          } else {
            refs[vnode.ref] = ref;
          }
        } // 触发指令:只调用一次,指令第一次绑定到元素时调用


        this._triggerDirective('bind', vnode);

        vnode.children.forEach(function (child) {
          vnode.sp.addChild(_this._createDisObj(child));
        });
        popTarget();
        return vnode.sp;
      }
      /**
       * 更新显示对象
       * @param { VNode } oldVNode 旧虚拟节点
       * @param { VNode } newVNode 新虚拟节点
       */

    }, {
      key: "_updateDisObj",
      value: function _updateDisObj(oldVNode, newVNode) {
        if (oldVNode.vm) {
          // 更新继承属性
          for (var key in oldVNode.vm.$props) {
            if (hasOwn(this._vm.$props, key)) oldVNode.vm.$props[key] = this._vm.$props[key]; // bug:1.1.6 属性优先级错误,导致继承失败

            if (hasOwn(newVNode.attrs, key)) oldVNode.vm.$props[key] = newVNode.attrs[key];
          }

          var parentOptions = oldVNode.vm._parentOptions;
          var oldParentAttrs = parentOptions.attrs;
          parentOptions.attrs = [];

          for (var _key2 in newVNode.attrs) {
            if (!hasOwn(oldVNode.vm.$props, _key2)) parentOptions.attrs[_key2] = newVNode.attrs[_key2];
          } // 更新组件事件


          for (var type in newVNode.on) {
            parentOptions.listeners[type] = oldVNode.on[type] = newVNode.on[type] = this._updateInvoker(type, oldVNode, newVNode);
          }

          for (var _type3 in oldVNode.on) {
            if (isUndef(newVNode.on[_type3])) {
              this._removeInvoker(_type3, oldVNode);
            }
          } // 更新原生事件


          for (var _type4 in newVNode.nativeOn) {
            oldVNode.nativeOn[_type4] = newVNode.nativeOn[_type4] = this._updateInvoker(_type4, oldVNode, newVNode, true);
          }

          for (var _type5 in oldVNode.nativeOn) {
            if (isUndef(newVNode.nativeOn[_type5])) {
              this._removeInvoker(_type5, oldVNode, true);
            }
          } // 如果inheritAttrs不为false,则禁用 Attribute 继承


          if (false !== oldVNode.vm.$options.inheritAttrs) {
            this._updateAttrs(oldVNode, oldParentAttrs, parentOptions.attrs);
          }
        } else {
          // 如果是原生类,则直接更新原生事件
          for (var _type6 in newVNode.on) {
            oldVNode.on[_type6] = newVNode.on[_type6] = this._updateInvoker(_type6, oldVNode, newVNode);
          }

          for (var _type7 in oldVNode.on) {
            if (isUndef(newVNode.on[_type7])) {
              this._removeInvoker(_type7, oldVNode);
            }
          } // 更新属性


          this._updateAttrs(oldVNode, oldVNode.attrs, newVNode.attrs);
        } // 触发指令:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前


        this._triggerDirective('update', newVNode, oldVNode); // 更新子集


        this._updateChildren(oldVNode.children, newVNode.children, newVNode.sp); // 触发指令:指令所在组件的 VNode 及其子 VNode 全部更新后调用。


        this._triggerDirective('componentUpdated', newVNode, oldVNode);
      }
      /**
       * 通过虚拟节点销毁显示对象
       * @param { VNode } vnode
       * @return { VNode } 返回销毁的虚拟节点
       */

    }, {
      key: "_destroyDisObj",
      value: function _destroyDisObj(vnode) {
        var _this2 = this;

        if (vnode.vm) vnode.vm.$callHook('beforeDestroyed');

        if (vnode.sp) {
          // 触发指令
          this._triggerDirective('unbind', vnode); // 通过获取父节点,移除显示对象


          vnode.sp && vnode.sp.$parent && vnode.sp.$parent.removeChild(vnode.sp); // 移除组件事件

          if (!vnode.vm) {
            for (var type in vnode.on) {
              this._removeInvoker(type, vnode, false);
            }
          } // 移除原生事件


          for (var _type8 in vnode.nativeOn) {
            this._removeInvoker(_type8, vnode, true);
          }
        } // 触发销毁方法,不在此处销毁,由vm内处理销毁
        // if(vnode.vm) vnode.vm.$destroy()
        // 移除各项示例挂载


        if (vnode.ref) {
          var refs = this._vm.$refs;
          var ref = vnode.vm || vnode.sp;

          if (vnode.refInFor && Array.isArray(refs[vnode.ref])) {
            var refList = refs[vnode.ref];

            if (refList.length <= 1) {
              delete this._vm.$refs[vnode.ref];
            } else {
              var index = refList.indexOf(ref);

              if (index > 0) {
                refList.splice(index, 1);
              }
            }
          } else {
            delete this._vm.$refs[vnode.ref];
          }
        } // 递归子对象,进行销毁


        vnode.children.forEach(function (vnode) {
          return _this2._destroyDisObj(vnode);
        });
        return vnode;
      }
      /**
       * 新增属性
       * @param { VNode } 虚拟节点
       * @param { Record<string, any> } attrs 属性组
       */

    }, {
      key: "_addAttrs",
      value: function _addAttrs(vnode, attrs) {
        if (!hasOwn(vnode.sp, DEFAULT_ATTR)) vnode.sp[DEFAULT_ATTR] = {};

        for (var name in attrs) {
          vnode.sp[DEFAULT_ATTR][name] = vnode.sp[name];
          vnode.sp[name] = attrs[name];
        }
      }
      /**
       * 更新属性
       * @param { VNode } 虚拟节点
       * @param { Record<string, any> } oldAttrs 旧属性组
       * @param { Record<string, any> } newAttrs 新属性组
       */

    }, {
      key: "_updateAttrs",
      value: function _updateAttrs(vnode, oldAttrs, newAttrs) {
        for (var name in newAttrs) {
          if (oldAttrs[name] !== newAttrs[name]) {
            if (!hasOwn(vnode.sp[DEFAULT_ATTR], name)) {
              vnode.sp[DEFAULT_ATTR][name] = vnode.sp[name];
            }

            vnode.sp[name] = newAttrs[name];
          }
        }

        for (var _name in oldAttrs) {
          if (isUndef(newAttrs[_name])) {
            vnode.sp[_name] = vnode.sp[DEFAULT_ATTR][_name];
          }
        }
      }
      /**
       * 新增事件对象
       * @param { string } type 事件类型
       * @param { VNode } 虚拟节点
       * @param { boolean } isNative 是否原生事件
       * @return { VNodeInvoker } 事件对象
       */

    }, {
      key: "_addInvoker",
      value: function _addInvoker(type, vnode) {
        var isNative = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
        var prefix = isNative ? 'nativeOn' : 'on';
        var event = parseEvent(type);
        var on = vnode[prefix][type];

        if (isUndef(on.fns)) {
          on = createFnInvoker(on, this._vm);
        }

        if (!vnode.vm || isNative) {
          vnode.sp[event.once ? 'once' : 'addEventListener'](event.name, on, this._vm, event.capture);
        } else {
          vnode.vm[event.once ? '$once' : '$on'](event.name, on);
        }

        return on;
      }
      /**
       * 更新事件对象
       * @param { string } type 事件类型
       * @param { VNode } oldVNode 旧虚拟节点
       * @param { VNode } newVNode 新虚拟节点
       * @param { boolean } isNative 是否原生事件
       * @return { VNodeInvoker } 事件对象
       */

    }, {
      key: "_updateInvoker",
      value: function _updateInvoker(type, oldVNode, newVNode) {
        var isNative = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
        var prefix = isNative ? 'nativeOn' : 'on';
        var oldOn = oldVNode[prefix][type];
        var newOn = newVNode[prefix][type];

        if (isUndef(newOn)) ; else if (isUndef(oldOn)) {
          return this._addInvoker(type, newVNode, isNative);
        } else if (newOn !== oldOn) {
          //事件不一样的,直接替换内部执行函数
          oldOn.fns = newOn;
          return oldOn;
        }
      }
      /**
       * 移除事件对象
       * @param { string } type 事件类型
       * @param { VNode } 虚拟节点
       * @param { boolean } isNative 是否原生事件
       * @return { VNodeInvoker } 事件对象
       */

    }, {
      key: "_removeInvoker",
      value: function _removeInvoker(type, vnode) {
        var isNative = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
        var on = isNative ? vnode.nativeOn[type] : vnode.on[type];
        var event = parseEvent(type);

        if (!vnode.vm || isNative) {
          vnode.sp.removeEventListener(event.name, on, this._vm, event.capture);
        } else {
          vnode.vm.$off(event.name, on);
        }

        return on;
      }
      /**
       * 触发指令
       * @param { string } hook 钩子函数:bind | inserted | update | componentUpdated | unbind
       * @param { VNode } vnode 虚拟节点
       * @param { VNode } oldVnode 旧虚拟节点
       */

    }, {
      key: "_triggerDirective",
      value: function _triggerDirective(hook, vnode, oldVnode) {
        if (vnode.directives) {
          var oldDir = oldVnode && normalizeDirectives(oldVnode.directives);

          var _iterator2 = _createForOfIteratorHelper(vnode.directives),
              _step2;

          try {
            for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
              var dir = _step2.value;
              var directive = this._directives[dir.name];

              if (directive && directive[hook]) {
                var binding = _objectSpread2({}, dir);

                if (oldDir) {
                  if (hasOwn(oldDir[dir.name], 'value')) binding['oldValue'] = oldDir[dir.name].value;
                  if (hasOwn(oldDir[dir.name], 'arg')) binding['oldArg'] = oldDir[dir.arg].value;
                }

                directive[hook].apply(this._vm, [vnode.sp, binding].concat(Array.prototype.slice.call(arguments, 1)));
              }
            }
          } catch (err) {
            _iterator2.e(err);
          } finally {
            _iterator2.f();
          }
        }
      }
    }]);

    return Render;
  }();

  /* @flow */
  var seenObjects = new Set();
  /**
   * Recursively traverse an object to evoke all converted
   * getters, so that every nested property inside the object
   * is collected as a "deep" dependency.
   */

  function traverse(val) {
    _traverse(val, seenObjects);

    seenObjects.clear();
  }

  function _traverse(val, seen) {
    var i, keys;
    var isA = Array.isArray(val);

    if (!isA && !isObject(val) || Object.isFrozen(val)) {
      return;
    }

    if (val.__ob__) {
      var depId = val.__ob__.dep.id;

      if (seen.has(depId)) {
        return;
      }

      seen.add(depId);
    }

    if (isA) {
      i = val.length;

      while (i--) {
        _traverse(val[i], seen);
      }
    } else {
      keys = Object.keys(val);
      i = keys.length;

      while (i--) {
        _traverse(val[keys[i]], seen);
      }
    }
  }

  // Browser environment sniffing
  var inBrowser = typeof window !== 'undefined';
  var inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;
  var weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();
  var UA = inBrowser && window.navigator.userAgent.toLowerCase();
  UA && /msie|trident/.test(UA);
  UA && UA.indexOf('msie 9.0') > 0;
  var isEdge = UA && UA.indexOf('edge/') > 0;
  UA && UA.indexOf('android') > 0 || weexPlatform === 'android';
  var isIOS = UA && /iphone|ipad|ipod|ios/.test(UA) || weexPlatform === 'ios';
  UA && /chrome\/\d+/.test(UA) && !isEdge;
  UA && /phantomjs/.test(UA);
  UA && UA.match(/firefox\/(\d+)/);

  var callbacks = [];
  var pending = false;

  function flushCallbacks() {
    pending = false;
    var copies = callbacks.slice(0);
    callbacks.length = 0;

    for (var i = 0; i < copies.length; i++) {
      copies[i]();
    }
  } // Here we have async deferring wrappers using microtasks.
  // In 2.5 we used (macro) tasks (in combination with microtasks).
  // However, it has subtle problems when state is changed right before repaint
  // (e.g. #6813, out-in transitions).
  // Also, using (macro) tasks in event handler would cause some weird behaviors
  // that cannot be circumvented (e.g. #7109, #7153, #7546, #7834, #8109).
  // So we now use microtasks everywhere, again.
  // A major drawback of this tradeoff is that there are some scenarios
  // where microtasks have too high a priority and fire in between supposedly
  // sequential events (e.g. #4521, #6690, which have workarounds)
  // or even between bubbling of the same event (#6566).


  var p = Promise.resolve();

  var timerFunc = function timerFunc() {
    p.then(flushCallbacks); // In problematic UIWebViews, Promise.then doesn't completely break, but
    // it can get stuck in a weird state where callbacks are pushed into the
    // microtask queue but the queue isn't being flushed, until the browser
    // needs to do some other work, e.g. handle a timer. Therefore we can
    // "force" the microtask queue to be flushed by adding an empty timer.

    if (isIOS) setTimeout(noop);
  };

  function nextTick(cb, ctx) {
    var _resolve;

    callbacks.push(function () {
      if (cb) {
        try {
          cb.call(ctx);
        } catch (e) {
          console.log(e, ctx, 'nextTick');
        }
      } else if (_resolve) {
        _resolve(ctx);
      }
    });

    if (!pending) {
      pending = true;
      timerFunc();
    } // $flow-disable-line


    if (!cb && typeof Promise !== 'undefined') {
      return new Promise(function (resolve) {
        _resolve = resolve;
      });
    }
  }

  var queue = [];
  var activatedChildren = [];
  var has = {};
  var waiting = false;
  var flushing = false;
  var index = 0;
  /**
   * Reset the scheduler's state.
   */

  function resetSchedulerState() {
    index = queue.length = activatedChildren.length = 0;
    has = {};
    waiting = flushing = false;
  } // Async edge case #6566 requires saving the timestamp when event listeners are
  /**
   * Flush both queues and run the watchers.
   */

  function flushSchedulerQueue() {
    flushing = true;
    var watcher, id; // Sort queue before flush.
    // This ensures that:
    // 1. Components are updated from parent to child. (because parent is always
    //    created before the child)
    // 2. A component's user watchers are run before its render watcher (because
    //    user watchers are created before the render watcher)
    // 3. If a component is destroyed during a parent component's watcher run,
    //    its watchers can be skipped.

    queue.sort(function (a, b) {
      return a.id - b.id;
    }); // do not cache length because more watchers might be pushed
    // as we run existing watchers

    for (index = 0; index < queue.length; index++) {
      watcher = queue[index];

      if (watcher.before) {
        watcher.before();
      }

      id = watcher.id;
      has[id] = null;
      watcher.run();
    } // keep copies of post queues before resetting state


    var updatedQueue = queue.slice();
    resetSchedulerState(); // call component updated hooks

    callUpdatedHooks(updatedQueue);
  }

  function callUpdatedHooks(queue) {
    var i = queue.length;

    while (i--) {
      var watcher = queue[i];
      var vm = watcher.vm;

      if (vm._watcher === watcher && vm._isMounted && !vm._isDestroyed) {
        vm.$callHook('updated');
      }
    }
  }
  /**
   * Push a watcher into the watcher queue.
   * Jobs with duplicate IDs will be skipped unless it's
   * pushed when the queue is being flushed.
   */


  function queueWatcher(watcher) {
    var id = watcher.id;

    if (has[id] == null) {
      has[id] = true;

      if (!flushing) {
        queue.push(watcher);
      } else {
        // if already flushing, splice the watcher based on its id
        // if already past its id, it will be run next immediately.
        var i = queue.length - 1;

        while (i > index && queue[i].id > watcher.id) {
          i--;
        }

        queue.splice(i + 1, 0, watcher);
      } // queue the flush


      if (!waiting) {
        waiting = true;
        nextTick(flushSchedulerQueue);
      }
    }
  }

  var uid = 0;

  var Watcher = /*#__PURE__*/function () {
    function Watcher(vm, expOrFn, cb, options) {
      _classCallCheck(this, Watcher);

      // options
      if (options) {
        this.deep = !!options.deep;
        this.user = !!options.user;
        this.lazy = !!options.lazy;
        this.sync = !!options.sync;
        this.immediate = !!options.immediate;
        this.before = options.before;
      } else {
        this.deep = this.user = this.lazy = this.sync = this.immediate = false;
      }

      vm._watchers.push(this);

      this.id = uid++;
      this.active = true;
      this.dirty = this.lazy; // for lazy watchers

      this.vm = vm; // 存放dep实例

      this.deps = [];
      this.newDeps = []; // 存放dep的ID

      this.depIds = new Set();
      this.newDepIds = new Set(); // 更新触发回调函数

      this.cb = cb || noop; // parse expression for getter

      this.expression = expOrFn.toString();

      if ('function' === typeof expOrFn) {
        this.getter = expOrFn;
      } else {
        this.getter = parsePath(expOrFn);

        if (!this.getter) {
          this.getter = noop;
        }
      } // 如果非懒加载在创建watcher实例时先取一次值


      this.value = this.lazy ? undefined : this.get();

      if (this.immediate) {
        try {
          cb.call(vm, this.value);
        } catch (error) {
          console.error("callback for immediate watcher \"".concat(this.expression, "\""));
        }
      }
    }
    /**
     * Evaluate the getter, and re-collect dependencies.
     */


    _createClass(Watcher, [{
      key: "get",
      value: function get() {
        pushTarget(this);
        var value;

        try {
          value = this.getter.call(this.vm, this.vm);
        } catch (e) {
          // TODO
          console.log(e);
        } finally {
          // "touch" every property so they are all tracked as
          // dependencies for deep watching
          if (this.deep) {
            traverse(value);
          }

          popTarget();
          this.cleanupDeps();
        }

        return value;
      }
      /**
       * Add a dependency to this directive.
       */

    }, {
      key: "addDep",
      value: function addDep(dep) {
        var id = dep.id;

        if (!this.newDepIds.has(id)) {
          this.newDepIds.add(id);
          this.newDeps.push(dep);

          if (!this.depIds.has(id)) {
            dep.addSub(this);
          }
        }
      }
      /**
       * Clean up for dependency collection.
       */

    }, {
      key: "cleanupDeps",
      value: function cleanupDeps() {
        var i = this.deps.length;

        while (i--) {
          var dep = this.deps[i];

          if (!this.newDepIds.has(dep.id)) {
            dep.removeSub(this);
          }
        }

        var tmp = this.depIds;
        this.depIds = this.newDepIds;
        this.newDepIds = tmp;
        this.newDepIds.clear();
        var tmp2 = this.deps;
        this.deps = this.newDeps;
        this.newDeps = tmp2;
        this.newDeps.length = 0;
      }
      /**
       * Subscriber interface.
       * Will be called when a dependency changes.
       */

    }, {
      key: "update",
      value: function update() {
        /* istanbul ignore else */
        if (this.lazy) {
          this.dirty = true;
        } else if (this.sync) {
          this.run();
        } else {
          queueWatcher(this);
        }
      }
      /**
       * Scheduler job interface.
       * Will be called by the scheduler.
       */

    }, {
      key: "run",
      value: function run() {
        if (!this.active) return;
        var value = this.get();

        if (value !== this.value || // Deep watchers and watchers on Object/Arrays should fire even
        // when the value is the same, because the value may
        // have mutated.
        isObject(value)) {
          // set new value
          var oldValue = this.value;
          this.value = value;
          this.cb.call(this.vm, value, oldValue);
        }
      }
      /**
       * Evaluate the value of the watcher.
       * This only gets called for lazy watchers.
       */

    }, {
      key: "evaluate",
      value: function evaluate() {
        this.value = this.get();
        this.dirty = false;
      }
      /**
       * Depend on all deps collected by this watcher.
       */

    }, {
      key: "depend",
      value: function depend() {
        var i = this.deps.length;

        while (i--) {
          this.deps[i].depend();
        }
      }
      /**
       * Remove self from all dependencies' subscriber list.
       */

    }, {
      key: "teardown",
      value: function teardown() {
        if (!this.active) return; // remove self from vm's watcher list
        // this is a somewhat expensive operation so we skip it
        // if the vm is being destroyed.

        var i = this.deps.length;

        while (i--) {
          this.deps[i].removeSub(this);
        }

        this.active = false;
      }
    }]);

    return Watcher;
  }();

  /*
   * not type checking this file because flow doesn't play well with
   * dynamically accessing methods on Array prototype
   */
  var arrayProto = Array.prototype;
  var arrayMethods = Object.create(arrayProto);
  var arrayKeys = Object.getOwnPropertyNames(arrayMethods);
  var methodsToPatch = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'];
  /**
   * Intercept mutating methods and emit events
   */

  methodsToPatch.forEach(function (method) {
    // cache original method
    var original = arrayProto[method];
    def(arrayMethods, method, function mutator() {
      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
        args[_key] = arguments[_key];
      }

      var result = original.apply(this, args);
      var ob = this.__ob__;
      var inserted;

      switch (method) {
        case 'push':
        case 'unshift':
          inserted = args;
          break;

        case 'splice':
          inserted = args.slice(2);
          break;
      }

      if (inserted) ob.observeArray(inserted); // notify change

      ob.dep.notify();
      return result;
    });
  });

  var Observer = /*#__PURE__*/function () {
    function Observer(value) {
      _classCallCheck(this, Observer);

      this.value = value;
      this.dep = new Dep();
      this.vmCount = 0;
      def(value, '__ob__', this);

      if (Array.isArray(value)) {
        if (hasProto) {
          protoAugment(value, arrayMethods);
        } else {
          copyAugment(value, arrayMethods, arrayKeys);
        }

        value.forEach(function (item) {
          return observe(item);
        });
      } else {
        this.walk(value);
      }
    }
    /**
     * Walk through all properties and convert them into
     * getter/setters. This method should only be called when
     * value type is Object.
     */


    _createClass(Observer, [{
      key: "walk",
      value: function walk(obj) {
        for (var key in obj) {
          defineReactive(obj, key);
        }
      }
      /**
       * Observe a list of Array items.
       */

    }, {
      key: "observeArray",
      value: function observeArray(items) {
        items.forEach(function (item) {
          return observe(item);
        });
      }
    }]);

    return Observer;
  }();
  function defineReactive(obj, key, val) {
    var dep = new Dep();
    var property = Object.getOwnPropertyDescriptor(obj, key);

    if (property && property.configurable === false) {
      return;
    } // cater for pre-defined getter/setters


    var getter = property && property.get;
    var setter = property && property.set;

    if ((!getter || setter) && arguments.length === 2) {
      val = obj[key];
    }

    var childOb = observe(val);
    Object.defineProperty(obj, key, {
      enumerable: true,
      configurable: true,
      get: function get() {
        var value = getter ? getter.call(obj) : val;

        if (Dep.target) {
          dep.depend();

          if (childOb) {
            childOb.dep.depend();

            if (Array.isArray(value)) {
              dependArray(value);
            }
          }
        }

        return value;
      },
      set: function set(newVal) {
        var value = getter ? getter.call(obj) : val;
        /* eslint-disable no-self-compare */

        if (newVal === value || newVal !== newVal && value !== value) {
          return;
        }
        /* try {
          if (
            (Array.isArray(newVal) || isPlainObject(newVal)) &&
            Object.isExtensible(newVal) &&
            !(newVal instanceof egret.HashObject) &&
            !newVal._isVue
          ) {
            // 复杂类型的比较,如果复杂类型数据没有不同,只是引用不一的话,则不更新
            return;
          }
        } catch (e) {
          // TODO
          console.log(e);
        } */
        // #7981: for accessor properties without setter


        if (getter && !setter) return;

        if (setter) {
          setter.call(obj, newVal);
        } else {
          val = newVal;
        }

        childOb = observe(newVal);
        dep.notify();
      }
    });
  }
  /**
   * Attempt to create an observer instance for a value,
   * returns the new observer if successfully observed,
   * or the existing observer if the value already has one.
   */

  function observe(value, asRootData) {
    if (!isObject(value)) return;
    var ob;

    if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {
      ob = value.__ob__;
    } else if ((Array.isArray(value) || isPlainObject(value)) && Object.isExtensible(value) && !(value instanceof egret.HashObject) && !value._isVue) {
      ob = new Observer(value);
    }

    if (asRootData && ob) {
      ob.vmCount++;
    }

    return ob;
  }
  /**
   * Set a property on an object. Adds the new property and
   * triggers change notification if the property doesn't
   * already exist.
   */

  function set(target, key, val) {
    if (Array.isArray(target) && isValidArrayIndex(key)) {
      target.length = Math.max(target.length, key);
      target.splice(key, 1, val);
      return val;
    }

    if (key in target && !(key in Object.prototype)) {
      target[key] = val;
      return val;
    }

    var ob = target.__ob__;

    if (target._isVue || ob && ob.vmCount) {
      console.warn('Avoid adding reactive properties to a Vue instance or its root $data at runtime - declare it upfront in the data option.');
      return val;
    }

    if (!ob) {
      target[key] = val;
      return val;
    }

    defineReactive(ob.value, key, val);
    ob.dep.notify();
    return val;
  }
  /**
   * Delete a property and trigger change if necessary.
   */

  function del(target, key) {
    if (Array.isArray(target) && isValidArrayIndex(key)) {
      target.splice(key, 1);
      return;
    }

    var ob = target.__ob__;

    if (target._isVue || ob && ob.vmCount) {
      console.warn('Avoid deleting properties on a Vue instance or its root $data - just set it to null.');
      return;
    }

    if (!hasOwn(target, key)) {
      return;
    }

    delete target[key];

    if (!ob) {
      return;
    }

    ob.dep.notify();
  }
  /**
   * Collect dependencies on array elements when the array is touched, since
   * we cannot intercept array element access like property getters.
   */

  function dependArray(arr) {
    arr.forEach(function (e) {
      e && e.__ob__ && e.__ob__.dep.depend();

      if (Array.isArray(e)) {
        dependArray(e);
      }
    });
  }
  /**
   * Augment a target Object or Array by intercepting
   * the prototype chain using __proto__
   */


  function protoAugment(target, src) {
    /* eslint-disable no-proto */
    target.__proto__ = src;
    /* eslint-enable no-proto */
  }
  /**
   * Augment a target Object or Array by defining
   * hidden properties.
   */

  /* istanbul ignore next */


  function copyAugment(target, src, keys) {
    for (var i = 0, l = keys.length; i < l; i++) {
      var key = keys[i];
      def(target, key, src[key]);
    }
  }

  /**
   * Use function string name to check built-in types,
   * because a simple equality check will fail when running
   * across different vms / iframes.
   * eg: Boolean => function Boolean() { [native code] } => 'Boolean'
   */

  function getType(fn) {
    var match = fn && fn.toString().match(/^\s*function (\w+)/);
    return match ? match[1] : '';
  }

  function isSameType(a, b) {
    return getType(a) === getType(b);
  }
  function checkType(type, expectedTypes) {
    var eTypes = Array.isArray(expectedTypes) ? expectedTypes : [expectedTypes];
    return eTypes.some(function (eType) {
      return isSameType(eType, type);
    });
  }
  function normalizeProp(propsOptions) {
    var props = {};
    var val;

    if (Array.isArray(propsOptions)) {
      for (var i = propsOptions.length - 1; i >= 0; i--) {
        val = propsOptions[i];

        if (typeof val === 'string') {
          props[val] = {
            type: null
          };
        }
      }
    } else {
      for (var key in propsOptions) {
        val = propsOptions[key];
        props[key] = isPlainObject(val) ? val : {
          type: val
        };
      }
    }

    return props;
  }
  function validateProp(options, vm) {
    if ('object' === _typeof(options) && options.type) {
      if (typeof options.default === 'function') {
        if (!checkType(Function, options.type)) return options.default.call(vm);
      } else if (typeof options.default === 'undefined') {
        if (checkType(String, options.type)) return '';else if (checkType(Number, options.type)) return 0;else if (checkType(Boolean, options.type)) return false;else if (checkType(Array, options.type)) return [];else if (checkType(Object, options.type)) return {};
      }

      return options.default;
    }

    return options;
  }

  /**
   * 动画Promise包装
   * @description 用于检测egret.Tween是否被安装,且空值时,返回this的Tween
   * @author Hsuna
   * @param { Array<TweenData> } params 运动参数
   * - egret.Tween.set: ['set', :props]
   * - egret.Tween.to: ['to', :props, :duration?, :ease?]
   * - egret.Tween.wait: ['wait', :duration, :passive?]
   * @param { RefData } target 可选,运动对象
   * @return { Promise<egret.Tween> }
   */
  function tween() {
    var _this = this;

    var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
    var target = arguments.length > 1 ? arguments[1] : undefined;

    for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
      args[_key - 2] = arguments[_key];
    }

    if ('Tween' in egret) {
      return new Promise(function (resolve) {
        var _egret$Tween;

        var t = (_egret$Tween = egret.Tween).get.apply(_egret$Tween, [target || _this].concat(args));

        params.forEach(function (_ref) {
          var _t;

          var _ref2 = _toArray(_ref),
              name = _ref2[0],
              args = _ref2.slice(1);

          if ('function' === typeof t[name]) t = (_t = t)[name].apply(_t, _toConsumableArray(args)); // 至少要一个参数,所以这里拆成arg0和args
        });
        t.call(resolve, _this, [t]);
      }); //return tween instanceof egret.Tween ? tween : ;
    } else throw 'The egret.Tween.js not import!!!';
  }

  /**
   * 组件类
   * @author Hsuna
   * @param { ComponentOptions } options 组件配置
   * @param { ComponentParentOptions } parentOptions 继承配置
   */

  var Component = /*#__PURE__*/function () {
    function Component() {
      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
      var parentOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

      _classCallCheck(this, Component);

      /** 子组件集合 */
      this.$children = [];
      /** 获取注册列表 */

      this.$refs = {}; // 全局方法

      /** 设置对象的 property */

      this.$set = set;
      /** 删除对象的 property */

      this.$delete = del;
      /** 回调延迟到下次更新 */

      this.$nextTick = function (fn) {
        return nextTick(fn, this);
      };
      /** Tween方法 */


      this.$tween = tween; // private __tickHandler: ComponentMap<Function> = [];

      this._global = {};
      this._data = {};
      this._props = {};
      this._hasHookEvent = false; // 状态值

      this._isVue = true;
      this._isMounted = false;
      this._isBeingDestroyed = false;
      this._isDestroyed = false;
      this._watchers = [];
      this._events = {};
      this._components = {};
      this._directives = {};
      this.$options = options;
      this._parentOptions = parentOptions;

      this._init();
    }

    _createClass(Component, [{
      key: "_init",
      value: function _init() {
        this.$parent = this._parentOptions.parent;
        if (this.$parent) this.$parent.$children.push(this);
        this.$root = this.$parent ? this.$parent.$root : this;

        this._initMethods(this.$options.methods);

        this.$callHook('beforeCreate');

        this._initGlobal();

        this._initData(this.$options.data);

        this._initProps(this.$options.props, this._parentOptions.propsData);

        this._initComputed(this.$options.computed);

        this._initWatch(this.$options.watch);

        this._initComponents(this.$options.components);

        this._initDirectives(this.$options.directives);

        this.$callHook('created');
        this._render = new Render(this);

        this._initEvent();
      }
    }, {
      key: "_initEvent",
      value: function _initEvent() {
        var _this = this;

        /* 添加到显示列表时触发挂载 */
        this.$el.once(egret.Event.ADDED, function () {
          return _this._render.inserted();
        }, this.$el);
        /* 添加到舞台时触发挂载 */

        this.$el.once(egret.Event.ADDED_TO_STAGE, function () {
          _this.$callHook('beforeMount');

          _this._global.stage = _this.$el.stage;
          _this._watcher = new Watcher(_this, function () {
            if (!_this._render) return; // 防止渲染器销毁时,进程依然回调方法

            if (_this._isMounted) _this.$callHook('beforeUpdate');

            _this._render.update();
          }, noop);
          _this._isMounted = true;

          _this.$callHook('mounted');
        }, this.$el);
        /* 从舞台移除时销毁该示例 */

        this.$el.once(egret.Event.REMOVED_FROM_STAGE, function () {
          return _this.$destroy();
        }, this.$el);
      }
      /** 初始化全局参数,用于全局方便获取 */

    }, {
      key: "_initGlobal",
      value: function _initGlobal() {
        this._global = {
          stage: new egret.Stage()
        }; // 监听数据

        observe(this._global, true);
      }
    }, {
      key: "_initProps",
      value: function _initProps() {
        var _this2 = this;

        var propsOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
        var propsData = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
        var props = normalizeProp(propsOptions); // normalizeProp

        var _loop = function _loop(key) {
          _this2._props[key] = hasOwn(propsData, key) ? propsData[key] : validateProp(props[key], _this2);
          Object.defineProperty(_this2, key, {
            get: function get() {
              return this._props[key];
            },
            set: function set(val) {
              console.error('The props data not set!');
            }
          });
        };

        for (var key in props) {
          _loop(key);
        } // 监听数据


        observe(this._props, true);
      }
    }, {
      key: "_initData",
      value: function _initData(data) {
        var _this3 = this;

        this._data = typeof data === 'function' ? this._getData(data) : data || {};

        var _loop2 = function _loop2(key) {
          Object.defineProperty(_this3, key, {
            get: function get() {
              return this._data[key];
            },
            set: function set(val) {
              this._data[key] = val;
            }
          });
        };

        for (var key in this._data) {
          _loop2(key);
        } // 监听数据


        observe(this._data, true);
      }
    }, {
      key: "_initMethods",
      value: function _initMethods() {
        var methods = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

        // 将methods上的方法赋值到vm实例上
        for (var e in methods) {
          this[e] = methods[e];
        }
      }
    }, {
      key: "_initComputed",
      value: function _initComputed() {
        var computed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
        var propertyDefinition;

        for (var key in computed) {
          var userDef = computed[key] || noop;
          propertyDefinition = typeof userDef === 'function' ? {
            get: userDef,
            set: noop
          } : {
            get: userDef.get,
            set: userDef.set
          };
          Object.defineProperty(this, key, propertyDefinition);
        }
      }
    }, {
      key: "_initWatch",
      value: function _initWatch() {
        var _this4 = this;

        var watch = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

        var _loop3 = function _loop3(key) {
          var handler = watch[key];

          if (Array.isArray(handler)) {
            handler.forEach(function (h) {
              return _this4._createWatcher(key, h);
            });
          } else {
            _this4._createWatcher(key, handler);
          }
        };

        for (var key in watch) {
          _loop3(key);
        }
      }
    }, {
      key: "_initComponents",
      value: function _initComponents() {
        var components = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

        for (var name in components) {
          this._components[name] = VueEgret.extend(components[name]);
        }
      }
    }, {
      key: "_initDirectives",
      value: function _initDirectives() {
        var directives = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

        for (var name in directives) {
          this._directives[name] = directives[name];
        }
      }
    }, {
      key: "_getData",
      value: function _getData(data) {
        pushTarget();

        try {
          return data.call(this, this);
        } catch (e) {
          console.log(e);
          return {};
        } finally {
          popTarget();
        }
      }
    }, {
      key: "_createWatcher",
      value: function _createWatcher(expOrFn, handler, options) {
        if (isPlainObject(handler)) {
          options = handler;
          handler = handler.handler;
        }

        if (typeof handler === 'string') {
          handler = this[handler];
        }

        return this.$watch(expOrFn, handler, options);
      }
    }, {
      key: "$on",
      value: function $on(event, fn) {
        var _this5 = this;

        if (Array.isArray(event)) {
          event.forEach(function (evt) {
            return _this5.$on(evt, fn);
          });
        } else {
          var events = this._events[event] || (this._events[event] = []);
          events.push(fn); // optimize hook:event cost by using a boolean flag marked at registration
          // instead of a hash lookup

          if (isHook(event)) {
            this._hasHookEvent = true;
          }
        }

        return this;
      }
    }, {
      key: "$once",
      value: function $once(event, fn) {
        var _this6 = this;

        var on = function on() {
          _this6.$off(event, on);

          for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
            args[_key] = arguments[_key];
          }

          return fn.apply(_this6, args);
        };

        on.fn = fn;
        this.$on(event, on);
        return this;
      }
    }, {
      key: "$off",
      value: function $off(event, fn) {
        var _this7 = this;

        // all
        if (!arguments.length) {
          this._events = Object.create(null);
          this._hasHookEvent = false;
          return this;
        } // array of events


        if (Array.isArray(event)) {
          event.forEach(function (evt) {
            return _this7.$off(evt, fn);
          });
          return this;
        } // specific event


        var cbs = this._events[event];

        if (!cbs) {
          return this;
        }

        if (!fn) {
          this._events[event] = null;
          return this;
        }

        if (fn) {
          // specific handler
          var cb;
          var i = cbs.length;

          while (i--) {
            cb = cbs[i];

            if (cb === fn) {
              cbs.splice(i, 1);
              break;
            }
          }
        }

        return this;
      }
    }, {
      key: "$emit",
      value: function $emit(event) {
        var _this8 = this;

        for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
          args[_key2 - 1] = arguments[_key2];
        }

        var cbs = this._events[event];

        if (cbs) {
          _toConsumableArray(cbs).forEach(function (cb) {
            return cb.apply(_this8.$parent, args);
          });
        }

        return this;
      }
      /**
       *
       * @param expOrFn
       * @param cb
       * @param options
       */

    }, {
      key: "$watch",
      value: function $watch(expOrFn, cb, options) {
        if (isPlainObject(cb)) {
          return this._createWatcher(expOrFn, cb, options);
        }

        options = options || {};
        var watcher = new Watcher(this, expOrFn, cb, options);
        return function unwatchFn() {
          watcher.teardown();
        };
      }
    }, {
      key: "$callHook",
      value: function $callHook(name) {
        // 阻断所有数据变动
        pushTarget();

        if ('function' === typeof this.$options[name]) {
          var _this$$options$name;

          for (var _len3 = arguments.length, rest = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
            rest[_key3 - 1] = arguments[_key3];
          }

          (_this$$options$name = this.$options[name]).call.apply(_this$$options$name, [this].concat(rest));
        }

        if (this._hasHookEvent) {
          this.$emit('hook:' + name);
        }

        popTarget();
      }
      /**
       * 强制刷新
       */

    }, {
      key: "$forceUpdate",
      value: function $forceUpdate() {
        if (this._watcher) {
          this._watcher.update();
        }
      }
      /**
       * 挂载
       * @param { egret.DisplayObjectContainer } parent 挂载对象
       * @return { Component }
       */

    }, {
      key: "$mount",
      value: function $mount(parent) {
        if (parent instanceof egret.DisplayObjectContainer && this.$el) {
          parent.addChild(this.$el);
        }

        return this;
      }
      /**
       * 销毁
       * @description 销毁对象
       * @author Hsuna
       */

    }, {
      key: "$destroy",
      value: function $destroy() {
        if (this._isBeingDestroyed) return;
        this.$callHook('beforeDestroy');
        this._isBeingDestroyed = true; // 从parent列表中移除

        if (this.$parent && !this.$parent._isBeingDestroyed) {
          var index = this.$parent.$children.indexOf(this);
          if (index > -1) this.$parent.$children.splice(index, 1);
        } // 销毁观察器


        if (this._watcher) {
          this._watcher.teardown();

          this._watcher = null;
          this._watchers = null;
        } // 销毁渲染器


        if (this._render) {
          this._render.destroy();

          this._render = null;
        } // 销毁内部事件


        if (this._events) {
          this._events = null;
        }

        this._isDestroyed = true;
        this.$callHook('destroyed');
      }
      /**
       * 通过挂载名或者组件,获取实际的显示对象
       * @param { ComponentRef } ref 显示对象名
       * @param { boolean } isAll 是否返回全部,如果选是,则返回数组对象
       * @return { TArray<egret.DisplayObject> }
       */

    }, {
      key: "$displayObject",
      value: function $displayObject(ref, isAll) {
        var _this9 = this;

        if ('string' === typeof ref) {
          // 挂载名
          var refs = this.$refs[ref];

          if (Array.isArray(refs)) {
            if (isAll) return refs.map(function (ref) {
              return _this9.$displayObject(ref);
            });
            return this.$displayObject(refs[0]);
          }

          return this.$displayObject(refs);
        } else if (ref instanceof Component) {
          // 组件
          return ref.$el;
        } else if (ref instanceof egret.DisplayObject) {
          // 显示对象本身
          return ref;
        }

        return null;
      }
      /**
       * 碰撞检测
       * @description 用于检测两个显示对象间是否存在碰撞
       * @author Hsuna
       * @param { ComponentRef } ref1 显示对象1
       * @param { ComponentRef } ref2 显示对象2
       * @return { boolean }
       */

    }, {
      key: "$hitTest",
      value: function $hitTest(ref1, ref2) {
        var disObj1 = this.$displayObject(ref1);
        var disObj2 = this.$displayObject(ref2);
        if (!disObj1 || !disObj2) return true;
        var rect1 = disObj1.getBounds();
        var rect2 = disObj2.getBounds();
        rect1.x = disObj1.x, rect1.y = disObj1.y;
        rect2.x = disObj2.x, rect2.y = disObj2.y;
        return rect1.intersects(rect2);
      }
      /**
       * 坐标点碰撞检测
       * @description 用于检测坐标点是否在对象内
       * @author Hsuna
       * @param { ComponentRef } ref 显示对象
       * @param { number } x 坐标X
       * @param { number } y 坐标Y
       * @param { boolean } shapeFlag 是否采用像素值检测
       * @return { boolean }
       */

    }, {
      key: "$hitTestPoint",
      value: function $hitTestPoint(ref, x, y, shapeFlag) {
        var disObj = this.$displayObject(ref);
        return disObj ? disObj.hitTestPoint(x, y, shapeFlag) : false;
      }
      /**
       * 将全局坐标转化为本地坐标
       * @param { ComponentRef } ref 显示对象
       * @param { number } stateX  全局坐标X
       * @param { number } stateY  全局坐标Y
       * @return { egret.Point } 本地坐标
       */

    }, {
      key: "$globalToLocal",
      value: function $globalToLocal(ref, stateX, stateY) {
        var disObj = this.$displayObject(ref);
        var resultPoint = new egret.Point(stateX, stateY);
        disObj && disObj.globalToLocal(stateX, stateY, resultPoint);
        return resultPoint;
      }
      /**
       * 将本地坐标转化为全局坐标
       * @param { ComponentRef } ref 显示对象
       * @param { number } localX  本地坐标X
       * @param { number } localY  本地坐标Y
       * @return { egret.Point } 全局坐标
       */

    }, {
      key: "$localToGlobal",
      value: function $localToGlobal(ref, localX, localY) {
        var disObj = this.$displayObject(ref);
        var resultPoint = new egret.Point(localX, localY);
        disObj && disObj.localToGlobal(localX, localY, resultPoint);
        return resultPoint;
      }
      /**
       * 获取舞台信息
       * @return { egret.Stage }
       */

    }, {
      key: "$stage",
      get: function get() {
        return this._global.stage;
      }
      /**
       * 获取舞台宽度
       * @return { number }
       */

    }, {
      key: "$stageWidth",
      get: function get() {
        return this._global.stage.stageWidth;
      }
      /**
       * 获取舞台高度
       * @return { number }
       */

    }, {
      key: "$stageHeight",
      get: function get() {
        return this._global.stage.stageHeight;
      }
    }, {
      key: "$data",
      get: function get() {
        return this._data;
      }
    }, {
      key: "$props",
      get: function get() {
        return this._props;
      }
      /** 获取属性 */

    }, {
      key: "$attrs",
      get: function get() {
        return this._parentOptions.attrs || emptyObject;
      }
      /** 获取事件 */

    }, {
      key: "$listeners",
      get: function get() {
        return this._parentOptions.listeners || emptyObject;
      }
    }]);

    return Component;
  }();
  /**
   * VueEgret类
   * @description
   * @author Hsuna
   */

  var VueEgret = /*#__PURE__*/function (_Component) {
    _inherits(VueEgret, _Component);

    var _super = _createSuper(VueEgret);

    function VueEgret(options) {
      _classCallCheck(this, VueEgret);

      return _super.call(this, options);
    }
    /**
     * 设置全局组件
     * @param { string } name 组件名 用于全局定义
     * @param { ComponentOptions } options 组件配置
     */


    _createClass(VueEgret, null, [{
      key: "component",
      value: function component(name, options) {
        if (options) return VueEgret._components[name] = VueEgret.extend(options);
        return VueEgret._components[name];
      }
      /**
       * 设置全局指令
       */

    }, {
      key: "directive",
      value: function directive(name, definition) {
        if (definition) return VueEgret._directives[name] = typeof definition === 'function' ? {
          bind: definition,
          update: definition
        } : definition;
        return VueEgret._directives[name];
      }
      /**
       * 通过配置,获取组件类型
       * @param { ComponentOptions } options
       */

    }, {
      key: "extend",
      value: function extend(options) {
        var _a;

        if ('function' === typeof options) return options;
        return _a = /*#__PURE__*/function (_Component2) {
          _inherits(_a, _Component2);

          var _super2 = _createSuper(_a);

          function _a() {
            var parentOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

            _classCallCheck(this, _a);

            return _super2.call(this, options, parentOptions);
          }

          return _a;
        }(Component), _a.cid = VueEgret.cid++, _a.options = options, _a;
      }
      /**
       * 通过配置,获取主类
       * 由于egret启动是需要实例化Main类
       * @param { ComponentOptions } options
       */

    }, {
      key: "classMain",
      value: function classMain(options) {
        return /*#__PURE__*/function (_egret$DisplayObjectC) {
          _inherits(_class, _egret$DisplayObjectC);

          var _super3 = _createSuper(_class);

          function _class() {
            var _this10;

            _classCallCheck(this, _class);

            _this10 = _super3.call(this);
            _this10.vm = new VueEgret(options);

            _this10.vm.$mount(_assertThisInitialized(_this10));

            return _this10;
          }

          return _class;
        }(egret.DisplayObjectContainer);
      }
    }]);

    return VueEgret;
  }(Component);
  VueEgret.cid = 0;
  /** 版本号 */

  VueEgret.version = "1.4.2";
  /** 组件库缓存 */

  VueEgret._components = {};
  /** 指令缓存 */

  VueEgret._directives = {};
  VueEgret.set = set;
  VueEgret.delete = del;
  VueEgret.nextTick = nextTick;

  // iife/cjs usage extends esm default export - so import it all

  return VueEgret;

})));