1/*! 2 * Vue.js v2.6.14 3 * (c) 2014-2021 Evan You 4 * Released under the MIT License. 5 */ 6(function (global, factory) { 7 typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : 8 typeof define === 'function' && define.amd ? define(factory) : 9 (global = global || self, global.Vue = factory()); 10}(this, function () { 'use strict'; 11 12 /* */ 13 14 var emptyObject = Object.freeze({}); 15 16 // These helpers produce better VM code in JS engines due to their 17 // explicitness and function inlining. 18 function isUndef (v) { 19 return v === undefined || v === null 20 } 21 22 function isDef (v) { 23 return v !== undefined && v !== null 24 } 25 26 function isTrue (v) { 27 return v === true 28 } 29 30 function isFalse (v) { 31 return v === false 32 } 33 34 /** 35 * Check if value is primitive. 36 */ 37 function isPrimitive (value) { 38 return ( 39 typeof value === 'string' || 40 typeof value === 'number' || 41 // $flow-disable-line 42 typeof value === 'symbol' || 43 typeof value === 'boolean' 44 ) 45 } 46 47 /** 48 * Quick object check - this is primarily used to tell 49 * Objects from primitive values when we know the value 50 * is a JSON-compliant type. 51 */ 52 function isObject (obj) { 53 return obj !== null && typeof obj === 'object' 54 } 55 56 /** 57 * Get the raw type string of a value, e.g., [object Object]. 58 */ 59 var _toString = Object.prototype.toString; 60 61 function toRawType (value) { 62 return _toString.call(value).slice(8, -1) 63 } 64 65 /** 66 * Strict object type check. Only returns true 67 * for plain JavaScript objects. 68 */ 69 function isPlainObject (obj) { 70 return _toString.call(obj) === '[object Object]' 71 } 72 73 function isRegExp (v) { 74 return _toString.call(v) === '[object RegExp]' 75 } 76 77 /** 78 * Check if val is a valid array index. 79 */ 80 function isValidArrayIndex (val) { 81 var n = parseFloat(String(val)); 82 return n >= 0 && Math.floor(n) === n && isFinite(val) 83 } 84 85 function isPromise (val) { 86 return ( 87 isDef(val) && 88 typeof val.then === 'function' && 89 typeof val.catch === 'function' 90 ) 91 } 92 93 /** 94 * Convert a value to a string that is actually rendered. 95 */ 96 function toString (val) { 97 return val == null 98 ? '' 99 : Array.isArray(val) || (isPlainObject(val) && val.toString === _toString) 100 ? JSON.stringify(val, null, 2) 101 : String(val) 102 } 103 104 /** 105 * Convert an input value to a number for persistence. 106 * If the conversion fails, return original string. 107 */ 108 function toNumber (val) { 109 var n = parseFloat(val); 110 return isNaN(n) ? val : n 111 } 112 113 /** 114 * Make a map and return a function for checking if a key 115 * is in that map. 116 */ 117 function makeMap ( 118 str, 119 expectsLowerCase 120 ) { 121 var map = Object.create(null); 122 var list = str.split(','); 123 for (var i = 0; i < list.length; i++) { 124 map[list[i]] = true; 125 } 126 return expectsLowerCase 127 ? function (val) { return map[val.toLowerCase()]; } 128 : function (val) { return map[val]; } 129 } 130 131 /** 132 * Check if a tag is a built-in tag. 133 */ 134 var isBuiltInTag = makeMap('slot,component', true); 135 136 /** 137 * Check if an attribute is a reserved attribute. 138 */ 139 var isReservedAttribute = makeMap('key,ref,slot,slot-scope,is'); 140 141 /** 142 * Remove an item from an array. 143 */ 144 function remove (arr, item) { 145 if (arr.length) { 146 var index = arr.indexOf(item); 147 if (index > -1) { 148 return arr.splice(index, 1) 149 } 150 } 151 } 152 153 /** 154 * Check whether an object has the property. 155 */ 156 var hasOwnProperty = Object.prototype.hasOwnProperty; 157 function hasOwn (obj, key) { 158 return hasOwnProperty.call(obj, key) 159 } 160 161 /** 162 * Create a cached version of a pure function. 163 */ 164 function cached (fn) { 165 var cache = Object.create(null); 166 return (function cachedFn (str) { 167 var hit = cache[str]; 168 return hit || (cache[str] = fn(str)) 169 }) 170 } 171 172 /** 173 * Camelize a hyphen-delimited string. 174 */ 175 var camelizeRE = /-(\w)/g; 176 var camelize = cached(function (str) { 177 return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; }) 178 }); 179 180 /** 181 * Capitalize a string. 182 */ 183 var capitalize = cached(function (str) { 184 return str.charAt(0).toUpperCase() + str.slice(1) 185 }); 186 187 /** 188 * Hyphenate a camelCase string. 189 */ 190 var hyphenateRE = /\B([A-Z])/g; 191 var hyphenate = cached(function (str) { 192 return str.replace(hyphenateRE, '-$1').toLowerCase() 193 }); 194 195 /** 196 * Simple bind polyfill for environments that do not support it, 197 * e.g., PhantomJS 1.x. Technically, we don't need this anymore 198 * since native bind is now performant enough in most browsers.
199 * But removing it would mean breaking code that was able to run in 200 * PhantomJS 1.x, so this must be kept for backward compatibility. 201 */ 202 203 /* istanbul ignore next */ 204 function polyfillBind (fn, ctx) { 205 function boundFn (a) { 206 var l = arguments.length; 207 return l 208 ? l > 1 209 ? fn.apply(ctx, arguments) 210 : fn.call(ctx, a) 211 : fn.call(ctx) 212 } 213 214 boundFn._length = fn.length; 215 return boundFn 216 } 217 218 function nativeBind (fn, ctx) { 219 return fn.bind(ctx) 220 } 221 222 var bind = Function.prototype.bind 223 ? nativeBind 224 : polyfillBind; 225 226 /** 227 * Convert an Array-like object to a real Array. 228 */ 229 function toArray (list, start) { 230 start = start || 0; 231 var i = list.length - start; 232 var ret = new Array(i); 233 while (i--) { 234 ret[i] = list[i + start]; 235 } 236 return ret 237 } 238 239 /** 240 * Mix properties into target object. 241 */ 242 function extend (to, _from) { 243 for (var key in _from) { 244 to[key] = _from[key]; 245 } 246 return to 247 } 248 249 /** 250 * Merge an Array of Objects into a single Object. 251 */ 252 function toObject (arr) { 253 var res = {}; 254 for (var i = 0; i < arr.length; i++) { 255 if (arr[i]) { 256 extend(res, arr[i]); 257 } 258 } 259 return res 260 } 261 262 /* eslint-disable no-unused-vars */ 263 264 /** 265 * Perform no operation. 266 * Stubbing args to make Flow happy without leaving useless transpiled code 267 * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/). 268 */ 269 function noop (a, b, c) {} 270 271 /** 272 * Always return false. 273 */ 274 var no = function (a, b, c) { return false; }; 275 276 /* eslint-enable no-unused-vars */ 277 278 /** 279 * Return the same value. 280 */ 281 var identity = function (_) { return _; }; 282 283 /** 284 * Generate a string containing static keys from compiler modules. 285 */ 286 function genStaticKeys (modules) { 287 return modules.reduce(function (keys, m) { 288 return keys.concat(m.staticKeys || []) 289 }, []).join(',') 290 } 291 292 /** 293 * Check if two values are loosely equal - that is, 294 * if they are plain objects, do they have the same shape? 295 */ 296 function looseEqual (a, b) { 297 if (a === b) { return true } 298 var isObjectA = isObject(a); 299 var isObjectB = isObject(b); 300 if (isObjectA && isObjectB) { 301 try { 302 var isArrayA = Array.isArray(a); 303 var isArrayB = Array.isArray(b); 304 if (isArrayA && isArrayB) { 305 return a.length === b.length && a.every(function (e, i) { 306 return looseEqual(e, b[i]) 307 }) 308 } else if (a instanceof Date && b instanceof Date) { 309 return a.getTime() === b.getTime() 310 } else if (!isArrayA && !isArrayB) { 311 var keysA = Object.keys(a); 312 var keysB = Object.keys(b); 313 return keysA.length === keysB.length && keysA.every(function (key) { 314 return looseEqual(a[key], b[key]) 315 }) 316 } else { 317 /* istanbul ignore next */ 318 return false 319 } 320 } catch (e) { 321 /* istanbul ignore next */ 322 return false 323 } 324 } else if (!isObjectA && !isObjectB) { 325 return String(a) === String(b) 326 } else { 327 return false 328 } 329 } 330 331 /** 332 * Return the first index at which a loosely equal value can be 333 * found in the array (if value is a plain object, the array must 334 * contain an object of the same shape), or -1 if it is not present. 335 */ 336 function looseIndexOf (arr, val) { 337 for (var i = 0; i < arr.length; i++) { 338 if (looseEqual(arr[i], val)) { return i } 339 } 340 return -1 341 } 342 343 /** 344 * Ensure a function is called only once. 345 */ 346 function once (fn) { 347 var called = false; 348 return function () { 349 if (!called) { 350 called = true; 351 fn.apply(this, arguments); 352 } 353 } 354 } 355 356 var SSR_ATTR = 'data-server-rendered'; 357 358 var ASSET_TYPES = [ 359 'component', 360 'directive', 361 'filter' 362 ]; 363 364 var LIFECYCLE_HOOKS = [ 365 'beforeCreate', 366 'created', 367 'beforeMount', 368 'mounted', 369 'beforeUpdate', 370 'updated', 371 'beforeDestroy', 372 'destroyed', 373 'activated', 374 'deactivated', 375 'errorCaptured', 376 'serverPrefetch' 377 ]; 378 379 /* */ 380 381 382 383 var config = ({ 384 /** 385 * Option merge strategies (used in core/util/options) 386 */ 387 // $flow-disable-line 388 optionMergeStrategies: Object.create(null), 389 390 /** 391 * Whether to suppress warnings. 392 */ 393 silent: false, 394 395 /** 396 * Show production mode tip message on boot? 397 */ 398 productionTip: "development" !== 'production', 399 400 /** 401 * Whether to enable devtools 402 */ 403 devtools: "development" !== 'production', 404 405 /** 406 * Whether to record perf 407 */ 408 performance: false, 409 410 /** 411 * Error handler for watcher errors 412 */ 413 errorHandler: null, 414 415 /** 416 * Warn handler for watcher warns 417 */ 418 warnHandler: null, 419 420 /** 421 * Ignore certain custom elements 422 */ 423 ignoredElements: [], 424 425 /** 426 * Custom user key aliases for v-on 427 */ 428 // $flow-disable-line 429 keyCodes: Object.create(null), 430 431 /** 432 * Check if a tag is reserved so that it cannot be registered as a
433 * component. This is platform-dependent and may be overwritten. 434 */ 435 isReservedTag: no, 436 437 /** 438 * Check if an attribute is reserved so that it cannot be used as a component 439 * prop. This is platform-dependent and may be overwritten. 440 */ 441 isReservedAttr: no, 442 443 /** 444 * Check if a tag is an unknown element. 445 * Platform-dependent. 446 */ 447 isUnknownElement: no, 448 449 /** 450 * Get the namespace of an element 451 */ 452 getTagNamespace: noop, 453 454 /** 455 * Parse the real tag name for the specific platform. 456 */ 457 parsePlatformTagName: identity, 458 459 /** 460 * Check if an attribute must be bound using property, e.g. value 461 * Platform-dependent. 462 */ 463 mustUseProp: no, 464 465 /** 466 * Perform updates asynchronously. Intended to be used by Vue Test Utils 467 * This will significantly reduce performance if set to false. 468 */ 469 async: true, 470 471 /** 472 * Exposed for legacy reasons 473 */ 474 _lifecycleHooks: LIFECYCLE_HOOKS 475 }); 476 477 /* */ 478 479 /** 480 * unicode letters used for parsing html tags, component names and property paths. 481 * using https://www.w3.org/TR/html53/semantics-scripting.html#potentialcustomelementname 482 * skipping \u10000-\uEFFFF due to it freezing up PhantomJS 483 */ 484 var unicodeRegExp = /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/; 485 486 /** 487 * Check if a string starts with $ or _ 488 */ 489 function isReserved (str) { 490 var c = (str + '').charCodeAt(0); 491 return c === 0x24 || c === 0x5F 492 } 493 494 /** 495 * Define a property. 496 */ 497 function def (obj, key, val, enumerable) { 498 Object.defineProperty(obj, key, { 499 value: val, 500 enumerable: !!enumerable, 501 writable: true, 502 configurable: true 503 }); 504 } 505 506 /** 507 * Parse simple path. 508 */ 509 var bailRE = new RegExp(("[^" + (unicodeRegExp.source) + ".$_\\d]")); 510 function parsePath (path) { 511 if (bailRE.test(path)) { 512 return 513 } 514 var segments = path.split('.'); 515 return function (obj) { 516 for (var i = 0; i < segments.length; i++) { 517 if (!obj) { return } 518 obj = obj[segments[i]]; 519 } 520 return obj 521 } 522 } 523 524 /* */ 525 526 // can we use __proto__? 527 var hasProto = '__proto__' in {}; 528 529 // Browser environment sniffing 530 var inBrowser = typeof window !== 'undefined'; 531 var inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform; 532 var weexPlatform = inWeex && WXEnvironment.platform.toLowerCase(); 533 var UA = inBrowser && window.navigator.userAgent.toLowerCase(); 534 var isIE = UA && /msie|trident/.test(UA); 535 var isIE9 = UA && UA.indexOf('msie 9.0') > 0; 536 var isEdge = UA && UA.indexOf('edge/') > 0; 537 var isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android'); 538 var isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios'); 539 var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge; 540 var isPhantomJS = UA && /phantomjs/.test(UA); 541 var isFF = UA && UA.match(/firefox\/(\d+)/); 542 543 // Firefox has a "watch" function on Object.prototype... 544 var nativeWatch = ({}).watch; 545 546 var supportsPassive = false; 547 if (inBrowser) { 548 try { 549 var opts = {}; 550 Object.defineProperty(opts, 'passive', ({ 551 get: function get () { 552 /* istanbul ignore next */ 553 supportsPassive = true; 554 } 555 })); // https://github.com/facebook/flow/issues/285 556 window.addEventListener('test-passive', null, opts); 557 } catch (e) {} 558 } 559 560 // this needs to be lazy-evaled because vue may be required before 561 // vue-server-renderer can set VUE_ENV 562 var _isServer; 563 var isServerRendering = function () { 564 if (_isServer === undefined) { 565 /* istanbul ignore if */ 566 if (!inBrowser && !inWeex && typeof global !== 'undefined') { 567 // detect presence of vue-server-renderer and avoid 568 // Webpack shimming the process 569 _isServer = global['process'] && global['process'].env.VUE_ENV === 'server'; 570 } else { 571 _isServer = false; 572 } 573 } 574 return _isServer 575 }; 576 577 // detect devtools 578 var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__; 579 580 /* istanbul ignore next */ 581 function isNative (Ctor) { 582 return typeof Ctor === 'function' && /native code/.test(Ctor.toString()) 583 } 584 585 var hasSymbol = 586 typeof Symbol !== 'undefined' && isNative(Symbol) && 587 typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys); 588 589 var _Set; 590 /* istanbul ignore if */ // $flow-disable-line 591 if (typeof Set !== 'undefined' && isNative(Set)) { 592 // use native Set when available. 593 _Set = Set; 594 } else { 595 // a non-standard Set polyfill that only works with primitive keys. 596 _Set = /*@__PURE__*/(function () { 597 function Set () { 598 this.set = Object.create(null); 599 } 600 Set.prototype.has = function has (key) { 601 return this.set[key] === true 602 }; 603 Set.prototype.add = function add (key) { 604 this.set[key] = true; 605 }; 606 Set.prototype.clear = function clear () { 607 this.set = Object.create(null); 608 }; 609 610 return Set; 611 }()); 612 } 613 614 /* */ 615 616 var warn = noop; 617 var tip = noop; 618 var generateComponentTrace = (noop); // work around flow check 619 var formatComponentName = (noop); 620 621 { 622 var hasConsole = typeof console !== 'undefined'; 623 var classifyRE = /(?:^|[-_])(\w)/g; 624 var classify = function (str) { return str 625 .replace(classifyRE, function (c) { return c.toUpperCase(); }) 626 .replace(/[-_]/g, ''); }; 627 628 warn = function (msg, vm) { 629 var trace = vm ? generateComponentTrace(vm) : ''; 630 631 if (config.warnHandler) { 632 config.warnHandler.call(null, msg, vm, trace); 633 } else if (hasConsole && (!config.silent)) { 634 console.error(("[Vue warn]: " + msg + trace)); 635 } 636 }; 637 638 tip = function (msg, vm) { 639 if (hasConsole && (!config.silent)) { 640 console.warn("[Vue tip]: " + msg + ( 641 vm ? generateComponentTrace(vm) : '' 642 )); 643 } 644 }; 645 646 formatComponentName = function (vm, includeFile) { 647 if (vm.$root === vm) { 648 return '<Root>' 649 } 650 var options = typeof vm === 'function' && vm.cid != null 651 ? vm.options 652 : vm._isVue 653 ? vm.$options || vm.constructor.options 654 : vm; 655 var name = options.name || options._componentTag; 656 var file = options.__file; 657 if (!name && file) { 658 var match = file.match(/([^/\\]+)\.vue$/); 659 name = match && match[1]; 660 } 661 662 return ( 663 (name ? ("<" + (classify(name)) + ">") : "<Anonymous>") + 664 (file && includeFile !== false ? (" at " + file) : '') 665 ) 666 }; 667 668 var repeat = function (str, n) { 669 var res = ''; 670 while (n) { 671 if (n % 2 === 1) { res += str; } 672 if (n > 1) { str += str; } 673 n >>= 1; 674 } 675 return res 676 }; 677 678 generateComponentTrace = function (vm) { 679 if (vm._isVue && vm.$parent) { 680 var tree = []; 681 var currentRecursiveSequence = 0; 682 while (vm) { 683 if (tree.length > 0) { 684 var last = tree[tree.length - 1]; 685 if (last.constructor === vm.constructor) { 686 currentRecursiveSequence++; 687 vm = vm.$parent; 688 continue 689 } else if (currentRecursiveSequence > 0) { 690 tree[tree.length - 1] = [last, currentRecursiveSequence]; 691 currentRecursiveSequence = 0; 692 } 693 } 694 tree.push(vm); 695 vm = vm.$parent; 696 } 697 return '\n\nfound in\n\n' + tree 698 .map(function (vm, i) { return ("" + (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm) 699 ? ((formatComponentName(vm[0])) + "... (" + (vm[1]) + " recursive calls)") 700 : formatComponentName(vm))); }) 701 .join('\n') 702 } else { 703 return ("\n\n(found in " + (formatComponentName(vm)) + ")") 704 } 705 }; 706 } 707 708 /* */ 709 710 var uid = 0; 711 712 /** 713 * A dep is an observable that can have multiple 714 * directives subscribing to it. 715 */ 716 var Dep = function Dep () { 717 this.id = uid++; 718 this.subs = []; 719 }; 720 721 Dep.prototype.addSub = function addSub (sub) { 722 this.subs.push(sub); 723 }; 724 725 Dep.prototype.removeSub = function removeSub (sub) { 726 remove(this.subs, sub); 727 }; 728
729 Dep.prototype.depend = function depend () { 730 if (Dep.target) { 731 Dep.target.addDep(this); 732 } 733 }; 734 735 Dep.prototype.notify = function notify () { 736 // stabilize the subscriber list first 737 var subs = this.subs.slice(); 738 if (!config.async) { 739 // subs aren't sorted in scheduler if not running async 740 // we need to sort them now to make sure they fire in correct 741 // order 742 subs.sort(function (a, b) { return a.id - b.id; }); 743 } 744 for (var i = 0, l = subs.length; i < l; i++) { 745 subs[i].update(); 746 } 747 }; 748 749 // The current target watcher being evaluated. 750 // This is globally unique because only one watcher 751 // can be evaluated at a time. 752 Dep.target = null; 753 var targetStack = []; 754 755 function pushTarget (target) { 756 targetStack.push(target); 757 Dep.target = target; 758 } 759 760 function popTarget () { 761 targetStack.pop(); 762 Dep.target = targetStack[targetStack.length - 1]; 763 } 764 765 /* */ 766 767 var VNode = function VNode ( 768 tag, 769 data, 770 children, 771 text, 772 elm, 773 context, 774 componentOptions, 775 asyncFactory 776 ) { 777 this.tag = tag; 778 this.data = data; 779 this.children = children; 780 this.text = text; 781 this.elm = elm; 782 this.ns = undefined; 783 this.context = context; 784 this.fnContext = undefined; 785 this.fnOptions = undefined; 786 this.fnScopeId = undefined; 787 this.key = data && data.key; 788 this.componentOptions = componentOptions; 789 this.componentInstance = undefined; 790 this.parent = undefined; 791 this.raw = false; 792 this.isStatic = false; 793 this.isRootInsert = true; 794 this.isComment = false; 795 this.isCloned = false; 796 this.isOnce = false; 797 this.asyncFactory = asyncFactory; 798 this.asyncMeta = undefined; 799 this.isAsyncPlaceholder = false; 800 }; 801 802 var prototypeAccessors = { child: { configurable: true } }; 803 804 // DEPRECATED: alias for componentInstance for backwards compat. 805 /* istanbul ignore next */ 806 prototypeAccessors.child.get = function () { 807 return this.componentInstance 808 }; 809 810 Object.defineProperties( VNode.prototype, prototypeAccessors ); 811 812 var createEmptyVNode = function (text) { 813 if ( text === void 0 ) text = ''; 814 815 var node = new VNode(); 816 node.text = text; 817 node.isComment = true; 818 return node 819 }; 820 821 function createTextVNode (val) { 822 return new VNode(undefined, undefined, undefined, String(val)) 823 } 824 825 // optimized shallow clone 826 // used for static nodes and slot nodes because they may be reused across 827 // multiple renders, cloning them avoids errors when DOM manipulations rely 828 // on their elm reference. 829 function cloneVNode (vnode) { 830 var cloned = new VNode( 831 vnode.tag, 832 vnode.data, 833 // #7975 834 // clone children array to avoid mutating original in case of cloning 835 // a child. 836 vnode.children && vnode.children.slice(), 837 vnode.text, 838 vnode.elm, 839 vnode.context, 840 vnode.componentOptions, 841 vnode.asyncFactory 842 ); 843 cloned.ns = vnode.ns; 844 cloned.isStatic = vnode.isStatic; 845 cloned.key = vnode.key; 846 cloned.isComment = vnode.isComment; 847 cloned.fnContext = vnode.fnContext; 848 cloned.fnOptions = vnode.fnOptions; 849 cloned.fnScopeId = vnode.fnScopeId; 850 cloned.asyncMeta = vnode.asyncMeta; 851 cloned.isCloned = true; 852 return cloned 853 } 854 855 /* 856 * not type checking this file because flow doesn't play well with 857 * dynamically accessing methods on Array prototype 858 */ 859 860 var arrayProto = Array.prototype; 861 var arrayMethods = Object.create(arrayProto); 862 863 var methodsToPatch = [ 864 'push', 865 'pop', 866 'shift', 867 'unshift', 868 'splice', 869 'sort', 870 'reverse' 871 ]; 872 873 /** 874 * Intercept mutating methods and emit events 875 */ 876 methodsToPatch.forEach(function (method) { 877 // cache original method 878 var original = arrayProto[method]; 879 def(arrayMethods, method, function mutator () { 880 var args = [], len = arguments.length; 881 while ( len-- ) args[ len ] = arguments[ len ]; 882 883 var result = original.apply(this, args); 884 var ob = this.__ob__; 885 var inserted; 886 switch (method) { 887 case 'push': 888 case 'unshift': 889 inserted = args; 890 break 891 case 'splice': 892 inserted = args.slice(2); 893 break 894 } 895 if (inserted) { ob.observeArray(inserted); } 896 // notify change 897 ob.dep.notify(); 898 return result 899 }); 900 }); 901 902 /* */ 903 904 var arrayKeys = Object.getOwnPropertyNames(arrayMethods); 905 906 /** 907 * In some cases we may want to disable observation inside a component's 908 * update computation. 909 */ 910 var shouldObserve = true; 911 912 function toggleObserving (value) { 913 shouldObserve = value; 914 } 915 916 /** 917 * Observer class that is attached to each observed 918 * object. Once attached, the observer converts the target 919 * object's property keys into getter/setters that 920 * collect dependencies and dispatch updates. 921 */ 922 var Observer = function Observer (value) { 923 this.value = value; 924 this.dep = new Dep(); 925 this.vmCount = 0; 926 def(value, '__ob__', this); 927 if (Array.isArray(value)) { 928 if (hasProto) { 929 protoAugment(value, arrayMethods); 930 } else { 931 copyAugment(value, arrayMethods, arrayKeys); 932 } 933 this.observeArray(value); 934 } else { 935 this.walk(value); 936 } 937 }; 938 939 /** 940 * Walk through all properties and convert them into 941 * getter/setters. This method should only be called when 942 * value type is Object. 943 */ 944 Observer.prototype.walk = function walk (obj) { 945 var keys = Object.keys(obj); 946 for (var i = 0; i < keys.length; i++) { 947 defineReactive$$1(obj, keys[i]); 948 } 949 }; 950 951 /** 952 * Observe a list of Array items. 953 */ 954 Observer.prototype.observeArray = function observeArray (items) { 955 for (var i = 0, l = items.length; i < l; i++) { 956 observe(items[i]); 957 } 958 }; 959 960 // helpers 961 962 /** 963 * Augment a target Object or Array by intercepting 964 * the prototype chain using __proto__ 965 */
966 function protoAugment (target, src) { 967 /* eslint-disable no-proto */ 968 target.__proto__ = src; 969 /* eslint-enable no-proto */ 970 } 971 972 /** 973 * Augment a target Object or Array by defining 974 * hidden properties. 975 */ 976 /* istanbul ignore next */ 977 function copyAugment (target, src, keys) { 978 for (var i = 0, l = keys.length; i < l; i++) { 979 var key = keys[i]; 980 def(target, key, src[key]); 981 } 982 } 983 984 /** 985 * Attempt to create an observer instance for a value, 986 * returns the new observer if successfully observed, 987 * or the existing observer if the value already has one. 988 */ 989 function observe (value, asRootData) { 990 if (!isObject(value) || value instanceof VNode) { 991 return 992 } 993 var ob; 994 if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) { 995 ob = value.__ob__; 996 } else if ( 997 shouldObserve && 998 !isServerRendering() && 999 (Array.isArray(value) || isPlainObject(value)) && 1000 Object.isExtensible(value) && 1001 !value._isVue 1002 ) { 1003 ob = new Observer(value); 1004 } 1005 if (asRootData && ob) { 1006 ob.vmCount++; 1007 } 1008 return ob 1009 } 1010 1011 /** 1012 * Define a reactive property on an Object. 1013 */ 1014 function defineReactive$$1 ( 1015 obj, 1016 key, 1017 val, 1018 customSetter, 1019 shallow 1020 ) { 1021 var dep = new Dep(); 1022 1023 var property = Object.getOwnPropertyDescriptor(obj, key); 1024 if (property && property.configurable === false) { 1025 return 1026 } 1027 1028 // cater for pre-defined getter/setters 1029 var getter = property && property.get; 1030 var setter = property && property.set; 1031 if ((!getter || setter) && arguments.length === 2) { 1032 val = obj[key]; 1033 } 1034 1035 var childOb = !shallow && observe(val); 1036 Object.defineProperty(obj, key, { 1037 enumerable: true, 1038 configurable: true, 1039 get: function reactiveGetter () { 1040 var value = getter ? getter.call(obj) : val; 1041 if (Dep.target) { 1042 dep.depend(); 1043 if (childOb) { 1044 childOb.dep.depend(); 1045 if (Array.isArray(value)) { 1046 dependArray(value); 1047 } 1048 } 1049 } 1050 return value 1051 }, 1052 set: function reactiveSetter (newVal) { 1053 var value = getter ? getter.call(obj) : val; 1054 /* eslint-disable no-self-compare */ 1055 if (newVal === value || (newVal !== newVal && value !== value)) { 1056 return 1057 } 1058 /* eslint-enable no-self-compare */ 1059 if (customSetter) { 1060 customSetter(); 1061 } 1062 // #7981: for accessor properties without setter 1063 if (getter && !setter) { return } 1064 if (setter) { 1065 setter.call(obj, newVal); 1066 } else { 1067 val = newVal; 1068 } 1069 childOb = !shallow && observe(newVal); 1070 dep.notify(); 1071 } 1072 }); 1073 } 1074 1075 /** 1076 * Set a property on an object. Adds the new property and 1077 * triggers change notification if the property doesn't 1078 * already exist. 1079 */ 1080 function set (target, key, val) { 1081 if (isUndef(target) || isPrimitive(target) 1082 ) { 1083 warn(("Cannot set reactive property on undefined, null, or primitive value: " + ((target)))); 1084 } 1085 if (Array.isArray(target) && isValidArrayIndex(key)) { 1086 target.length = Math.max(target.length, key); 1087 target.splice(key, 1, val); 1088 return val 1089 } 1090 if (key in target && !(key in Object.prototype)) { 1091 target[key] = val; 1092 return val 1093 } 1094 var ob = (target).__ob__; 1095 if (target._isVue || (ob && ob.vmCount)) { 1096 warn( 1097 'Avoid adding reactive properties to a Vue instance or its root $data ' + 1098 'at runtime - declare it upfront in the data option.' 1099 ); 1100 return val 1101 } 1102 if (!ob) { 1103 target[key] = val; 1104 return val 1105 } 1106 defineReactive$$1(ob.value, key, val); 1107 ob.dep.notify(); 1108 return val 1109 } 1110 1111 /** 1112 * Delete a property and trigger change if necessary. 1113 */ 1114 function del (target, key) { 1115 if (isUndef(target) || isPrimitive(target) 1116 ) { 1117 warn(("Cannot delete reactive property on undefined, null, or primitive value: " + ((target)))); 1118 } 1119 if (Array.isArray(target) && isValidArrayIndex(key)) { 1120 target.splice(key, 1); 1121 return 1122 } 1123 var ob = (target).__ob__; 1124 if (target._isVue || (ob && ob.vmCount)) { 1125 warn( 1126 'Avoid deleting properties on a Vue instance or its root $data ' +
1127 '- just set it to null.' 1128 ); 1129 return 1130 } 1131 if (!hasOwn(target, key)) { 1132 return 1133 } 1134 delete target[key]; 1135 if (!ob) { 1136 return 1137 } 1138 ob.dep.notify(); 1139 } 1140 1141 /** 1142 * Collect dependencies on array elements when the array is touched, since 1143 * we cannot intercept array element access like property getters. 1144 */ 1145 function dependArray (value) { 1146 for (var e = (void 0), i = 0, l = value.length; i < l; i++) { 1147 e = value[i]; 1148 e && e.__ob__ && e.__ob__.dep.depend(); 1149 if (Array.isArray(e)) { 1150 dependArray(e); 1151 } 1152 } 1153 } 1154 1155 /* */ 1156 1157 /** 1158 * Option overwriting strategies are functions that handle 1159 * how to merge a parent option value and a child option 1160 * value into the final value. 1161 */ 1162 var strats = config.optionMergeStrategies; 1163 1164 /** 1165 * Options with restrictions 1166 */ 1167 { 1168 strats.el = strats.propsData = function (parent, child, vm, key) { 1169 if (!vm) { 1170 warn( 1171 "option \"" + key + "\" can only be used during instance " + 1172 'creation with the `new` keyword.' 1173 ); 1174 } 1175 return defaultStrat(parent, child) 1176 }; 1177 } 1178 1179 /** 1180 * Helper that recursively merges two data objects together. 1181 */ 1182 function mergeData (to, from) { 1183 if (!from) { return to } 1184 var key, toVal, fromVal; 1185 1186 var keys = hasSymbol 1187 ? Reflect.ownKeys(from) 1188 : Object.keys(from); 1189 1190 for (var i = 0; i < keys.length; i++) { 1191 key = keys[i]; 1192 // in case the object is already observed... 1193 if (key === '__ob__') { continue } 1194 toVal = to[key]; 1195 fromVal = from[key]; 1196 if (!hasOwn(to, key)) { 1197 set(to, key, fromVal); 1198 } else if ( 1199 toVal !== fromVal && 1200 isPlainObject(toVal) && 1201 isPlainObject(fromVal) 1202 ) { 1203 mergeData(toVal, fromVal); 1204 } 1205 } 1206 return to 1207 } 1208 1209 /** 1210 * Data 1211 */ 1212 function mergeDataOrFn ( 1213 parentVal, 1214 childVal, 1215 vm 1216 ) { 1217 if (!vm) { 1218 // in a Vue.extend merge, both should be functions 1219 if (!childVal) { 1220 return parentVal 1221 } 1222 if (!parentVal) { 1223 return childVal 1224 } 1225 // when parentVal & childVal are both present, 1226 // we need to return a function that returns the 1227 // merged result of both functions... no need to 1228 // check if parentVal is a function here because 1229 // it has to be a function to pass previous merges. 1230 return function mergedDataFn () { 1231 return mergeData( 1232 typeof childVal === 'function' ? childVal.call(this, this) : childVal, 1233 typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal 1234 ) 1235 } 1236 } else { 1237 return function mergedInstanceDataFn () { 1238 // instance merge 1239 var instanceData = typeof childVal === 'function' 1240 ? childVal.call(vm, vm) 1241 : childVal; 1242 var defaultData = typeof parentVal === 'function' 1243 ? parentVal.call(vm, vm) 1244 : parentVal; 1245 if (instanceData) { 1246 return mergeData(instanceData, defaultData) 1247 } else { 1248 return defaultData 1249 } 1250 } 1251 } 1252 } 1253 1254 strats.data = function ( 1255 parentVal, 1256 childVal, 1257 vm 1258 ) { 1259 if (!vm) { 1260 if (childVal && typeof childVal !== 'function') { 1261 warn( 1262 'The "data" option should be a function ' + 1263 'that returns a per-instance value in component ' + 1264 'definitions.', 1265 vm 1266 ); 1267 1268 return parentVal 1269 } 1270 return mergeDataOrFn(parentVal, childVal) 1271 } 1272 1273 return mergeDataOrFn(parentVal, childVal, vm) 1274 }; 1275 1276 /** 1277 * Hooks and props are merged as arrays. 1278 */ 1279 function mergeHook ( 1280 parentVal, 1281 childVal 1282 ) { 1283 var res = childVal 1284 ? parentVal 1285 ? parentVal.concat(childVal) 1286 : Array.isArray(childVal) 1287 ? childVal 1288 : [childVal] 1289 : parentVal; 1290 return res 1291 ? dedupeHooks(res) 1292 : res 1293 } 1294 1295 function dedupeHooks (hooks) { 1296 var res = []; 1297 for (var i = 0; i < hooks.length; i++) { 1298 if (res.indexOf(hooks[i]) === -1) { 1299 res.push(hooks[i]); 1300 } 1301 } 1302 return res 1303 } 1304 1305 LIFECYCLE_HOOKS.forEach(function (hook) { 1306 strats[hook] = mergeHook; 1307 }); 1308 1309 /** 1310 * Assets 1311 * 1312 * When a vm is present (instance creation), we need to do 1313 * a three-way merge between constructor options, instance 1314 * options and parent options. 1315 */ 1316 function mergeAssets ( 1317 parentVal, 1318 childVal, 1319 vm, 1320 key 1321 ) { 1322 var res = Object.create(parentVal || null); 1323 if (childVal) { 1324 assertObjectType(key, childVal, vm); 1325 return extend(res, childVal) 1326 } else { 1327 return res 1328 } 1329 } 1330 1331 ASSET_TYPES.forEach(function (type) { 1332 strats[type + 's'] = mergeAssets; 1333 }); 1334 1335 /** 1336 * Watchers. 1337 * 1338 * Watchers hashes should not overwrite one 1339 * another, so we merge them as arrays. 1340 */ 1341 strats.watch = function ( 1342 parentVal, 1343 childVal, 1344 vm, 1345 key 1346 ) { 1347 // work around Firefox's Object.prototype.watch... 1348 if (parentVal === nativeWatch) { parentVal = undefined; } 1349 if (childVal === nativeWatch) { childVal = undefined; } 1350 /* istanbul ignore if */ 1351 if (!childVal) { return Object.create(parentVal || null) } 1352 { 1353 assertObjectType(key, childVal, vm); 1354 } 1355 if (!parentVal) { return childVal } 1356 var ret = {}; 1357 extend(ret, parentVal); 1358 for (var key$1 in childVal) { 1359 var parent = ret[key$1]; 1360 var child = childVal[key$1]; 1361 if (parent && !Array.isArray(parent)) { 1362 parent = [parent]; 1363 } 1364 ret[key$1] = parent 1365 ? parent.concat(child) 1366 : Array.isArray(child) ? child : [child]; 1367 } 1368 return ret 1369 }; 1370 1371 /** 1372 * Other object hashes. 1373 */ 1374 strats.props = 1375 strats.methods = 1376 strats.inject = 1377 strats.computed = function ( 1378 parentVal, 1379 childVal, 1380 vm, 1381 key 1382 ) { 1383 if (childVal && "development" !== 'production') { 1384 assertObjectType(key, childVal, vm); 1385 } 1386 if (!parentVal) { return childVal } 1387 var ret = Object.create(null); 1388 extend(ret, parentVal); 1389 if (childVal) { extend(ret, childVal); } 1390 return ret 1391 }; 1392 strats.provide = mergeDataOrFn; 1393 1394 /** 1395 * Default strategy. 1396 */ 1397 var defaultStrat = function (parentVal, childVal) { 1398 return childVal === undefined 1399 ? parentVal 1400 : childVal 1401 }; 1402 1403 /** 1404 * Validate component names 1405 */ 1406 function checkComponents (options) { 1407 for (var key in options.components) { 1408 validateComponentName(key); 1409 } 1410 } 1411 1412 function validateComponentName (name) { 1413 if (!new RegExp(("^[a-zA-Z][\\-\\.0-9_" + (unicodeRegExp.source) + "]*$")).test(name)) { 1414 warn(
1415 'Invalid component name: "' + name + '". Component names ' + 1416 'should conform to valid custom element name in html5 specification.' 1417 ); 1418 } 1419 if (isBuiltInTag(name) || config.isReservedTag(name)) { 1420 warn( 1421 'Do not use built-in or reserved HTML elements as component ' + 1422 'id: ' + name 1423 ); 1424 } 1425 } 1426 1427 /** 1428 * Ensure all props option syntax are normalized into the 1429 * Object-based format. 1430 */ 1431 function normalizeProps (options, vm) { 1432 var props = options.props; 1433 if (!props) { return } 1434 var res = {}; 1435 var i, val, name; 1436 if (Array.isArray(props)) { 1437 i = props.length; 1438 while (i--) { 1439 val = props[i]; 1440 if (typeof val === 'string') { 1441 name = camelize(val); 1442 res[name] = { type: null }; 1443 } else { 1444 warn('props must be strings when using array syntax.'); 1445 } 1446 } 1447 } else if (isPlainObject(props)) { 1448 for (var key in props) { 1449 val = props[key]; 1450 name = camelize(key); 1451 res[name] = isPlainObject(val) 1452 ? val 1453 : { type: val }; 1454 } 1455 } else { 1456 warn( 1457 "Invalid value for option \"props\": expected an Array or an Object, " + 1458 "but got " + (toRawType(props)) + ".", 1459 vm 1460 ); 1461 } 1462 options.props = res; 1463 } 1464 1465 /** 1466 * Normalize all injections into Object-based format 1467 */ 1468 function normalizeInject (options, vm) { 1469 var inject = options.inject; 1470 if (!inject) { return } 1471 var normalized = options.inject = {}; 1472 if (Array.isArray(inject)) { 1473 for (var i = 0; i < inject.length; i++) { 1474 normalized[inject[i]] = { from: inject[i] }; 1475 } 1476 } else if (isPlainObject(inject)) { 1477 for (var key in inject) { 1478 var val = inject[key]; 1479 normalized[key] = isPlainObject(val) 1480 ? extend({ from: key }, val) 1481 : { from: val }; 1482 } 1483 } else { 1484 warn( 1485 "Invalid value for option \"inject\": expected an Array or an Object, " + 1486 "but got " + (toRawType(inject)) + ".", 1487 vm 1488 ); 1489 } 1490 } 1491 1492 /** 1493 * Normalize raw function directives into object format. 1494 */ 1495 function normalizeDirectives (options) { 1496 var dirs = options.directives; 1497 if (dirs) { 1498 for (var key in dirs) { 1499 var def$$1 = dirs[key]; 1500 if (typeof def$$1 === 'function') { 1501 dirs[key] = { bind: def$$1, update: def$$1 }; 1502 } 1503 } 1504 } 1505 } 1506 1507 function assertObjectType (name, value, vm) { 1508 if (!isPlainObject(value)) { 1509 warn( 1510 "Invalid value for option \"" + name + "\": expected an Object, " + 1511 "but got " + (toRawType(value)) + ".", 1512 vm 1513 ); 1514 } 1515 } 1516 1517 /** 1518 * Merge two option objects into a new one. 1519 * Core utility used in both instantiation and inheritance. 1520 */ 1521 function mergeOptions ( 1522 parent, 1523 child, 1524 vm 1525 ) { 1526 { 1527 checkComponents(child); 1528 } 1529 1530 if (typeof child === 'function') { 1531 child = child.options; 1532 } 1533 1534 normalizeProps(child, vm); 1535 normalizeInject(child, vm); 1536 normalizeDirectives(child); 1537 1538 // Apply extends and mixins on the child options, 1539 // but only if it is a raw options object that isn't 1540 // the result of another mergeOptions call. 1541 // Only merged options has the _base property. 1542 if (!child._base) { 1543 if (child.extends) { 1544 parent = mergeOptions(parent, child.extends, vm); 1545 } 1546 if (child.mixins) { 1547 for (var i = 0, l = child.mixins.length; i < l; i++) { 1548 parent = mergeOptions(parent, child.mixins[i], vm); 1549 } 1550 } 1551 } 1552 1553 var options = {}; 1554 var key; 1555 for (key in parent) { 1556 mergeField(key); 1557 } 1558 for (key in child) { 1559 if (!hasOwn(parent, key)) { 1560 mergeField(key); 1561 } 1562 } 1563 function mergeField (key) { 1564 var strat = strats[key] || defaultStrat; 1565 options[key] = strat(parent[key], child[key], vm, key); 1566 } 1567 return options 1568 } 1569 1570 /** 1571 * Resolve an asset. 1572 * This function is used because child instances need access 1573 * to assets defined in its ancestor chain. 1574 */ 1575 function resolveAsset ( 1576 options, 1577 type, 1578 id, 1579 warnMissing 1580 ) { 1581 /* istanbul ignore if */ 1582 if (typeof id !== 'string') { 1583 return 1584 } 1585 var assets = options[type]; 1586 // check local registration variations first 1587 if (hasOwn(assets, id)) { return assets[id] } 1588 var camelizedId = camelize(id); 1589 if (hasOwn(assets, camelizedId)) { return assets[camelizedId] } 1590 var PascalCaseId = capitalize(camelizedId); 1591 if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] } 1592 // fallback to prototype chain 1593 var res = assets[id] || assets[camelizedId] || assets[PascalCaseId]; 1594 if (warnMissing && !res) { 1595 warn( 1596 'Failed to resolve ' + type.slice(0, -1) + ': ' + id, 1597 options 1598 ); 1599 } 1600 return res 1601 } 1602 1603 /* */ 1604 1605 1606 1607 function validateProp ( 1608 key, 1609 propOptions, 1610 propsData, 1611 vm 1612 ) { 1613 var prop = propOptions[key]; 1614 var absent = !hasOwn(propsData, key); 1615 var value = propsData[key]; 1616 // boolean casting 1617 var booleanIndex = getTypeIndex(Boolean, prop.type); 1618 if (booleanIndex > -1) { 1619 if (absent && !hasOwn(prop, 'default')) { 1620 value = false;
1621 } else if (value === '' || value === hyphenate(key)) { 1622 // only cast empty string / same name to boolean if 1623 // boolean has higher priority 1624 var stringIndex = getTypeIndex(String, prop.type); 1625 if (stringIndex < 0 || booleanIndex < stringIndex) { 1626 value = true; 1627 } 1628 } 1629 } 1630 // check default value 1631 if (value === undefined) { 1632 value = getPropDefaultValue(vm, prop, key); 1633 // since the default value is a fresh copy, 1634 // make sure to observe it. 1635 var prevShouldObserve = shouldObserve; 1636 toggleObserving(true); 1637 observe(value); 1638 toggleObserving(prevShouldObserve); 1639 } 1640 { 1641 assertProp(prop, key, value, vm, absent); 1642 } 1643 return value 1644 } 1645 1646 /** 1647 * Get the default value of a prop. 1648 */ 1649 function getPropDefaultValue (vm, prop, key) { 1650 // no default, return undefined 1651 if (!hasOwn(prop, 'default')) { 1652 return undefined 1653 } 1654 var def = prop.default; 1655 // warn against non-factory defaults for Object & Array 1656 if (isObject(def)) { 1657 warn( 1658 'Invalid default value for prop "' + key + '": ' + 1659 'Props with type Object/Array must use a factory function ' + 1660 'to return the default value.', 1661 vm 1662 ); 1663 } 1664 // the raw prop value was also undefined from previous render, 1665 // return previous default value to avoid unnecessary watcher trigger 1666 if (vm && vm.$options.propsData && 1667 vm.$options.propsData[key] === undefined && 1668 vm._props[key] !== undefined 1669 ) { 1670 return vm._props[key] 1671 } 1672 // call factory function for non-Function types 1673 // a value is Function if its prototype is function even across different execution context 1674 return typeof def === 'function' && getType(prop.type) !== 'Function' 1675 ? def.call(vm) 1676 : def 1677 } 1678 1679 /** 1680 * Assert whether a prop is valid. 1681 */ 1682 function assertProp ( 1683 prop, 1684 name, 1685 value, 1686 vm, 1687 absent 1688 ) { 1689 if (prop.required && absent) { 1690 warn( 1691 'Missing required prop: "' + name + '"', 1692 vm 1693 ); 1694 return 1695 } 1696 if (value == null && !prop.required) { 1697 return 1698 } 1699 var type = prop.type; 1700 var valid = !type || type === true; 1701 var expectedTypes = []; 1702 if (type) { 1703 if (!Array.isArray(type)) { 1704 type = [type]; 1705 } 1706 for (var i = 0; i < type.length && !valid; i++) { 1707 var assertedType = assertType(value, type[i], vm); 1708 expectedTypes.push(assertedType.expectedType || ''); 1709 valid = assertedType.valid; 1710 } 1711 } 1712 1713 var haveExpectedTypes = expectedTypes.some(function (t) { return t; }); 1714 if (!valid && haveExpectedTypes) { 1715 warn( 1716 getInvalidTypeMessage(name, value, expectedTypes), 1717 vm 1718 ); 1719 return 1720 } 1721 var validator = prop.validator; 1722 if (validator) { 1723 if (!validator(value)) { 1724 warn( 1725 'Invalid prop: custom validator check failed for prop "' + name + '".', 1726 vm 1727 ); 1728 } 1729 } 1730 } 1731 1732 var simpleCheckRE = /^(String|Number|Boolean|Function|Symbol|BigInt)$/; 1733 1734 function assertType (value, type, vm) { 1735 var valid; 1736 var expectedType = getType(type); 1737 if (simpleCheckRE.test(expectedType)) { 1738 var t = typeof value; 1739 valid = t === expectedType.toLowerCase(); 1740 // for primitive wrapper objects 1741 if (!valid && t === 'object') { 1742 valid = value instanceof type; 1743 } 1744 } else if (expectedType === 'Object') { 1745 valid = isPlainObject(value); 1746 } else if (expectedType === 'Array') { 1747 valid = Array.isArray(value); 1748 } else { 1749 try { 1750 valid = value instanceof type; 1751 } catch (e) { 1752 warn('Invalid prop type: "' + String(type) + '" is not a constructor', vm); 1753 valid = false; 1754 } 1755 } 1756 return { 1757 valid: valid, 1758 expectedType: expectedType 1759 } 1760 } 1761 1762 var functionTypeCheckRE = /^\s*function (\w+)/; 1763 1764 /** 1765 * Use function string name to check built-in types, 1766 * because a simple equality check will fail when running 1767 * across different vms / iframes. 1768 */ 1769 function getType (fn) { 1770 var match = fn && fn.toString().match(functionTypeCheckRE); 1771 return match ? match[1] : '' 1772 } 1773 1774 function isSameType (a, b) { 1775 return getType(a) === getType(b) 1776 } 1777 1778 function getTypeIndex (type, expectedTypes) { 1779 if (!Array.isArray(expectedTypes)) { 1780 return isSameType(expectedTypes, type) ? 0 : -1 1781 } 1782 for (var i = 0, len = expectedTypes.length; i < len; i++) { 1783 if (isSameType(expectedTypes[i], type)) { 1784 return i 1785 } 1786 } 1787 return -1 1788 } 1789 1790 function getInvalidTypeMessage (name, value, expectedTypes) { 1791 var message = "Invalid prop: type check failed for prop \"" + name + "\"." + 1792 " Expected " + (expectedTypes.map(capitalize).join(', ')); 1793 var expectedType = expectedTypes[0]; 1794 var receivedType = toRawType(value); 1795 // check if we need to specify expected value 1796 if ( 1797 expectedTypes.length === 1 && 1798 isExplicable(expectedType) && 1799 isExplicable(typeof value) && 1800 !isBoolean(expectedType, receivedType) 1801 ) { 1802 message += " with value " + (styleValue(value, expectedType)); 1803 } 1804 message += ", got " + receivedType + " "; 1805 // check if we need to specify received value 1806 if (isExplicable(receivedType)) { 1807 message += "with value " + (styleValue(value, receivedType)) + "."; 1808 } 1809 return message 1810 } 1811 1812 function styleValue (value, type) { 1813 if (type === 'String') { 1814 return ("\"" + value + "\"") 1815 } else if (type === 'Number') { 1816 return ("" + (Number(value))) 1817 } else { 1818 return ("" + value) 1819 } 1820 } 1821 1822 var EXPLICABLE_TYPES = ['string', 'number', 'boolean']; 1823 function isExplicable (value) { 1824 return EXPLICABLE_TYPES.some(function (elem) { return value.toLowerCase() === elem; }) 1825 } 1826 1827 function isBoolean () { 1828 var args = [], len = arguments.length; 1829 while ( len-- ) args[ len ] = arguments[ len ]; 1830 1831 return args.some(function (elem) { return elem.toLowerCase() === 'boolean'; }) 1832 } 1833 1834 /* */ 1835 1836 function handleError (err, vm, info) { 1837 // Deactivate deps tracking while processing error handler to avoid possible infinite rendering. 1838 // See: https://github.com/vuejs/vuex/issues/1505 1839 pushTarget(); 1840 try { 1841 if (vm) { 1842 var cur = vm; 1843 while ((cur = cur.$parent)) { 1844 var hooks = cur.$options.errorCaptured; 1845 if (hooks) { 1846 for (var i = 0; i < hooks.length; i++) { 1847 try { 1848 var capture = hooks[i].call(cur, err, vm, info) === false; 1849 if (capture) { return } 1850 } catch (e) { 1851 globalHandleError(e, cur, 'errorCaptured hook'); 1852 } 1853 } 1854 } 1855 } 1856 } 1857 globalHandleError(err, vm, info); 1858 } finally { 1859 popTarget(); 1860 } 1861 } 1862 1863 function invokeWithErrorHandling ( 1864 handler, 1865 context, 1866 args, 1867 vm, 1868 info 1869 ) { 1870 var res; 1871 try {
1872 res = args ? handler.apply(context, args) : handler.call(context); 1873 if (res && !res._isVue && isPromise(res) && !res._handled) { 1874 res.catch(function (e) { return handleError(e, vm, info + " (Promise/async)"); }); 1875 // issue #9511 1876 // avoid catch triggering multiple times when nested calls 1877 res._handled = true; 1878 } 1879 } catch (e) { 1880 handleError(e, vm, info); 1881 } 1882 return res 1883 } 1884 1885 function globalHandleError (err, vm, info) { 1886 if (config.errorHandler) { 1887 try { 1888 return config.errorHandler.call(null, err, vm, info) 1889 } catch (e) { 1890 // if the user intentionally throws the original error in the handler, 1891 // do not log it twice 1892 if (e !== err) { 1893 logError(e, null, 'config.errorHandler'); 1894 } 1895 } 1896 } 1897 logError(err, vm, info); 1898 } 1899 1900 function logError (err, vm, info) { 1901 { 1902 warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm); 1903 } 1904 /* istanbul ignore else */ 1905 if ((inBrowser || inWeex) && typeof console !== 'undefined') { 1906 console.error(err); 1907 } else { 1908 throw err 1909 } 1910 } 1911 1912 /* */ 1913 1914 var isUsingMicroTask = false; 1915 1916 var callbacks = []; 1917 var pending = false; 1918 1919 function flushCallbacks () { 1920 pending = false; 1921 var copies = callbacks.slice(0); 1922 callbacks.length = 0; 1923 for (var i = 0; i < copies.length; i++) { 1924 copies[i](); 1925 } 1926 } 1927 1928 // Here we have async deferring wrappers using microtasks. 1929 // In 2.5 we used (macro) tasks (in combination with microtasks). 1930 // However, it has subtle problems when state is changed right before repaint 1931 // (e.g. #6813, out-in transitions). 1932 // Also, using (macro) tasks in event handler would cause some weird behaviors 1933 // that cannot be circumvented (e.g. #7109, #7153, #7546, #7834, #8109). 1934 // So we now use microtasks everywhere, again. 1935 // A major drawback of this tradeoff is that there are some scenarios 1936 // where microtasks have too high a priority and fire in between supposedly 1937 // sequential events (e.g. #4521, #6690, which have workarounds) 1938 // or even between bubbling of the same event (#6566). 1939 var timerFunc; 1940 1941 // The nextTick behavior leverages the microtask queue, which can be accessed 1942 // via either native Promise.then or MutationObserver. 1943 // MutationObserver has wider support, however it is seriously bugged in 1944 // UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It 1945 // completely stops working after triggering a few times... so, if native 1946 // Promise is available, we will use it: 1947 /* istanbul ignore next, $flow-disable-line */ 1948 if (typeof Promise !== 'undefined' && isNative(Promise)) { 1949 var p = Promise.resolve(); 1950 timerFunc = function () { 1951 p.then(flushCallbacks); 1952 // In problematic UIWebViews, Promise.then doesn't completely break, but 1953 // it can get stuck in a weird state where callbacks are pushed into the 1954 // microtask queue but the queue isn't being flushed, until the browser 1955 // needs to do some other work, e.g. handle a timer. Therefore we can 1956 // "force" the microtask queue to be flushed by adding an empty timer. 1957 if (isIOS) { setTimeout(noop); } 1958 }; 1959 isUsingMicroTask = true; 1960 } else if (!isIE && typeof MutationObserver !== 'undefined' && ( 1961 isNative(MutationObserver) || 1962 // PhantomJS and iOS 7.x 1963 MutationObserver.toString() === '[object MutationObserverConstructor]' 1964 )) { 1965 // Use MutationObserver where native Promise is not available, 1966 // e.g. PhantomJS, iOS7, Android 4.4 1967 // (#6466 MutationObserver is unreliable in IE11) 1968 var counter = 1; 1969 var observer = new MutationObserver(flushCallbacks); 1970 var textNode = document.createTextNode(String(counter)); 1971 observer.observe(textNode, { 1972 characterData: true 1973 }); 1974 timerFunc = function () { 1975 counter = (counter + 1) % 2; 1976 textNode.data = String(counter); 1977 }; 1978 isUsingMicroTask = true; 1979 } else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) { 1980 // Fallback to setImmediate. 1981 // Technically it leverages the (macro) task queue, 1982 // but it is still a better choice than setTimeout.
1983 timerFunc = function () { 1984 setImmediate(flushCallbacks); 1985 }; 1986 } else { 1987 // Fallback to setTimeout. 1988 timerFunc = function () { 1989 setTimeout(flushCallbacks, 0); 1990 }; 1991 } 1992 1993 function nextTick (cb, ctx) { 1994 var _resolve; 1995 callbacks.push(function () { 1996 if (cb) { 1997 try { 1998 cb.call(ctx); 1999 } catch (e) { 2000 handleError(e, ctx, 'nextTick'); 2001 } 2002 } else if (_resolve) { 2003 _resolve(ctx); 2004 } 2005 }); 2006 if (!pending) { 2007 pending = true; 2008 timerFunc(); 2009 } 2010 // $flow-disable-line 2011 if (!cb && typeof Promise !== 'undefined') { 2012 return new Promise(function (resolve) { 2013 _resolve = resolve; 2014 }) 2015 } 2016 } 2017 2018 /* */ 2019 2020 var mark; 2021 var measure; 2022 2023 { 2024 var perf = inBrowser && window.performance; 2025 /* istanbul ignore if */ 2026 if ( 2027 perf && 2028 perf.mark && 2029 perf.measure && 2030 perf.clearMarks && 2031 perf.clearMeasures 2032 ) { 2033 mark = function (tag) { return perf.mark(tag); }; 2034 measure = function (name, startTag, endTag) { 2035 perf.measure(name, startTag, endTag); 2036 perf.clearMarks(startTag); 2037 perf.clearMarks(endTag); 2038 // perf.clearMeasures(name) 2039 }; 2040 } 2041 } 2042 2043 /* not type checking this file because flow doesn't play well with Proxy */ 2044 2045 var initProxy; 2046 2047 { 2048 var allowedGlobals = makeMap( 2049 'Infinity,undefined,NaN,isFinite,isNaN,' + 2050 'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' + 2051 'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,' + 2052 'require' // for Webpack/Browserify 2053 ); 2054 2055 var warnNonPresent = function (target, key) { 2056 warn( 2057 "Property or method \"" + key + "\" is not defined on the instance but " + 2058 'referenced during render. Make sure that this property is reactive, ' + 2059 'either in the data option, or for class-based components, by ' + 2060 'initializing the property. ' + 2061 'See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.', 2062 target 2063 ); 2064 }; 2065 2066 var warnReservedPrefix = function (target, key) { 2067 warn( 2068 "Property \"" + key + "\" must be accessed with \"$data." + key + "\" because " + 2069 'properties starting with "$" or "_" are not proxied in the Vue instance to ' + 2070 'prevent conflicts with Vue internals. ' + 2071 'See: https://vuejs.org/v2/api/#data', 2072 target 2073 ); 2074 }; 2075 2076 var hasProxy = 2077 typeof Proxy !== 'undefined' && isNative(Proxy); 2078 2079 if (hasProxy) { 2080 var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact'); 2081 config.keyCodes = new Proxy(config.keyCodes, { 2082 set: function set (target, key, value) { 2083 if (isBuiltInModifier(key)) { 2084 warn(("Avoid overwriting built-in modifier in config.keyCodes: ." + key)); 2085 return false 2086 } else { 2087 target[key] = value; 2088 return true 2089 } 2090 } 2091 }); 2092 } 2093 2094 var hasHandler = { 2095 has: function has (target, key) { 2096 var has = key in target; 2097 var isAllowed = allowedGlobals(key) || 2098 (typeof key === 'string' && key.charAt(0) === '_' && !(key in target.$data)); 2099 if (!has && !isAllowed) { 2100 if (key in target.$data) { warnReservedPrefix(target, key); } 2101 else { warnNonPresent(target, key); } 2102 } 2103 return has || !isAllowed 2104 } 2105 }; 2106 2107 var getHandler = { 2108 get: function get (target, key) { 2109 if (typeof key === 'string' && !(key in target)) { 2110 if (key in target.$data) { warnReservedPrefix(target, key); } 2111 else { warnNonPresent(target, key); } 2112 } 2113 return target[key] 2114 } 2115 }; 2116 2117 initProxy = function initProxy (vm) { 2118 if (hasProxy) { 2119 // determine which proxy handler to use 2120 var options = vm.$options; 2121 var handlers = options.render && options.render._withStripped 2122 ? getHandler 2123 : hasHandler; 2124 vm._renderProxy = new Proxy(vm, handlers); 2125 } else { 2126 vm._renderProxy = vm; 2127 } 2128 }; 2129 } 2130 2131 /* */ 2132 2133 var seenObjects = new _Set(); 2134 2135 /** 2136 * Recursively traverse an object to evoke all converted 2137 * getters, so that every nested property inside the object 2138 * is collected as a "deep" dependency. 2139 */ 2140 function traverse (val) { 2141 _traverse(val, seenObjects); 2142 seenObjects.clear(); 2143 } 2144 2145 function _traverse (val, seen) { 2146 var i, keys; 2147 var isA = Array.isArray(val); 2148 if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) { 2149 return 2150 } 2151 if (val.__ob__) { 2152 var depId = val.__ob__.dep.id; 2153 if (seen.has(depId)) { 2154 return 2155 } 2156 seen.add(depId); 2157 } 2158 if (isA) { 2159 i = val.length; 2160 while (i--) { _traverse(val[i], seen); } 2161 } else { 2162 keys = Object.keys(val); 2163 i = keys.length; 2164 while (i--) { _traverse(val[keys[i]], seen); } 2165 } 2166 } 2167 2168 /* */ 2169 2170 var normalizeEvent = cached(function (name) { 2171 var passive = name.charAt(0) === '&'; 2172 name = passive ? name.slice(1) : name; 2173 var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first 2174 name = once$$1 ? name.slice(1) : name; 2175 var capture = name.charAt(0) === '!'; 2176 name = capture ? name.slice(1) : name; 2177 return { 2178 name: name, 2179 once: once$$1, 2180 capture: capture, 2181 passive: passive 2182 } 2183 }); 2184 2185 function createFnInvoker (fns, vm) { 2186 function invoker () { 2187 var arguments$1 = arguments; 2188 2189 var fns = invoker.fns; 2190 if (Array.isArray(fns)) { 2191 var cloned = fns.slice(); 2192 for (var i = 0; i < cloned.length; i++) { 2193 invokeWithErrorHandling(cloned[i], null, arguments$1, vm, "v-on handler"); 2194 } 2195 } else { 2196 // return handler return value for single handlers 2197 return invokeWithErrorHandling(fns, null, arguments, vm, "v-on handler") 2198 } 2199 } 2200 invoker.fns = fns; 2201 return invoker 2202 } 2203 2204 function updateListeners ( 2205 on, 2206 oldOn, 2207 add, 2208 remove$$1, 2209 createOnceHandler, 2210 vm 2211 ) { 2212 var name, def$$1, cur, old, event; 2213 for (name in on) { 2214 def$$1 = cur = on[name]; 2215 old = oldOn[name]; 2216 event = normalizeEvent(name); 2217 if (isUndef(cur)) { 2218 warn( 2219 "Invalid handler for event \"" + (event.name) + "\": got " + String(cur), 2220 vm 2221 ); 2222 } else if (isUndef(old)) { 2223 if (isUndef(cur.fns)) { 2224 cur = on[name] = createFnInvoker(cur, vm); 2225 } 2226 if (isTrue(event.once)) { 2227 cur = on[name] = createOnceHandler(event.name, cur, event.capture); 2228 } 2229 add(event.name, cur, event.capture, event.passive, event.params); 2230 } else if (cur !== old) { 2231 old.fns = cur; 2232 on[name] = old; 2233 } 2234 } 2235 for (name in oldOn) { 2236 if (isUndef(on[name])) { 2237 event = normalizeEvent(name); 2238 remove$$1(event.name, oldOn[name], event.capture); 2239 } 2240 } 2241 } 2242 2243 /* */ 2244 2245 function mergeVNodeHook (def, hookKey, hook) { 2246 if (def instanceof VNode) { 2247 def = def.data.hook || (def.data.hook = {}); 2248 } 2249 var invoker; 2250 var oldHook = def[hookKey]; 2251 2252 function wrappedHook () { 2253 hook.apply(this, arguments); 2254 // important: remove merged hook to ensure it's called only once 2255 // and prevent memory leak 2256 remove(invoker.fns, wrappedHook); 2257 } 2258 2259 if (isUndef(oldHook)) { 2260 // no existing hook 2261 invoker = createFnInvoker([wrappedHook]); 2262 } else { 2263 /* istanbul ignore if */ 2264 if (isDef(oldHook.fns) && isTrue(oldHook.merged)) { 2265 // already a merged invoker 2266 invoker = oldHook; 2267 invoker.fns.push(wrappedHook); 2268 } else { 2269 // existing plain hook 2270 invoker = createFnInvoker([oldHook, wrappedHook]); 2271 } 2272 } 2273 2274 invoker.merged = true; 2275 def[hookKey] = invoker; 2276 } 2277 2278 /* */ 2279 2280 function extractPropsFromVNodeData ( 2281 data, 2282 Ctor, 2283 tag 2284 ) { 2285 // we are only extracting raw values here. 2286 // validation and default values are handled in the child 2287 // component itself. 2288 var propOptions = Ctor.options.props; 2289 if (isUndef(propOptions)) { 2290 return 2291 } 2292 var res = {}; 2293 var attrs = data.attrs; 2294 var props = data.props; 2295 if (isDef(attrs) || isDef(props)) { 2296 for (var key in propOptions) { 2297 var altKey = hyphenate(key); 2298 { 2299 var keyInLowerCase = key.toLowerCase(); 2300 if ( 2301 key !== keyInLowerCase && 2302 attrs && hasOwn(attrs, keyInLowerCase) 2303 ) { 2304 tip( 2305 "Prop \"" + keyInLowerCase + "\" is passed to component " + 2306 (formatComponentName(tag || Ctor)) + ", but the declared prop name is" + 2307 " \"" + key + "\". " + 2308 "Note that HTML attributes are case-insensitive and camelCased " + 2309 "props need to use their kebab-case equivalents when using in-DOM " + 2310 "templates. You should probably use \"" + altKey + "\" instead of \"" + key + "\"." 2311 ); 2312 } 2313 } 2314 checkProp(res, props, key, altKey, true) || 2315 checkProp(res, attrs, key, altKey, false); 2316 } 2317 } 2318 return res 2319 } 2320 2321 function checkProp ( 2322 res, 2323 hash, 2324 key, 2325 altKey, 2326 preserve 2327 ) {
2328 if (isDef(hash)) { 2329 if (hasOwn(hash, key)) { 2330 res[key] = hash[key]; 2331 if (!preserve) { 2332 delete hash[key]; 2333 } 2334 return true 2335 } else if (hasOwn(hash, altKey)) { 2336 res[key] = hash[altKey]; 2337 if (!preserve) { 2338 delete hash[altKey]; 2339 } 2340 return true 2341 } 2342 } 2343 return false 2344 } 2345 2346 /* */ 2347 2348 // The template compiler attempts to minimize the need for normalization by 2349 // statically analyzing the template at compile time. 2350 // 2351 // For plain HTML markup, normalization can be completely skipped because the 2352 // generated render function is guaranteed to return Array<VNode>. There are 2353 // two cases where extra normalization is needed: 2354 2355 // 1. When the children contains components - because a functional component 2356 // may return an Array instead of a single root. In this case, just a simple 2357 // normalization is needed - if any child is an Array, we flatten the whole 2358 // thing with Array.prototype.concat. It is guaranteed to be only 1-level deep 2359 // because functional components already normalize their own children. 2360 function simpleNormalizeChildren (children) { 2361 for (var i = 0; i < children.length; i++) { 2362 if (Array.isArray(children[i])) { 2363 return Array.prototype.concat.apply([], children) 2364 } 2365 } 2366 return children 2367 } 2368 2369 // 2. When the children contains constructs that always generated nested Arrays, 2370 // e.g. <template>, <slot>, v-for, or when the children is provided by user 2371 // with hand-written render functions / JSX. In such cases a full normalization 2372 // is needed to cater to all possible types of children values. 2373 function normalizeChildren (children) { 2374 return isPrimitive(children) 2375 ? [createTextVNode(children)] 2376 : Array.isArray(children) 2377 ? normalizeArrayChildren(children) 2378 : undefined 2379 } 2380 2381 function isTextNode (node) { 2382 return isDef(node) && isDef(node.text) && isFalse(node.isComment) 2383 } 2384 2385 function normalizeArrayChildren (children, nestedIndex) { 2386 var res = []; 2387 var i, c, lastIndex, last; 2388 for (i = 0; i < children.length; i++) { 2389 c = children[i]; 2390 if (isUndef(c) || typeof c === 'boolean') { continue } 2391 lastIndex = res.length - 1; 2392 last = res[lastIndex]; 2393 // nested 2394 if (Array.isArray(c)) { 2395 if (c.length > 0) { 2396 c = normalizeArrayChildren(c, ((nestedIndex || '') + "_" + i)); 2397 // merge adjacent text nodes 2398 if (isTextNode(c[0]) && isTextNode(last)) { 2399 res[lastIndex] = createTextVNode(last.text + (c[0]).text); 2400 c.shift(); 2401 } 2402 res.push.apply(res, c); 2403 } 2404 } else if (isPrimitive(c)) { 2405 if (isTextNode(last)) { 2406 // merge adjacent text nodes 2407 // this is necessary for SSR hydration because text nodes are 2408 // essentially merged when rendered to HTML strings 2409 res[lastIndex] = createTextVNode(last.text + c); 2410 } else if (c !== '') { 2411 // convert primitive to vnode 2412 res.push(createTextVNode(c)); 2413 } 2414 } else { 2415 if (isTextNode(c) && isTextNode(last)) { 2416 // merge adjacent text nodes 2417 res[lastIndex] = createTextVNode(last.text + c.text); 2418 } else { 2419 // default key for nested array children (likely generated by v-for) 2420 if (isTrue(children._isVList) && 2421 isDef(c.tag) && 2422 isUndef(c.key) && 2423 isDef(nestedIndex)) { 2424 c.key = "__vlist" + nestedIndex + "_" + i + "__"; 2425 } 2426 res.push(c); 2427 } 2428 } 2429 } 2430 return res 2431 } 2432 2433 /* */ 2434 2435 function initProvide (vm) { 2436 var provide = vm.$options.provide; 2437 if (provide) { 2438 vm._provided = typeof provide === 'function' 2439 ? provide.call(vm) 2440 : provide; 2441 } 2442 } 2443 2444 function initInjections (vm) { 2445 var result = resolveInject(vm.$options.inject, vm); 2446 if (result) { 2447 toggleObserving(false); 2448 Object.keys(result).forEach(function (key) { 2449 /* istanbul ignore else */ 2450 { 2451 defineReactive$$1(vm, key, result[key], function () { 2452 warn( 2453 "Avoid mutating an injected value directly since the changes will be " + 2454 "overwritten whenever the provided component re-renders. " + 2455 "injection being mutated: \"" + key + "\"", 2456 vm 2457 ); 2458 }); 2459 } 2460 }); 2461 toggleObserving(true); 2462 } 2463 } 2464 2465 function resolveInject (inject, vm) { 2466 if (inject) { 2467 // inject is :any because flow is not smart enough to figure out cached 2468 var result = Object.create(null); 2469 var keys = hasSymbol 2470 ? Reflect.ownKeys(inject) 2471 : Object.keys(inject); 2472 2473 for (var i = 0; i < keys.length; i++) { 2474 var key = keys[i]; 2475 // #6574 in case the inject object is observed... 2476 if (key === '__ob__') { continue } 2477 var provideKey = inject[key].from; 2478 var source = vm; 2479 while (source) { 2480 if (source._provided && hasOwn(source._provided, provideKey)) { 2481 result[key] = source._provided[provideKey]; 2482 break 2483 } 2484 source = source.$parent; 2485 } 2486 if (!source) { 2487 if ('default' in inject[key]) { 2488 var provideDefault = inject[key].default; 2489 result[key] = typeof provideDefault === 'function' 2490 ? provideDefault.call(vm) 2491 : provideDefault; 2492 } else { 2493 warn(("Injection \"" + key + "\" not found"), vm); 2494 } 2495 } 2496 } 2497 return result 2498 } 2499 } 2500 2501 /* */ 2502 2503 2504 2505 /** 2506 * Runtime helper for resolving raw children VNodes into a slot object. 2507 */ 2508 function resolveSlots ( 2509 children, 2510 context 2511 ) { 2512 if (!children || !children.length) { 2513 return {} 2514 } 2515 var slots = {}; 2516 for (var i = 0, l = children.length; i < l; i++) { 2517 var child = children[i]; 2518 var data = child.data; 2519 // remove slot attribute if the node is resolved as a Vue slot node 2520 if (data && data.attrs && data.attrs.slot) { 2521 delete data.attrs.slot; 2522 } 2523 // named slots should only be respected if the vnode was rendered in the 2524 // same context. 2525 if ((child.context === context || child.fnContext === context) && 2526 data && data.slot != null 2527 ) { 2528 var name = data.slot; 2529 var slot = (slots[name] || (slots[name] = [])); 2530 if (child.tag === 'template') { 2531 slot.push.apply(slot, child.children || []); 2532 } else { 2533 slot.push(child); 2534 } 2535 } else { 2536 (slots.default || (slots.default = [])).push(child); 2537 } 2538 } 2539 // ignore slots that contains only whitespace 2540 for (var name$1 in slots) { 2541 if (slots[name$1].every(isWhitespace)) { 2542 delete slots[name$1]; 2543 } 2544 } 2545 return slots 2546 } 2547 2548 function isWhitespace (node) { 2549 return (node.isComment && !node.asyncFactory) || node.text === ' ' 2550 } 2551 2552 /* */ 2553 2554 function isAsyncPlaceholder (node) { 2555 return node.isComment && node.asyncFactory 2556 } 2557 2558 /* */ 2559 2560 function normalizeScopedSlots ( 2561 slots, 2562 normalSlots, 2563 prevSlots 2564 ) { 2565 var res; 2566 var hasNormalSlots = Object.keys(normalSlots).length > 0; 2567 var isStable = slots ? !!slots.$stable : !hasNormalSlots; 2568 var key = slots && slots.$key; 2569 if (!slots) { 2570 res = {}; 2571 } else if (slots._normalized) { 2572 // fast path 1: child component re-render only, parent did not change 2573 return slots._normalized 2574 } else if ( 2575 isStable && 2576 prevSlots && 2577 prevSlots !== emptyObject && 2578 key === prevSlots.$key && 2579 !hasNormalSlots && 2580 !prevSlots.$hasNormal 2581 ) { 2582 // fast path 2: stable scoped slots w/ no normal slots to proxy, 2583 // only need to normalize once 2584 return prevSlots 2585 } else { 2586 res = {}; 2587 for (var key$1 in slots) { 2588 if (slots[key$1] && key$1[0] !== '$') { 2589 res[key$1] = normalizeScopedSlot(normalSlots, key$1, slots[key$1]); 2590 } 2591 } 2592 } 2593 // expose normal slots on scopedSlots 2594 for (var key$2 in normalSlots) { 2595 if (!(key$2 in res)) { 2596 res[key$2] = proxyNormalSlot(normalSlots, key$2); 2597 } 2598 }
2599 // avoriaz seems to mock a non-extensible $scopedSlots object 2600 // and when that is passed down this would cause an error 2601 if (slots && Object.isExtensible(slots)) { 2602 (slots)._normalized = res; 2603 } 2604 def(res, '$stable', isStable); 2605 def(res, '$key', key); 2606 def(res, '$hasNormal', hasNormalSlots); 2607 return res 2608 } 2609 2610 function normalizeScopedSlot(normalSlots, key, fn) { 2611 var normalized = function () { 2612 var res = arguments.length ? fn.apply(null, arguments) : fn({}); 2613 res = res && typeof res === 'object' && !Array.isArray(res) 2614 ? [res] // single vnode 2615 : normalizeChildren(res); 2616 var vnode = res && res[0]; 2617 return res && ( 2618 !vnode || 2619 (res.length === 1 && vnode.isComment && !isAsyncPlaceholder(vnode)) // #9658, #10391 2620 ) ? undefined 2621 : res 2622 }; 2623 // this is a slot using the new v-slot syntax without scope. although it is 2624 // compiled as a scoped slot, render fn users would expect it to be present 2625 // on this.$slots because the usage is semantically a normal slot. 2626 if (fn.proxy) { 2627 Object.defineProperty(normalSlots, key, { 2628 get: normalized, 2629 enumerable: true, 2630 configurable: true 2631 }); 2632 } 2633 return normalized 2634 } 2635 2636 function proxyNormalSlot(slots, key) { 2637 return function () { return slots[key]; } 2638 } 2639 2640 /* */ 2641 2642 /** 2643 * Runtime helper for rendering v-for lists. 2644 */ 2645 function renderList ( 2646 val, 2647 render 2648 ) { 2649 var ret, i, l, keys, key; 2650 if (Array.isArray(val) || typeof val === 'string') { 2651 ret = new Array(val.length); 2652 for (i = 0, l = val.length; i < l; i++) { 2653 ret[i] = render(val[i], i); 2654 } 2655 } else if (typeof val === 'number') { 2656 ret = new Array(val); 2657 for (i = 0; i < val; i++) { 2658 ret[i] = render(i + 1, i); 2659 } 2660 } else if (isObject(val)) { 2661 if (hasSymbol && val[Symbol.iterator]) { 2662 ret = []; 2663 var iterator = val[Symbol.iterator](); 2664 var result = iterator.next(); 2665 while (!result.done) { 2666 ret.push(render(result.value, ret.length)); 2667 result = iterator.next(); 2668 } 2669 } else { 2670 keys = Object.keys(val); 2671 ret = new Array(keys.length); 2672 for (i = 0, l = keys.length; i < l; i++) { 2673 key = keys[i]; 2674 ret[i] = render(val[key], key, i); 2675 } 2676 } 2677 } 2678 if (!isDef(ret)) { 2679 ret = []; 2680 } 2681 (ret)._isVList = true; 2682 return ret 2683 } 2684 2685 /* */ 2686 2687 /** 2688 * Runtime helper for rendering <slot> 2689 */
2690 function renderSlot ( 2691 name, 2692 fallbackRender, 2693 props, 2694 bindObject 2695 ) { 2696 var scopedSlotFn = this.$scopedSlots[name]; 2697 var nodes; 2698 if (scopedSlotFn) { 2699 // scoped slot 2700 props = props || {}; 2701 if (bindObject) { 2702 if (!isObject(bindObject)) { 2703 warn('slot v-bind without argument expects an Object', this); 2704 } 2705 props = extend(extend({}, bindObject), props); 2706 } 2707 nodes = 2708 scopedSlotFn(props) || 2709 (typeof fallbackRender === 'function' ? fallbackRender() : fallbackRender); 2710 } else { 2711 nodes = 2712 this.$slots[name] || 2713 (typeof fallbackRender === 'function' ? fallbackRender() : fallbackRender); 2714 } 2715 2716 var target = props && props.slot; 2717 if (target) { 2718 return this.$createElement('template', { slot: target }, nodes) 2719 } else { 2720 return nodes 2721 } 2722 } 2723 2724 /* */ 2725 2726 /** 2727 * Runtime helper for resolving filters 2728 */ 2729 function resolveFilter (id) { 2730 return resolveAsset(this.$options, 'filters', id, true) || identity 2731 } 2732 2733 /* */ 2734 2735 function isKeyNotMatch (expect, actual) { 2736 if (Array.isArray(expect)) { 2737 return expect.indexOf(actual) === -1 2738 } else { 2739 return expect !== actual 2740 } 2741 } 2742 2743 /** 2744 * Runtime helper for checking keyCodes from config. 2745 * exposed as Vue.prototype._k 2746 * passing in eventKeyName as last argument separately for backwards compat 2747 */ 2748 function checkKeyCodes ( 2749 eventKeyCode, 2750 key, 2751 builtInKeyCode, 2752 eventKeyName, 2753 builtInKeyName 2754 ) { 2755 var mappedKeyCode = config.keyCodes[key] || builtInKeyCode; 2756 if (builtInKeyName && eventKeyName && !config.keyCodes[key]) { 2757 return isKeyNotMatch(builtInKeyName, eventKeyName) 2758 } else if (mappedKeyCode) { 2759 return isKeyNotMatch(mappedKeyCode, eventKeyCode) 2760 } else if (eventKeyName) { 2761 return hyphenate(eventKeyName) !== key 2762 }
2763 return eventKeyCode === undefined 2764 } 2765 2766 /* */ 2767 2768 /** 2769 * Runtime helper for merging v-bind="object" into a VNode's data. 2770 */ 2771 function bindObjectProps ( 2772 data, 2773 tag, 2774 value, 2775 asProp, 2776 isSync 2777 ) { 2778 if (value) { 2779 if (!isObject(value)) { 2780 warn( 2781 'v-bind without argument expects an Object or Array value', 2782 this 2783 ); 2784 } else { 2785 if (Array.isArray(value)) { 2786 value = toObject(value); 2787 } 2788 var hash; 2789 var loop = function ( key ) { 2790 if ( 2791 key === 'class' || 2792 key === 'style' || 2793 isReservedAttribute(key) 2794 ) { 2795 hash = data; 2796 } else { 2797 var type = data.attrs && data.attrs.type; 2798 hash = asProp || config.mustUseProp(tag, type, key) 2799 ? data.domProps || (data.domProps = {}) 2800 : data.attrs || (data.attrs = {}); 2801 } 2802 var camelizedKey = camelize(key); 2803 var hyphenatedKey = hyphenate(key); 2804 if (!(camelizedKey in hash) && !(hyphenatedKey in hash)) { 2805 hash[key] = value[key]; 2806 2807 if (isSync) { 2808 var on = data.on || (data.on = {}); 2809 on[("update:" + key)] = function ($event) { 2810 value[key] = $event; 2811 }; 2812 } 2813 } 2814 }; 2815 2816 for (var key in value) loop( key ); 2817 } 2818 } 2819 return data 2820 } 2821 2822 /* */ 2823 2824 /** 2825 * Runtime helper for rendering static trees. 2826 */
2827 function renderStatic ( 2828 index, 2829 isInFor 2830 ) { 2831 var cached = this._staticTrees || (this._staticTrees = []); 2832 var tree = cached[index]; 2833 // if has already-rendered static tree and not inside v-for, 2834 // we can reuse the same tree. 2835 if (tree && !isInFor) { 2836 return tree 2837 } 2838 // otherwise, render a fresh tree. 2839 tree = cached[index] = this.$options.staticRenderFns[index].call( 2840 this._renderProxy, 2841 null, 2842 this // for render fns generated for functional component templates 2843 ); 2844 markStatic(tree, ("__static__" + index), false); 2845 return tree 2846 } 2847 2848 /** 2849 * Runtime helper for v-once. 2850 * Effectively it means marking the node as static with a unique key. 2851 */ 2852 function markOnce ( 2853 tree, 2854 index, 2855 key 2856 ) { 2857 markStatic(tree, ("__once__" + index + (key ? ("_" + key) : "")), true); 2858 return tree 2859 } 2860 2861 function markStatic ( 2862 tree, 2863 key, 2864 isOnce 2865 ) { 2866 if (Array.isArray(tree)) { 2867 for (var i = 0; i < tree.length; i++) { 2868 if (tree[i] && typeof tree[i] !== 'string') { 2869 markStaticNode(tree[i], (key + "_" + i), isOnce); 2870 } 2871 } 2872 } else { 2873 markStaticNode(tree, key, isOnce); 2874 } 2875 } 2876 2877 function markStaticNode (node, key, isOnce) { 2878 node.isStatic = true; 2879 node.key = key; 2880 node.isOnce = isOnce; 2881 } 2882 2883 /* */ 2884 2885 function bindObjectListeners (data, value) { 2886 if (value) { 2887 if (!isPlainObject(value)) { 2888 warn( 2889 'v-on without argument expects an Object value', 2890 this 2891 ); 2892 } else { 2893 var on = data.on = data.on ? extend({}, data.on) : {}; 2894 for (var key in value) { 2895 var existing = on[key]; 2896 var ours = value[key]; 2897 on[key] = existing ? [].concat(existing, ours) : ours; 2898 } 2899 } 2900 } 2901 return data 2902 } 2903 2904 /* */ 2905 2906 function resolveScopedSlots ( 2907 fns, // see flow/vnode 2908 res, 2909 // the following are added in 2.6 2910 hasDynamicKeys, 2911 contentHashKey 2912 ) { 2913 res = res || { $stable: !hasDynamicKeys }; 2914 for (var i = 0; i < fns.length; i++) { 2915 var slot = fns[i]; 2916 if (Array.isArray(slot)) { 2917 resolveScopedSlots(slot, res, hasDynamicKeys); 2918 } else if (slot) { 2919 // marker for reverse proxying v-slot without scope on this.$slots 2920 if (slot.proxy) { 2921 slot.fn.proxy = true; 2922 } 2923 res[slot.key] = slot.fn; 2924 } 2925 } 2926 if (contentHashKey) { 2927 (res).$key = contentHashKey; 2928 } 2929 return res 2930 } 2931 2932 /* */ 2933 2934 function bindDynamicKeys (baseObj, values) { 2935 for (var i = 0; i < values.length; i += 2) { 2936 var key = values[i]; 2937 if (typeof key === 'string' && key) { 2938 baseObj[values[i]] = values[i + 1]; 2939 } else if (key !== '' && key !== null) { 2940 // null is a special value for explicitly removing a binding 2941 warn( 2942 ("Invalid value for dynamic directive argument (expected string or null): " + key), 2943 this 2944 ); 2945 } 2946 } 2947 return baseObj 2948 } 2949 2950 // helper to dynamically append modifier runtime markers to event names. 2951 // ensure only append when value is already string, otherwise it will be cast 2952 // to string and cause the type check to miss. 2953 function prependModifier (value, symbol) { 2954 return typeof value === 'string' ? symbol + value : value 2955 } 2956 2957 /* */ 2958 2959 function installRenderHelpers (target) { 2960 target._o = markOnce; 2961 target._n = toNumber; 2962 target._s = toString; 2963 target._l = renderList; 2964 target._t = renderSlot; 2965 target._q = looseEqual; 2966 target._i = looseIndexOf; 2967 target._m = renderStatic; 2968 target._f = resolveFilter; 2969 target._k = checkKeyCodes; 2970 target._b = bindObjectProps; 2971 target._v = createTextVNode; 2972 target._e = createEmptyVNode; 2973 target._u = resolveScopedSlots; 2974 target._g = bindObjectListeners; 2975 target._d = bindDynamicKeys; 2976 target._p = prependModifier; 2977 } 2978 2979 /* */ 2980 2981 function FunctionalRenderContext ( 2982 data, 2983 props, 2984 children, 2985 parent, 2986 Ctor 2987 ) { 2988 var this$1 = this; 2989 2990 var options = Ctor.options; 2991 // ensure the createElement function in functional components 2992 // gets a unique context - this is necessary for correct named slot check 2993 var contextVm; 2994 if (hasOwn(parent, '_uid')) { 2995 contextVm = Object.create(parent); 2996 // $flow-disable-line 2997 contextVm._original = parent; 2998 } else { 2999 // the context vm passed in is a functional context as well. 3000 // in this case we want to make sure we are able to get a hold to the 3001 // real context instance. 3002 contextVm = parent; 3003 // $flow-disable-line 3004 parent = parent._original; 3005 } 3006 var isCompiled = isTrue(options._compiled); 3007 var needNormalization = !isCompiled; 3008 3009 this.data = data; 3010 this.props = props; 3011 this.children = children; 3012 this.parent = parent; 3013 this.listeners = data.on || emptyObject; 3014 this.injections = resolveInject(options.inject, parent); 3015 this.slots = function () { 3016 if (!this$1.$slots) { 3017 normalizeScopedSlots( 3018 data.scopedSlots, 3019 this$1.$slots = resolveSlots(children, parent) 3020 ); 3021 } 3022 return this$1.$slots 3023 }; 3024 3025 Object.defineProperty(this, 'scopedSlots', ({ 3026 enumerable: true, 3027 get: function get () { 3028 return normalizeScopedSlots(data.scopedSlots, this.slots()) 3029 } 3030 })); 3031 3032 // support for compiled functional template 3033 if (isCompiled) { 3034 // exposing $options for renderStatic() 3035 this.$options = options; 3036 // pre-resolve slots for renderSlot() 3037 this.$slots = this.slots(); 3038 this.$scopedSlots = normalizeScopedSlots(data.scopedSlots, this.$slots); 3039 } 3040 3041 if (options._scopeId) { 3042 this._c = function (a, b, c, d) { 3043 var vnode = createElement(contextVm, a, b, c, d, needNormalization); 3044 if (vnode && !Array.isArray(vnode)) { 3045 vnode.fnScopeId = options._scopeId; 3046 vnode.fnContext = parent; 3047 } 3048 return vnode 3049 }; 3050 } else { 3051 this._c = function (a, b, c, d) { return createElement(contextVm, a, b, c, d, needNormalization); }; 3052 } 3053 } 3054 3055 installRenderHelpers(FunctionalRenderContext.prototype); 3056 3057 function createFunctionalComponent ( 3058 Ctor, 3059 propsData, 3060 data, 3061 contextVm, 3062 children 3063 ) { 3064 var options = Ctor.options; 3065 var props = {}; 3066 var propOptions = options.props; 3067 if (isDef(propOptions)) { 3068 for (var key in propOptions) { 3069 props[key] = validateProp(key, propOptions, propsData || emptyObject); 3070 } 3071 } else { 3072 if (isDef(data.attrs)) { mergeProps(props, data.attrs); } 3073 if (isDef(data.props)) { mergeProps(props, data.props); } 3074 } 3075 3076 var renderContext = new FunctionalRenderContext( 3077 data, 3078 props, 3079 children, 3080 contextVm, 3081 Ctor 3082 ); 3083 3084 var vnode = options.render.call(null, renderContext._c, renderContext); 3085 3086 if (vnode instanceof VNode) { 3087 return cloneAndMarkFunctionalResult(vnode, data, renderContext.parent, options, renderContext) 3088 } else if (Array.isArray(vnode)) { 3089 var vnodes = normalizeChildren(vnode) || []; 3090 var res = new Array(vnodes.length); 3091 for (var i = 0; i < vnodes.length; i++) { 3092 res[i] = cloneAndMarkFunctionalResult(vnodes[i], data, renderContext.parent, options, renderContext); 3093 } 3094 return res 3095 } 3096 } 3097 3098 function cloneAndMarkFunctionalResult (vnode, data, contextVm, options, renderContext) { 3099 // #7817 clone node before setting fnContext, otherwise if the node is reused
3100 // (e.g. it was from a cached normal slot) the fnContext causes named slots 3101 // that should not be matched to match. 3102 var clone = cloneVNode(vnode); 3103 clone.fnContext = contextVm; 3104 clone.fnOptions = options; 3105 { 3106 (clone.devtoolsMeta = clone.devtoolsMeta || {}).renderContext = renderContext; 3107 } 3108 if (data.slot) { 3109 (clone.data || (clone.data = {})).slot = data.slot; 3110 } 3111 return clone 3112 } 3113 3114 function mergeProps (to, from) { 3115 for (var key in from) { 3116 to[camelize(key)] = from[key]; 3117 } 3118 } 3119 3120 /* */ 3121 3122 /* */ 3123 3124 /* */ 3125 3126 /* */ 3127 3128 // inline hooks to be invoked on component VNodes during patch 3129 var componentVNodeHooks = { 3130 init: function init (vnode, hydrating) { 3131 if ( 3132 vnode.componentInstance && 3133 !vnode.componentInstance._isDestroyed && 3134 vnode.data.keepAlive 3135 ) { 3136 // kept-alive components, treat as a patch 3137 var mountedNode = vnode; // work around flow 3138 componentVNodeHooks.prepatch(mountedNode, mountedNode); 3139 } else { 3140 var child = vnode.componentInstance = createComponentInstanceForVnode( 3141 vnode, 3142 activeInstance 3143 ); 3144 child.$mount(hydrating ? vnode.elm : undefined, hydrating); 3145 } 3146 }, 3147 3148 prepatch: function prepatch (oldVnode, vnode) { 3149 var options = vnode.componentOptions; 3150 var child = vnode.componentInstance = oldVnode.componentInstance; 3151 updateChildComponent( 3152 child, 3153 options.propsData, // updated props 3154 options.listeners, // updated listeners 3155 vnode, // new parent vnode 3156 options.children // new children 3157 ); 3158 }, 3159 3160 insert: function insert (vnode) { 3161 var context = vnode.context; 3162 var componentInstance = vnode.componentInstance; 3163 if (!componentInstance._isMounted) { 3164 componentInstance._isMounted = true; 3165 callHook(componentInstance, 'mounted'); 3166 } 3167 if (vnode.data.keepAlive) { 3168 if (context._isMounted) { 3169 // vue-router#1212 3170 // During updates, a kept-alive component's child components may 3171 // change, so directly walking the tree here may call activated hooks 3172 // on incorrect children. Instead we push them into a queue which will 3173 // be processed after the whole patch process ended. 3174 queueActivatedComponent(componentInstance); 3175 } else { 3176 activateChildComponent(componentInstance, true /* direct */); 3177 } 3178 } 3179 }, 3180 3181 destroy: function destroy (vnode) { 3182 var componentInstance = vnode.componentInstance; 3183 if (!componentInstance._isDestroyed) { 3184 if (!vnode.data.keepAlive) { 3185 componentInstance.$destroy(); 3186 } else { 3187 deactivateChildComponent(componentInstance, true /* direct */); 3188 } 3189 } 3190 } 3191 }; 3192 3193 var hooksToMerge = Object.keys(componentVNodeHooks); 3194 3195 function createComponent ( 3196 Ctor, 3197 data, 3198 context, 3199 children, 3200 tag 3201 ) { 3202 if (isUndef(Ctor)) { 3203 return 3204 } 3205 3206 var baseCtor = context.$options._base; 3207 3208 // plain options object: turn it into a constructor 3209 if (isObject(Ctor)) { 3210 Ctor = baseCtor.extend(Ctor); 3211 } 3212 3213 // if at this stage it's not a constructor or an async component factory, 3214 // reject. 3215 if (typeof Ctor !== 'function') { 3216 { 3217 warn(("Invalid Component definition: " + (String(Ctor))), context); 3218 } 3219 return 3220 } 3221 3222 // async component 3223 var asyncFactory; 3224 if (isUndef(Ctor.cid)) { 3225 asyncFactory = Ctor; 3226 Ctor = resolveAsyncComponent(asyncFactory, baseCtor); 3227 if (Ctor === undefined) { 3228 // return a placeholder node for async component, which is rendered 3229 // as a comment node but preserves all the raw information for the node. 3230 // the information will be used for async server-rendering and hydration. 3231 return createAsyncPlaceholder( 3232 asyncFactory, 3233 data, 3234 context, 3235 children, 3236 tag 3237 ) 3238 } 3239 } 3240 3241 data = data || {}; 3242 3243 // resolve constructor options in case global mixins are applied after 3244 // component constructor creation 3245 resolveConstructorOptions(Ctor); 3246 3247 // transform component v-model data into props & events 3248 if (isDef(data.model)) { 3249 transformModel(Ctor.options, data); 3250 } 3251 3252 // extract props 3253 var propsData = extractPropsFromVNodeData(data, Ctor, tag); 3254 3255 // functional component 3256 if (isTrue(Ctor.options.functional)) { 3257 return createFunctionalComponent(Ctor, propsData, data, context, children) 3258 } 3259 3260 // extract listeners, since these needs to be treated as 3261 // child component listeners instead of DOM listeners 3262 var listeners = data.on; 3263 // replace with listeners with .native modifier 3264 // so it gets processed during parent component patch. 3265 data.on = data.nativeOn; 3266 3267 if (isTrue(Ctor.options.abstract)) { 3268 // abstract components do not keep anything 3269 // other than props & listeners & slot 3270 3271 // work around flow 3272 var slot = data.slot; 3273 data = {}; 3274 if (slot) { 3275 data.slot = slot; 3276 } 3277 } 3278
3279 // install component management hooks onto the placeholder node 3280 installComponentHooks(data); 3281 3282 // return a placeholder vnode 3283 var name = Ctor.options.name || tag; 3284 var vnode = new VNode( 3285 ("vue-component-" + (Ctor.cid) + (name ? ("-" + name) : '')), 3286 data, undefined, undefined, undefined, context, 3287 { Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children }, 3288 asyncFactory 3289 ); 3290 3291 return vnode 3292 } 3293 3294 function createComponentInstanceForVnode ( 3295 // we know it's MountedComponentVNode but flow doesn't 3296 vnode, 3297 // activeInstance in lifecycle state 3298 parent 3299 ) { 3300 var options = { 3301 _isComponent: true, 3302 _parentVnode: vnode, 3303 parent: parent 3304 }; 3305 // check inline-template render functions 3306 var inlineTemplate = vnode.data.inlineTemplate; 3307 if (isDef(inlineTemplate)) { 3308 options.render = inlineTemplate.render; 3309 options.staticRenderFns = inlineTemplate.staticRenderFns; 3310 } 3311 return new vnode.componentOptions.Ctor(options) 3312 } 3313 3314 function installComponentHooks (data) { 3315 var hooks = data.hook || (data.hook = {}); 3316 for (var i = 0; i < hooksToMerge.length; i++) { 3317 var key = hooksToMerge[i]; 3318 var existing = hooks[key]; 3319 var toMerge = componentVNodeHooks[key]; 3320 if (existing !== toMerge && !(existing && existing._merged)) { 3321 hooks[key] = existing ? mergeHook$1(toMerge, existing) : toMerge; 3322 } 3323 } 3324 } 3325 3326 function mergeHook$1 (f1, f2) { 3327 var merged = function (a, b) { 3328 // flow complains about extra args which is why we use any 3329 f1(a, b); 3330 f2(a, b); 3331 }; 3332 merged._merged = true; 3333 return merged 3334 } 3335 3336 // transform component v-model info (value and callback) into 3337 // prop and event handler respectively. 3338 function transformModel (options, data) { 3339 var prop = (options.model && options.model.prop) || 'value'; 3340 var event = (options.model && options.model.event) || 'input' 3341 ;(data.attrs || (data.attrs = {}))[prop] = data.model.value; 3342 var on = data.on || (data.on = {}); 3343 var existing = on[event]; 3344 var callback = data.model.callback; 3345 if (isDef(existing)) { 3346 if ( 3347 Array.isArray(existing) 3348 ? existing.indexOf(callback) === -1 3349 : existing !== callback 3350 ) { 3351 on[event] = [callback].concat(existing); 3352 } 3353 } else { 3354 on[event] = callback; 3355 } 3356 } 3357 3358 /* */ 3359 3360 var SIMPLE_NORMALIZE = 1; 3361 var ALWAYS_NORMALIZE = 2; 3362 3363 // wrapper function for providing a more flexible interface 3364 // without getting yelled at by flow 3365 function createElement ( 3366 context, 3367 tag, 3368 data, 3369 children, 3370 normalizationType, 3371 alwaysNormalize 3372 ) { 3373 if (Array.isArray(data) || isPrimitive(data)) { 3374 normalizationType = children; 3375 children = data; 3376 data = undefined; 3377 } 3378 if (isTrue(alwaysNormalize)) { 3379 normalizationType = ALWAYS_NORMALIZE; 3380 } 3381 return _createElement(context, tag, data, children, normalizationType) 3382 } 3383 3384 function _createElement ( 3385 context, 3386 tag, 3387 data, 3388 children, 3389 normalizationType 3390 ) { 3391 if (isDef(data) && isDef((data).__ob__)) { 3392 warn( 3393 "Avoid using observed data object as vnode data: " + (JSON.stringify(data)) + "\n" + 3394 'Always create fresh vnode data objects in each render!', 3395 context 3396 ); 3397 return createEmptyVNode() 3398 } 3399 // object syntax in v-bind 3400 if (isDef(data) && isDef(data.is)) { 3401 tag = data.is; 3402 } 3403 if (!tag) { 3404 // in case of component :is set to falsy value 3405 return createEmptyVNode() 3406 } 3407 // warn against non-primitive key 3408 if (isDef(data) && isDef(data.key) && !isPrimitive(data.key) 3409 ) { 3410 { 3411 warn( 3412 'Avoid using non-primitive value as key, ' + 3413 'use string/number value instead.', 3414 context 3415 ); 3416 } 3417 } 3418 // support single function children as default scoped slot 3419 if (Array.isArray(children) && 3420 typeof children[0] === 'function' 3421 ) { 3422 data = data || {}; 3423 data.scopedSlots = { default: children[0] }; 3424 children.length = 0; 3425 } 3426 if (normalizationType === ALWAYS_NORMALIZE) { 3427 children = normalizeChildren(children); 3428 } else if (normalizationType === SIMPLE_NORMALIZE) { 3429 children = simpleNormalizeChildren(children); 3430 } 3431 var vnode, ns; 3432 if (typeof tag === 'string') { 3433 var Ctor; 3434 ns = (context.$vnode && context.$vnode.ns) || config.getTagNamespace(tag); 3435 if (config.isReservedTag(tag)) { 3436 // platform built-in elements 3437 if (isDef(data) && isDef(data.nativeOn) && data.tag !== 'component') { 3438 warn(
3439 ("The .native modifier for v-on is only valid on components but it was used on <" + tag + ">."), 3440 context 3441 ); 3442 } 3443 vnode = new VNode( 3444 config.parsePlatformTagName(tag), data, children, 3445 undefined, undefined, context 3446 ); 3447 } else if ((!data || !data.pre) && isDef(Ctor = resolveAsset(context.$options, 'components', tag))) { 3448 // component 3449 vnode = createComponent(Ctor, data, context, children, tag); 3450 } else { 3451 // unknown or unlisted namespaced elements 3452 // check at runtime because it may get assigned a namespace when its 3453 // parent normalizes children 3454 vnode = new VNode( 3455 tag, data, children, 3456 undefined, undefined, context 3457 ); 3458 } 3459 } else { 3460 // direct component options / constructor 3461 vnode = createComponent(tag, data, context, children); 3462 } 3463 if (Array.isArray(vnode)) { 3464 return vnode 3465 } else if (isDef(vnode)) { 3466 if (isDef(ns)) { applyNS(vnode, ns); } 3467 if (isDef(data)) { registerDeepBindings(data); } 3468 return vnode 3469 } else { 3470 return createEmptyVNode() 3471 } 3472 } 3473 3474 function applyNS (vnode, ns, force) { 3475 vnode.ns = ns; 3476 if (vnode.tag === 'foreignObject') { 3477 // use default namespace inside foreignObject 3478 ns = undefined; 3479 force = true; 3480 }
3481 if (isDef(vnode.children)) { 3482 for (var i = 0, l = vnode.children.length; i < l; i++) { 3483 var child = vnode.children[i]; 3484 if (isDef(child.tag) && ( 3485 isUndef(child.ns) || (isTrue(force) && child.tag !== 'svg'))) { 3486 applyNS(child, ns, force); 3487 } 3488 } 3489 } 3490 } 3491 3492 // ref #5318 3493 // necessary to ensure parent re-render when deep bindings like :style and 3494 // :class are used on slot nodes 3495 function registerDeepBindings (data) { 3496 if (isObject(data.style)) { 3497 traverse(data.style); 3498 } 3499 if (isObject(data.class)) { 3500 traverse(data.class); 3501 } 3502 } 3503 3504 /* */ 3505 3506 function initRender (vm) { 3507 vm._vnode = null; // the root of the child tree 3508 vm._staticTrees = null; // v-once cached trees 3509 var options = vm.$options; 3510 var parentVnode = vm.$vnode = options._parentVnode; // the placeholder node in parent tree 3511 var renderContext = parentVnode && parentVnode.context; 3512 vm.$slots = resolveSlots(options._renderChildren, renderContext); 3513 vm.$scopedSlots = emptyObject; 3514 // bind the createElement fn to this instance 3515 // so that we get proper render context inside it. 3516 // args order: tag, data, children, normalizationType, alwaysNormalize 3517 // internal version is used by render functions compiled from templates 3518 vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); }; 3519 // normalization is always applied for the public version, used in 3520 // user-written render functions. 3521 vm.$createElement = function (a, b, c, d) { return createElement(vm, a, b, c, d, true); }; 3522 3523 // $attrs & $listeners are exposed for easier HOC creation. 3524 // they need to be reactive so that HOCs using them are always updated 3525 var parentData = parentVnode && parentVnode.data; 3526 3527 /* istanbul ignore else */ 3528 { 3529 defineReactive$$1(vm, '$attrs', parentData && parentData.attrs || emptyObject, function () { 3530 !isUpdatingChildComponent && warn("$attrs is readonly.", vm); 3531 }, true); 3532 defineReactive$$1(vm, '$listeners', options._parentListeners || emptyObject, function () { 3533 !isUpdatingChildComponent && warn("$listeners is readonly.", vm); 3534 }, true); 3535 } 3536 } 3537 3538 var currentRenderingInstance = null; 3539 3540 function renderMixin (Vue) { 3541 // install runtime convenience helpers 3542 installRenderHelpers(Vue.prototype); 3543 3544 Vue.prototype.$nextTick = function (fn) { 3545 return nextTick(fn, this) 3546 }; 3547 3548 Vue.prototype._render = function () { 3549 var vm = this; 3550 var ref = vm.$options; 3551 var render = ref.render; 3552 var _parentVnode = ref._parentVnode; 3553 3554 if (_parentVnode) { 3555 vm.$scopedSlots = normalizeScopedSlots( 3556 _parentVnode.data.scopedSlots, 3557 vm.$slots, 3558 vm.$scopedSlots 3559 ); 3560 } 3561 3562 // set parent vnode. this allows render functions to have access 3563 // to the data on the placeholder node. 3564 vm.$vnode = _parentVnode; 3565 // render self 3566 var vnode; 3567 try { 3568 // There's no need to maintain a stack because all render fns are called 3569 // separately from one another. Nested component's render fns are called 3570 // when parent component is patched. 3571 currentRenderingInstance = vm; 3572 vnode = render.call(vm._renderProxy, vm.$createElement); 3573 } catch (e) { 3574 handleError(e, vm, "render"); 3575 // return error render result, 3576 // or previous vnode to prevent render error causing blank component 3577 /* istanbul ignore else */ 3578 if (vm.$options.renderError) { 3579 try { 3580 vnode = vm.$options.renderError.call(vm._renderProxy, vm.$createElement, e); 3581 } catch (e) { 3582 handleError(e, vm, "renderError"); 3583 vnode = vm._vnode; 3584 } 3585 } else { 3586 vnode = vm._vnode; 3587 } 3588 } finally { 3589 currentRenderingInstance = null; 3590 } 3591 // if the returned array contains only a single node, allow it 3592 if (Array.isArray(vnode) && vnode.length === 1) { 3593 vnode = vnode[0]; 3594 } 3595 // return empty vnode in case the render function errored out 3596 if (!(vnode instanceof VNode)) { 3597 if (Array.isArray(vnode)) { 3598 warn( 3599 'Multiple root nodes returned from render function. Render function ' + 3600 'should return a single root node.', 3601 vm 3602 ); 3603 } 3604 vnode = createEmptyVNode(); 3605 } 3606 // set parent 3607 vnode.parent = _parentVnode; 3608 return vnode 3609 }; 3610 } 3611 3612 /* */ 3613 3614 function ensureCtor (comp, base) { 3615 if ( 3616 comp.__esModule || 3617 (hasSymbol && comp[Symbol.toStringTag] === 'Module') 3618 ) { 3619 comp = comp.default; 3620 } 3621 return isObject(comp) 3622 ? base.extend(comp) 3623 : comp 3624 } 3625 3626 function createAsyncPlaceholder ( 3627 factory, 3628 data, 3629 context, 3630 children, 3631 tag 3632 ) { 3633 var node = createEmptyVNode(); 3634 node.asyncFactory = factory; 3635 node.asyncMeta = { data: data, context: context, children: children, tag: tag }; 3636 return node 3637 } 3638 3639 function resolveAsyncComponent ( 3640 factory, 3641 baseCtor 3642 ) { 3643 if (isTrue(factory.error) && isDef(factory.errorComp)) { 3644 return factory.errorComp 3645 } 3646 3647 if (isDef(factory.resolved)) { 3648 return factory.resolved 3649 } 3650 3651 var owner = currentRenderingInstance;
3652 if (owner && isDef(factory.owners) && factory.owners.indexOf(owner) === -1) { 3653 // already pending 3654 factory.owners.push(owner); 3655 } 3656 3657 if (isTrue(factory.loading) && isDef(factory.loadingComp)) { 3658 return factory.loadingComp 3659 } 3660 3661 if (owner && !isDef(factory.owners)) { 3662 var owners = factory.owners = [owner]; 3663 var sync = true; 3664 var timerLoading = null; 3665 var timerTimeout = null 3666 3667 ;(owner).$on('hook:destroyed', function () { return remove(owners, owner); }); 3668 3669 var forceRender = function (renderCompleted) { 3670 for (var i = 0, l = owners.length; i < l; i++) { 3671 (owners[i]).$forceUpdate(); 3672 } 3673 3674 if (renderCompleted) { 3675 owners.length = 0; 3676 if (timerLoading !== null) { 3677 clearTimeout(timerLoading); 3678 timerLoading = null; 3679 } 3680 if (timerTimeout !== null) { 3681 clearTimeout(timerTimeout); 3682 timerTimeout = null; 3683 } 3684 } 3685 }; 3686 3687 var resolve = once(function (res) { 3688 // cache resolved 3689 factory.resolved = ensureCtor(res, baseCtor); 3690 // invoke callbacks only if this is not a synchronous resolve 3691 // (async resolves are shimmed as synchronous during SSR) 3692 if (!sync) { 3693 forceRender(true); 3694 } else { 3695 owners.length = 0; 3696 } 3697 }); 3698 3699 var reject = once(function (reason) { 3700 warn( 3701 "Failed to resolve async component: " + (String(factory)) + 3702 (reason ? ("\nReason: " + reason) : '') 3703 ); 3704 if (isDef(factory.errorComp)) { 3705 factory.error = true; 3706 forceRender(true); 3707 } 3708 }); 3709 3710 var res = factory(resolve, reject); 3711 3712 if (isObject(res)) { 3713 if (isPromise(res)) { 3714 // () => Promise 3715 if (isUndef(factory.resolved)) { 3716 res.then(resolve, reject); 3717 } 3718 } else if (isPromise(res.component)) { 3719 res.component.then(resolve, reject); 3720 3721 if (isDef(res.error)) { 3722 factory.errorComp = ensureCtor(res.error, baseCtor); 3723 } 3724 3725 if (isDef(res.loading)) { 3726 factory.loadingComp = ensureCtor(res.loading, baseCtor); 3727 if (res.delay === 0) { 3728 factory.loading = true; 3729 } else { 3730 timerLoading = setTimeout(function () { 3731 timerLoading = null; 3732 if (isUndef(factory.resolved) && isUndef(factory.error)) { 3733 factory.loading = true; 3734 forceRender(false); 3735 } 3736 }, res.delay || 200); 3737 } 3738 } 3739 3740 if (isDef(res.timeout)) { 3741 timerTimeout = setTimeout(function () { 3742 timerTimeout = null; 3743 if (isUndef(factory.resolved)) { 3744 reject( 3745 "timeout (" + (res.timeout) + "ms)" 3746 ); 3747 } 3748 }, res.timeout); 3749 } 3750 } 3751 } 3752 3753 sync = false; 3754 // return in case resolved synchronously 3755 return factory.loading 3756 ? factory.loadingComp 3757 : factory.resolved 3758 } 3759 } 3760 3761 /* */ 3762 3763 function getFirstComponentChild (children) { 3764 if (Array.isArray(children)) { 3765 for (var i = 0; i < children.length; i++) { 3766 var c = children[i]; 3767 if (isDef(c) && (isDef(c.componentOptions) || isAsyncPlaceholder(c))) { 3768 return c 3769 } 3770 } 3771 } 3772 } 3773 3774 /* */ 3775 3776 /* */ 3777 3778 function initEvents (vm) { 3779 vm._events = Object.create(null); 3780 vm._hasHookEvent = false; 3781 // init parent attached events 3782 var listeners = vm.$options._parentListeners; 3783 if (listeners) { 3784 updateComponentListeners(vm, listeners); 3785 } 3786 } 3787 3788 var target; 3789 3790 function add (event, fn) { 3791 target.$on(event, fn); 3792 } 3793 3794 function remove$1 (event, fn) { 3795 target.$off(event, fn); 3796 } 3797 3798 function createOnceHandler (event, fn) { 3799 var _target = target; 3800 return function onceHandler () { 3801 var res = fn.apply(null, arguments); 3802 if (res !== null) { 3803 _target.$off(event, onceHandler); 3804 } 3805 } 3806 } 3807 3808 function updateComponentListeners ( 3809 vm, 3810 listeners, 3811 oldListeners 3812 ) { 3813 target = vm; 3814 updateListeners(listeners, oldListeners || {}, add, remove$1, createOnceHandler, vm); 3815 target = undefined; 3816 } 3817 3818 function eventsMixin (Vue) { 3819 var hookRE = /^hook:/; 3820 Vue.prototype.$on = function (event, fn) { 3821 var vm = this; 3822 if (Array.isArray(event)) { 3823 for (var i = 0, l = event.length; i < l; i++) { 3824 vm.$on(event[i], fn); 3825 } 3826 } else { 3827 (vm._events[event] || (vm._events[event] = [])).push(fn); 3828 // optimize hook:event cost by using a boolean flag marked at registration 3829 // instead of a hash lookup 3830 if (hookRE.test(event)) { 3831 vm._hasHookEvent = true; 3832 } 3833 } 3834 return vm 3835 }; 3836 3837 Vue.prototype.$once = function (event, fn) { 3838 var vm = this; 3839 function on () { 3840 vm.$off(event, on); 3841 fn.apply(vm, arguments); 3842 } 3843 on.fn = fn; 3844 vm.$on(event, on); 3845 return vm 3846 }; 3847 3848 Vue.prototype.$off = function (event, fn) { 3849 var vm = this; 3850 // all 3851 if (!arguments.length) { 3852 vm._events = Object.create(null); 3853 return vm 3854 } 3855 // array of events 3856 if (Array.isArray(event)) { 3857 for (var i$1 = 0, l = event.length; i$1 < l; i$1++) { 3858 vm.$off(event[i$1], fn); 3859 } 3860 return vm 3861 } 3862 // specific event 3863 var cbs = vm._events[event]; 3864 if (!cbs) { 3865 return vm 3866 } 3867 if (!fn) { 3868 vm._events[event] = null; 3869 return vm 3870 } 3871 // specific handler 3872 var cb; 3873 var i = cbs.length; 3874 while (i--) { 3875 cb = cbs[i];
3876 if (cb === fn || cb.fn === fn) { 3877 cbs.splice(i, 1); 3878 break 3879 } 3880 } 3881 return vm 3882 }; 3883 3884 Vue.prototype.$emit = function (event) { 3885 var vm = this; 3886 { 3887 var lowerCaseEvent = event.toLowerCase(); 3888 if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) { 3889 tip( 3890 "Event \"" + lowerCaseEvent + "\" is emitted in component " + 3891 (formatComponentName(vm)) + " but the handler is registered for \"" + event + "\". " + 3892 "Note that HTML attributes are case-insensitive and you cannot use " + 3893 "v-on to listen to camelCase events when using in-DOM templates. " + 3894 "You should probably use \"" + (hyphenate(event)) + "\" instead of \"" + event + "\"." 3895 ); 3896 } 3897 } 3898 var cbs = vm._events[event]; 3899 if (cbs) { 3900 cbs = cbs.length > 1 ? toArray(cbs) : cbs; 3901 var args = toArray(arguments, 1); 3902 var info = "event handler for \"" + event + "\""; 3903 for (var i = 0, l = cbs.length; i < l; i++) { 3904 invokeWithErrorHandling(cbs[i], vm, args, vm, info); 3905 } 3906 } 3907 return vm 3908 }; 3909 } 3910 3911 /* */ 3912 3913 var activeInstance = null; 3914 var isUpdatingChildComponent = false; 3915 3916 function setActiveInstance(vm) { 3917 var prevActiveInstance = activeInstance; 3918 activeInstance = vm; 3919 return function () { 3920 activeInstance = prevActiveInstance; 3921 } 3922 } 3923 3924 function initLifecycle (vm) { 3925 var options = vm.$options; 3926 3927 // locate first non-abstract parent 3928 var parent = options.parent; 3929 if (parent && !options.abstract) { 3930 while (parent.$options.abstract && parent.$parent) { 3931 parent = parent.$parent; 3932 } 3933 parent.$children.push(vm); 3934 } 3935 3936 vm.$parent = parent; 3937 vm.$root = parent ? parent.$root : vm; 3938 3939 vm.$children = []; 3940 vm.$refs = {}; 3941 3942 vm._watcher = null; 3943 vm._inactive = null; 3944 vm._directInactive = false; 3945 vm._isMounted = false; 3946 vm._isDestroyed = false; 3947 vm._isBeingDestroyed = false; 3948 } 3949 3950 function lifecycleMixin (Vue) { 3951 Vue.prototype._update = function (vnode, hydrating) { 3952 var vm = this; 3953 var prevEl = vm.$el; 3954 var prevVnode = vm._vnode; 3955 var restoreActiveInstance = setActiveInstance(vm); 3956 vm._vnode = vnode; 3957 // Vue.prototype.__patch__ is injected in entry points 3958 // based on the rendering backend used. 3959 if (!prevVnode) { 3960 // initial render 3961 vm.$el = vm.__patch__(vm.$el, vnode, hydrating, false /* removeOnly */); 3962 } else { 3963 // updates 3964 vm.$el = vm.__patch__(prevVnode, vnode); 3965 } 3966 restoreActiveInstance(); 3967 // update __vue__ reference 3968 if (prevEl) { 3969 prevEl.__vue__ = null; 3970 } 3971 if (vm.$el) { 3972 vm.$el.__vue__ = vm; 3973 } 3974 // if parent is an HOC, update its $el as well 3975 if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) { 3976 vm.$parent.$el = vm.$el; 3977 } 3978 // updated hook is called by the scheduler to ensure that children are 3979 // updated in a parent's updated hook. 3980 }; 3981 3982 Vue.prototype.$forceUpdate = function () { 3983 var vm = this; 3984 if (vm._watcher) { 3985 vm._watcher.update(); 3986 } 3987 }; 3988 3989 Vue.prototype.$destroy = function () { 3990 var vm = this; 3991 if (vm._isBeingDestroyed) { 3992 return 3993 } 3994 callHook(vm, 'beforeDestroy'); 3995 vm._isBeingDestroyed = true; 3996 // remove self from parent 3997 var parent = vm.$parent; 3998 if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) { 3999 remove(parent.$children, vm); 4000 } 4001 // teardown watchers 4002 if (vm._watcher) { 4003 vm._watcher.teardown(); 4004 } 4005 var i = vm._watchers.length; 4006 while (i--) { 4007 vm._watchers[i].teardown(); 4008 } 4009 // remove reference from data ob 4010 // frozen object may not have observer. 4011 if (vm._data.__ob__) { 4012 vm._data.__ob__.vmCount--; 4013 } 4014 // call the last hook... 4015 vm._isDestroyed = true; 4016 // invoke destroy hooks on current rendered tree 4017 vm.__patch__(vm._vnode, null); 4018 // fire destroyed hook 4019 callHook(vm, 'destroyed'); 4020 // turn off all instance listeners. 4021 vm.$off(); 4022 // remove __vue__ reference 4023 if (vm.$el) { 4024 vm.$el.__vue__ = null; 4025 } 4026 // release circular reference (#6759) 4027 if (vm.$vnode) { 4028 vm.$vnode.parent = null; 4029 } 4030 }; 4031 } 4032 4033 function mountComponent ( 4034 vm, 4035 el, 4036 hydrating 4037 ) { 4038 vm.$el = el; 4039 if (!vm.$options.render) { 4040 vm.$options.render = createEmptyVNode; 4041 { 4042 /* istanbul ignore if */ 4043 if ((vm.$options.template && vm.$options.template.charAt(0) !== '#') || 4044 vm.$options.el || el) { 4045 warn( 4046 'You are using the runtime-only build of Vue where the template ' + 4047 'compiler is not available. Either pre-compile the templates into ' + 4048 'render functions, or use the compiler-included build.', 4049 vm 4050 ); 4051 } else { 4052 warn( 4053 'Failed to mount component: template or render function not defined.', 4054 vm 4055 ); 4056 } 4057 } 4058 } 4059 callHook(vm, 'beforeMount'); 4060 4061 var updateComponent; 4062 /* istanbul ignore if */ 4063 if (config.performance && mark) { 4064 updateComponent = function () { 4065 var name = vm._name; 4066 var id = vm._uid; 4067 var startTag = "vue-perf-start:" + id; 4068 var endTag = "vue-perf-end:" + id; 4069 4070 mark(startTag); 4071 var vnode = vm._render(); 4072 mark(endTag); 4073 measure(("vue " + name + " render"), startTag, endTag); 4074 4075 mark(startTag); 4076 vm._update(vnode, hydrating); 4077 mark(endTag); 4078 measure(("vue " + name + " patch"), startTag, endTag); 4079 }; 4080 } else { 4081 updateComponent = function () { 4082 vm._update(vm._render(), hydrating); 4083 }; 4084 } 4085 4086 // we set this to vm._watcher inside the watcher's constructor 4087 // since the watcher's initial patch may call $forceUpdate (e.g. inside child 4088 // component's mounted hook), which relies on vm._watcher being already defined 4089 new Watcher(vm, updateComponent, noop, { 4090 before: function before () { 4091 if (vm._isMounted && !vm._isDestroyed) { 4092 callHook(vm, 'beforeUpdate'); 4093 } 4094 } 4095 }, true /* isRenderWatcher */); 4096 hydrating = false;
4097 4098 // manually mounted instance, call mounted on self 4099 // mounted is called for render-created child components in its inserted hook 4100 if (vm.$vnode == null) { 4101 vm._isMounted = true; 4102 callHook(vm, 'mounted'); 4103 } 4104 return vm 4105 } 4106 4107 function updateChildComponent ( 4108 vm, 4109 propsData, 4110 listeners, 4111 parentVnode, 4112 renderChildren 4113 ) { 4114 { 4115 isUpdatingChildComponent = true; 4116 } 4117 4118 // determine whether component has slot children 4119 // we need to do this before overwriting $options._renderChildren. 4120 4121 // check if there are dynamic scopedSlots (hand-written or compiled but with 4122 // dynamic slot names). Static scoped slots compiled from template has the 4123 // "$stable" marker. 4124 var newScopedSlots = parentVnode.data.scopedSlots; 4125 var oldScopedSlots = vm.$scopedSlots; 4126 var hasDynamicScopedSlot = !!( 4127 (newScopedSlots && !newScopedSlots.$stable) || 4128 (oldScopedSlots !== emptyObject && !oldScopedSlots.$stable) || 4129 (newScopedSlots && vm.$scopedSlots.$key !== newScopedSlots.$key) || 4130 (!newScopedSlots && vm.$scopedSlots.$key) 4131 ); 4132 4133 // Any static slot children from the parent may have changed during parent's 4134 // update. Dynamic scoped slots may also have changed. In such cases, a forced 4135 // update is necessary to ensure correctness. 4136 var needsForceUpdate = !!( 4137 renderChildren || // has new static slots 4138 vm.$options._renderChildren || // has old static slots 4139 hasDynamicScopedSlot 4140 ); 4141 4142 vm.$options._parentVnode = parentVnode; 4143 vm.$vnode = parentVnode; // update vm's placeholder node without re-render 4144 4145 if (vm._vnode) { // update child tree's parent 4146 vm._vnode.parent = parentVnode; 4147 } 4148 vm.$options._renderChildren = renderChildren; 4149 4150 // update $attrs and $listeners hash 4151 // these are also reactive so they may trigger child update if the child 4152 // used them during render 4153 vm.$attrs = parentVnode.data.attrs || emptyObject; 4154 vm.$listeners = listeners || emptyObject; 4155 4156 // update props 4157 if (propsData && vm.$options.props) { 4158 toggleObserving(false); 4159 var props = vm._props; 4160 var propKeys = vm.$options._propKeys || []; 4161 for (var i = 0; i < propKeys.length; i++) { 4162 var key = propKeys[i]; 4163 var propOptions = vm.$options.props; // wtf flow? 4164 props[key] = validateProp(key, propOptions, propsData, vm); 4165 } 4166 toggleObserving(true); 4167 // keep a copy of raw propsData 4168 vm.$options.propsData = propsData; 4169 } 4170 4171 // update listeners 4172 listeners = listeners || emptyObject; 4173 var oldListeners = vm.$options._parentListeners; 4174 vm.$options._parentListeners = listeners; 4175 updateComponentListeners(vm, listeners, oldListeners); 4176 4177 // resolve slots + force update if has children 4178 if (needsForceUpdate) { 4179 vm.$slots = resolveSlots(renderChildren, parentVnode.context); 4180 vm.$forceUpdate(); 4181 } 4182 4183 { 4184 isUpdatingChildComponent = false; 4185 } 4186 } 4187 4188 function isInInactiveTree (vm) { 4189 while (vm && (vm = vm.$parent)) { 4190 if (vm._inactive) { return true } 4191 } 4192 return false 4193 } 4194 4195 function activateChildComponent (vm, direct) { 4196 if (direct) { 4197 vm._directInactive = false; 4198 if (isInInactiveTree(vm)) { 4199 return 4200 } 4201 } else if (vm._directInactive) { 4202 return 4203 } 4204 if (vm._inactive || vm._inactive === null) { 4205 vm._inactive = false; 4206 for (var i = 0; i < vm.$children.length; i++) { 4207 activateChildComponent(vm.$children[i]); 4208 } 4209 callHook(vm, 'activated'); 4210 } 4211 } 4212 4213 function deactivateChildComponent (vm, direct) { 4214 if (direct) { 4215 vm._directInactive = true; 4216 if (isInInactiveTree(vm)) { 4217 return 4218 } 4219 } 4220 if (!vm._inactive) { 4221 vm._inactive = true; 4222 for (var i = 0; i < vm.$children.length; i++) { 4223 deactivateChildComponent(vm.$children[i]); 4224 } 4225 callHook(vm, 'deactivated'); 4226 } 4227 } 4228 4229 function callHook (vm, hook) { 4230 // #7573 disable dep collection when invoking lifecycle hooks 4231 pushTarget(); 4232 var handlers = vm.$options[hook]; 4233 var info = hook + " hook"; 4234 if (handlers) { 4235 for (var i = 0, j = handlers.length; i < j; i++) { 4236 invokeWithErrorHandling(handlers[i], vm, null, vm, info); 4237 } 4238 } 4239 if (vm._hasHookEvent) { 4240 vm.$emit('hook:' + hook); 4241 } 4242 popTarget(); 4243 } 4244 4245 /* */ 4246 4247 var MAX_UPDATE_COUNT = 100; 4248 4249 var queue = []; 4250 var activatedChildren = []; 4251 var has = {}; 4252 var circular = {}; 4253 var waiting = false;
4254 var flushing = false; 4255 var index = 0; 4256 4257 /** 4258 * Reset the scheduler's state. 4259 */ 4260 function resetSchedulerState () { 4261 index = queue.length = activatedChildren.length = 0; 4262 has = {}; 4263 { 4264 circular = {}; 4265 } 4266 waiting = flushing = false; 4267 } 4268 4269 // Async edge case #6566 requires saving the timestamp when event listeners are 4270 // attached. However, calling performance.now() has a perf overhead especially 4271 // if the page has thousands of event listeners. Instead, we take a timestamp 4272 // every time the scheduler flushes and use that for all event listeners 4273 // attached during that flush. 4274 var currentFlushTimestamp = 0; 4275 4276 // Async edge case fix requires storing an event listener's attach timestamp. 4277 var getNow = Date.now; 4278 4279 // Determine what event timestamp the browser is using. Annoyingly, the 4280 // timestamp can either be hi-res (relative to page load) or low-res 4281 // (relative to UNIX epoch), so in order to compare time we have to use the 4282 // same timestamp type when saving the flush timestamp. 4283 // All IE versions use low-res event timestamps, and have problematic clock 4284 // implementations (#9632) 4285 if (inBrowser && !isIE) { 4286 var performance = window.performance; 4287 if ( 4288 performance && 4289 typeof performance.now === 'function' && 4290 getNow() > document.createEvent('Event').timeStamp 4291 ) { 4292 // if the event timestamp, although evaluated AFTER the Date.now(), is 4293 // smaller than it, it means the event is using a hi-res timestamp, 4294 // and we need to use the hi-res version for event listener timestamps as 4295 // well. 4296 getNow = function () { return performance.now(); }; 4297 } 4298 } 4299 4300 /** 4301 * Flush both queues and run the watchers. 4302 */ 4303 function flushSchedulerQueue () { 4304 currentFlushTimestamp = getNow(); 4305 flushing = true; 4306 var watcher, id; 4307 4308 // Sort queue before flush. 4309 // This ensures that: 4310 // 1. Components are updated from parent to child. (because parent is always 4311 // created before the child) 4312 // 2. A component's user watchers are run before its render watcher (because 4313 // user watchers are created before the render watcher) 4314 // 3. If a component is destroyed during a parent component's watcher run, 4315 // its watchers can be skipped. 4316 queue.sort(function (a, b) { return a.id - b.id; }); 4317 4318 // do not cache length because more watchers might be pushed 4319 // as we run existing watchers 4320 for (index = 0; index < queue.length; index++) { 4321 watcher = queue[index]; 4322 if (watcher.before) { 4323 watcher.before(); 4324 } 4325 id = watcher.id; 4326 has[id] = null; 4327 watcher.run(); 4328 // in dev build, check and stop circular updates. 4329 if (has[id] != null) { 4330 circular[id] = (circular[id] || 0) + 1; 4331 if (circular[id] > MAX_UPDATE_COUNT) { 4332 warn( 4333 'You may have an infinite update loop ' + ( 4334 watcher.user 4335 ? ("in watcher with expression \"" + (watcher.expression) + "\"") 4336 : "in a component render function." 4337 ), 4338 watcher.vm 4339 ); 4340 break 4341 } 4342 } 4343 } 4344 4345 // keep copies of post queues before resetting state 4346 var activatedQueue = activatedChildren.slice(); 4347 var updatedQueue = queue.slice(); 4348 4349 resetSchedulerState(); 4350 4351 // call component updated and activated hooks 4352 callActivatedHooks(activatedQueue); 4353 callUpdatedHooks(updatedQueue); 4354 4355 // devtool hook 4356 /* istanbul ignore if */ 4357 if (devtools && config.devtools) { 4358 devtools.emit('flush'); 4359 } 4360 } 4361 4362 function callUpdatedHooks (queue) { 4363 var i = queue.length; 4364 while (i--) { 4365 var watcher = queue[i]; 4366 var vm = watcher.vm; 4367 if (vm._watcher === watcher && vm._isMounted && !vm._isDestroyed) { 4368 callHook(vm, 'updated'); 4369 } 4370 } 4371 } 4372 4373 /** 4374 * Queue a kept-alive component that was activated during patch. 4375 * The queue will be processed after the entire tree has been patched. 4376 */ 4377 function queueActivatedComponent (vm) { 4378 // setting _inactive to false here so that a render function can 4379 // rely on checking whether it's in an inactive tree (e.g. router-view) 4380 vm._inactive = false;
4381 activatedChildren.push(vm); 4382 } 4383 4384 function callActivatedHooks (queue) { 4385 for (var i = 0; i < queue.length; i++) { 4386 queue[i]._inactive = true; 4387 activateChildComponent(queue[i], true /* true */); 4388 } 4389 } 4390 4391 /** 4392 * Push a watcher into the watcher queue. 4393 * Jobs with duplicate IDs will be skipped unless it's 4394 * pushed when the queue is being flushed. 4395 */ 4396 function queueWatcher (watcher) { 4397 var id = watcher.id; 4398 if (has[id] == null) { 4399 has[id] = true; 4400 if (!flushing) { 4401 queue.push(watcher); 4402 } else { 4403 // if already flushing, splice the watcher based on its id 4404 // if already past its id, it will be run next immediately. 4405 var i = queue.length - 1; 4406 while (i > index && queue[i].id > watcher.id) { 4407 i--; 4408 } 4409 queue.splice(i + 1, 0, watcher); 4410 } 4411 // queue the flush 4412 if (!waiting) { 4413 waiting = true; 4414 4415 if (!config.async) { 4416 flushSchedulerQueue(); 4417 return 4418 } 4419 nextTick(flushSchedulerQueue); 4420 } 4421 } 4422 } 4423 4424 /* */ 4425 4426 4427 4428 var uid$2 = 0; 4429 4430 /** 4431 * A watcher parses an expression, collects dependencies, 4432 * and fires callback when the expression value changes. 4433 * This is used for both the $watch() api and directives. 4434 */ 4435 var Watcher = function Watcher ( 4436 vm, 4437 expOrFn, 4438 cb, 4439 options, 4440 isRenderWatcher 4441 ) { 4442 this.vm = vm; 4443 if (isRenderWatcher) { 4444 vm._watcher = this; 4445 } 4446 vm._watchers.push(this); 4447 // options 4448 if (options) { 4449 this.deep = !!options.deep; 4450 this.user = !!options.user; 4451 this.lazy = !!options.lazy; 4452 this.sync = !!options.sync; 4453 this.before = options.before; 4454 } else { 4455 this.deep = this.user = this.lazy = this.sync = false; 4456 } 4457 this.cb = cb; 4458 this.id = ++uid$2; // uid for batching 4459 this.active = true; 4460 this.dirty = this.lazy; // for lazy watchers 4461 this.deps = []; 4462 this.newDeps = []; 4463 this.depIds = new _Set(); 4464 this.newDepIds = new _Set(); 4465 this.expression = expOrFn.toString(); 4466 // parse expression for getter 4467 if (typeof expOrFn === 'function') { 4468 this.getter = expOrFn; 4469 } else { 4470 this.getter = parsePath(expOrFn); 4471 if (!this.getter) { 4472 this.getter = noop; 4473 warn( 4474 "Failed watching path: \"" + expOrFn + "\" " + 4475 'Watcher only accepts simple dot-delimited paths. ' + 4476 'For full control, use a function instead.', 4477 vm 4478 ); 4479 } 4480 } 4481 this.value = this.lazy 4482 ? undefined 4483 : this.get(); 4484 }; 4485 4486 /** 4487 * Evaluate the getter, and re-collect dependencies. 4488 */ 4489 Watcher.prototype.get = function get () { 4490 pushTarget(this); 4491 var value; 4492 var vm = this.vm; 4493 try { 4494 value = this.getter.call(vm, vm); 4495 } catch (e) { 4496 if (this.user) { 4497 handleError(e, vm, ("getter for watcher \"" + (this.expression) + "\"")); 4498 } else { 4499 throw e 4500 } 4501 } finally { 4502 // "touch" every property so they are all tracked as 4503 // dependencies for deep watching 4504 if (this.deep) { 4505 traverse(value); 4506 } 4507 popTarget(); 4508 this.cleanupDeps(); 4509 } 4510 return value 4511 }; 4512 4513 /** 4514 * Add a dependency to this directive. 4515 */ 4516 Watcher.prototype.addDep = function addDep (dep) { 4517 var id = dep.id; 4518 if (!this.newDepIds.has(id)) { 4519 this.newDepIds.add(id); 4520 this.newDeps.push(dep); 4521 if (!this.depIds.has(id)) { 4522 dep.addSub(this); 4523 } 4524 } 4525 }; 4526 4527 /** 4528 * Clean up for dependency collection. 4529 */ 4530 Watcher.prototype.cleanupDeps = function cleanupDeps () { 4531 var i = this.deps.length; 4532 while (i--) { 4533 var dep = this.deps[i]; 4534 if (!this.newDepIds.has(dep.id)) { 4535 dep.removeSub(this); 4536 } 4537 } 4538 var tmp = this.depIds; 4539 this.depIds = this.newDepIds; 4540 this.newDepIds = tmp; 4541 this.newDepIds.clear(); 4542 tmp = this.deps; 4543 this.deps = this.newDeps; 4544 this.newDeps = tmp; 4545 this.newDeps.length = 0; 4546 }; 4547 4548 /** 4549 * Subscriber interface. 4550 * Will be called when a dependency changes. 4551 */ 4552 Watcher.prototype.update = function update () { 4553 /* istanbul ignore else */ 4554 if (this.lazy) { 4555 this.dirty = true; 4556 } else if (this.sync) { 4557 this.run(); 4558 } else { 4559 queueWatcher(this); 4560 } 4561 }; 4562 4563 /** 4564 * Scheduler job interface. 4565 * Will be called by the scheduler. 4566 */ 4567 Watcher.prototype.run = function run () { 4568 if (this.active) { 4569 var value = this.get(); 4570 if ( 4571 value !== this.value ||
4572 // Deep watchers and watchers on Object/Arrays should fire even 4573 // when the value is the same, because the value may 4574 // have mutated. 4575 isObject(value) || 4576 this.deep 4577 ) { 4578 // set new value 4579 var oldValue = this.value; 4580 this.value = value; 4581 if (this.user) { 4582 var info = "callback for watcher \"" + (this.expression) + "\""; 4583 invokeWithErrorHandling(this.cb, this.vm, [value, oldValue], this.vm, info); 4584 } else { 4585 this.cb.call(this.vm, value, oldValue); 4586 } 4587 } 4588 } 4589 }; 4590 4591 /** 4592 * Evaluate the value of the watcher. 4593 * This only gets called for lazy watchers. 4594 */ 4595 Watcher.prototype.evaluate = function evaluate () { 4596 this.value = this.get(); 4597 this.dirty = false; 4598 }; 4599 4600 /** 4601 * Depend on all deps collected by this watcher. 4602 */ 4603 Watcher.prototype.depend = function depend () { 4604 var i = this.deps.length; 4605 while (i--) { 4606 this.deps[i].depend(); 4607 } 4608 }; 4609 4610 /** 4611 * Remove self from all dependencies' subscriber list. 4612 */ 4613 Watcher.prototype.teardown = function teardown () { 4614 if (this.active) { 4615 // remove self from vm's watcher list 4616 // this is a somewhat expensive operation so we skip it 4617 // if the vm is being destroyed. 4618 if (!this.vm._isBeingDestroyed) { 4619 remove(this.vm._watchers, this); 4620 } 4621 var i = this.deps.length; 4622 while (i--) { 4623 this.deps[i].removeSub(this); 4624 } 4625 this.active = false; 4626 } 4627 }; 4628 4629 /* */ 4630 4631 var sharedPropertyDefinition = { 4632 enumerable: true, 4633 configurable: true, 4634 get: noop, 4635 set: noop 4636 }; 4637 4638 function proxy (target, sourceKey, key) { 4639 sharedPropertyDefinition.get = function proxyGetter () { 4640 return this[sourceKey][key] 4641 }; 4642 sharedPropertyDefinition.set = function proxySetter (val) { 4643 this[sourceKey][key] = val; 4644 }; 4645 Object.defineProperty(target, key, sharedPropertyDefinition); 4646 } 4647 4648 function initState (vm) { 4649 vm._watchers = []; 4650 var opts = vm.$options; 4651 if (opts.props) { initProps(vm, opts.props); } 4652 if (opts.methods) { initMethods(vm, opts.methods); } 4653 if (opts.data) { 4654 initData(vm); 4655 } else { 4656 observe(vm._data = {}, true /* asRootData */); 4657 } 4658 if (opts.computed) { initComputed(vm, opts.computed); } 4659 if (opts.watch && opts.watch !== nativeWatch) { 4660 initWatch(vm, opts.watch); 4661 } 4662 } 4663 4664 function initProps (vm, propsOptions) { 4665 var propsData = vm.$options.propsData || {}; 4666 var props = vm._props = {}; 4667 // cache prop keys so that future props updates can iterate using Array 4668 // instead of dynamic object key enumeration. 4669 var keys = vm.$options._propKeys = []; 4670 var isRoot = !vm.$parent; 4671 // root instance props should be converted 4672 if (!isRoot) { 4673 toggleObserving(false); 4674 } 4675 var loop = function ( key ) { 4676 keys.push(key); 4677 var value = validateProp(key, propsOptions, propsData, vm); 4678 /* istanbul ignore else */ 4679 { 4680 var hyphenatedKey = hyphenate(key); 4681 if (isReservedAttribute(hyphenatedKey) || 4682 config.isReservedAttr(hyphenatedKey)) { 4683 warn( 4684 ("\"" + hyphenatedKey + "\" is a reserved attribute and cannot be used as component prop."), 4685 vm 4686 ); 4687 } 4688 defineReactive$$1(props, key, value, function () { 4689 if (!isRoot && !isUpdatingChildComponent) { 4690 warn( 4691 "Avoid mutating a prop directly since the value will be " + 4692 "overwritten whenever the parent component re-renders. " + 4693 "Instead, use a data or computed property based on the prop's " + 4694 "value. Prop being mutated: \"" + key + "\"", 4695 vm 4696 ); 4697 } 4698 }); 4699 } 4700 // static props are already proxied on the component's prototype 4701 // during Vue.extend(). We only need to proxy props defined at 4702 // instantiation here. 4703 if (!(key in vm)) { 4704 proxy(vm, "_props", key); 4705 } 4706 }; 4707 4708 for (var key in propsOptions) loop( key ); 4709 toggleObserving(true); 4710 } 4711 4712 function initData (vm) { 4713 var data = vm.$options.data; 4714 data = vm._data = typeof data === 'function' 4715 ? getData(data, vm) 4716 : data || {}; 4717 if (!isPlainObject(data)) { 4718 data = {}; 4719 warn( 4720 'data functions should return an object:\n' + 4721 'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function', 4722 vm 4723 ); 4724 } 4725 // proxy data on instance 4726 var keys = Object.keys(data); 4727 var props = vm.$options.props; 4728 var methods = vm.$options.methods; 4729 var i = keys.length; 4730 while (i--) { 4731 var key = keys[i]; 4732 { 4733 if (methods && hasOwn(methods, key)) { 4734 warn( 4735 ("Method \"" + key + "\" has already been defined as a data property."), 4736 vm 4737 ); 4738 } 4739 } 4740 if (props && hasOwn(props, key)) { 4741 warn( 4742 "The data property \"" + key + "\" is already declared as a prop. " + 4743 "Use prop default value instead.", 4744 vm 4745 ); 4746 } else if (!isReserved(key)) { 4747 proxy(vm, "_data", key); 4748 } 4749 } 4750 // observe data 4751 observe(data, true /* asRootData */); 4752 } 4753 4754 function getData (data, vm) { 4755 // #7573 disable dep collection when invoking data getters 4756 pushTarget(); 4757 try { 4758 return data.call(vm, vm) 4759 } catch (e) { 4760 handleError(e, vm, "data()"); 4761 return {} 4762 } finally { 4763 popTarget(); 4764 } 4765 } 4766 4767 var computedWatcherOptions = { lazy: true }; 4768 4769 function initComputed (vm, computed) { 4770 // $flow-disable-line 4771 var watchers = vm._computedWatchers = Object.create(null); 4772 // computed properties are just getters during SSR 4773 var isSSR = isServerRendering(); 4774 4775 for (var key in computed) { 4776 var userDef = computed[key]; 4777 var getter = typeof userDef === 'function' ? userDef : userDef.get; 4778 if (getter == null) { 4779 warn( 4780 ("Getter is missing for computed property \"" + key + "\"."), 4781 vm 4782 ); 4783 } 4784 4785 if (!isSSR) { 4786 // create internal watcher for the computed property. 4787 watchers[key] = new Watcher( 4788 vm, 4789 getter || noop, 4790 noop, 4791 computedWatcherOptions 4792 ); 4793 } 4794 4795 // component-defined computed properties are already defined on the 4796 // component prototype. We only need to define computed properties defined 4797 // at instantiation here. 4798 if (!(key in vm)) { 4799 defineComputed(vm, key, userDef); 4800 } else { 4801 if (key in vm.$data) { 4802 warn(("The computed property \"" + key + "\" is already defined in data."), vm); 4803 } else if (vm.$options.props && key in vm.$options.props) { 4804 warn(("The computed property \"" + key + "\" is already defined as a prop."), vm); 4805 } else if (vm.$options.methods && key in vm.$options.methods) { 4806 warn(("The computed property \"" + key + "\" is already defined as a method."), vm); 4807 } 4808 } 4809 } 4810 } 4811 4812 function defineComputed ( 4813 target, 4814 key, 4815 userDef 4816 ) { 4817 var shouldCache = !isServerRendering(); 4818 if (typeof userDef === 'function') { 4819 sharedPropertyDefinition.get = shouldCache 4820 ? createComputedGetter(key) 4821 : createGetterInvoker(userDef); 4822 sharedPropertyDefinition.set = noop; 4823 } else { 4824 sharedPropertyDefinition.get = userDef.get 4825 ? shouldCache && userDef.cache !== false 4826 ? createComputedGetter(key) 4827 : createGetterInvoker(userDef.get) 4828 : noop; 4829 sharedPropertyDefinition.set = userDef.set || noop; 4830 } 4831 if (sharedPropertyDefinition.set === noop) { 4832 sharedPropertyDefinition.set = function () { 4833 warn( 4834 ("Computed property \"" + key + "\" was assigned to but it has no setter."), 4835 this 4836 ); 4837 }; 4838 } 4839 Object.defineProperty(target, key, sharedPropertyDefinition); 4840 } 4841 4842 function createComputedGetter (key) { 4843 return function computedGetter () { 4844 var watcher = this._computedWatchers && this._computedWatchers[key]; 4845 if (watcher) { 4846 if (watcher.dirty) { 4847 watcher.evaluate(); 4848 } 4849 if (Dep.target) {
4850 watcher.depend(); 4851 } 4852 return watcher.value 4853 } 4854 } 4855 } 4856 4857 function createGetterInvoker(fn) { 4858 return function computedGetter () { 4859 return fn.call(this, this) 4860 } 4861 } 4862 4863 function initMethods (vm, methods) { 4864 var props = vm.$options.props; 4865 for (var key in methods) { 4866 { 4867 if (typeof methods[key] !== 'function') { 4868 warn( 4869 "Method \"" + key + "\" has type \"" + (typeof methods[key]) + "\" in the component definition. " + 4870 "Did you reference the function correctly?", 4871 vm 4872 ); 4873 } 4874 if (props && hasOwn(props, key)) { 4875 warn( 4876 ("Method \"" + key + "\" has already been defined as a prop."), 4877 vm 4878 ); 4879 } 4880 if ((key in vm) && isReserved(key)) { 4881 warn( 4882 "Method \"" + key + "\" conflicts with an existing Vue instance method. " + 4883 "Avoid defining component methods that start with _ or $." 4884 ); 4885 } 4886 } 4887 vm[key] = typeof methods[key] !== 'function' ? noop : bind(methods[key], vm); 4888 } 4889 } 4890 4891 function initWatch (vm, watch) { 4892 for (var key in watch) { 4893 var handler = watch[key]; 4894 if (Array.isArray(handler)) { 4895 for (var i = 0; i < handler.length; i++) { 4896 createWatcher(vm, key, handler[i]); 4897 } 4898 } else { 4899 createWatcher(vm, key, handler); 4900 } 4901 } 4902 } 4903 4904 function createWatcher ( 4905 vm, 4906 expOrFn, 4907 handler, 4908 options 4909 ) { 4910 if (isPlainObject(handler)) { 4911 options = handler; 4912 handler = handler.handler; 4913 } 4914 if (typeof handler === 'string') { 4915 handler = vm[handler]; 4916 } 4917 return vm.$watch(expOrFn, handler, options) 4918 } 4919 4920 function stateMixin (Vue) { 4921 // flow somehow has problems with directly declared definition object 4922 // when using Object.defineProperty, so we have to procedurally build up 4923 // the object here. 4924 var dataDef = {}; 4925 dataDef.get = function () { return this._data }; 4926 var propsDef = {}; 4927 propsDef.get = function () { return this._props }; 4928 { 4929 dataDef.set = function () { 4930 warn( 4931 'Avoid replacing instance root $data. ' + 4932 'Use nested data properties instead.', 4933 this 4934 ); 4935 }; 4936 propsDef.set = function () { 4937 warn("$props is readonly.", this); 4938 }; 4939 } 4940 Object.defineProperty(Vue.prototype, '$data', dataDef); 4941 Object.defineProperty(Vue.prototype, '$props', propsDef); 4942 4943 Vue.prototype.$set = set; 4944 Vue.prototype.$delete = del; 4945 4946 Vue.prototype.$watch = function ( 4947 expOrFn, 4948 cb, 4949 options 4950 ) { 4951 var vm = this; 4952 if (isPlainObject(cb)) { 4953 return createWatcher(vm, expOrFn, cb, options) 4954 } 4955 options = options || {}; 4956 options.user = true; 4957 var watcher = new Watcher(vm, expOrFn, cb, options); 4958 if (options.immediate) { 4959 var info = "callback for immediate watcher \"" + (watcher.expression) + "\""; 4960 pushTarget(); 4961 invokeWithErrorHandling(cb, vm, [watcher.value], vm, info); 4962 popTarget(); 4963 } 4964 return function unwatchFn () { 4965 watcher.teardown(); 4966 } 4967 }; 4968 } 4969 4970 /* */ 4971 4972 var uid$3 = 0; 4973 4974 function initMixin (Vue) { 4975 Vue.prototype._init = function (options) { 4976 var vm = this; 4977 // a uid 4978 vm._uid = uid$3++; 4979 4980 var startTag, endTag; 4981 /* istanbul ignore if */ 4982 if (config.performance && mark) { 4983 startTag = "vue-perf-start:" + (vm._uid); 4984 endTag = "vue-perf-end:" + (vm._uid); 4985 mark(startTag); 4986 } 4987 4988 // a flag to avoid this being observed 4989 vm._isVue = true; 4990 // merge options 4991 if (options && options._isComponent) { 4992 // optimize internal component instantiation 4993 // since dynamic options merging is pretty slow, and none of the 4994 // internal component options needs special treatment. 4995 initInternalComponent(vm, options); 4996 } else { 4997 vm.$options = mergeOptions( 4998 resolveConstructorOptions(vm.constructor), 4999 options || {}, 5000 vm 5001 ); 5002 } 5003 /* istanbul ignore else */ 5004 { 5005 initProxy(vm); 5006 } 5007 // expose real self 5008 vm._self = vm; 5009 initLifecycle(vm); 5010 initEvents(vm); 5011 initRender(vm); 5012 callHook(vm, 'beforeCreate'); 5013 initInjections(vm); // resolve injections before data/props 5014 initState(vm); 5015 initProvide(vm); // resolve provide after data/props 5016 callHook(vm, 'created'); 5017 5018 /* istanbul ignore if */ 5019 if (config.performance && mark) { 5020 vm._name = formatComponentName(vm, false); 5021 mark(endTag); 5022 measure(("vue " + (vm._name) + " init"), startTag, endTag); 5023 } 5024 5025 if (vm.$options.el) { 5026 vm.$mount(vm.$options.el); 5027 } 5028 }; 5029 } 5030 5031 function initInternalComponent (vm, options) { 5032 var opts = vm.$options = Object.create(vm.constructor.options); 5033 // doing this because it's faster than dynamic enumeration. 5034 var parentVnode = options._parentVnode; 5035 opts.parent = options.parent; 5036 opts._parentVnode = parentVnode; 5037 5038 var vnodeComponentOptions = parentVnode.componentOptions; 5039 opts.propsData = vnodeComponentOptions.propsData; 5040 opts._parentListeners = vnodeComponentOptions.listeners; 5041 opts._renderChildren = vnodeComponentOptions.children; 5042 opts._componentTag = vnodeComponentOptions.tag; 5043 5044 if (options.render) { 5045 opts.render = options.render; 5046 opts.staticRenderFns = options.staticRenderFns; 5047 } 5048 } 5049
5050 function resolveConstructorOptions (Ctor) { 5051 var options = Ctor.options; 5052 if (Ctor.super) { 5053 var superOptions = resolveConstructorOptions(Ctor.super); 5054 var cachedSuperOptions = Ctor.superOptions; 5055 if (superOptions !== cachedSuperOptions) { 5056 // super option changed, 5057 // need to resolve new options. 5058 Ctor.superOptions = superOptions; 5059 // check if there are any late-modified/attached options (#4976) 5060 var modifiedOptions = resolveModifiedOptions(Ctor); 5061 // update base extend options 5062 if (modifiedOptions) { 5063 extend(Ctor.extendOptions, modifiedOptions); 5064 } 5065 options = Ctor.options = mergeOptions(superOptions, Ctor.extendOptions); 5066 if (options.name) { 5067 options.components[options.name] = Ctor; 5068 } 5069 } 5070 } 5071 return options 5072 } 5073 5074 function resolveModifiedOptions (Ctor) { 5075 var modified; 5076 var latest = Ctor.options; 5077 var sealed = Ctor.sealedOptions; 5078 for (var key in latest) { 5079 if (latest[key] !== sealed[key]) { 5080 if (!modified) { modified = {}; } 5081 modified[key] = latest[key]; 5082 } 5083 } 5084 return modified 5085 } 5086 5087 function Vue (options) { 5088 if (!(this instanceof Vue) 5089 ) { 5090 warn('Vue is a constructor and should be called with the `new` keyword'); 5091 } 5092 this._init(options); 5093 } 5094 5095 initMixin(Vue); 5096 stateMixin(Vue); 5097 eventsMixin(Vue); 5098 lifecycleMixin(Vue); 5099 renderMixin(Vue); 5100 5101 /* */ 5102 5103 function initUse (Vue) { 5104 Vue.use = function (plugin) { 5105 var installedPlugins = (this._installedPlugins || (this._installedPlugins = [])); 5106 if (installedPlugins.indexOf(plugin) > -1) { 5107 return this 5108 } 5109 5110 // additional parameters 5111 var args = toArray(arguments, 1); 5112 args.unshift(this); 5113 if (typeof plugin.install === 'function') { 5114 plugin.install.apply(plugin, args); 5115 } else if (typeof plugin === 'function') { 5116 plugin.apply(null, args); 5117 } 5118 installedPlugins.push(plugin); 5119 return this 5120 }; 5121 } 5122 5123 /* */ 5124 5125 function initMixin$1 (Vue) { 5126 Vue.mixin = function (mixin) { 5127 this.options = mergeOptions(this.options, mixin); 5128 return this 5129 }; 5130 } 5131 5132 /* */ 5133 5134 function initExtend (Vue) { 5135 /** 5136 * Each instance constructor, including Vue, has a unique 5137 * cid. This enables us to create wrapped "child 5138 * constructors" for prototypal inheritance and cache them. 5139 */ 5140 Vue.cid = 0; 5141 var cid = 1; 5142 5143 /** 5144 * Class inheritance 5145 */ 5146 Vue.extend = function (extendOptions) { 5147 extendOptions = extendOptions || {}; 5148 var Super = this; 5149 var SuperId = Super.cid; 5150 var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {}); 5151 if (cachedCtors[SuperId]) { 5152 return cachedCtors[SuperId] 5153 } 5154 5155 var name = extendOptions.name || Super.options.name; 5156 if (name) { 5157 validateComponentName(name); 5158 } 5159 5160 var Sub = function VueComponent (options) { 5161 this._init(options); 5162 }; 5163 Sub.prototype = Object.create(Super.prototype); 5164 Sub.prototype.constructor = Sub; 5165 Sub.cid = cid++; 5166 Sub.options = mergeOptions( 5167 Super.options, 5168 extendOptions 5169 ); 5170 Sub['super'] = Super; 5171 5172 // For props and computed properties, we define the proxy getters on 5173 // the Vue instances at extension time, on the extended prototype. This 5174 // avoids Object.defineProperty calls for each instance created. 5175 if (Sub.options.props) { 5176 initProps$1(Sub); 5177 } 5178 if (Sub.options.computed) { 5179 initComputed$1(Sub); 5180 } 5181 5182 // allow further extension/mixin/plugin usage 5183 Sub.extend = Super.extend; 5184 Sub.mixin = Super.mixin; 5185 Sub.use = Super.use; 5186 5187 // create asset registers, so extended classes 5188 // can have their private assets too. 5189 ASSET_TYPES.forEach(function (type) { 5190 Sub[type] = Super[type]; 5191 }); 5192 // enable recursive self-lookup 5193 if (name) { 5194 Sub.options.components[name] = Sub; 5195 } 5196 5197 // keep a reference to the super options at extension time. 5198 // later at instantiation we can check if Super's options have 5199 // been updated. 5200 Sub.superOptions = Super.options; 5201 Sub.extendOptions = extendOptions; 5202 Sub.sealedOptions = extend({}, Sub.options); 5203
5204 // cache constructor 5205 cachedCtors[SuperId] = Sub; 5206 return Sub 5207 }; 5208 } 5209 5210 function initProps$1 (Comp) { 5211 var props = Comp.options.props; 5212 for (var key in props) { 5213 proxy(Comp.prototype, "_props", key); 5214 } 5215 } 5216 5217 function initComputed$1 (Comp) { 5218 var computed = Comp.options.computed; 5219 for (var key in computed) { 5220 defineComputed(Comp.prototype, key, computed[key]); 5221 } 5222 } 5223 5224 /* */ 5225 5226 function initAssetRegisters (Vue) { 5227 /** 5228 * Create asset registration methods. 5229 */ 5230 ASSET_TYPES.forEach(function (type) { 5231 Vue[type] = function ( 5232 id, 5233 definition 5234 ) { 5235 if (!definition) { 5236 return this.options[type + 's'][id] 5237 } else { 5238 /* istanbul ignore if */ 5239 if (type === 'component') { 5240 validateComponentName(id); 5241 } 5242 if (type === 'component' && isPlainObject(definition)) { 5243 definition.name = definition.name || id; 5244 definition = this.options._base.extend(definition); 5245 } 5246 if (type === 'directive' && typeof definition === 'function') { 5247 definition = { bind: definition, update: definition }; 5248 } 5249 this.options[type + 's'][id] = definition; 5250 return definition 5251 } 5252 }; 5253 }); 5254 } 5255 5256 /* */ 5257 5258 5259 5260 5261 5262 function getComponentName (opts) { 5263 return opts && (opts.Ctor.options.name || opts.tag) 5264 } 5265 5266 function matches (pattern, name) { 5267 if (Array.isArray(pattern)) { 5268 return pattern.indexOf(name) > -1 5269 } else if (typeof pattern === 'string') { 5270 return pattern.split(',').indexOf(name) > -1 5271 } else if (isRegExp(pattern)) { 5272 return pattern.test(name) 5273 } 5274 /* istanbul ignore next */ 5275 return false 5276 } 5277 5278 function pruneCache (keepAliveInstance, filter) { 5279 var cache = keepAliveInstance.cache; 5280 var keys = keepAliveInstance.keys; 5281 var _vnode = keepAliveInstance._vnode; 5282 for (var key in cache) { 5283 var entry = cache[key]; 5284 if (entry) { 5285 var name = entry.name; 5286 if (name && !filter(name)) { 5287 pruneCacheEntry(cache, key, keys, _vnode); 5288 } 5289 } 5290 } 5291 } 5292 5293 function pruneCacheEntry ( 5294 cache, 5295 key, 5296 keys, 5297 current 5298 ) { 5299 var entry = cache[key]; 5300 if (entry && (!current || entry.tag !== current.tag)) { 5301 entry.componentInstance.$destroy(); 5302 } 5303 cache[key] = null; 5304 remove(keys, key); 5305 } 5306 5307 var patternTypes = [String, RegExp, Array]; 5308 5309 var KeepAlive = { 5310 name: 'keep-alive', 5311 abstract: true, 5312 5313 props: { 5314 include: patternTypes, 5315 exclude: patternTypes, 5316 max: [String, Number] 5317 }, 5318 5319 methods: { 5320 cacheVNode: function cacheVNode() { 5321 var ref = this; 5322 var cache = ref.cache; 5323 var keys = ref.keys; 5324 var vnodeToCache = ref.vnodeToCache; 5325 var keyToCache = ref.keyToCache; 5326 if (vnodeToCache) { 5327 var tag = vnodeToCache.tag; 5328 var componentInstance = vnodeToCache.componentInstance; 5329 var componentOptions = vnodeToCache.componentOptions; 5330 cache[keyToCache] = { 5331 name: getComponentName(componentOptions), 5332 tag: tag, 5333 componentInstance: componentInstance, 5334 }; 5335 keys.push(keyToCache); 5336 // prune oldest entry 5337 if (this.max && keys.length > parseInt(this.max)) { 5338 pruneCacheEntry(cache, keys[0], keys, this._vnode); 5339 } 5340 this.vnodeToCache = null; 5341 } 5342 } 5343 }, 5344 5345 created: function created () { 5346 this.cache = Object.create(null); 5347 this.keys = []; 5348 }, 5349 5350 destroyed: function destroyed () { 5351 for (var key in this.cache) { 5352 pruneCacheEntry(this.cache, key, this.keys); 5353 } 5354 }, 5355 5356 mounted: function mounted () { 5357 var this$1 = this; 5358 5359 this.cacheVNode(); 5360 this.$watch('include', function (val) { 5361 pruneCache(this$1, function (name) { return matches(val, name); }); 5362 }); 5363 this.$watch('exclude', function (val) { 5364 pruneCache(this$1, function (name) { return !matches(val, name); }); 5365 }); 5366 }, 5367 5368 updated: function updated () { 5369 this.cacheVNode(); 5370 }, 5371 5372 render: function render () { 5373 var slot = this.$slots.default; 5374 var vnode = getFirstComponentChild(slot); 5375 var componentOptions = vnode && vnode.componentOptions; 5376 if (componentOptions) { 5377 // check pattern 5378 var name = getComponentName(componentOptions); 5379 var ref = this; 5380 var include = ref.include; 5381 var exclude = ref.exclude; 5382 if ( 5383 // not included 5384 (include && (!name || !matches(include, name))) || 5385 // excluded 5386 (exclude && name && matches(exclude, name)) 5387 ) { 5388 return vnode 5389 } 5390 5391 var ref$1 = this; 5392 var cache = ref$1.cache; 5393 var keys = ref$1.keys; 5394 var key = vnode.key == null 5395 // same constructor may get registered as different local components 5396 // so cid alone is not enough (#3269) 5397 ? componentOptions.Ctor.cid + (componentOptions.tag ? ("::" + (componentOptions.tag)) : '') 5398 : vnode.key; 5399 if (cache[key]) {
5400 vnode.componentInstance = cache[key].componentInstance; 5401 // make current key freshest 5402 remove(keys, key); 5403 keys.push(key); 5404 } else { 5405 // delay setting the cache until update 5406 this.vnodeToCache = vnode; 5407 this.keyToCache = key; 5408 } 5409 5410 vnode.data.keepAlive = true; 5411 } 5412 return vnode || (slot && slot[0]) 5413 } 5414 }; 5415 5416 var builtInComponents = { 5417 KeepAlive: KeepAlive 5418 }; 5419 5420 /* */ 5421 5422 function initGlobalAPI (Vue) { 5423 // config 5424 var configDef = {}; 5425 configDef.get = function () { return config; }; 5426 { 5427 configDef.set = function () { 5428 warn( 5429 'Do not replace the Vue.config object, set individual fields instead.' 5430 ); 5431 }; 5432 } 5433 Object.defineProperty(Vue, 'config', configDef); 5434 5435 // exposed util methods. 5436 // NOTE: these are not considered part of the public API - avoid relying on 5437 // them unless you are aware of the risk. 5438 Vue.util = { 5439 warn: warn, 5440 extend: extend, 5441 mergeOptions: mergeOptions, 5442 defineReactive: defineReactive$$1 5443 }; 5444 5445 Vue.set = set; 5446 Vue.delete = del; 5447 Vue.nextTick = nextTick; 5448 5449 // 2.6 explicit observable API 5450 Vue.observable = function (obj) { 5451 observe(obj); 5452 return obj 5453 }; 5454 5455 Vue.options = Object.create(null); 5456 ASSET_TYPES.forEach(function (type) { 5457 Vue.options[type + 's'] = Object.create(null); 5458 }); 5459 5460 // this is used to identify the "base" constructor to extend all plain-object 5461 // components with in Weex's multi-instance scenarios. 5462 Vue.options._base = Vue; 5463 5464 extend(Vue.options.components, builtInComponents); 5465 5466 initUse(Vue); 5467 initMixin$1(Vue); 5468 initExtend(Vue); 5469 initAssetRegisters(Vue); 5470 } 5471 5472 initGlobalAPI(Vue); 5473 5474 Object.defineProperty(Vue.prototype, '$isServer', { 5475 get: isServerRendering 5476 }); 5477 5478 Object.defineProperty(Vue.prototype, '$ssrContext', { 5479 get: function get () { 5480 /* istanbul ignore next */ 5481 return this.$vnode && this.$vnode.ssrContext 5482 } 5483 }); 5484 5485 // expose FunctionalRenderContext for ssr runtime helper installation 5486 Object.defineProperty(Vue, 'FunctionalRenderContext', { 5487 value: FunctionalRenderContext 5488 }); 5489 5490 Vue.version = '2.6.14'; 5491 5492 /* */ 5493 5494 // these are reserved for web because they are directly compiled away 5495 // during template compilation 5496 var isReservedAttr = makeMap('style,class'); 5497 5498 // attributes that should be using props for binding 5499 var acceptValue = makeMap('input,textarea,option,select,progress'); 5500 var mustUseProp = function (tag, type, attr) { 5501 return ( 5502 (attr === 'value' && acceptValue(tag)) && type !== 'button' || 5503 (attr === 'selected' && tag === 'option') || 5504 (attr === 'checked' && tag === 'input') || 5505 (attr === 'muted' && tag === 'video') 5506 ) 5507 }; 5508 5509 var isEnumeratedAttr = makeMap('contenteditable,draggable,spellcheck'); 5510 5511 var isValidContentEditableValue = makeMap('events,caret,typing,plaintext-only'); 5512 5513 var convertEnumeratedValue = function (key, value) { 5514 return isFalsyAttrValue(value) || value === 'false' 5515 ? 'false' 5516 // allow arbitrary string value for contenteditable 5517 : key === 'contenteditable' && isValidContentEditableValue(value) 5518 ? value 5519 : 'true' 5520 }; 5521 5522 var isBooleanAttr = makeMap( 5523 'allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,' + 5524 'default,defaultchecked,defaultmuted,defaultselected,defer,disabled,' + 5525 'enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,' + 5526 'muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,' + 5527 'required,reversed,scoped,seamless,selected,sortable,' + 5528 'truespeed,typemustmatch,visible' 5529 ); 5530 5531 var xlinkNS = 'http://www.w3.org/1999/xlink'; 5532 5533 var isXlink = function (name) { 5534 return name.charAt(5) === ':' && name.slice(0, 5) === 'xlink' 5535 }; 5536 5537 var getXlinkProp = function (name) { 5538 return isXlink(name) ? name.slice(6, name.length) : '' 5539 }; 5540 5541 var isFalsyAttrValue = function (val) { 5542 return val == null || val === false 5543 }; 5544 5545 /* */ 5546 5547 function genClassForVnode (vnode) { 5548 var data = vnode.data; 5549 var parentNode = vnode; 5550 var childNode = vnode; 5551 while (isDef(childNode.componentInstance)) { 5552 childNode = childNode.componentInstance._vnode; 5553 if (childNode && childNode.data) { 5554 data = mergeClassData(childNode.data, data); 5555 } 5556 } 5557 while (isDef(parentNode = parentNode.parent)) { 5558 if (parentNode && parentNode.data) { 5559 data = mergeClassData(data, parentNode.data); 5560 } 5561 } 5562 return renderClass(data.staticClass, data.class) 5563 } 5564 5565 function mergeClassData (child, parent) { 5566 return { 5567 staticClass: concat(child.staticClass, parent.staticClass), 5568 class: isDef(child.class) 5569 ? [child.class, parent.class] 5570 : parent.class 5571 } 5572 } 5573 5574 function renderClass ( 5575 staticClass, 5576 dynamicClass 5577 ) { 5578 if (isDef(staticClass) || isDef(dynamicClass)) { 5579 return concat(staticClass, stringifyClass(dynamicClass)) 5580 } 5581 /* istanbul ignore next */ 5582 return '' 5583 } 5584 5585 function concat (a, b) { 5586 return a ? b ? (a + ' ' + b) : a : (b || '') 5587 } 5588 5589 function stringifyClass (value) { 5590 if (Array.isArray(value)) { 5591 return stringifyArray(value) 5592 } 5593 if (isObject(value)) { 5594 return stringifyObject(value) 5595 } 5596 if (typeof value === 'string') { 5597 return value 5598 } 5599 /* istanbul ignore next */ 5600 return '' 5601 } 5602 5603 function stringifyArray (value) { 5604 var res = ''; 5605 var stringified; 5606 for (var i = 0, l = value.length; i < l; i++) { 5607 if (isDef(stringified = stringifyClass(value[i])) && stringified !== '') { 5608 if (res) { res += ' '; } 5609 res += stringified; 5610 } 5611 } 5612 return res 5613 } 5614 5615 function stringifyObject (value) { 5616 var res = ''; 5617 for (var key in value) { 5618 if (value[key]) { 5619 if (res) { res += ' '; } 5620 res += key; 5621 } 5622 } 5623 return res 5624 } 5625 5626 /* */ 5627 5628 var namespaceMap = { 5629 svg: 'http://www.w3.org/2000/svg', 5630 math: 'http://www.w3.org/1998/Math/MathML' 5631 }; 5632 5633 var isHTMLTag = makeMap( 5634 'html,body,base,head,link,meta,style,title,' + 5635 'address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,' + 5636 'div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,' + 5637 'a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,' + 5638 's,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,' + 5639 'embed,object,param,source,canvas,script,noscript,del,ins,' + 5640 'caption,col,colgroup,table,thead,tbody,td,th,tr,' + 5641 'button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,' + 5642 'output,progress,select,textarea,' + 5643 'details,dialog,menu,menuitem,summary,' + 5644 'content,element,shadow,template,blockquote,iframe,tfoot' 5645 ); 5646 5647 // this map is intentionally selective, only covering SVG elements that may 5648 // contain child elements. 5649 var isSVG = makeMap( 5650 'svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,' + 5651 'foreignobject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,' + 5652 'polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view', 5653 true 5654 ); 5655 5656 var isPreTag = function (tag) { return tag === 'pre'; }; 5657 5658 var isReservedTag = function (tag) { 5659 return isHTMLTag(tag) || isSVG(tag) 5660 }; 5661 5662 function getTagNamespace (tag) { 5663 if (isSVG(tag)) { 5664 return 'svg' 5665 } 5666 // basic support for MathML 5667 // note it doesn't support other MathML elements being component roots 5668 if (tag === 'math') { 5669 return 'math' 5670 } 5671 } 5672 5673 var unknownElementCache = Object.create(null); 5674 function isUnknownElement (tag) { 5675 /* istanbul ignore if */ 5676 if (!inBrowser) { 5677 return true 5678 } 5679 if (isReservedTag(tag)) { 5680 return false 5681 } 5682 tag = tag.toLowerCase(); 5683 /* istanbul ignore if */ 5684 if (unknownElementCache[tag] != null) { 5685 return unknownElementCache[tag] 5686 } 5687 var el = document.createElement(tag); 5688 if (tag.indexOf('-') > -1) { 5689 // http://stackoverflow.com/a/28210364/1070244 5690 return (unknownElementCache[tag] = ( 5691 el.constructor === window.HTMLUnknownElement || 5692 el.constructor === window.HTMLElement 5693 )) 5694 } else { 5695 return (unknownElementCache[tag] = /HTMLUnknownElement/.test(el.toString())) 5696 } 5697 } 5698 5699 var isTextInputType = makeMap('text,number,password,search,email,tel,url'); 5700 5701 /* */ 5702 5703 /** 5704 * Query an element selector if it's not an element already. 5705 */ 5706 function query (el) { 5707 if (typeof el === 'string') { 5708 var selected = document.querySelector(el); 5709 if (!selected) { 5710 warn( 5711 'Cannot find element: ' + el 5712 ); 5713 return document.createElement('div') 5714 } 5715 return selected 5716 } else { 5717 return el 5718 } 5719 } 5720 5721 /* */ 5722 5723 function createElement$1 (tagName, vnode) { 5724 var elm = document.createElement(tagName); 5725 if (tagName !== 'select') { 5726 return elm 5727 } 5728 // false or null will remove the attribute but undefined will not 5729 if (vnode.data && vnode.data.attrs && vnode.data.attrs.multiple !== undefined) { 5730 elm.setAttribute('multiple', 'multiple'); 5731 } 5732 return elm 5733 } 5734 5735 function createElementNS (namespace, tagName) { 5736 return document.createElementNS(namespaceMap[namespace], tagName) 5737 } 5738 5739 function createTextNode (text) { 5740 return document.createTextNode(text) 5741 } 5742 5743 function createComment (text) { 5744 return document.createComment(text) 5745 } 5746 5747 function insertBefore (parentNode, newNode, referenceNode) { 5748 parentNode.insertBefore(newNode, referenceNode); 5749 } 5750 5751 function removeChild (node, child) { 5752 node.removeChild(child); 5753 } 5754 5755 function appendChild (node, child) { 5756 node.appendChild(child); 5757 } 5758 5759 function parentNode (node) { 5760 return node.parentNode 5761 } 5762 5763 function nextSibling (node) { 5764 return node.nextSibling 5765 } 5766 5767 function tagName (node) { 5768 return node.tagName 5769 } 5770 5771 function setTextContent (node, text) { 5772 node.textContent = text; 5773 } 5774 5775 function setStyleScope (node, scopeId) { 5776 node.setAttribute(scopeId, ''); 5777 } 5778 5779 var nodeOps = /*#__PURE__*/Object.freeze({ 5780 createElement: createElement$1, 5781 createElementNS: createElementNS, 5782 createTextNode: createTextNode, 5783 createComment: createComment, 5784 insertBefore: insertBefore, 5785 removeChild: removeChild, 5786 appendChild: appendChild, 5787 parentNode: parentNode, 5788 nextSibling: nextSibling, 5789 tagName: tagName, 5790 setTextContent: setTextContent, 5791 setStyleScope: setStyleScope 5792 }); 5793 5794 /* */ 5795 5796 var ref = { 5797 create: function create (_, vnode) { 5798 registerRef(vnode); 5799 }, 5800 update: function update (oldVnode, vnode) { 5801 if (oldVnode.data.ref !== vnode.data.ref) { 5802 registerRef(oldVnode, true); 5803 registerRef(vnode); 5804 } 5805 }, 5806 destroy: function destroy (vnode) { 5807 registerRef(vnode, true); 5808 } 5809 }; 5810 5811 function registerRef (vnode, isRemoval) { 5812 var key = vnode.data.ref; 5813 if (!isDef(key)) { return } 5814 5815 var vm = vnode.context; 5816 var ref = vnode.componentInstance || vnode.elm; 5817 var refs = vm.$refs; 5818 if (isRemoval) { 5819 if (Array.isArray(refs[key])) { 5820 remove(refs[key], ref); 5821 } else if (refs[key] === ref) { 5822 refs[key] = undefined; 5823 } 5824 } else { 5825 if (vnode.data.refInFor) { 5826 if (!Array.isArray(refs[key])) { 5827 refs[key] = [ref]; 5828 } else if (refs[key].indexOf(ref) < 0) { 5829 // $flow-disable-line 5830 refs[key].push(ref); 5831 } 5832 } else { 5833 refs[key] = ref; 5834 } 5835 } 5836 } 5837 5838 /** 5839 * Virtual DOM patching algorithm based on Snabbdom by 5840 * Simon Friis Vindum (@paldepind) 5841 * Licensed under the MIT License 5842 * https://github.com/paldepind/snabbdom/blob/master/LICENSE 5843 * 5844 * modified by Evan You (@yyx990803) 5845 * 5846 * Not type-checking this because this file is perf-critical and the cost 5847 * of making flow understand it is not worth it. 5848 */ 5849 5850 var emptyNode = new VNode('', {}, []); 5851 5852 var hooks = ['create', 'activate', 'update', 'remove', 'destroy']; 5853 5854 function sameVnode (a, b) { 5855 return (
5856 a.key === b.key && 5857 a.asyncFactory === b.asyncFactory && ( 5858 ( 5859 a.tag === b.tag && 5860 a.isComment === b.isComment && 5861 isDef(a.data) === isDef(b.data) && 5862 sameInputType(a, b) 5863 ) || ( 5864 isTrue(a.isAsyncPlaceholder) && 5865 isUndef(b.asyncFactory.error) 5866 ) 5867 ) 5868 ) 5869 } 5870 5871 function sameInputType (a, b) { 5872 if (a.tag !== 'input') { return true } 5873 var i; 5874 var typeA = isDef(i = a.data) && isDef(i = i.attrs) && i.type; 5875 var typeB = isDef(i = b.data) && isDef(i = i.attrs) && i.type; 5876 return typeA === typeB || isTextInputType(typeA) && isTextInputType(typeB) 5877 } 5878 5879 function createKeyToOldIdx (children, beginIdx, endIdx) { 5880 var i, key; 5881 var map = {}; 5882 for (i = beginIdx; i <= endIdx; ++i) { 5883 key = children[i].key; 5884 if (isDef(key)) { map[key] = i; } 5885 } 5886 return map 5887 } 5888 5889 function createPatchFunction (backend) { 5890 var i, j; 5891 var cbs = {}; 5892 5893 var modules = backend.modules; 5894 var nodeOps = backend.nodeOps; 5895 5896 for (i = 0; i < hooks.length; ++i) { 5897 cbs[hooks[i]] = []; 5898 for (j = 0; j < modules.length; ++j) { 5899 if (isDef(modules[j][hooks[i]])) { 5900 cbs[hooks[i]].push(modules[j][hooks[i]]); 5901 } 5902 } 5903 } 5904 5905 function emptyNodeAt (elm) { 5906 return new VNode(nodeOps.tagName(elm).toLowerCase(), {}, [], undefined, elm) 5907 } 5908 5909 function createRmCb (childElm, listeners) { 5910 function remove$$1 () { 5911 if (--remove$$1.listeners === 0) { 5912 removeNode(childElm); 5913 } 5914 } 5915 remove$$1.listeners = listeners; 5916 return remove$$1 5917 } 5918 5919 function removeNode (el) { 5920 var parent = nodeOps.parentNode(el); 5921 // element may have already been removed due to v-html / v-text 5922 if (isDef(parent)) { 5923 nodeOps.removeChild(parent, el); 5924 } 5925 } 5926 5927 function isUnknownElement$$1 (vnode, inVPre) { 5928 return ( 5929 !inVPre && 5930 !vnode.ns && 5931 !( 5932 config.ignoredElements.length && 5933 config.ignoredElements.some(function (ignore) { 5934 return isRegExp(ignore) 5935 ? ignore.test(vnode.tag) 5936 : ignore === vnode.tag 5937 }) 5938 ) && 5939 config.isUnknownElement(vnode.tag) 5940 ) 5941 } 5942 5943 var creatingElmInVPre = 0; 5944 5945 function createElm ( 5946 vnode, 5947 insertedVnodeQueue, 5948 parentElm, 5949 refElm, 5950 nested, 5951 ownerArray, 5952 index 5953 ) {
5954 if (isDef(vnode.elm) && isDef(ownerArray)) { 5955 // This vnode was used in a previous render! 5956 // now it's used as a new node, overwriting its elm would cause 5957 // potential patch errors down the road when it's used as an insertion 5958 // reference node. Instead, we clone the node on-demand before creating 5959 // associated DOM element for it. 5960 vnode = ownerArray[index] = cloneVNode(vnode); 5961 } 5962 5963 vnode.isRootInsert = !nested; // for transition enter check 5964 if (createComponent(vnode, insertedVnodeQueue, parentElm, refElm)) { 5965 return 5966 } 5967 5968 var data = vnode.data; 5969 var children = vnode.children; 5970 var tag = vnode.tag; 5971 if (isDef(tag)) { 5972 { 5973 if (data && data.pre) { 5974 creatingElmInVPre++; 5975 } 5976 if (isUnknownElement$$1(vnode, creatingElmInVPre)) { 5977 warn( 5978 'Unknown custom element: <' + tag + '> - did you ' + 5979 'register the component correctly? For recursive components, ' + 5980 'make sure to provide the "name" option.', 5981 vnode.context 5982 ); 5983 } 5984 } 5985 5986 vnode.elm = vnode.ns 5987 ? nodeOps.createElementNS(vnode.ns, tag) 5988 : nodeOps.createElement(tag, vnode); 5989 setScope(vnode); 5990 5991 /* istanbul ignore if */ 5992 { 5993 createChildren(vnode, children, insertedVnodeQueue); 5994 if (isDef(data)) { 5995 invokeCreateHooks(vnode, insertedVnodeQueue); 5996 } 5997 insert(parentElm, vnode.elm, refElm); 5998 } 5999 6000 if (data && data.pre) { 6001 creatingElmInVPre--; 6002 } 6003 } else if (isTrue(vnode.isComment)) { 6004 vnode.elm = nodeOps.createComment(vnode.text); 6005 insert(parentElm, vnode.elm, refElm); 6006 } else { 6007 vnode.elm = nodeOps.createTextNode(vnode.text); 6008 insert(parentElm, vnode.elm, refElm); 6009 } 6010 } 6011 6012 function createComponent (vnode, insertedVnodeQueue, parentElm, refElm) { 6013 var i = vnode.data; 6014 if (isDef(i)) { 6015 var isReactivated = isDef(vnode.componentInstance) && i.keepAlive; 6016 if (isDef(i = i.hook) && isDef(i = i.init)) { 6017 i(vnode, false /* hydrating */); 6018 } 6019 // after calling the init hook, if the vnode is a child component 6020 // it should've created a child instance and mounted it. the child 6021 // component also has set the placeholder vnode's elm. 6022 // in that case we can just return the element and be done.
6023 if (isDef(vnode.componentInstance)) { 6024 initComponent(vnode, insertedVnodeQueue); 6025 insert(parentElm, vnode.elm, refElm); 6026 if (isTrue(isReactivated)) { 6027 reactivateComponent(vnode, insertedVnodeQueue, parentElm, refElm); 6028 } 6029 return true 6030 } 6031 } 6032 } 6033 6034 function initComponent (vnode, insertedVnodeQueue) { 6035 if (isDef(vnode.data.pendingInsert)) { 6036 insertedVnodeQueue.push.apply(insertedVnodeQueue, vnode.data.pendingInsert); 6037 vnode.data.pendingInsert = null; 6038 } 6039 vnode.elm = vnode.componentInstance.$el; 6040 if (isPatchable(vnode)) { 6041 invokeCreateHooks(vnode, insertedVnodeQueue); 6042 setScope(vnode); 6043 } else { 6044 // empty component root. 6045 // skip all element-related modules except for ref (#3455) 6046 registerRef(vnode); 6047 // make sure to invoke the insert hook 6048 insertedVnodeQueue.push(vnode); 6049 } 6050 } 6051 6052 function reactivateComponent (vnode, insertedVnodeQueue, parentElm, refElm) { 6053 var i; 6054 // hack for #4339: a reactivated component with inner transition 6055 // does not trigger because the inner node's created hooks are not called 6056 // again. It's not ideal to involve module-specific logic in here but 6057 // there doesn't seem to be a better way to do it. 6058 var innerNode = vnode; 6059 while (innerNode.componentInstance) { 6060 innerNode = innerNode.componentInstance._vnode; 6061 if (isDef(i = innerNode.data) && isDef(i = i.transition)) { 6062 for (i = 0; i < cbs.activate.length; ++i) { 6063 cbs.activate[i](emptyNode, innerNode); 6064 } 6065 insertedVnodeQueue.push(innerNode); 6066 break 6067 } 6068 } 6069 // unlike a newly created component, 6070 // a reactivated keep-alive component doesn't insert itself 6071 insert(parentElm, vnode.elm, refElm); 6072 } 6073 6074 function insert (parent, elm, ref$$1) { 6075 if (isDef(parent)) { 6076 if (isDef(ref$$1)) { 6077 if (nodeOps.parentNode(ref$$1) === parent) { 6078 nodeOps.insertBefore(parent, elm, ref$$1); 6079 } 6080 } else { 6081 nodeOps.appendChild(parent, elm); 6082 } 6083 } 6084 } 6085 6086 function createChildren (vnode, children, insertedVnodeQueue) { 6087 if (Array.isArray(children)) { 6088 { 6089 checkDuplicateKeys(children); 6090 } 6091 for (var i = 0; i < children.length; ++i) { 6092 createElm(children[i], insertedVnodeQueue, vnode.elm, null, true, children, i); 6093 } 6094 } else if (isPrimitive(vnode.text)) { 6095 nodeOps.appendChild(vnode.elm, nodeOps.createTextNode(String(vnode.text))); 6096 } 6097 } 6098 6099 function isPatchable (vnode) { 6100 while (vnode.componentInstance) { 6101 vnode = vnode.componentInstance._vnode; 6102 } 6103 return isDef(vnode.tag) 6104 } 6105 6106 function invokeCreateHooks (vnode, insertedVnodeQueue) { 6107 for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) { 6108 cbs.create[i$1](emptyNode, vnode); 6109 } 6110 i = vnode.data.hook; // Reuse variable 6111 if (isDef(i)) { 6112 if (isDef(i.create)) { i.create(emptyNode, vnode); } 6113 if (isDef(i.insert)) { insertedVnodeQueue.push(vnode); } 6114 } 6115 } 6116 6117 // set scope id attribute for scoped CSS. 6118 // this is implemented as a special case to avoid the overhead 6119 // of going through the normal attribute patching process. 6120 function setScope (vnode) { 6121 var i; 6122 if (isDef(i = vnode.fnScopeId)) { 6123 nodeOps.setStyleScope(vnode.elm, i); 6124 } else { 6125 var ancestor = vnode; 6126 while (ancestor) { 6127 if (isDef(i = ancestor.context) && isDef(i = i.$options._scopeId)) { 6128 nodeOps.setStyleScope(vnode.elm, i); 6129 } 6130 ancestor = ancestor.parent; 6131 } 6132 } 6133 // for slot content they should also get the scopeId from the host instance. 6134 if (isDef(i = activeInstance) && 6135 i !== vnode.context && 6136 i !== vnode.fnContext && 6137 isDef(i = i.$options._scopeId) 6138 ) { 6139 nodeOps.setStyleScope(vnode.elm, i); 6140 } 6141 } 6142 6143 function addVnodes (parentElm, refElm, vnodes, startIdx, endIdx, insertedVnodeQueue) { 6144 for (; startIdx <= endIdx; ++startIdx) { 6145 createElm(vnodes[startIdx], insertedVnodeQueue, parentElm, refElm, false, vnodes, startIdx); 6146 } 6147 } 6148 6149 function invokeDestroyHook (vnode) { 6150 var i, j; 6151 var data = vnode.data; 6152 if (isDef(data)) { 6153 if (isDef(i = data.hook) && isDef(i = i.destroy)) { i(vnode); } 6154 for (i = 0; i < cbs.destroy.length; ++i) { cbs.destroy[i](vnode); } 6155 } 6156 if (isDef(i = vnode.children)) { 6157 for (j = 0; j < vnode.children.length; ++j) { 6158 invokeDestroyHook(vnode.children[j]); 6159 } 6160 } 6161 } 6162 6163 function removeVnodes (vnodes, startIdx, endIdx) { 6164 for (; startIdx <= endIdx; ++startIdx) { 6165 var ch = vnodes[startIdx]; 6166 if (isDef(ch)) { 6167 if (isDef(ch.tag)) { 6168 removeAndInvokeRemoveHook(ch); 6169 invokeDestroyHook(ch); 6170 } else { // Text node 6171 removeNode(ch.elm); 6172 } 6173 } 6174 } 6175 } 6176 6177 function removeAndInvokeRemoveHook (vnode, rm) { 6178 if (isDef(rm) || isDef(vnode.data)) { 6179 var i; 6180 var listeners = cbs.remove.length + 1; 6181 if (isDef(rm)) { 6182 // we have a recursively passed down rm callback 6183 // increase the listeners count 6184 rm.listeners += listeners; 6185 } else { 6186 // directly removing 6187 rm = createRmCb(vnode.elm, listeners); 6188 } 6189 // recursively invoke hooks on child component root node 6190 if (isDef(i = vnode.componentInstance) && isDef(i = i._vnode) && isDef(i.data)) { 6191 removeAndInvokeRemoveHook(i, rm); 6192 } 6193 for (i = 0; i < cbs.remove.length; ++i) {
6194 cbs.remove[i](vnode, rm); 6195 } 6196 if (isDef(i = vnode.data.hook) && isDef(i = i.remove)) { 6197 i(vnode, rm); 6198 } else { 6199 rm(); 6200 } 6201 } else { 6202 removeNode(vnode.elm); 6203 } 6204 } 6205 6206 function updateChildren (parentElm, oldCh, newCh, insertedVnodeQueue, removeOnly) { 6207 var oldStartIdx = 0; 6208 var newStartIdx = 0; 6209 var oldEndIdx = oldCh.length - 1; 6210 var oldStartVnode = oldCh[0]; 6211 var oldEndVnode = oldCh[oldEndIdx]; 6212 var newEndIdx = newCh.length - 1; 6213 var newStartVnode = newCh[0]; 6214 var newEndVnode = newCh[newEndIdx]; 6215 var oldKeyToIdx, idxInOld, vnodeToMove, refElm; 6216 6217 // removeOnly is a special flag used only by <transition-group> 6218 // to ensure removed elements stay in correct relative positions 6219 // during leaving transitions 6220 var canMove = !removeOnly; 6221 6222 { 6223 checkDuplicateKeys(newCh); 6224 } 6225 6226 while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) { 6227 if (isUndef(oldStartVnode)) { 6228 oldStartVnode = oldCh[++oldStartIdx]; // Vnode has been moved left 6229 } else if (isUndef(oldEndVnode)) { 6230 oldEndVnode = oldCh[--oldEndIdx]; 6231 } else if (sameVnode(oldStartVnode, newStartVnode)) { 6232 patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue, newCh, newStartIdx); 6233 oldStartVnode = oldCh[++oldStartIdx]; 6234 newStartVnode = newCh[++newStartIdx]; 6235 } else if (sameVnode(oldEndVnode, newEndVnode)) { 6236 patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue, newCh, newEndIdx); 6237 oldEndVnode = oldCh[--oldEndIdx]; 6238 newEndVnode = newCh[--newEndIdx]; 6239 } else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right 6240 patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue, newCh, newEndIdx); 6241 canMove && nodeOps.insertBefore(parentElm, oldStartVnode.elm, nodeOps.nextSibling(oldEndVnode.elm)); 6242 oldStartVnode = oldCh[++oldStartIdx]; 6243 newEndVnode = newCh[--newEndIdx]; 6244 } else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left 6245 patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue, newCh, newStartIdx); 6246 canMove && nodeOps.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm); 6247 oldEndVnode = oldCh[--oldEndIdx]; 6248 newStartVnode = newCh[++newStartIdx]; 6249 } else { 6250 if (isUndef(oldKeyToIdx)) { oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx); } 6251 idxInOld = isDef(newStartVnode.key) 6252 ? oldKeyToIdx[newStartVnode.key] 6253 : findIdxInOld(newStartVnode, oldCh, oldStartIdx, oldEndIdx); 6254 if (isUndef(idxInOld)) { // New element 6255 createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx); 6256 } else { 6257 vnodeToMove = oldCh[idxInOld]; 6258 if (sameVnode(vnodeToMove, newStartVnode)) { 6259 patchVnode(vnodeToMove, newStartVnode, insertedVnodeQueue, newCh, newStartIdx); 6260 oldCh[idxInOld] = undefined; 6261 canMove && nodeOps.insertBefore(parentElm, vnodeToMove.elm, oldStartVnode.elm); 6262 } else { 6263 // same key but different element. treat as new element 6264 createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx); 6265 } 6266 } 6267 newStartVnode = newCh[++newStartIdx]; 6268 } 6269 } 6270 if (oldStartIdx > oldEndIdx) { 6271 refElm = isUndef(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm; 6272 addVnodes(parentElm, refElm, newCh, newStartIdx, newEndIdx, insertedVnodeQueue); 6273 } else if (newStartIdx > newEndIdx) { 6274 removeVnodes(oldCh, oldStartIdx, oldEndIdx); 6275 } 6276 } 6277 6278 function checkDuplicateKeys (children) { 6279 var seenKeys = {}; 6280 for (var i = 0; i < children.length; i++) { 6281 var vnode = children[i]; 6282 var key = vnode.key; 6283 if (isDef(key)) { 6284 if (seenKeys[key]) { 6285 warn( 6286 ("Duplicate keys detected: '" + key + "'. This may cause an update error."), 6287 vnode.context 6288 ); 6289 } else { 6290 seenKeys[key] = true; 6291 } 6292 } 6293 } 6294 } 6295 6296 function findIdxInOld (node, oldCh, start, end) { 6297 for (var i = start; i < end; i++) { 6298 var c = oldCh[i]; 6299 if (isDef(c) && sameVnode(node, c)) { return i } 6300 } 6301 } 6302 6303 function patchVnode ( 6304 oldVnode, 6305 vnode, 6306 insertedVnodeQueue, 6307 ownerArray, 6308 index, 6309 removeOnly 6310 ) { 6311 if (oldVnode === vnode) { 6312 return 6313 } 6314
6315 if (isDef(vnode.elm) && isDef(ownerArray)) { 6316 // clone reused vnode 6317 vnode = ownerArray[index] = cloneVNode(vnode); 6318 } 6319 6320 var elm = vnode.elm = oldVnode.elm; 6321 6322 if (isTrue(oldVnode.isAsyncPlaceholder)) { 6323 if (isDef(vnode.asyncFactory.resolved)) { 6324 hydrate(oldVnode.elm, vnode, insertedVnodeQueue); 6325 } else { 6326 vnode.isAsyncPlaceholder = true; 6327 } 6328 return 6329 } 6330 6331 // reuse element for static trees. 6332 // note we only do this if the vnode is cloned - 6333 // if the new node is not cloned it means the render functions have been 6334 // reset by the hot-reload-api and we need to do a proper re-render. 6335 if (isTrue(vnode.isStatic) && 6336 isTrue(oldVnode.isStatic) && 6337 vnode.key === oldVnode.key && 6338 (isTrue(vnode.isCloned) || isTrue(vnode.isOnce)) 6339 ) { 6340 vnode.componentInstance = oldVnode.componentInstance; 6341 return 6342 } 6343 6344 var i; 6345 var data = vnode.data; 6346 if (isDef(data) && isDef(i = data.hook) && isDef(i = i.prepatch)) { 6347 i(oldVnode, vnode); 6348 } 6349 6350 var oldCh = oldVnode.children; 6351 var ch = vnode.children; 6352 if (isDef(data) && isPatchable(vnode)) { 6353 for (i = 0; i < cbs.update.length; ++i) { cbs.update[i](oldVnode, vnode); } 6354 if (isDef(i = data.hook) && isDef(i = i.update)) { i(oldVnode, vnode); } 6355 } 6356 if (isUndef(vnode.text)) { 6357 if (isDef(oldCh) && isDef(ch)) { 6358 if (oldCh !== ch) { updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly); } 6359 } else if (isDef(ch)) { 6360 { 6361 checkDuplicateKeys(ch); 6362 } 6363 if (isDef(oldVnode.text)) { nodeOps.setTextContent(elm, ''); } 6364 addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue); 6365 } else if (isDef(oldCh)) { 6366 removeVnodes(oldCh, 0, oldCh.length - 1); 6367 } else if (isDef(oldVnode.text)) { 6368 nodeOps.setTextContent(elm, ''); 6369 } 6370 } else if (oldVnode.text !== vnode.text) { 6371 nodeOps.setTextContent(elm, vnode.text); 6372 } 6373 if (isDef(data)) { 6374 if (isDef(i = data.hook) && isDef(i = i.postpatch)) { i(oldVnode, vnode); } 6375 } 6376 } 6377 6378 function invokeInsertHook (vnode, queue, initial) { 6379 // delay insert hooks for component root nodes, invoke them after the 6380 // element is really inserted 6381 if (isTrue(initial) && isDef(vnode.parent)) { 6382 vnode.parent.data.pendingInsert = queue; 6383 } else { 6384 for (var i = 0; i < queue.length; ++i) { 6385 queue[i].data.hook.insert(queue[i]); 6386 } 6387 } 6388 } 6389 6390 var hydrationBailed = false; 6391 // list of modules that can skip create hook during hydration because they 6392 // are already rendered on the client or has no need for initialization 6393 // Note: style is excluded because it relies on initial clone for future 6394 // deep updates (#7063). 6395 var isRenderedModule = makeMap('attrs,class,staticClass,staticStyle,key'); 6396 6397 // Note: this is a browser-only function so we can assume elms are DOM nodes. 6398 function hydrate (elm, vnode, insertedVnodeQueue, inVPre) { 6399 var i; 6400 var tag = vnode.tag; 6401 var data = vnode.data; 6402 var children = vnode.children; 6403 inVPre = inVPre || (data && data.pre); 6404 vnode.elm = elm; 6405 6406 if (isTrue(vnode.isComment) && isDef(vnode.asyncFactory)) { 6407 vnode.isAsyncPlaceholder = true; 6408 return true 6409 } 6410 // assert node match 6411 { 6412 if (!assertNodeMatch(elm, vnode, inVPre)) { 6413 return false 6414 } 6415 } 6416 if (isDef(data)) { 6417 if (isDef(i = data.hook) && isDef(i = i.init)) { i(vnode, true /* hydrating */); } 6418 if (isDef(i = vnode.componentInstance)) { 6419 // child component. it should have hydrated its own tree. 6420 initComponent(vnode, insertedVnodeQueue); 6421 return true 6422 } 6423 } 6424 if (isDef(tag)) { 6425 if (isDef(children)) { 6426 // empty element, allow client to pick up and populate children 6427 if (!elm.hasChildNodes()) { 6428 createChildren(vnode, children, insertedVnodeQueue); 6429 } else { 6430 // v-html and domProps: innerHTML 6431 if (isDef(i = data) && isDef(i = i.domProps) && isDef(i = i.innerHTML)) { 6432 if (i !== elm.innerHTML) { 6433 /* istanbul ignore if */ 6434 if (typeof console !== 'undefined' && 6435 !hydrationBailed 6436 ) { 6437 hydrationBailed = true; 6438 console.warn('Parent: ', elm); 6439 console.warn('server innerHTML: ', i); 6440 console.warn('client innerHTML: ', elm.innerHTML); 6441 } 6442 return false 6443 } 6444 } else { 6445 // iterate and compare children lists 6446 var childrenMatch = true; 6447 var childNode = elm.firstChild; 6448 for (var i$1 = 0; i$1 < children.length; i$1++) { 6449 if (!childNode || !hydrate(childNode, children[i$1], insertedVnodeQueue, inVPre)) { 6450 childrenMatch = false;
6451 break 6452 } 6453 childNode = childNode.nextSibling; 6454 } 6455 // if childNode is not null, it means the actual childNodes list is 6456 // longer than the virtual children list. 6457 if (!childrenMatch || childNode) { 6458 /* istanbul ignore if */ 6459 if (typeof console !== 'undefined' && 6460 !hydrationBailed 6461 ) { 6462 hydrationBailed = true; 6463 console.warn('Parent: ', elm); 6464 console.warn('Mismatching childNodes vs. VNodes: ', elm.childNodes, children); 6465 } 6466 return false 6467 } 6468 } 6469 } 6470 } 6471 if (isDef(data)) { 6472 var fullInvoke = false; 6473 for (var key in data) { 6474 if (!isRenderedModule(key)) { 6475 fullInvoke = true; 6476 invokeCreateHooks(vnode, insertedVnodeQueue); 6477 break 6478 } 6479 } 6480 if (!fullInvoke && data['class']) { 6481 // ensure collecting deps for deep class bindings for future updates 6482 traverse(data['class']); 6483 } 6484 } 6485 } else if (elm.data !== vnode.text) { 6486 elm.data = vnode.text; 6487 } 6488 return true 6489 } 6490 6491 function assertNodeMatch (node, vnode, inVPre) {
6492 if (isDef(vnode.tag)) { 6493 return vnode.tag.indexOf('vue-component') === 0 || ( 6494 !isUnknownElement$$1(vnode, inVPre) && 6495 vnode.tag.toLowerCase() === (node.tagName && node.tagName.toLowerCase()) 6496 ) 6497 } else { 6498 return node.nodeType === (vnode.isComment ? 8 : 3) 6499 } 6500 } 6501 6502 return function patch (oldVnode, vnode, hydrating, removeOnly) { 6503 if (isUndef(vnode)) { 6504 if (isDef(oldVnode)) { invokeDestroyHook(oldVnode); } 6505 return 6506 } 6507 6508 var isInitialPatch = false; 6509 var insertedVnodeQueue = []; 6510 6511 if (isUndef(oldVnode)) { 6512 // empty mount (likely as component), create new root element 6513 isInitialPatch = true; 6514 createElm(vnode, insertedVnodeQueue); 6515 } else { 6516 var isRealElement = isDef(oldVnode.nodeType); 6517 if (!isRealElement && sameVnode(oldVnode, vnode)) { 6518 // patch existing root node 6519 patchVnode(oldVnode, vnode, insertedVnodeQueue, null, null, removeOnly); 6520 } else { 6521 if (isRealElement) { 6522 // mounting to a real element 6523 // check if this is server-rendered content and if we can perform 6524 // a successful hydration. 6525 if (oldVnode.nodeType === 1 && oldVnode.hasAttribute(SSR_ATTR)) { 6526 oldVnode.removeAttribute(SSR_ATTR); 6527 hydrating = true; 6528 } 6529 if (isTrue(hydrating)) { 6530 if (hydrate(oldVnode, vnode, insertedVnodeQueue)) { 6531 invokeInsertHook(vnode, insertedVnodeQueue, true); 6532 return oldVnode 6533 } else { 6534 warn( 6535 'The client-side rendered virtual DOM tree is not matching ' + 6536 'server-rendered content. This is likely caused by incorrect ' + 6537 'HTML markup, for example nesting block-level elements inside ' + 6538 '<p>, or missing <tbody>. Bailing hydration and performing ' + 6539 'full client-side render.' 6540 ); 6541 } 6542 } 6543 // either not server-rendered, or hydration failed. 6544 // create an empty node and replace it 6545 oldVnode = emptyNodeAt(oldVnode); 6546 } 6547 6548 // replacing existing element 6549 var oldElm = oldVnode.elm; 6550 var parentElm = nodeOps.parentNode(oldElm); 6551 6552 // create new node 6553 createElm( 6554 vnode, 6555 insertedVnodeQueue, 6556 // extremely rare edge case: do not insert if old element is in a 6557 // leaving transition. Only happens when combining transition + 6558 // keep-alive + HOCs. (#4590) 6559 oldElm._leaveCb ? null : parentElm, 6560 nodeOps.nextSibling(oldElm) 6561 ); 6562 6563 // update parent placeholder node element, recursively
6564 if (isDef(vnode.parent)) { 6565 var ancestor = vnode.parent; 6566 var patchable = isPatchable(vnode); 6567 while (ancestor) { 6568 for (var i = 0; i < cbs.destroy.length; ++i) { 6569 cbs.destroy[i](ancestor); 6570 } 6571 ancestor.elm = vnode.elm; 6572 if (patchable) { 6573 for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) { 6574 cbs.create[i$1](emptyNode, ancestor); 6575 } 6576 // #6513 6577 // invoke insert hooks that may have been merged by create hooks. 6578 // e.g. for directives that uses the "inserted" hook. 6579 var insert = ancestor.data.hook.insert; 6580 if (insert.merged) { 6581 // start at index 1 to avoid re-invoking component mounted hook 6582 for (var i$2 = 1; i$2 < insert.fns.length; i$2++) { 6583 insert.fns[i$2](); 6584 } 6585 } 6586 } else { 6587 registerRef(ancestor); 6588 } 6589 ancestor = ancestor.parent; 6590 } 6591 } 6592 6593 // destroy old node 6594 if (isDef(parentElm)) { 6595 removeVnodes([oldVnode], 0, 0); 6596 } else if (isDef(oldVnode.tag)) { 6597 invokeDestroyHook(oldVnode); 6598 } 6599 } 6600 } 6601 6602 invokeInsertHook(vnode, insertedVnodeQueue, isInitialPatch); 6603 return vnode.elm 6604 } 6605 } 6606 6607 /* */ 6608 6609 var directives = { 6610 create: updateDirectives, 6611 update: updateDirectives, 6612 destroy: function unbindDirectives (vnode) { 6613 updateDirectives(vnode, emptyNode); 6614 } 6615 }; 6616 6617 function updateDirectives (oldVnode, vnode) { 6618 if (oldVnode.data.directives || vnode.data.directives) { 6619 _update(oldVnode, vnode); 6620 } 6621 } 6622 6623 function _update (oldVnode, vnode) { 6624 var isCreate = oldVnode === emptyNode; 6625 var isDestroy = vnode === emptyNode; 6626 var oldDirs = normalizeDirectives$1(oldVnode.data.directives, oldVnode.context); 6627 var newDirs = normalizeDirectives$1(vnode.data.directives, vnode.context); 6628 6629 var dirsWithInsert = []; 6630 var dirsWithPostpatch = []; 6631 6632 var key, oldDir, dir; 6633 for (key in newDirs) { 6634 oldDir = oldDirs[key]; 6635 dir = newDirs[key]; 6636 if (!oldDir) { 6637 // new directive, bind 6638 callHook$1(dir, 'bind', vnode, oldVnode); 6639 if (dir.def && dir.def.inserted) { 6640 dirsWithInsert.push(dir); 6641 } 6642 } else { 6643 // existing directive, update 6644 dir.oldValue = oldDir.value; 6645 dir.oldArg = oldDir.arg; 6646 callHook$1(dir, 'update', vnode, oldVnode); 6647 if (dir.def && dir.def.componentUpdated) { 6648 dirsWithPostpatch.push(dir); 6649 } 6650 } 6651 } 6652 6653 if (dirsWithInsert.length) { 6654 var callInsert = function () { 6655 for (var i = 0; i < dirsWithInsert.length; i++) { 6656 callHook$1(dirsWithInsert[i], 'inserted', vnode, oldVnode); 6657 } 6658 }; 6659 if (isCreate) { 6660 mergeVNodeHook(vnode, 'insert', callInsert); 6661 } else { 6662 callInsert(); 6663 } 6664 } 6665 6666 if (dirsWithPostpatch.length) { 6667 mergeVNodeHook(vnode, 'postpatch', function () { 6668 for (var i = 0; i < dirsWithPostpatch.length; i++) { 6669 callHook$1(dirsWithPostpatch[i], 'componentUpdated', vnode, oldVnode); 6670 } 6671 }); 6672 } 6673 6674 if (!isCreate) { 6675 for (key in oldDirs) { 6676 if (!newDirs[key]) { 6677 // no longer present, unbind 6678 callHook$1(oldDirs[key], 'unbind', oldVnode, oldVnode, isDestroy); 6679 } 6680 } 6681 } 6682 } 6683 6684 var emptyModifiers = Object.create(null); 6685 6686 function normalizeDirectives$1 ( 6687 dirs, 6688 vm 6689 ) { 6690 var res = Object.create(null); 6691 if (!dirs) { 6692 // $flow-disable-line 6693 return res 6694 } 6695 var i, dir; 6696 for (i = 0; i < dirs.length; i++) { 6697 dir = dirs[i]; 6698 if (!dir.modifiers) { 6699 // $flow-disable-line 6700 dir.modifiers = emptyModifiers; 6701 } 6702 res[getRawDirName(dir)] = dir; 6703 dir.def = resolveAsset(vm.$options, 'directives', dir.name, true); 6704 } 6705 // $flow-disable-line 6706 return res 6707 } 6708 6709 function getRawDirName (dir) { 6710 return dir.rawName || ((dir.name) + "." + (Object.keys(dir.modifiers || {}).join('.'))) 6711 } 6712 6713 function callHook$1 (dir, hook, vnode, oldVnode, isDestroy) { 6714 var fn = dir.def && dir.def[hook]; 6715 if (fn) {
6716 try { 6717 fn(vnode.elm, dir, vnode, oldVnode, isDestroy); 6718 } catch (e) { 6719 handleError(e, vnode.context, ("directive " + (dir.name) + " " + hook + " hook")); 6720 } 6721 } 6722 } 6723 6724 var baseModules = [ 6725 ref, 6726 directives 6727 ]; 6728 6729 /* */ 6730 6731 function updateAttrs (oldVnode, vnode) { 6732 var opts = vnode.componentOptions; 6733 if (isDef(opts) && opts.Ctor.options.inheritAttrs === false) { 6734 return 6735 } 6736 if (isUndef(oldVnode.data.attrs) && isUndef(vnode.data.attrs)) { 6737 return 6738 } 6739 var key, cur, old; 6740 var elm = vnode.elm; 6741 var oldAttrs = oldVnode.data.attrs || {}; 6742 var attrs = vnode.data.attrs || {}; 6743 // clone observed objects, as the user probably wants to mutate it 6744 if (isDef(attrs.__ob__)) { 6745 attrs = vnode.data.attrs = extend({}, attrs); 6746 } 6747 6748 for (key in attrs) { 6749 cur = attrs[key]; 6750 old = oldAttrs[key]; 6751 if (old !== cur) { 6752 setAttr(elm, key, cur, vnode.data.pre); 6753 } 6754 } 6755 // #4391: in IE9, setting type can reset value for input[type=radio] 6756 // #6666: IE/Edge forces progress value down to 1 before setting a max 6757 /* istanbul ignore if */ 6758 if ((isIE || isEdge) && attrs.value !== oldAttrs.value) { 6759 setAttr(elm, 'value', attrs.value); 6760 } 6761 for (key in oldAttrs) { 6762 if (isUndef(attrs[key])) { 6763 if (isXlink(key)) { 6764 elm.removeAttributeNS(xlinkNS, getXlinkProp(key)); 6765 } else if (!isEnumeratedAttr(key)) { 6766 elm.removeAttribute(key); 6767 } 6768 } 6769 } 6770 } 6771 6772 function setAttr (el, key, value, isInPre) { 6773 if (isInPre || el.tagName.indexOf('-') > -1) { 6774 baseSetAttr(el, key, value); 6775 } else if (isBooleanAttr(key)) { 6776 // set attribute for blank value 6777 // e.g. <option disabled>Select one</option> 6778 if (isFalsyAttrValue(value)) { 6779 el.removeAttribute(key); 6780 } else { 6781 // technically allowfullscreen is a boolean attribute for <iframe>, 6782 // but Flash expects a value of "true" when used on <embed> tag 6783 value = key === 'allowfullscreen' && el.tagName === 'EMBED' 6784 ? 'true' 6785 : key; 6786 el.setAttribute(key, value); 6787 } 6788 } else if (isEnumeratedAttr(key)) { 6789 el.setAttribute(key, convertEnumeratedValue(key, value)); 6790 } else if (isXlink(key)) { 6791 if (isFalsyAttrValue(value)) { 6792 el.removeAttributeNS(xlinkNS, getXlinkProp(key)); 6793 } else { 6794 el.setAttributeNS(xlinkNS, key, value); 6795 } 6796 } else { 6797 baseSetAttr(el, key, value); 6798 } 6799 } 6800 6801 function baseSetAttr (el, key, value) { 6802 if (isFalsyAttrValue(value)) { 6803 el.removeAttribute(key); 6804 } else { 6805 // #7138: IE10 & 11 fires input event when setting placeholder on 6806 // <textarea>... block the first input event and remove the blocker 6807 // immediately. 6808 /* istanbul ignore if */ 6809 if ( 6810 isIE && !isIE9 && 6811 el.tagName === 'TEXTAREA' && 6812 key === 'placeholder' && value !== '' && !el.__ieph 6813 ) { 6814 var blocker = function (e) { 6815 e.stopImmediatePropagation(); 6816 el.removeEventListener('input', blocker); 6817 }; 6818 el.addEventListener('input', blocker); 6819 // $flow-disable-line 6820 el.__ieph = true; /* IE placeholder patched */ 6821 } 6822 el.setAttribute(key, value); 6823 } 6824 } 6825 6826 var attrs = { 6827 create: updateAttrs, 6828 update: updateAttrs 6829 }; 6830 6831 /* */ 6832 6833 function updateClass (oldVnode, vnode) { 6834 var el = vnode.elm; 6835 var data = vnode.data; 6836 var oldData = oldVnode.data; 6837 if ( 6838 isUndef(data.staticClass) && 6839 isUndef(data.class) && ( 6840 isUndef(oldData) || ( 6841 isUndef(oldData.staticClass) && 6842 isUndef(oldData.class) 6843 ) 6844 ) 6845 ) { 6846 return 6847 } 6848 6849 var cls = genClassForVnode(vnode); 6850 6851 // handle transition classes 6852 var transitionClass = el._transitionClasses; 6853 if (isDef(transitionClass)) { 6854 cls = concat(cls, stringifyClass(transitionClass)); 6855 } 6856 6857 // set the class 6858 if (cls !== el._prevClass) { 6859 el.setAttribute('class', cls); 6860 el._prevClass = cls; 6861 } 6862 } 6863 6864 var klass = { 6865 create: updateClass, 6866 update: updateClass 6867 }; 6868 6869 /* */ 6870
6871 var validDivisionCharRE = /[\w).+\-_$\]]/; 6872 6873 function parseFilters (exp) { 6874 var inSingle = false; 6875 var inDouble = false; 6876 var inTemplateString = false; 6877 var inRegex = false; 6878 var curly = 0; 6879 var square = 0; 6880 var paren = 0; 6881 var lastFilterIndex = 0; 6882 var c, prev, i, expression, filters; 6883 6884 for (i = 0; i < exp.length; i++) { 6885 prev = c; 6886 c = exp.charCodeAt(i); 6887 if (inSingle) { 6888 if (c === 0x27 && prev !== 0x5C) { inSingle = false; } 6889 } else if (inDouble) { 6890 if (c === 0x22 && prev !== 0x5C) { inDouble = false; } 6891 } else if (inTemplateString) { 6892 if (c === 0x60 && prev !== 0x5C) { inTemplateString = false; } 6893 } else if (inRegex) { 6894 if (c === 0x2f && prev !== 0x5C) { inRegex = false; } 6895 } else if ( 6896 c === 0x7C && // pipe 6897 exp.charCodeAt(i + 1) !== 0x7C && 6898 exp.charCodeAt(i - 1) !== 0x7C && 6899 !curly && !square && !paren 6900 ) { 6901 if (expression === undefined) { 6902 // first filter, end of expression 6903 lastFilterIndex = i + 1; 6904 expression = exp.slice(0, i).trim(); 6905 } else { 6906 pushFilter(); 6907 } 6908 } else { 6909 switch (c) { 6910 case 0x22: inDouble = true; break // " 6911 case 0x27: inSingle = true; break // ' 6912 case 0x60: inTemplateString = true; break // ` 6913 case 0x28: paren++; break // ( 6914 case 0x29: paren--; break // ) 6915 case 0x5B: square++; break // [ 6916 case 0x5D: square--; break // ] 6917 case 0x7B: curly++; break // { 6918 case 0x7D: curly--; break // } 6919 } 6920 if (c === 0x2f) { // / 6921 var j = i - 1; 6922 var p = (void 0); 6923 // find first non-whitespace prev char 6924 for (; j >= 0; j--) { 6925 p = exp.charAt(j); 6926 if (p !== ' ') { break } 6927 } 6928 if (!p || !validDivisionCharRE.test(p)) { 6929 inRegex = true; 6930 } 6931 } 6932 } 6933 } 6934 6935 if (expression === undefined) { 6936 expression = exp.slice(0, i).trim(); 6937 } else if (lastFilterIndex !== 0) { 6938 pushFilter(); 6939 } 6940 6941 function pushFilter () { 6942 (filters || (filters = [])).push(exp.slice(lastFilterIndex, i).trim()); 6943 lastFilterIndex = i + 1; 6944 } 6945 6946 if (filters) { 6947 for (i = 0; i < filters.length; i++) { 6948 expression = wrapFilter(expression, filters[i]); 6949 } 6950 } 6951 6952 return expression 6953 } 6954 6955 function wrapFilter (exp, filter) { 6956 var i = filter.indexOf('('); 6957 if (i < 0) { 6958 // _f: resolveFilter 6959 return ("_f(\"" + filter + "\")(" + exp + ")") 6960 } else { 6961 var name = filter.slice(0, i); 6962 var args = filter.slice(i + 1); 6963 return ("_f(\"" + name + "\")(" + exp + (args !== ')' ? ',' + args : args)) 6964 } 6965 } 6966 6967 /* */ 6968 6969 6970 6971 /* eslint-disable no-unused-vars */ 6972 function baseWarn (msg, range) { 6973 console.error(("[Vue compiler]: " + msg)); 6974 } 6975 /* eslint-enable no-unused-vars */ 6976 6977 function pluckModuleFunction ( 6978 modules, 6979 key 6980 ) { 6981 return modules 6982 ? modules.map(function (m) { return m[key]; }).filter(function (_) { return _; }) 6983 : [] 6984 } 6985 6986 function addProp (el, name, value, range, dynamic) { 6987 (el.props || (el.props = [])).push(rangeSetItem({ name: name, value: value, dynamic: dynamic }, range)); 6988 el.plain = false; 6989 } 6990 6991 function addAttr (el, name, value, range, dynamic) { 6992 var attrs = dynamic 6993 ? (el.dynamicAttrs || (el.dynamicAttrs = [])) 6994 : (el.attrs || (el.attrs = [])); 6995 attrs.push(rangeSetItem({ name: name, value: value, dynamic: dynamic }, range)); 6996 el.plain = false; 6997 } 6998 6999 // add a raw attr (use this in preTransforms) 7000 function addRawAttr (el, name, value, range) { 7001 el.attrsMap[name] = value; 7002 el.attrsList.push(rangeSetItem({ name: name, value: value }, range)); 7003 } 7004 7005 function addDirective ( 7006 el, 7007 name, 7008 rawName, 7009 value, 7010 arg, 7011 isDynamicArg, 7012 modifiers, 7013 range 7014 ) { 7015 (el.directives || (el.directives = [])).push(rangeSetItem({ 7016 name: name, 7017 rawName: rawName, 7018 value: value, 7019 arg: arg, 7020 isDynamicArg: isDynamicArg, 7021 modifiers: modifiers 7022 }, range)); 7023 el.plain = false;
7024 } 7025 7026 function prependModifierMarker (symbol, name, dynamic) { 7027 return dynamic 7028 ? ("_p(" + name + ",\"" + symbol + "\")") 7029 : symbol + name // mark the event as captured 7030 } 7031 7032 function addHandler ( 7033 el, 7034 name, 7035 value, 7036 modifiers, 7037 important, 7038 warn, 7039 range, 7040 dynamic 7041 ) { 7042 modifiers = modifiers || emptyObject; 7043 // warn prevent and passive modifier 7044 /* istanbul ignore if */ 7045 if ( 7046 warn && 7047 modifiers.prevent && modifiers.passive 7048 ) { 7049 warn( 7050 'passive and prevent can\'t be used together. ' + 7051 'Passive handler can\'t prevent default event.', 7052 range 7053 ); 7054 } 7055 7056 // normalize click.right and click.middle since they don't actually fire 7057 // this is technically browser-specific, but at least for now browsers are 7058 // the only target envs that have right/middle clicks. 7059 if (modifiers.right) { 7060 if (dynamic) { 7061 name = "(" + name + ")==='click'?'contextmenu':(" + name + ")"; 7062 } else if (name === 'click') { 7063 name = 'contextmenu'; 7064 delete modifiers.right; 7065 } 7066 } else if (modifiers.middle) { 7067 if (dynamic) { 7068 name = "(" + name + ")==='click'?'mouseup':(" + name + ")"; 7069 } else if (name === 'click') { 7070 name = 'mouseup'; 7071 } 7072 } 7073 7074 // check capture modifier 7075 if (modifiers.capture) { 7076 delete modifiers.capture; 7077 name = prependModifierMarker('!', name, dynamic); 7078 } 7079 if (modifiers.once) { 7080 delete modifiers.once; 7081 name = prependModifierMarker('~', name, dynamic); 7082 } 7083 /* istanbul ignore if */ 7084 if (modifiers.passive) { 7085 delete modifiers.passive; 7086 name = prependModifierMarker('&', name, dynamic); 7087 } 7088 7089 var events; 7090 if (modifiers.native) { 7091 delete modifiers.native; 7092 events = el.nativeEvents || (el.nativeEvents = {}); 7093 } else { 7094 events = el.events || (el.events = {}); 7095 } 7096 7097 var newHandler = rangeSetItem({ value: value.trim(), dynamic: dynamic }, range); 7098 if (modifiers !== emptyObject) { 7099 newHandler.modifiers = modifiers; 7100 } 7101 7102 var handlers = events[name]; 7103 /* istanbul ignore if */ 7104 if (Array.isArray(handlers)) { 7105 important ? handlers.unshift(newHandler) : handlers.push(newHandler); 7106 } else if (handlers) { 7107 events[name] = important ? [newHandler, handlers] : [handlers, newHandler]; 7108 } else { 7109 events[name] = newHandler; 7110 } 7111 7112 el.plain = false; 7113 } 7114 7115 function getRawBindingAttr ( 7116 el, 7117 name 7118 ) { 7119 return el.rawAttrsMap[':' + name] || 7120 el.rawAttrsMap['v-bind:' + name] || 7121 el.rawAttrsMap[name] 7122 } 7123 7124 function getBindingAttr ( 7125 el, 7126 name, 7127 getStatic 7128 ) { 7129 var dynamicValue = 7130 getAndRemoveAttr(el, ':' + name) || 7131 getAndRemoveAttr(el, 'v-bind:' + name); 7132 if (dynamicValue != null) { 7133 return parseFilters(dynamicValue) 7134 } else if (getStatic !== false) { 7135 var staticValue = getAndRemoveAttr(el, name); 7136 if (staticValue != null) { 7137 return JSON.stringify(staticValue) 7138 } 7139 } 7140 } 7141 7142 // note: this only removes the attr from the Array (attrsList) so that it 7143 // doesn't get processed by processAttrs. 7144 // By default it does NOT remove it from the map (attrsMap) because the map is 7145 // needed during codegen. 7146 function getAndRemoveAttr ( 7147 el, 7148 name, 7149 removeFromMap 7150 ) { 7151 var val; 7152 if ((val = el.attrsMap[name]) != null) { 7153 var list = el.attrsList; 7154 for (var i = 0, l = list.length; i < l; i++) { 7155 if (list[i].name === name) { 7156 list.splice(i, 1); 7157 break 7158 } 7159 } 7160 } 7161 if (removeFromMap) { 7162 delete el.attrsMap[name]; 7163 } 7164 return val 7165 } 7166 7167 function getAndRemoveAttrByRegex ( 7168 el, 7169 name 7170 ) { 7171 var list = el.attrsList; 7172 for (var i = 0, l = list.length; i < l; i++) { 7173 var attr = list[i]; 7174 if (name.test(attr.name)) { 7175 list.splice(i, 1); 7176 return attr 7177 } 7178 } 7179 } 7180 7181 function rangeSetItem ( 7182 item, 7183 range 7184 ) { 7185 if (range) { 7186 if (range.start != null) { 7187 item.start = range.start; 7188 } 7189 if (range.end != null) { 7190 item.end = range.end; 7191 } 7192 } 7193 return item 7194 } 7195 7196 /* */ 7197 7198 /** 7199 * Cross-platform code generation for component v-model 7200 */ 7201 function genComponentModel ( 7202 el, 7203 value, 7204 modifiers 7205 ) { 7206 var ref = modifiers || {}; 7207 var number = ref.number; 7208 var trim = ref.trim; 7209 7210 var baseValueExpression = '$$v'; 7211 var valueExpression = baseValueExpression; 7212 if (trim) { 7213 valueExpression = 7214 "(typeof " + baseValueExpression + " === 'string'" + 7215 "? " + baseValueExpression + ".trim()" + 7216 ": " + baseValueExpression + ")"; 7217 } 7218 if (number) { 7219 valueExpression = "_n(" + valueExpression + ")"; 7220 }
7221 var assignment = genAssignmentCode(value, valueExpression); 7222 7223 el.model = { 7224 value: ("(" + value + ")"), 7225 expression: JSON.stringify(value), 7226 callback: ("function (" + baseValueExpression + ") {" + assignment + "}") 7227 }; 7228 } 7229 7230 /** 7231 * Cross-platform codegen helper for generating v-model value assignment code. 7232 */ 7233 function genAssignmentCode ( 7234 value, 7235 assignment 7236 ) { 7237 var res = parseModel(value); 7238 if (res.key === null) { 7239 return (value + "=" + assignment) 7240 } else { 7241 return ("$set(" + (res.exp) + ", " + (res.key) + ", " + assignment + ")") 7242 } 7243 } 7244 7245 /** 7246 * Parse a v-model expression into a base path and a final key segment. 7247 * Handles both dot-path and possible square brackets. 7248 * 7249 * Possible cases: 7250 * 7251 * - test 7252 * - test[key] 7253 * - test[test1[key]] 7254 * - test["a"][key] 7255 * - xxx.test[a[a].test1[key]] 7256 * - test.xxx.a["asa"][test1[key]] 7257 * 7258 */ 7259 7260 var len, str, chr, index$1, expressionPos, expressionEndPos; 7261 7262 7263 7264 function parseModel (val) { 7265 // Fix https://github.com/vuejs/vue/pull/7730 7266 // allow v-model="obj.val " (trailing whitespace) 7267 val = val.trim(); 7268 len = val.length; 7269 7270 if (val.indexOf('[') < 0 || val.lastIndexOf(']') < len - 1) { 7271 index$1 = val.lastIndexOf('.'); 7272 if (index$1 > -1) { 7273 return { 7274 exp: val.slice(0, index$1), 7275 key: '"' + val.slice(index$1 + 1) + '"' 7276 } 7277 } else { 7278 return { 7279 exp: val, 7280 key: null 7281 } 7282 } 7283 } 7284 7285 str = val; 7286 index$1 = expressionPos = expressionEndPos = 0; 7287 7288 while (!eof()) { 7289 chr = next(); 7290 /* istanbul ignore if */ 7291 if (isStringStart(chr)) { 7292 parseString(chr); 7293 } else if (chr === 0x5B) { 7294 parseBracket(chr); 7295 } 7296 } 7297 7298 return { 7299 exp: val.slice(0, expressionPos), 7300 key: val.slice(expressionPos + 1, expressionEndPos) 7301 } 7302 } 7303 7304 function next () { 7305 return str.charCodeAt(++index$1) 7306 } 7307 7308 function eof () { 7309 return index$1 >= len 7310 } 7311 7312 function isStringStart (chr) { 7313 return chr === 0x22 || chr === 0x27 7314 } 7315 7316 function parseBracket (chr) { 7317 var inBracket = 1; 7318 expressionPos = index$1; 7319 while (!eof()) { 7320 chr = next(); 7321 if (isStringStart(chr)) { 7322 parseString(chr); 7323 continue 7324 } 7325 if (chr === 0x5B) { inBracket++; } 7326 if (chr === 0x5D) { inBracket--; } 7327 if (inBracket === 0) { 7328 expressionEndPos = index$1; 7329 break 7330 } 7331 } 7332 } 7333 7334 function parseString (chr) { 7335 var stringQuote = chr; 7336 while (!eof()) { 7337 chr = next(); 7338 if (chr === stringQuote) { 7339 break 7340 } 7341 } 7342 } 7343 7344 /* */ 7345 7346 var warn$1; 7347 7348 // in some cases, the event used has to be determined at runtime 7349 // so we used some reserved tokens during compile. 7350 var RANGE_TOKEN = '__r'; 7351 var CHECKBOX_RADIO_TOKEN = '__c'; 7352 7353 function model ( 7354 el, 7355 dir, 7356 _warn 7357 ) { 7358 warn$1 = _warn; 7359 var value = dir.value; 7360 var modifiers = dir.modifiers; 7361 var tag = el.tag; 7362 var type = el.attrsMap.type; 7363 7364 { 7365 // inputs with type="file" are read only and setting the input's 7366 // value will throw an error. 7367 if (tag === 'input' && type === 'file') { 7368 warn$1( 7369 "<" + (el.tag) + " v-model=\"" + value + "\" type=\"file\">:\n" + 7370 "File inputs are read only. Use a v-on:change listener instead.", 7371 el.rawAttrsMap['v-model'] 7372 ); 7373 } 7374 } 7375 7376 if (el.component) { 7377 genComponentModel(el, value, modifiers); 7378 // component v-model doesn't need extra runtime 7379 return false 7380 } else if (tag === 'select') { 7381 genSelect(el, value, modifiers); 7382 } else if (tag === 'input' && type === 'checkbox') { 7383 genCheckboxModel(el, value, modifiers); 7384 } else if (tag === 'input' && type === 'radio') { 7385 genRadioModel(el, value, modifiers); 7386 } else if (tag === 'input' || tag === 'textarea') { 7387 genDefaultModel(el, value, modifiers); 7388 } else if (!config.isReservedTag(tag)) { 7389 genComponentModel(el, value, modifiers); 7390 // component v-model doesn't need extra runtime 7391 return false 7392 } else { 7393 warn$1( 7394 "<" + (el.tag) + " v-model=\"" + value + "\">: " + 7395 "v-model is not supported on this element type. " + 7396 'If you are working with contenteditable, it\'s recommended to ' + 7397 'wrap a library dedicated for that purpose inside a custom component.', 7398 el.rawAttrsMap['v-model'] 7399 ); 7400 } 7401 7402 // ensure runtime directive metadata 7403 return true 7404 } 7405
7406 function genCheckboxModel ( 7407 el, 7408 value, 7409 modifiers 7410 ) { 7411 var number = modifiers && modifiers.number; 7412 var valueBinding = getBindingAttr(el, 'value') || 'null'; 7413 var trueValueBinding = getBindingAttr(el, 'true-value') || 'true'; 7414 var falseValueBinding = getBindingAttr(el, 'false-value') || 'false'; 7415 addProp(el, 'checked', 7416 "Array.isArray(" + value + ")" + 7417 "?_i(" + value + "," + valueBinding + ")>-1" + ( 7418 trueValueBinding === 'true' 7419 ? (":(" + value + ")") 7420 : (":_q(" + value + "," + trueValueBinding + ")") 7421 ) 7422 ); 7423 addHandler(el, 'change', 7424 "var $$a=" + value + "," + 7425 '$$el=$event.target,' + 7426 "$$c=$$el.checked?(" + trueValueBinding + "):(" + falseValueBinding + ");" + 7427 'if(Array.isArray($$a)){' + 7428 "var $$v=" + (number ? '_n(' + valueBinding + ')' : valueBinding) + "," + 7429 '$$i=_i($$a,$$v);' + 7430 "if($$el.checked){$$i<0&&(" + (genAssignmentCode(value, '$$a.concat([$$v])')) + ")}" + 7431 "else{$$i>-1&&(" + (genAssignmentCode(value, '$$a.slice(0,$$i).concat($$a.slice($$i+1))')) + ")}" + 7432 "}else{" + (genAssignmentCode(value, '$$c')) + "}", 7433 null, true 7434 ); 7435 } 7436 7437 function genRadioModel ( 7438 el, 7439 value, 7440 modifiers 7441 ) { 7442 var number = modifiers && modifiers.number; 7443 var valueBinding = getBindingAttr(el, 'value') || 'null'; 7444 valueBinding = number ? ("_n(" + valueBinding + ")") : valueBinding; 7445 addProp(el, 'checked', ("_q(" + value + "," + valueBinding + ")")); 7446 addHandler(el, 'change', genAssignmentCode(value, valueBinding), null, true); 7447 } 7448 7449 function genSelect ( 7450 el, 7451 value, 7452 modifiers 7453 ) { 7454 var number = modifiers && modifiers.number; 7455 var selectedVal = "Array.prototype.filter" + 7456 ".call($event.target.options,function(o){return o.selected})" + 7457 ".map(function(o){var val = \"_value\" in o ? o._value : o.value;" + 7458 "return " + (number ? '_n(val)' : 'val') + "})"; 7459 7460 var assignment = '$event.target.multiple ? $$selectedVal : $$selectedVal[0]'; 7461 var code = "var $$selectedVal = " + selectedVal + ";"; 7462 code = code + " " + (genAssignmentCode(value, assignment)); 7463 addHandler(el, 'change', code, null, true); 7464 } 7465 7466 function genDefaultModel ( 7467 el, 7468 value, 7469 modifiers 7470 ) { 7471 var type = el.attrsMap.type; 7472 7473 // warn if v-bind:value conflicts with v-model 7474 // except for inputs with v-bind:type 7475 { 7476 var value$1 = el.attrsMap['v-bind:value'] || el.attrsMap[':value']; 7477 var typeBinding = el.attrsMap['v-bind:type'] || el.attrsMap[':type']; 7478 if (value$1 && !typeBinding) { 7479 var binding = el.attrsMap['v-bind:value'] ? 'v-bind:value' : ':value'; 7480 warn$1( 7481 binding + "=\"" + value$1 + "\" conflicts with v-model on the same element " + 7482 'because the latter already expands to a value binding internally', 7483 el.rawAttrsMap[binding] 7484 ); 7485 } 7486 } 7487 7488 var ref = modifiers || {}; 7489 var lazy = ref.lazy; 7490 var number = ref.number; 7491 var trim = ref.trim; 7492 var needCompositionGuard = !lazy && type !== 'range'; 7493 var event = lazy 7494 ? 'change' 7495 : type === 'range' 7496 ? RANGE_TOKEN 7497 : 'input'; 7498 7499 var valueExpression = '$event.target.value'; 7500 if (trim) { 7501 valueExpression = "$event.target.value.trim()"; 7502 } 7503 if (number) { 7504 valueExpression = "_n(" + valueExpression + ")"; 7505 } 7506 7507 var code = genAssignmentCode(value, valueExpression); 7508 if (needCompositionGuard) { 7509 code = "if($event.target.composing)return;" + code; 7510 } 7511 7512 addProp(el, 'value', ("(" + value + ")")); 7513 addHandler(el, event, code, null, true); 7514 if (trim || number) { 7515 addHandler(el, 'blur', '$forceUpdate()'); 7516 } 7517 } 7518 7519 /* */ 7520 7521 // normalize v-model event tokens that can only be determined at runtime. 7522 // it's important to place the event as the first in the array because 7523 // the whole point is ensuring the v-model callback gets called before 7524 // user-attached handlers. 7525 function normalizeEvents (on) { 7526 /* istanbul ignore if */ 7527 if (isDef(on[RANGE_TOKEN])) { 7528 // IE input[type=range] only supports `change` event 7529 var event = isIE ? 'change' : 'input'; 7530 on[event] = [].concat(on[RANGE_TOKEN], on[event] || []); 7531 delete on[RANGE_TOKEN]; 7532 } 7533 // This was originally intended to fix #4521 but no longer necessary 7534 // after 2.5. Keeping it for backwards compat with generated code from < 2.4 7535 /* istanbul ignore if */ 7536 if (isDef(on[CHECKBOX_RADIO_TOKEN])) { 7537 on.change = [].concat(on[CHECKBOX_RADIO_TOKEN], on.change || []); 7538 delete on[CHECKBOX_RADIO_TOKEN]; 7539 } 7540 } 7541 7542 var target$1; 7543 7544 function createOnceHandler$1 (event, handler, capture) { 7545 var _target = target$1; // save current target element in closure 7546 return function onceHandler () { 7547 var res = handler.apply(null, arguments); 7548 if (res !== null) { 7549 remove$2(event, onceHandler, capture, _target); 7550 } 7551 } 7552 } 7553 7554 // #9446: Firefox <= 53 (in particular, ESR 52) has incorrect Event.timeStamp 7555 // implementation and does not fire microtasks in between event propagation, so 7556 // safe to exclude. 7557 var useMicrotaskFix = isUsingMicroTask && !(isFF && Number(isFF[1]) <= 53); 7558 7559 function add$1 ( 7560 name, 7561 handler, 7562 capture, 7563 passive 7564 ) {
7565 // async edge case #6566: inner click event triggers patch, event handler 7566 // attached to outer element during patch, and triggered again. This 7567 // happens because browsers fire microtask ticks between event propagation. 7568 // the solution is simple: we save the timestamp when a handler is attached, 7569 // and the handler would only fire if the event passed to it was fired 7570 // AFTER it was attached. 7571 if (useMicrotaskFix) { 7572 var attachedTimestamp = currentFlushTimestamp; 7573 var original = handler; 7574 handler = original._wrapper = function (e) { 7575 if ( 7576 // no bubbling, should always fire. 7577 // this is just a safety net in case event.timeStamp is unreliable in 7578 // certain weird environments... 7579 e.target === e.currentTarget || 7580 // event is fired after handler attachment 7581 e.timeStamp >= attachedTimestamp || 7582 // bail for environments that have buggy event.timeStamp implementations 7583 // #9462 iOS 9 bug: event.timeStamp is 0 after history.pushState 7584 // #9681 QtWebEngine event.timeStamp is negative value 7585 e.timeStamp <= 0 || 7586 // #9448 bail if event is fired in another document in a multi-page 7587 // electron/nw.js app, since event.timeStamp will be using a different 7588 // starting reference 7589 e.target.ownerDocument !== document 7590 ) { 7591 return original.apply(this, arguments) 7592 } 7593 }; 7594 } 7595 target$1.addEventListener( 7596 name, 7597 handler, 7598 supportsPassive 7599 ? { capture: capture, passive: passive } 7600 : capture 7601 ); 7602 } 7603 7604 function remove$2 ( 7605 name, 7606 handler, 7607 capture, 7608 _target 7609 ) { 7610 (_target || target$1).removeEventListener( 7611 name, 7612 handler._wrapper || handler, 7613 capture 7614 ); 7615 } 7616 7617 function updateDOMListeners (oldVnode, vnode) { 7618 if (isUndef(oldVnode.data.on) && isUndef(vnode.data.on)) { 7619 return 7620 } 7621 var on = vnode.data.on || {}; 7622 var oldOn = oldVnode.data.on || {}; 7623 target$1 = vnode.elm; 7624 normalizeEvents(on); 7625 updateListeners(on, oldOn, add$1, remove$2, createOnceHandler$1, vnode.context); 7626 target$1 = undefined; 7627 } 7628 7629 var events = { 7630 create: updateDOMListeners, 7631 update: updateDOMListeners 7632 }; 7633 7634 /* */ 7635 7636 var svgContainer; 7637 7638 function updateDOMProps (oldVnode, vnode) { 7639 if (isUndef(oldVnode.data.domProps) && isUndef(vnode.data.domProps)) { 7640 return 7641 } 7642 var key, cur; 7643 var elm = vnode.elm; 7644 var oldProps = oldVnode.data.domProps || {}; 7645 var props = vnode.data.domProps || {}; 7646 // clone observed objects, as the user probably wants to mutate it 7647 if (isDef(props.__ob__)) { 7648 props = vnode.data.domProps = extend({}, props); 7649 } 7650 7651 for (key in oldProps) { 7652 if (!(key in props)) { 7653 elm[key] = ''; 7654 } 7655 } 7656 7657 for (key in props) { 7658 cur = props[key]; 7659 // ignore children if the node has textContent or innerHTML, 7660 // as these will throw away existing DOM nodes and cause removal errors 7661 // on subsequent patches (#3360) 7662 if (key === 'textContent' || key === 'innerHTML') { 7663 if (vnode.children) { vnode.children.length = 0; } 7664 if (cur === oldProps[key]) { continue } 7665 // #6601 work around Chrome version <= 55 bug where single textNode 7666 // replaced by innerHTML/textContent retains its parentNode property 7667 if (elm.childNodes.length === 1) { 7668 elm.removeChild(elm.childNodes[0]); 7669 } 7670 } 7671 7672 if (key === 'value' && elm.tagName !== 'PROGRESS') { 7673 // store value as _value as well since 7674 // non-string values will be stringified 7675 elm._value = cur; 7676 // avoid resetting cursor position when value is the same 7677 var strCur = isUndef(cur) ? '' : String(cur); 7678 if (shouldUpdateValue(elm, strCur)) { 7679 elm.value = strCur; 7680 } 7681 } else if (key === 'innerHTML' && isSVG(elm.tagName) && isUndef(elm.innerHTML)) { 7682 // IE doesn't support innerHTML for SVG elements 7683 svgContainer = svgContainer || document.createElement('div'); 7684 svgContainer.innerHTML = "<svg>" + cur + "</svg>"; 7685 var svg = svgContainer.firstChild; 7686 while (elm.firstChild) { 7687 elm.removeChild(elm.firstChild); 7688 } 7689 while (svg.firstChild) { 7690 elm.appendChild(svg.firstChild); 7691 } 7692 } else if ( 7693 // skip the update if old and new VDOM state is the same. 7694 // `value` is handled separately because the DOM value may be temporarily 7695 // out of sync with VDOM state due to focus, composition and modifiers. 7696 // This #4521 by skipping the unnecessary `checked` update. 7697 cur !== oldProps[key] 7698 ) { 7699 // some property updates can throw 7700 // e.g. `value` on <progress> w/ non-finite value 7701 try { 7702 elm[key] = cur; 7703 } catch (e) {} 7704 } 7705 } 7706 } 7707 7708 // check platforms/web/util/attrs.js acceptValue 7709 7710 7711 function shouldUpdateValue (elm, checkVal) { 7712 return (!elm.composing && ( 7713 elm.tagName === 'OPTION' || 7714 isNotInFocusAndDirty(elm, checkVal) || 7715 isDirtyWithModifiers(elm, checkVal) 7716 )) 7717 } 7718 7719 function isNotInFocusAndDirty (elm, checkVal) { 7720 // return true when textbox (.number and .trim) loses focus and its value is 7721 // not equal to the updated value 7722 var notInFocus = true; 7723 // #6157 7724 // work around IE bug when accessing document.activeElement in an iframe 7725 try { notInFocus = document.activeElement !== elm; } catch (e) {} 7726 return notInFocus && elm.value !== checkVal 7727 } 7728 7729 function isDirtyWithModifiers (elm, newVal) { 7730 var value = elm.value; 7731 var modifiers = elm._vModifiers; // injected by v-model runtime 7732 if (isDef(modifiers)) { 7733 if (modifiers.number) { 7734 return toNumber(value) !== toNumber(newVal) 7735 } 7736 if (modifiers.trim) { 7737 return value.trim() !== newVal.trim() 7738 } 7739 } 7740 return value !== newVal 7741 } 7742 7743 var domProps = { 7744 create: updateDOMProps, 7745 update: updateDOMProps 7746 }; 7747 7748 /* */ 7749 7750 var parseStyleText = cached(function (cssText) { 7751 var res = {}; 7752 var listDelimiter = /;(?![^(]*\))/g; 7753 var propertyDelimiter = /:(.+)/; 7754 cssText.split(listDelimiter).forEach(function (item) { 7755 if (item) { 7756 var tmp = item.split(propertyDelimiter); 7757 tmp.length > 1 && (res[tmp[0].trim()] = tmp[1].trim()); 7758 } 7759 }); 7760 return res 7761 }); 7762 7763 // merge static and dynamic style data on the same vnode 7764 function normalizeStyleData (data) { 7765 var style = normalizeStyleBinding(data.style); 7766 // static style is pre-processed into an object during compilation 7767 // and is always a fresh object, so it's safe to merge into
7767it 7768 return data.staticStyle 7769 ? extend(data.staticStyle, style) 7770 : style 7771 } 7772 7773 // normalize possible array / string values into Object 7774 function normalizeStyleBinding (bindingStyle) { 7775 if (Array.isArray(bindingStyle)) { 7776 return toObject(bindingStyle) 7777 } 7778 if (typeof bindingStyle === 'string') { 7779 return parseStyleText(bindingStyle) 7780 } 7781 return bindingStyle 7782 } 7783 7784 /** 7785 * parent component style should be after child's 7786 * so that parent component's style could override it 7787 */ 7788 function getStyle (vnode, checkChild) { 7789 var res = {}; 7790 var styleData; 7791 7792 if (checkChild) { 7793 var childNode = vnode; 7794 while (childNode.componentInstance) { 7795 childNode = childNode.componentInstance._vnode; 7796 if ( 7797 childNode && childNode.data && 7798 (styleData = normalizeStyleData(childNode.data)) 7799 ) { 7800 extend(res, styleData); 7801 } 7802 } 7803 } 7804 7805 if ((styleData = normalizeStyleData(vnode.data))) { 7806 extend(res, styleData); 7807 } 7808 7809 var parentNode = vnode; 7810 while ((parentNode = parentNode.parent)) { 7811 if (parentNode.data && (styleData = normalizeStyleData(parentNode.data))) { 7812 extend(res, styleData); 7813 } 7814 } 7815 return res 7816 } 7817 7818 /* */ 7819 7820 var cssVarRE = /^--/; 7821 var importantRE = /\s*!important$/; 7822 var setProp = function (el, name, val) { 7823 /* istanbul ignore if */ 7824 if (cssVarRE.test(name)) { 7825 el.style.setProperty(name, val); 7826 } else if (importantRE.test(val)) { 7827 el.style.setProperty(hyphenate(name), val.replace(importantRE, ''), 'important'); 7828 } else { 7829 var normalizedName = normalize(name); 7830 if (Array.isArray(val)) { 7831 // Support values array created by autoprefixer, e.g. 7832 // {display: ["-webkit-box", "-ms-flexbox", "flex"]} 7833 // Set them one by one, and the browser will only set those it can recognize 7834 for (var i = 0, len = val.length; i < len; i++) { 7835 el.style[normalizedName] = val[i]; 7836 } 7837 } else { 7838 el.style[normalizedName] = val; 7839 } 7840 } 7841 }; 7842 7843 var vendorNames = ['Webkit', 'Moz', 'ms']; 7844 7845 var emptyStyle; 7846 var normalize = cached(function (prop) { 7847 emptyStyle = emptyStyle || document.createElement('div').style; 7848 prop = camelize(prop); 7849 if (prop !== 'filter' && (prop in emptyStyle)) { 7850 return prop 7851 } 7852 var capName = prop.charAt(0).toUpperCase() + prop.slice(1); 7853 for (var i = 0; i < vendorNames.length; i++) { 7854 var name = vendorNames[i] + capName; 7855 if (name in emptyStyle) { 7856 return name 7857 } 7858 } 7859 }); 7860 7861 function updateStyle (oldVnode, vnode) { 7862 var data = vnode.data; 7863 var oldData = oldVnode.data; 7864 7865 if (isUndef(data.staticStyle) && isUndef(data.style) && 7866 isUndef(oldData.staticStyle) && isUndef(oldData.style) 7867 ) { 7868 return 7869 } 7870 7871 var cur, name; 7872 var el = vnode.elm; 7873 var oldStaticStyle = oldData.staticStyle; 7874 var oldStyleBinding = oldData.normalizedStyle || oldData.style || {}; 7875 7876 // if static style exists, stylebinding already merged into it when doing normalizeStyleData 7877 var oldStyle = oldStaticStyle || oldStyleBinding; 7878 7879 var style = normalizeStyleBinding(vnode.data.style) || {}; 7880 7881 // store normalized style under a different key for next diff 7882 // make sure to clone it if it's reactive, since the user likely wants 7883 // to mutate it. 7884 vnode.data.normalizedStyle = isDef(style.__ob__) 7885 ? extend({}, style) 7886 : style; 7887 7888 var newStyle = getStyle(vnode, true); 7889 7890 for (name in oldStyle) { 7891 if (isUndef(newStyle[name])) { 7892 setProp(el, name, ''); 7893 } 7894 } 7895 for (name in newStyle) { 7896 cur = newStyle[name]; 7897 if (cur !== oldStyle[name]) { 7898 // ie9 setting to null has no effect, must use empty string 7899 setProp(el, name, cur == null ? '' : cur); 7900 } 7901 } 7902 } 7903 7904 var style = { 7905 create: updateStyle, 7906 update: updateStyle 7907 }; 7908 7909 /* */ 7910 7911 var whitespaceRE = /\s+/; 7912 7913 /** 7914 * Add class with compatibility for SVG since classList is not supported on 7915 * SVG elements in IE 7916 */ 7917 function addClass (el, cls) { 7918 /* istanbul ignore if */ 7919 if (!cls || !(cls = cls.trim())) { 7920 return 7921 } 7922 7923 /* istanbul ignore else */ 7924 if (el.classList) { 7925 if (cls.indexOf(' ') > -1) {
7926 cls.split(whitespaceRE).forEach(function (c) { return el.classList.add(c); }); 7927 } else { 7928 el.classList.add(cls); 7929 } 7930 } else { 7931 var cur = " " + (el.getAttribute('class') || '') + " "; 7932 if (cur.indexOf(' ' + cls + ' ') < 0) { 7933 el.setAttribute('class', (cur + cls).trim()); 7934 } 7935 } 7936 } 7937 7938 /** 7939 * Remove class with compatibility for SVG since classList is not supported on 7940 * SVG elements in IE 7941 */ 7942 function removeClass (el, cls) { 7943 /* istanbul ignore if */ 7944 if (!cls || !(cls = cls.trim())) { 7945 return 7946 } 7947 7948 /* istanbul ignore else */ 7949 if (el.classList) { 7950 if (cls.indexOf(' ') > -1) { 7951 cls.split(whitespaceRE).forEach(function (c) { return el.classList.remove(c); }); 7952 } else { 7953 el.classList.remove(cls); 7954 } 7955 if (!el.classList.length) { 7956 el.removeAttribute('class'); 7957 } 7958 } else { 7959 var cur = " " + (el.getAttribute('class') || '') + " "; 7960 var tar = ' ' + cls + ' '; 7961 while (cur.indexOf(tar) >= 0) { 7962 cur = cur.replace(tar, ' '); 7963 } 7964 cur = cur.trim(); 7965 if (cur) { 7966 el.setAttribute('class', cur); 7967 } else { 7968 el.removeAttribute('class'); 7969 } 7970 } 7971 } 7972 7973 /* */ 7974 7975 function resolveTransition (def$$1) { 7976 if (!def$$1) { 7977 return 7978 } 7979 /* istanbul ignore else */ 7980 if (typeof def$$1 === 'object') { 7981 var res = {}; 7982 if (def$$1.css !== false) { 7983 extend(res, autoCssTransition(def$$1.name || 'v')); 7984 } 7985 extend(res, def$$1); 7986 return res 7987 } else if (typeof def$$1 === 'string') { 7988 return autoCssTransition(def$$1) 7989 } 7990 } 7991 7992 var autoCssTransition = cached(function (name) { 7993 return { 7994 enterClass: (name + "-enter"), 7995 enterToClass: (name + "-enter-to"), 7996 enterActiveClass: (name + "-enter-active"), 7997 leaveClass: (name + "-leave"), 7998 leaveToClass: (name + "-leave-to"), 7999 leaveActiveClass: (name + "-leave-active") 8000 } 8001 }); 8002 8003 var hasTransition = inBrowser && !isIE9; 8004 var TRANSITION = 'transition'; 8005 var ANIMATION = 'animation'; 8006 8007 // Transition property/event sniffing 8008 var transitionProp = 'transition'; 8009 var transitionEndEvent = 'transitionend'; 8010 var animationProp = 'animation'; 8011 var animationEndEvent = 'animationend'; 8012 if (hasTransition) { 8013 /* istanbul ignore if */ 8014 if (window.ontransitionend === undefined && 8015 window.onwebkittransitionend !== undefined 8016 ) { 8017 transitionProp = 'WebkitTransition'; 8018 transitionEndEvent = 'webkitTransitionEnd'; 8019 } 8020 if (window.onanimationend === undefined && 8021 window.onwebkitanimationend !== undefined 8022 ) { 8023 animationProp = 'WebkitAnimation'; 8024 animationEndEvent = 'webkitAnimationEnd'; 8025 } 8026 } 8027 8028 // binding to window is necessary to make hot reload work in IE in strict mode 8029 var raf = inBrowser 8030 ? window.requestAnimationFrame 8031 ? window.requestAnimationFrame.bind(window) 8032 : setTimeout 8033 : /* istanbul ignore next */ function (fn) { return fn(); }; 8034 8035 function nextFrame (fn) { 8036 raf(function () { 8037 raf(fn); 8038 }); 8039 } 8040 8041 function addTransitionClass (el, cls) { 8042 var transitionClasses = el._transitionClasses || (el._transitionClasses = []); 8043 if (transitionClasses.indexOf(cls) < 0) { 8044 transitionClasses.push(cls); 8045 addClass(el, cls); 8046 } 8047 } 8048 8049 function removeTransitionClass (el, cls) { 8050 if (el._transitionClasses) { 8051 remove(el._transitionClasses, cls); 8052 } 8053 removeClass(el, cls); 8054 } 8055 8056 function whenTransitionEnds ( 8057 el, 8058 expectedType, 8059 cb 8060 ) { 8061 var ref = getTransitionInfo(el, expectedType); 8062 var type = ref.type; 8063 var timeout = ref.timeout; 8064 var propCount = ref.propCount; 8065 if (!type) { return cb() } 8066 var event = type === TRANSITION ? transitionEndEvent : animationEndEvent; 8067 var ended = 0; 8068 var end = function () { 8069 el.removeEventListener(event, onEnd); 8070 cb(); 8071 }; 8072 var onEnd = function (e) { 8073 if (e.target === el) { 8074 if (++ended >= propCount) { 8075 end(); 8076 } 8077 } 8078 }; 8079 setTimeout(function () { 8080 if (ended < propCount) { 8081 end(); 8082 } 8083 }, timeout + 1); 8084 el.addEventListener(event, onEnd); 8085 } 8086 8087 var transformRE = /\b(transform|all)(,|$)/; 8088 8089 function getTransitionInfo (el, expectedType) { 8090 var styles = window.getComputedStyle(el); 8091 // JSDOM may return undefined for transition properties 8092 var transitionDelays = (styles[transitionProp + 'Delay'] || '').split(', '); 8093 var transitionDurations = (styles[transitionProp + 'Duration'] || '').split(', '); 8094 var transitionTimeout = getTimeout(transitionDelays, transitionDurations); 8095 var animationDelays = (styles[animationProp + 'Delay'] || '').split(', '); 8096 var animationDurations = (styles[animationProp + 'Duration'] || '').split(', '); 8097 var animationTimeout = getTimeout(animationDelays, animationDurations); 8098 8099 var type; 8100 var timeout = 0; 8101 var propCount = 0; 8102 /* istanbul ignore if */ 8103 if (expectedType === TRANSITION) { 8104 if (transitionTimeout > 0) { 8105 type = TRANSITION; 8106 timeout = transitionTimeout; 8107 propCount = transitionDurations.length; 8108 } 8109 } else if (expectedType === ANIMATION) { 8110 if (animationTimeout > 0) { 8111 type = ANIMATION; 8112 timeout = animationTimeout; 8113 propCount = animationDurations.length; 8114 } 8115 } else { 8116 timeout = Math.max(transitionTimeout, animationTimeout); 8117 type = timeout > 0 8118 ? transitionTimeout > animationTimeout 8119 ? TRANSITION 8120 : ANIMATION 8121 : null; 8122 propCount = type 8123 ? type === TRANSITION 8124 ? transitionDurations.length 8125 : animationDurations.length 8126 : 0; 8127 } 8128 var hasTransform = 8129 type === TRANSITION && 8130 transformRE.test(styles[transitionProp + 'Property']); 8131 return { 8132 type: type, 8133 timeout: timeout, 8134 propCount: propCount, 8135 hasTransform: hasTransform 8136 } 8137 } 8138 8139 function getTimeout (delays, durations) { 8140 /* istanbul ignore next */ 8141 while (delays.length < durations.length) { 8142 delays = delays.concat(delays); 8143 } 8144 8145 return Math.max.apply(null, durations.map(function (d, i) { 8146 return toMs(d) + toMs(delays[i]) 8147 })) 8148 } 8149 8150 // Old versions of Chromium (below 61.0.3163.100) formats floating pointer numbers 8151 // in a locale-dependent way, using a comma instead of a dot. 8152 // If comma is not replaced with a dot, the input will be rounded down (i.e. acting 8153 // as a floor function) causing unexpected behaviors 8154 function toMs (s) { 8155 return Number(s.slice(0, -1).replace(',', '.')) * 1000 8156 } 8157 8158 /* */ 8159 8160 function enter (vnode, toggleDisplay) { 8161 var el = vnode.elm; 8162 8163 // call leave callback now 8164 if (isDef(el._leaveCb)) { 8165 el._leaveCb.cancelled = true; 8166 el._leaveCb(); 8167 } 8168 8169 var data = resolveTransition(vnode.data.transition); 8170 if (isUndef(data)) { 8171 return 8172 } 8173 8174 /* istanbul ignore if */ 8175 if (isDef(el._enterCb) || el.nodeType !== 1) { 8176 return 8177 } 8178 8179 var css = data.css; 8180 var type = data.type; 8181 var enterClass = data.enterClass; 8182 var enterToClass = data.enterToClass; 8183 var enterActiveClass = data.enterActiveClass; 8184 var appearClass = data.appearClass; 8185 var appearToClass = data.appearToClass; 8186 var appearActiveClass = data.appearActiveClass; 8187 var beforeEnter = data.beforeEnter; 8188 var enter = data.enter; 8189 var afterEnter = data.afterEnter; 8190 var enterCancelled = data.enterCancelled; 8191 var beforeAppear = data.beforeAppear; 8192 var appear = data.appear; 8193 var afterAppear = data.afterAppear; 8194 var appearCancelled = data.appearCancelled; 8195 var duration = data.duration; 8196 8197 // activeInstance will always be the <transition> component managing this 8198 // transition. One edge case to check is when the <transition> is placed 8199 // as the root node of a child component. In that case we need to check 8200 // <transition>'s parent for appear check. 8201 var context = activeInstance; 8202 var transitionNode = activeInstance.$vnode; 8203 while (transitionNode && transitionNode.parent) { 8204 context = transitionNode.context; 8205 transitionNode = transitionNode.parent; 8206 } 8207 8208 var isAppear = !context._isMounted || !vnode.isRootInsert; 8209 8210 if (isAppear && !appear && appear !== '') { 8211 return 8212 } 8213 8214 var startClass = isAppear && appearClass 8215 ? appearClass 8216 : enterClass; 8217 var activeClass = isAppear && appearActiveClass 8218 ? appearActiveClass 8219 : enterActiveClass; 8220 var toClass = isAppear && appearToClass 8221 ? appearToClass 8222 : enterToClass; 8223 8224 var beforeEnterHook = isAppear 8225 ? (beforeAppear || beforeEnter) 8226 : beforeEnter; 8227 var enterHook = isAppear 8228 ? (typeof appear === 'function' ? appear : enter) 8229 : enter; 8230 var afterEnterHook = isAppear 8231 ? (afterAppear || afterEnter) 8232 : afterEnter; 8233 var enterCancelledHook = isAppear 8234 ? (appearCancelled || enterCancelled) 8235 : enterCancelled; 8236 8237 var explicitEnterDuration = toNumber( 8238 isObject(duration) 8239 ? duration.enter 8240 : duration 8241 ); 8242 8243 if (explicitEnterDuration != null) { 8244 checkDuration(explicitEnterDuration, 'enter', vnode); 8245 } 8246 8247 var expectsCSS = css !== false && !isIE9; 8248 var userWantsControl = getHookArgumentsLength(enterHook); 8249 8250 var cb = el._enterCb = once(function () { 8251 if (expectsCSS) { 8252 removeTransitionClass(el, toClass); 8253 removeTransitionClass(el, activeClass); 8254 } 8255 if (cb.cancelled) { 8256 if (expectsCSS) { 8257 removeTransitionClass(el, startClass); 8258 } 8259 enterCancelledHook && enterCancelledHook(el); 8260 } else { 8261 afterEnterHook && afterEnterHook(el); 8262 } 8263 el._enterCb = null; 8264 }); 8265 8266 if (!vnode.data.show) { 8267 // remove pending leave element on enter by injecting an insert hook 8268 mergeVNodeHook(vnode, 'insert', function () { 8269 var parent = el.parentNode; 8270 var pendingNode = parent && parent._pending && parent._pending[vnode.key]; 8271 if (pendingNode && 8272 pendingNode.tag === vnode.tag && 8273 pendingNode.elm._leaveCb 8274 ) { 8275 pendingNode.elm._leaveCb(); 8276 } 8277 enterHook && enterHook(el, cb); 8278 }); 8279 } 8280 8281 // start enter transition 8282 beforeEnterHook && beforeEnterHook(el); 8283 if (expectsCSS) { 8284 addTransitionClass(el, startClass); 8285 addTransitionClass(el, activeClass); 8286 nextFrame(function () { 8287 removeTransitionClass(el, startClass); 8288 if (!cb.cancelled) { 8289 addTransitionClass(el, toClass); 8290 if (!userWantsControl) { 8291 if (isValidDuration(explicitEnterDuration)) { 8292 setTimeout(cb, explicitEnterDuration); 8293 } else { 8294 whenTransitionEnds(el, type, cb); 8295 } 8296 } 8297 } 8298 }); 8299 } 8300 8301 if (vnode.data.show) { 8302 toggleDisplay && toggleDisplay(); 8303 enterHook && enterHook(el, cb); 8304 } 8305 8306 if (!expectsCSS && !userWantsControl) { 8307 cb(); 8308 } 8309 } 8310 8311 function leave (vnode, rm) { 8312 var el = vnode.elm; 8313 8314 // call enter callback now 8315 if (isDef(el._enterCb)) { 8316 el._enterCb.cancelled = true; 8317 el._enterCb(); 8318 } 8319 8320 var data = resolveTransition(vnode.data.transition); 8321 if (isUndef(data) || el.nodeType !== 1) { 8322 return rm() 8323 } 8324 8325 /* istanbul ignore if */ 8326 if (isDef(el._leaveCb)) { 8327 return 8328 } 8329 8330 var css = data.css; 8331 var type = data.type; 8332 var leaveClass = data.leaveClass; 8333 var leaveToClass = data.leaveToClass; 8334 var leaveActiveClass = data.leaveActiveClass; 8335 var beforeLeave = data.beforeLeave; 8336 var leave = data.leave; 8337 var afterLeave = data.afterLeave; 8338 var leaveCancelled = data.leaveCancelled; 8339 var delayLeave = data.delayLeave; 8340 var duration = data.duration; 8341 8342 var expectsCSS = css !== false && !isIE9; 8343 var userWantsControl = getHookArgumentsLength(leave); 8344 8345 var explicitLeaveDuration = toNumber( 8346 isObject(duration) 8347 ? duration.leave 8348 : duration 8349 ); 8350
8351 if (isDef(explicitLeaveDuration)) { 8352 checkDuration(explicitLeaveDuration, 'leave', vnode); 8353 } 8354 8355 var cb = el._leaveCb = once(function () { 8356 if (el.parentNode && el.parentNode._pending) { 8357 el.parentNode._pending[vnode.key] = null; 8358 } 8359 if (expectsCSS) { 8360 removeTransitionClass(el, leaveToClass); 8361 removeTransitionClass(el, leaveActiveClass); 8362 } 8363 if (cb.cancelled) { 8364 if (expectsCSS) { 8365 removeTransitionClass(el, leaveClass); 8366 } 8367 leaveCancelled && leaveCancelled(el); 8368 } else { 8369 rm(); 8370 afterLeave && afterLeave(el); 8371 } 8372 el._leaveCb = null; 8373 }); 8374 8375 if (delayLeave) { 8376 delayLeave(performLeave); 8377 } else { 8378 performLeave(); 8379 } 8380 8381 function performLeave () { 8382 // the delayed leave may have already been cancelled 8383 if (cb.cancelled) { 8384 return 8385 } 8386 // record leaving element 8387 if (!vnode.data.show && el.parentNode) { 8388 (el.parentNode._pending || (el.parentNode._pending = {}))[(vnode.key)] = vnode; 8389 } 8390 beforeLeave && beforeLeave(el); 8391 if (expectsCSS) { 8392 addTransitionClass(el, leaveClass); 8393 addTransitionClass(el, leaveActiveClass); 8394 nextFrame(function () { 8395 removeTransitionClass(el, leaveClass); 8396 if (!cb.cancelled) { 8397 addTransitionClass(el, leaveToClass); 8398 if (!userWantsControl) { 8399 if (isValidDuration(explicitLeaveDuration)) { 8400 setTimeout(cb, explicitLeaveDuration); 8401 } else { 8402 whenTransitionEnds(el, type, cb); 8403 } 8404 } 8405 } 8406 }); 8407 } 8408 leave && leave(el, cb); 8409 if (!expectsCSS && !userWantsControl) { 8410 cb(); 8411 } 8412 } 8413 } 8414 8415 // only used in dev mode 8416 function checkDuration (val, name, vnode) { 8417 if (typeof val !== 'number') { 8418 warn( 8419 "<transition> explicit " + name + " duration is not a valid number - " + 8420 "got " + (JSON.stringify(val)) + ".", 8421 vnode.context 8422 ); 8423 } else if (isNaN(val)) { 8424 warn( 8425 "<transition> explicit " + name + " duration is NaN - " + 8426 'the duration expression might be incorrect.', 8427 vnode.context 8428 ); 8429 } 8430 } 8431 8432 function isValidDuration (val) { 8433 return typeof val === 'number' && !isNaN(val) 8434 } 8435 8436 /** 8437 * Normalize a transition hook's argument length. The hook may be: 8438 * - a merged hook (invoker) with the original in .fns 8439 * - a wrapped component method (check ._length) 8440 * - a plain function (.length) 8441 */ 8442 function getHookArgumentsLength (fn) { 8443 if (isUndef(fn)) { 8444 return false 8445 } 8446 var invokerFns = fn.fns; 8447 if (isDef(invokerFns)) { 8448 // invoker 8449 return getHookArgumentsLength( 8450 Array.isArray(invokerFns) 8451 ? invokerFns[0] 8452 : invokerFns 8453 ) 8454 } else { 8455 return (fn._length || fn.length) > 1 8456 } 8457 } 8458 8459 function _enter (_, vnode) { 8460 if (vnode.data.show !== true) { 8461 enter(vnode); 8462 } 8463 } 8464 8465 var transition = inBrowser ? { 8466 create: _enter, 8467 activate: _enter, 8468 remove: function remove$$1 (vnode, rm) { 8469 /* istanbul ignore else */ 8470 if (vnode.data.show !== true) { 8471 leave(vnode, rm); 8472 } else { 8473 rm(); 8474 } 8475 } 8476 } : {}; 8477 8478 var platformModules = [ 8479 attrs, 8480 klass, 8481 events, 8482 domProps, 8483 style, 8484 transition 8485 ]; 8486 8487 /* */ 8488 8489 // the directive module should be applied last, after all 8490 // built-in modules have been applied. 8491 var modules = platformModules.concat(baseModules); 8492 8493 var patch = createPatchFunction({ nodeOps: nodeOps, modules: modules }); 8494 8495 /** 8496 * Not type checking this file because flow doesn't like attaching 8497 * properties to Elements. 8498 */ 8499 8500 /* istanbul ignore if */ 8501 if (isIE9) { 8502 // http://www.matts411.com/post/internet-explorer-9-oninput/ 8503 document.addEventListener('selectionchange', function () { 8504 var el = document.activeElement; 8505 if (el && el.vmodel) { 8506 trigger(el, 'input'); 8507 } 8508 }); 8509 } 8510 8511 var directive = { 8512 inserted: function inserted (el, binding, vnode, oldVnode) { 8513 if (vnode.tag === 'select') { 8514 // #6903 8515 if (oldVnode.elm && !oldVnode.elm._vOptions) { 8516 mergeVNodeHook(vnode, 'postpatch', function () { 8517 directive.componentUpdated(el, binding, vnode); 8518 }); 8519 } else { 8520 setSelected(el, binding, vnode.context); 8521 } 8522 el._vOptions = [].map.call(el.options, getValue); 8523 } else if (vnode.tag === 'textarea' || isTextInputType(el.type)) { 8524 el._vModifiers = binding.modifiers; 8525 if (!binding.modifiers.lazy) { 8526 el.addEventListener('compositionstart', onCompositionStart); 8527 el.addEventListener('compositionend', onCompositionEnd); 8528 // Safari < 10.2 & UIWebView doesn't fire compositionend when 8529 // switching focus before confirming composition choice 8530 // this also fixes the issue where some browsers e.g. iOS Chrome 8531 // fires "change" instead of "input" on autocomplete. 8532 el.addEventListener('change', onCompositionEnd); 8533 /* istanbul ignore if */ 8534 if (isIE9) { 8535 el.vmodel = true; 8536 } 8537 } 8538 } 8539 }, 8540 8541 componentUpdated: function componentUpdated (el, binding, vnode) { 8542 if (vnode.tag === 'select') { 8543 setSelected(el, binding, vnode.context); 8544 // in case the options rendered by v-for have changed, 8545 // it's possible that the value is out-of-sync with the rendered options. 8546 // detect such cases and filter out values that no longer has a matching 8547 // option in the DOM. 8548 var prevOptions = el._vOptions; 8549 var curOptions = el._vOptions = [].map.call(el.options, getValue); 8550 if (curOptions.some(function (o, i) { return !looseEqual(o, prevOptions[i]); })) { 8551 // trigger change event if 8552 // no matching option found for at least one value 8553 var needReset = el.multiple 8554 ? binding.value.some(function (v) { return hasNoMatchingOption(v, curOptions); }) 8555 : binding.value !== binding.oldValue && hasNoMatchingOption(binding.value, curOptions); 8556 if (needReset) { 8557 trigger(el, 'change'); 8558 } 8559 } 8560 } 8561 } 8562 }; 8563 8564 function setSelected (el, binding, vm) { 8565 actuallySetSelected(el, binding, vm); 8566 /* istanbul ignore if */ 8567 if (isIE || isEdge) { 8568 setTimeout(function () { 8569 actuallySetSelected(el, binding, vm); 8570 }, 0); 8571 } 8572 } 8573 8574 function actuallySetSelected (el, binding, vm) { 8575 var value = binding.value; 8576 var isMultiple = el.multiple; 8577 if (isMultiple && !Array.isArray(value)) { 8578 warn( 8579 "<select multiple v-model=\"" + (binding.expression) + "\"> " + 8580 "expects an Array value for its binding, but got " + (Object.prototype.toString.call(value).slice(8, -1)), 8581 vm 8582 ); 8583 return 8584 } 8585 var selected, option; 8586 for (var i = 0, l = el.options.length; i < l; i++) { 8587 option = el.options[i]; 8588 if (isMultiple) { 8589 selected = looseIndexOf(value, getValue(option)) > -1; 8590 if (option.selected !== selected) { 8591 option.selected = selected; 8592 } 8593 } else { 8594 if (looseEqual(getValue(option), value)) { 8595 if (el.selectedIndex !== i) { 8596 el.selectedIndex = i; 8597 } 8598 return 8599 } 8600 } 8601 } 8602 if (!isMultiple) { 8603 el.selectedIndex = -1; 8604 } 8605 } 8606 8607 function hasNoMatchingOption (value, options) { 8608 return options.every(function (o) { return !looseEqual(o, value); }) 8609 } 8610 8611 function getValue (option) { 8612 return '_value' in option 8613 ? option._value 8614 : option.value 8615 } 8616 8617 function onCompositionStart (e) { 8618 e.target.composing = true; 8619 } 8620 8621 function onCompositionEnd (e) { 8622 // prevent triggering an input event for no reason 8623 if (!e.target.composing) { return } 8624 e.target.composing = false;
8625 trigger(e.target, 'input'); 8626 } 8627 8628 function trigger (el, type) { 8629 var e = document.createEvent('HTMLEvents'); 8630 e.initEvent(type, true, true); 8631 el.dispatchEvent(e); 8632 } 8633 8634 /* */ 8635 8636 // recursively search for possible transition defined inside the component root 8637 function locateNode (vnode) { 8638 return vnode.componentInstance && (!vnode.data || !vnode.data.transition) 8639 ? locateNode(vnode.componentInstance._vnode) 8640 : vnode 8641 } 8642 8643 var show = { 8644 bind: function bind (el, ref, vnode) { 8645 var value = ref.value; 8646 8647 vnode = locateNode(vnode); 8648 var transition$$1 = vnode.data && vnode.data.transition; 8649 var originalDisplay = el.__vOriginalDisplay = 8650 el.style.display === 'none' ? '' : el.style.display; 8651 if (value && transition$$1) { 8652 vnode.data.show = true; 8653 enter(vnode, function () { 8654 el.style.display = originalDisplay; 8655 }); 8656 } else { 8657 el.style.display = value ? originalDisplay : 'none'; 8658 } 8659 }, 8660 8661 update: function update (el, ref, vnode) { 8662 var value = ref.value; 8663 var oldValue = ref.oldValue; 8664 8665 /* istanbul ignore if */ 8666 if (!value === !oldValue) { return } 8667 vnode = locateNode(vnode); 8668 var transition$$1 = vnode.data && vnode.data.transition; 8669 if (transition$$1) { 8670 vnode.data.show = true; 8671 if (value) { 8672 enter(vnode, function () { 8673 el.style.display = el.__vOriginalDisplay; 8674 }); 8675 } else { 8676 leave(vnode, function () { 8677 el.style.display = 'none'; 8678 }); 8679 } 8680 } else { 8681 el.style.display = value ? el.__vOriginalDisplay : 'none'; 8682 } 8683 }, 8684 8685 unbind: function unbind ( 8686 el, 8687 binding, 8688 vnode, 8689 oldVnode, 8690 isDestroy 8691 ) { 8692 if (!isDestroy) { 8693 el.style.display = el.__vOriginalDisplay; 8694 } 8695 } 8696 }; 8697 8698 var platformDirectives = { 8699 model: directive, 8700 show: show 8701 }; 8702 8703 /* */ 8704 8705 var transitionProps = { 8706 name: String, 8707 appear: Boolean, 8708 css: Boolean, 8709 mode: String, 8710 type: String, 8711 enterClass: String, 8712 leaveClass: String, 8713 enterToClass: String, 8714 leaveToClass: String, 8715 enterActiveClass: String, 8716 leaveActiveClass: String, 8717 appearClass: String, 8718 appearActiveClass: String, 8719 appearToClass: String, 8720 duration: [Number, String, Object] 8721 }; 8722 8723 // in case the child is also an abstract component, e.g. <keep-alive> 8724 // we want to recursively retrieve the real component to be rendered 8725 function getRealChild (vnode) { 8726 var compOptions = vnode && vnode.componentOptions; 8727 if (compOptions && compOptions.Ctor.options.abstract) { 8728 return getRealChild(getFirstComponentChild(compOptions.children)) 8729 } else { 8730 return vnode 8731 } 8732 } 8733 8734 function extractTransitionData (comp) { 8735 var data = {}; 8736 var options = comp.$options; 8737 // props 8738 for (var key in options.propsData) { 8739 data[key] = comp[key]; 8740 } 8741 // events. 8742 // extract listeners and pass them directly to the transition methods 8743 var listeners = options._parentListeners; 8744 for (var key$1 in listeners) { 8745 data[camelize(key$1)] = listeners[key$1]; 8746 } 8747 return data 8748 } 8749 8750 function placeholder (h, rawChild) { 8751 if (/\d-keep-alive$/.test(rawChild.tag)) { 8752 return h('keep-alive', { 8753 props: rawChild.componentOptions.propsData 8754 }) 8755 } 8756 } 8757 8758 function hasParentTransition (vnode) { 8759 while ((vnode = vnode.parent)) { 8760 if (vnode.data.transition) { 8761 return true 8762 } 8763 } 8764 } 8765 8766 function isSameChild (child, oldChild) { 8767 return oldChild.key === child.key && oldChild.tag === child.tag 8768 } 8769 8770 var isNotTextNode = function (c) { return c.tag || isAsyncPlaceholder(c); }; 8771 8772 var isVShowDirective = function (d) { return d.name === 'show'; }; 8773 8774 var Transition = { 8775 name: 'transition', 8776 props: transitionProps, 8777 abstract: true, 8778 8779 render: function render (h) { 8780 var this$1 = this; 8781 8782 var children = this.$slots.default; 8783 if (!children) { 8784 return 8785 } 8786
8787 // filter out text nodes (possible whitespaces) 8788 children = children.filter(isNotTextNode); 8789 /* istanbul ignore if */ 8790 if (!children.length) { 8791 return 8792 } 8793 8794 // warn multiple elements 8795 if (children.length > 1) { 8796 warn( 8797 '<transition> can only be used on a single element. Use ' + 8798 '<transition-group> for lists.', 8799 this.$parent 8800 ); 8801 } 8802 8803 var mode = this.mode; 8804 8805 // warn invalid mode 8806 if (mode && mode !== 'in-out' && mode !== 'out-in' 8807 ) { 8808 warn( 8809 'invalid <transition> mode: ' + mode, 8810 this.$parent 8811 ); 8812 } 8813 8814 var rawChild = children[0]; 8815 8816 // if this is a component root node and the component's 8817 // parent container node also has transition, skip. 8818 if (hasParentTransition(this.$vnode)) { 8819 return rawChild 8820 } 8821 8822 // apply transition data to child 8823 // use getRealChild() to ignore abstract components e.g. keep-alive 8824 var child = getRealChild(rawChild); 8825 /* istanbul ignore if */ 8826 if (!child) { 8827 return rawChild 8828 } 8829 8830 if (this._leaving) { 8831 return placeholder(h, rawChild) 8832 } 8833 8834 // ensure a key that is unique to the vnode type and to this transition 8835 // component instance. This key will be used to remove pending leaving nodes 8836 // during entering. 8837 var id = "__transition-" + (this._uid) + "-"; 8838 child.key = child.key == null 8839 ? child.isComment 8840 ? id + 'comment' 8841 : id + child.tag 8842 : isPrimitive(child.key) 8843 ? (String(child.key).indexOf(id) === 0 ? child.key : id + child.key) 8844 : child.key; 8845 8846 var data = (child.data || (child.data = {})).transition = extractTransitionData(this); 8847 var oldRawChild = this._vnode; 8848 var oldChild = getRealChild(oldRawChild); 8849 8850 // mark v-show 8851 // so that the transition module can hand over the control to the directive 8852 if (child.data.directives && child.data.directives.some(isVShowDirective)) { 8853 child.data.show = true; 8854 } 8855 8856 if ( 8857 oldChild && 8858 oldChild.data && 8859 !isSameChild(child, oldChild) && 8860 !isAsyncPlaceholder(oldChild) && 8861 // #6687 component root is a comment node 8862 !(oldChild.componentInstance && oldChild.componentInstance._vnode.isComment) 8863 ) { 8864 // replace old child transition data with fresh one 8865 // important for dynamic transitions! 8866 var oldData = oldChild.data.transition = extend({}, data); 8867 // handle transition mode 8868 if (mode === 'out-in') { 8869 // return placeholder node and queue update when leave finishes 8870 this._leaving = true; 8871 mergeVNodeHook(oldData, 'afterLeave', function () { 8872 this$1._leaving = false; 8873 this$1.$forceUpdate(); 8874 }); 8875 return placeholder(h, rawChild) 8876 } else if (mode === 'in-out') { 8877 if (isAsyncPlaceholder(child)) { 8878 return oldRawChild 8879 } 8880 var delayedLeave; 8881 var performLeave = function () { delayedLeave(); }; 8882 mergeVNodeHook(data, 'afterEnter', performLeave); 8883 mergeVNodeHook(data, 'enterCancelled', performLeave); 8884 mergeVNodeHook(oldData, 'delayLeave', function (leave) { delayedLeave = leave; }); 8885 } 8886 } 8887 8888 return rawChild 8889 } 8890 }; 8891 8892 /* */ 8893 8894 var props = extend({ 8895 tag: String, 8896 moveClass: String 8897 }, transitionProps); 8898 8899 delete props.mode; 8900 8901 var TransitionGroup = { 8902 props: props, 8903 8904 beforeMount: function beforeMount () { 8905 var this$1 = this; 8906 8907 var update = this._update; 8908 this._update = function (vnode, hydrating) { 8909 var restoreActiveInstance = setActiveInstance(this$1); 8910 // force removing pass 8911 this$1.__patch__( 8912 this$1._vnode, 8913 this$1.kept, 8914 false, // hydrating 8915 true // removeOnly (!important, avoids unnecessary moves) 8916 ); 8917 this$1._vnode = this$1.kept; 8918 restoreActiveInstance(); 8919 update.call(this$1, vnode, hydrating); 8920 }; 8921 }, 8922 8923 render: function render (h) { 8924 var tag = this.tag || this.$vnode.data.tag || 'span'; 8925 var map = Object.create(null); 8926 var prevChildren = this.prevChildren = this.children; 8927 var rawChildren = this.$slots.default || []; 8928 var children = this.children = []; 8929 var transitionData = extractTransitionData(this); 8930 8931 for (var i = 0; i < rawChildren.length; i++) { 8932 var c = rawChildren[i]; 8933 if (c.tag) { 8934 if (c.key != null && String(c.key).indexOf('__vlist') !== 0) { 8935 children.push(c); 8936 map[c.key] = c 8937 ;(c.data || (c.data = {})).transition = transitionData; 8938 } else {
8939 var opts = c.componentOptions; 8940 var name = opts ? (opts.Ctor.options.name || opts.tag || '') : c.tag; 8941 warn(("<transition-group> children must be keyed: <" + name + ">")); 8942 } 8943 } 8944 } 8945 8946 if (prevChildren) { 8947 var kept = []; 8948 var removed = []; 8949 for (var i$1 = 0; i$1 < prevChildren.length; i$1++) { 8950 var c$1 = prevChildren[i$1]; 8951 c$1.data.transition = transitionData; 8952 c$1.data.pos = c$1.elm.getBoundingClientRect(); 8953 if (map[c$1.key]) { 8954 kept.push(c$1); 8955 } else { 8956 removed.push(c$1); 8957 } 8958 } 8959 this.kept = h(tag, null, kept); 8960 this.removed = removed; 8961 } 8962 8963 return h(tag, null, children) 8964 }, 8965 8966 updated: function updated () { 8967 var children = this.prevChildren; 8968 var moveClass = this.moveClass || ((this.name || 'v') + '-move'); 8969 if (!children.length || !this.hasMove(children[0].elm, moveClass)) { 8970 return 8971 } 8972 8973 // we divide the work into three loops to avoid mixing DOM reads and writes 8974 // in each iteration - which helps prevent layout thrashing. 8975 children.forEach(callPendingCbs); 8976 children.forEach(recordPosition); 8977 children.forEach(applyTranslation); 8978 8979 // force reflow to put everything in position 8980 // assign to this to avoid being removed in tree-shaking 8981 // $flow-disable-line 8982 this._reflow = document.body.offsetHeight; 8983 8984 children.forEach(function (c) { 8985 if (c.data.moved) { 8986 var el = c.elm; 8987 var s = el.style; 8988 addTransitionClass(el, moveClass); 8989 s.transform = s.WebkitTransform = s.transitionDuration = ''; 8990 el.addEventListener(transitionEndEvent, el._moveCb = function cb (e) { 8991 if (e && e.target !== el) { 8992 return 8993 } 8994 if (!e || /transform$/.test(e.propertyName)) { 8995 el.removeEventListener(transitionEndEvent, cb); 8996 el._moveCb = null; 8997 removeTransitionClass(el, moveClass); 8998 } 8999 }); 9000 } 9001 }); 9002 }, 9003 9004 methods: { 9005 hasMove: function hasMove (el, moveClass) { 9006 /* istanbul ignore if */ 9007 if (!hasTransition) { 9008 return false 9009 } 9010 /* istanbul ignore if */ 9011 if (this._hasMove) { 9012 return this._hasMove 9013 } 9014 // Detect whether an element with the move class applied has 9015 // CSS transitions. Since the element may be inside an entering 9016 // transition at this very moment, we make a clone of it and remove 9017 // all other transition classes applied to ensure only the move class 9018 // is applied. 9019 var clone = el.cloneNode(); 9020 if (el._transitionClasses) { 9021 el._transitionClasses.forEach(function (cls) { removeClass(clone, cls); }); 9022 } 9023 addClass(clone, moveClass); 9024 clone.style.display = 'none'; 9025 this.$el.appendChild(clone); 9026 var info = getTransitionInfo(clone); 9027 this.$el.removeChild(clone); 9028 return (this._hasMove = info.hasTransform) 9029 } 9030 } 9031 }; 9032 9033 function callPendingCbs (c) { 9034 /* istanbul ignore if */ 9035 if (c.elm._moveCb) { 9036 c.elm._moveCb(); 9037 } 9038 /* istanbul ignore if */ 9039 if (c.elm._enterCb) { 9040 c.elm._enterCb(); 9041 } 9042 } 9043 9044 function recordPosition (c) { 9045 c.data.newPos = c.elm.getBoundingClientRect(); 9046 } 9047 9048 function applyTranslation (c) { 9049 var oldPos = c.data.pos; 9050 var newPos = c.data.newPos; 9051 var dx = oldPos.left - newPos.left; 9052 var dy = oldPos.top - newPos.top; 9053 if (dx || dy) { 9054 c.data.moved = true; 9055 var s = c.elm.style; 9056 s.transform = s.WebkitTransform = "translate(" + dx + "px," + dy + "px)"; 9057 s.transitionDuration = '0s'; 9058 } 9059 } 9060 9061 var platformComponents = { 9062 Transition: Transition, 9063 TransitionGroup: TransitionGroup 9064 }; 9065 9066 /* */ 9067 9068 // install platform specific utils 9069 Vue.config.mustUseProp = mustUseProp; 9070 Vue.config.isReservedTag = isReservedTag; 9071 Vue.config.isReservedAttr = isReservedAttr; 9072 Vue.config.getTagNamespace = getTagNamespace; 9073 Vue.config.isUnknownElement = isUnknownElement; 9074 9075 // install platform runtime directives & components 9076 extend(Vue.options.directives, platformDirectives); 9077 extend(Vue.options.components, platformComponents); 9078 9079 // install platform patch function 9080 Vue.prototype.__patch__ = inBrowser ? patch : noop; 9081 9082 // public mount method 9083 Vue.prototype.$mount = function ( 9084 el, 9085 hydrating 9086 ) { 9087 el = el && inBrowser ? query(el) : undefined; 9088 return mountComponent(this, el, hydrating) 9089 }; 9090 9091 // devtools global hook 9092 /* istanbul ignore next */ 9093 if (inBrowser) { 9094 setTimeout(function () { 9095 if (config.devtools) { 9096 if (devtools) { 9097 devtools.emit('init', Vue); 9098 } else { 9099 console[console.info ? 'info' : 'log']( 9100 'Download the Vue Devtools extension for a better development experience:\n' + 9101 'https://github.com/vuejs/vue-devtools' 9102 ); 9103 } 9104 } 9105 if (config.productionTip !== false && 9106 typeof console !== 'undefined' 9107 ) { 9108 console[console.info ? 'info' : 'log']( 9109 "You are running Vue in development mode.\n" + 9110 "Make sure to turn on production mode when deploying for production.\n" + 9111 "See more tips at https://vuejs.org/guide/deployment.html" 9112 ); 9113 } 9114 }, 0); 9115 } 9116 9117 /* */ 9118 9119 var defaultTagRE = /\{\{((?:.|\r?\n)+?)\}\}/g; 9120 var regexEscapeRE = /[-.*+?^${}()|[\]\/\\]/g; 9121 9122 var buildRegex = cached(function (delimiters) { 9123 var open = delimiters[0].replace(regexEscapeRE, '\\$&'); 9124 var close = delimiters[1].replace(regexEscapeRE, '\\$&'); 9125 return new RegExp(open + '((?:.|\\n)+?)' + close, 'g') 9126 }); 9127 9128 9129 9130 function parseText ( 9131 text, 9132 delimiters 9133 ) { 9134 var tagRE = delimiters ? buildRegex(delimiters) : defaultTagRE; 9135 if (!tagRE.test(text)) { 9136 return 9137 } 9138 var tokens = []; 9139 var rawTokens = []; 9140 var lastIndex = tagRE.lastIndex = 0; 9141 var match, index, tokenValue; 9142 while ((match = tagRE.exec(text))) { 9143 index = match.index; 9144 // push text token 9145 if (index > lastIndex) { 9146 rawTokens.push(tokenValue = text.slice(lastIndex, index)); 9147 tokens.push(JSON.stringify(tokenValue)); 9148 } 9149 // tag token 9150 var exp = parseFilters(match[1].trim()); 9151 tokens.push(("_s(" + exp + ")")); 9152 rawTokens.push({ '@binding': exp }); 9153 lastIndex = index + match[0].length; 9154 } 9155 if (lastIndex < text.length) { 9156 rawTokens.push(tokenValue = text.slice(lastIndex)); 9157 tokens.push(JSON.stringify(tokenValue)); 9158 } 9159 return { 9160 expression: tokens.join('+'), 9161 tokens: rawTokens 9162 } 9163 } 9164 9165 /* */ 9166 9167 function transformNode (el, options) { 9168 var warn = options.warn || baseWarn; 9169 var staticClass = getAndRemoveAttr(el, 'class'); 9170 if (staticClass) { 9171 var res = parseText(staticClass, options.delimiters); 9172 if (res) { 9173 warn( 9174 "class=\"" + staticClass + "\": " + 9175 'Interpolation inside attributes has been removed. ' + 9176 'Use v-bind or the colon shorthand instead. For example, ' + 9177 'instead of <div class="{{ val }}">, use <div :class="val">.', 9178 el.rawAttrsMap['class'] 9179 ); 9180 } 9181 } 9182 if (staticClass) { 9183 el.staticClass = JSON.stringify(staticClass); 9184 } 9185 var classBinding = getBindingAttr(el, 'class', false /* getStatic */); 9186 if (classBinding) { 9187 el.classBinding = classBinding; 9188 } 9189 } 9190 9191 function genData (el) { 9192 var data = ''; 9193 if (el.staticClass) { 9194 data += "staticClass:" + (el.staticClass) + ","; 9195 } 9196 if (el.classBinding) { 9197 data += "class:" + (el.classBinding) + ","; 9198 } 9199 return data 9200 } 9201 9202 var klass$1 = { 9203 staticKeys: ['staticClass'], 9204 transformNode: transformNode, 9205 genData: genData 9206 }; 9207 9208 /* */ 9209 9210 function transformNode$1 (el, options) { 9211 var warn = options.warn || baseWarn; 9212 var staticStyle = getAndRemoveAttr(el, 'style'); 9213 if (staticStyle) { 9214 /* istanbul ignore if */ 9215 { 9216 var res = parseText(staticStyle, options.delimiters); 9217 if (res) { 9218 warn( 9219 "style=\"" + staticStyle + "\": " + 9220 'Interpolation inside attributes has been removed. ' + 9221 'Use v-bind or the colon shorthand instead. For example, ' + 9222 'instead of <div style="{{ val }}">, use <div :style="val">.', 9223 el.rawAttrsMap['style'] 9224 ); 9225 } 9226 } 9227 el.staticStyle = JSON.stringify(parseStyleText(staticStyle)); 9228 } 9229 9230 var styleBinding = getBindingAttr(el, 'style', false /* getStatic */); 9231 if (styleBinding) { 9232 el.styleBinding = styleBinding; 9233 } 9234 } 9235 9236 function genData$1 (el) { 9237 var data = ''; 9238 if (el.staticStyle) { 9239 data += "staticStyle:" + (el.staticStyle) + ","; 9240 } 9241 if (el.styleBinding) { 9242 data += "style:(" + (el.styleBinding) + "),"; 9243 } 9244 return data 9245 } 9246 9247 var style$1 = { 9248 staticKeys: ['staticStyle'], 9249 transformNode: transformNode$1, 9250 genData: genData$1 9251 }; 9252 9253 /* */ 9254 9255 var decoder; 9256 9257 var he = { 9258 decode: function decode (html) { 9259 decoder = decoder || document.createElement('div'); 9260 decoder.innerHTML = html; 9261 return decoder.textContent 9262 } 9263 }; 9264 9265 /* */ 9266 9267 var isUnaryTag = makeMap( 9268 'area,base,br,col,embed,frame,hr,img,input,isindex,keygen,' + 9269 'link,meta,param,source,track,wbr' 9270 ); 9271 9272 // Elements that you can, intentionally, leave open 9273 // (and which close themselves) 9274 var canBeLeftOpenTag = makeMap( 9275 'colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source' 9276 ); 9277 9278 // HTML5 tags https://html.spec.whatwg.org/multipage/indices.html#elements-3 9279 // Phrasing Content https://html.spec.whatwg.org/multipage/dom.html#phrasing-content 9280 var isNonPhrasingTag = makeMap( 9281 'address,article,aside,base,blockquote,body,caption,col,colgroup,dd,' + 9282 'details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,' + 9283 'h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,' + 9284 'optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,' + 9285 'title,tr,track' 9286 ); 9287 9288 /** 9289 * Not type-checking this file because it's mostly vendor code. 9290 */ 9291 9292 // Regular Expressions for parsing tags and attributes 9293 var attribute = /^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/; 9294 var dynamicArgAttribute = /^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+?\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/; 9295 var ncname = "[a-zA-Z_][\\-\\.0-9_a-zA-Z" + (unicodeRegExp.source) + "]*"; 9296 var qnameCapture = "((?:" + ncname + "\\:)?" + ncname + ")"; 9297 var startTagOpen = new RegExp(("^<" + qnameCapture)); 9298 var startTagClose = /^\s*(\/?)>/; 9299 var endTag = new RegExp(("^<\\/" + qnameCapture + "[^>]*>")); 9300 var doctype = /^<!DOCTYPE [^>]+>/i; 9301 // #7298: escape - to avoid being passed as HTML comment when inlined in page 9302 var comment = /^<!\--/; 9303 var conditionalComment = /^<!\[/; 9304 9305 // Special Elements (can contain anything) 9306 var isPlainTextElement = makeMap('script,style,textarea', true); 9307 var reCache = {}; 9308 9309 var decodingMap = { 9310 '<': '<', 9311 '>': '>', 9312 '"': '"', 9313 '&': '&', 9314 ' ': '\n', 9315 '	': '\t', 9316 ''': "'" 9317 }; 9318 var encodedAttr = /&(?:lt|gt|quot|amp|#39);/g; 9319 var encodedAttrWithNewLines = /&(?:lt|gt|quot|amp|#39|#10|#9);/g; 9320 9321 // #5992 9322 var isIgnoreNewlineTag = makeMap('pre,textarea', true); 9323 var shouldIgnoreFirstNewline = function (tag, html) { return tag && isIgnoreNewlineTag(tag) && html[0] === '\n'; }; 9324 9325 function decodeAttr (value, shouldDecodeNewlines) { 9326 var re = shouldDecodeNewlines ? encodedAttrWithNewLines : encodedAttr; 9327 return value.replace(re, function (match) { return decodingMap[match]; }) 9328 } 9329 9330 function parseHTML (html, options) { 9331 var stack = [];
9332 var expectHTML = options.expectHTML; 9333 var isUnaryTag$$1 = options.isUnaryTag || no; 9334 var canBeLeftOpenTag$$1 = options.canBeLeftOpenTag || no; 9335 var index = 0; 9336 var last, lastTag; 9337 while (html) { 9338 last = html; 9339 // Make sure we're not in a plaintext content element like script/style 9340 if (!lastTag || !isPlainTextElement(lastTag)) { 9341 var textEnd = html.indexOf('<'); 9342 if (textEnd === 0) { 9343 // Comment: 9344 if (comment.test(html)) { 9345 var commentEnd = html.indexOf('-->'); 9346 9347 if (commentEnd >= 0) { 9348 if (options.shouldKeepComment) { 9349 options.comment(html.substring(4, commentEnd), index, index + commentEnd + 3); 9350 } 9351 advance(commentEnd + 3); 9352 continue 9353 } 9354 } 9355 9356 // http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-revealed_conditional_comment 9357 if (conditionalComment.test(html)) { 9358 var conditionalEnd = html.indexOf(']>'); 9359 9360 if (conditionalEnd >= 0) { 9361 advance(conditionalEnd + 2); 9362 continue 9363 } 9364 } 9365 9366 // Doctype: 9367 var doctypeMatch = html.match(doctype); 9368 if (doctypeMatch) { 9369 advance(doctypeMatch[0].length); 9370 continue 9371 } 9372 9373 // End tag: 9374 var endTagMatch = html.match(endTag); 9375 if (endTagMatch) { 9376 var curIndex = index; 9377 advance(endTagMatch[0].length); 9378 parseEndTag(endTagMatch[1], curIndex, index); 9379 continue 9380 } 9381 9382 // Start tag: 9383 var startTagMatch = parseStartTag(); 9384 if (startTagMatch) { 9385 handleStartTag(startTagMatch); 9386 if (shouldIgnoreFirstNewline(startTagMatch.tagName, html)) { 9387 advance(1); 9388 } 9389 continue 9390 } 9391 } 9392 9393 var text = (void 0), rest = (void 0), next = (void 0); 9394 if (textEnd >= 0) { 9395 rest = html.slice(textEnd); 9396 while ( 9397 !endTag.test(rest) && 9398 !startTagOpen.test(rest) && 9399 !comment.test(rest) && 9400 !conditionalComment.test(rest) 9401 ) { 9402 // < in plain text, be forgiving and treat it as text 9403 next = rest.indexOf('<', 1); 9404 if (next < 0) { break } 9405 textEnd += next; 9406 rest = html.slice(textEnd); 9407 } 9408 text = html.substring(0, textEnd); 9409 } 9410 9411 if (textEnd < 0) { 9412 text = html; 9413 } 9414 9415 if (text) { 9416 advance(text.length); 9417 } 9418 9419 if (options.chars && text) { 9420 options.chars(text, index - text.length, index); 9421 } 9422 } else { 9423 var endTagLength = 0; 9424 var stackedTag = lastTag.toLowerCase(); 9425 var reStackedTag = reCache[stackedTag] || (reCache[stackedTag] = new RegExp('([\\s\\S]*?)(</' + stackedTag + '[^>]*>)', 'i')); 9426 var rest$1 = html.replace(reStackedTag, function (all, text, endTag) { 9427 endTagLength = endTag.length; 9428 if (!isPlainTextElement(stackedTag) && stackedTag !== 'noscript') { 9429 text = text 9430 .replace(/<!\--([\s\S]*?)-->/g, '$1') // #7298 9431 .replace(/<!\[CDATA\[([\s\S]*?)]]>/g, '$1'); 9432 } 9433 if (shouldIgnoreFirstNewline(stackedTag, text)) { 9434 text = text.slice(1); 9435 } 9436 if (options.chars) { 9437 options.chars(text); 9438 } 9439 return '' 9440 }); 9441 index += html.length - rest$1.length; 9442 html = rest$1; 9443 parseEndTag(stackedTag, index - endTagLength, index); 9444 } 9445 9446 if (html === last) { 9447 options.chars && options.chars(html); 9448 if (!stack.length && options.warn) { 9449 options.warn(("Mal-formatted tag at end of template: \"" + html + "\""), { start: index + html.length }); 9450 } 9451 break 9452 } 9453 } 9454 9455 // Clean up any remaining tags 9456 parseEndTag(); 9457 9458 function advance (n) { 9459 index += n; 9460 html = html.substring(n); 9461 } 9462 9463 function parseStartTag () { 9464 var start = html.match(startTagOpen); 9465 if (start) { 9466 var match = { 9467 tagName: start[1], 9468 attrs: [], 9469 start: index 9470 }; 9471 advance(start[0].length); 9472 var end, attr; 9473 while (!(end = html.match(startTagClose)) && (attr = html.match(dynamicArgAttribute) || html.match(attribute))) { 9474 attr.start = index; 9475 advance(attr[0].length); 9476 attr.end = index; 9477 match.attrs.push(attr); 9478 } 9479 if (end) { 9480 match.unarySlash = end[1]; 9481 advance(end[0].length); 9482 match.end = index; 9483 return match 9484 } 9485 } 9486 } 9487 9488 function handleStartTag (match) { 9489 var tagName = match.tagName; 9490 var unarySlash = match.unarySlash; 9491 9492 if (expectHTML) { 9493 if (lastTag === 'p' && isNonPhrasingTag(tagName)) { 9494 parseEndTag(lastTag); 9495 } 9496 if (canBeLeftOpenTag$$1(tagName) && lastTag === tagName) { 9497 parseEndTag(tagName); 9498 } 9499 } 9500 9501 var unary = isUnaryTag$$1(tagName) || !!unarySlash; 9502 9503 var l = match.attrs.length; 9504 var attrs = new Array(l); 9505 for (var i = 0; i < l; i++) { 9506 var args = match.attrs[i]; 9507 var value = args[3] || args[4] || args[5] || ''; 9508 var shouldDecodeNewlines = tagName === 'a' && args[1] === 'href' 9509 ? options.shouldDecodeNewlinesForHref 9510 : options.shouldDecodeNewlines; 9511 attrs[i] = { 9512 name: args[1], 9513 value: decodeAttr(value, shouldDecodeNewlines) 9514 }; 9515 if (options.outputSourceRange) { 9516 attrs[i].start = args.start + args[0].match(/^\s*/).length; 9517 attrs[i].end = args.end; 9518 } 9519 } 9520 9521 if (!unary) { 9522 stack.push({ tag: tagName, lowerCasedTag: tagName.toLowerCase(), attrs: attrs, start: match.start, end: match.end }); 9523 lastTag = tagName; 9524 } 9525 9526 if (options.start) { 9527 options.start(tagName, attrs, unary, match.start, match.end); 9528 } 9529 } 9530 9531 function parseEndTag (tagName, start, end) { 9532 var pos, lowerCasedTagName; 9533 if (start == null) { start = index; } 9534 if (end == null) { end = index; } 9535 9536 // Find the closest opened tag of the same type 9537 if (tagName) { 9538 lowerCasedTagName = tagName.toLowerCase(); 9539 for (pos = stack.length - 1; pos >= 0; pos--) { 9540 if (stack[pos].lowerCasedTag === lowerCasedTagName) { 9541 break 9542 } 9543 } 9544 } else { 9545 // If no tag name is provided, clean shop 9546 pos = 0; 9547 } 9548 9549 if (pos >= 0) { 9550 // Close all the open elements, up the stack 9551 for (var i = stack.length - 1; i >= pos; i--) { 9552 if (i > pos || !tagName && 9553 options.warn 9554 ) { 9555 options.warn( 9556 ("tag <" + (stack[i].tag) + "> has no matching end tag."), 9557 { start: stack[i].start, end: stack[i].end } 9558 ); 9559 } 9560 if (options.end) { 9561 options.end(stack[i].tag, start, end); 9562 } 9563 } 9564 9565 // Remove the open elements from the stack 9566 stack.length = pos; 9567 lastTag = pos && stack[pos - 1].tag; 9568 } else if (lowerCasedTagName === 'br') { 9569 if (options.start) { 9570 options.start(tagName, [], true, start, end); 9571 } 9572 } else if (lowerCasedTagName === 'p') { 9573 if (options.start) { 9574 options.start(tagName, [], false, start, end); 9575 } 9576 if (options.end) { 9577 options.end(tagName, start, end); 9578 } 9579 } 9580 } 9581 } 9582 9583 /* */ 9584 9585 var onRE = /^@|^v-on:/; 9586 var dirRE = /^v-|^@|^:|^#/; 9587 var forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/; 9588 var forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/; 9589 var stripParensRE = /^\(|\)$/g; 9590 var dynamicArgRE = /^\[.*\]$/; 9591 9592 var argRE = /:(.*)$/; 9593 var bindRE = /^:|^\.|^v-bind:/; 9594 var modifierRE = /\.[^.\]]+(?=[^\]]*$)/g; 9595 9596 var slotRE = /^v-slot(:|$)|^#/; 9597 9598 var lineBreakRE = /[\r\n]/; 9599 var whitespaceRE$1 = /[ \f\t\r\n]+/g; 9600 9601 var invalidAttributeRE = /[\s"'<>\/=]/; 9602
9603 var decodeHTMLCached = cached(he.decode); 9604 9605 var emptySlotScopeToken = "_empty_"; 9606 9607 // configurable state 9608 var warn$2; 9609 var delimiters; 9610 var transforms; 9611 var preTransforms; 9612 var postTransforms; 9613 var platformIsPreTag; 9614 var platformMustUseProp; 9615 var platformGetTagNamespace; 9616 var maybeComponent; 9617 9618 function createASTElement ( 9619 tag, 9620 attrs, 9621 parent 9622 ) { 9623 return { 9624 type: 1, 9625 tag: tag, 9626 attrsList: attrs, 9627 attrsMap: makeAttrsMap(attrs), 9628 rawAttrsMap: {}, 9629 parent: parent, 9630 children: [] 9631 } 9632 } 9633 9634 /** 9635 * Convert HTML string to AST. 9636 */ 9637 function parse ( 9638 template, 9639 options 9640 ) { 9641 warn$2 = options.warn || baseWarn; 9642 9643 platformIsPreTag = options.isPreTag || no; 9644 platformMustUseProp = options.mustUseProp || no; 9645 platformGetTagNamespace = options.getTagNamespace || no; 9646 var isReservedTag = options.isReservedTag || no; 9647 maybeComponent = function (el) { return !!( 9648 el.component || 9649 el.attrsMap[':is'] || 9650 el.attrsMap['v-bind:is'] || 9651 !(el.attrsMap.is ? isReservedTag(el.attrsMap.is) : isReservedTag(el.tag)) 9652 ); }; 9653 transforms = pluckModuleFunction(options.modules, 'transformNode'); 9654 preTransforms = pluckModuleFunction(options.modules, 'preTransformNode'); 9655 postTransforms = pluckModuleFunction(options.modules, 'postTransformNode'); 9656 9657 delimiters = options.delimiters; 9658 9659 var stack = []; 9660 var preserveWhitespace = options.preserveWhitespace !== false; 9661 var whitespaceOption = options.whitespace; 9662 var root; 9663 var currentParent; 9664 var inVPre = false; 9665 var inPre = false; 9666 var warned = false; 9667 9668 function warnOnce (msg, range) { 9669 if (!warned) { 9670 warned = true; 9671 warn$2(msg, range); 9672 } 9673 } 9674 9675 function closeElement (element) { 9676 trimEndingWhitespace(element); 9677 if (!inVPre && !element.processed) { 9678 element = processElement(element, options); 9679 } 9680 // tree management 9681 if (!stack.length && element !== root) { 9682 // allow root elements with v-if, v-else-if and v-else 9683 if (root.if && (element.elseif || element.else)) { 9684 { 9685 checkRootConstraints(element); 9686 } 9687 addIfCondition(root, { 9688 exp: element.elseif, 9689 block: element 9690 }); 9691 } else { 9692 warnOnce( 9693 "Component template should contain exactly one root element. " + 9694 "If you are using v-if on multiple elements, " + 9695 "use v-else-if to chain them instead.", 9696 { start: element.start } 9697 ); 9698 } 9699 } 9700 if (currentParent && !element.forbidden) { 9701 if (element.elseif || element.else) { 9702 processIfConditions(element, currentParent); 9703 } else { 9704 if (element.slotScope) { 9705 // scoped slot 9706 // keep it in the children list so that v-else(-if) conditions can 9707 // find it as the prev node. 9708 var name = element.slotTarget || '"default"' 9709 ;(currentParent.scopedSlots || (currentParent.scopedSlots = {}))[name] = element; 9710 } 9711 currentParent.children.push(element); 9712 element.parent = currentParent; 9713 } 9714 } 9715 9716 // final children cleanup 9717 // filter out scoped slots 9718 element.children = element.children.filter(function (c) { return !(c).slotScope; }); 9719 // remove trailing whitespace node again 9720 trimEndingWhitespace(element); 9721 9722 // check pre state 9723 if (element.pre) { 9724 inVPre = false; 9725 } 9726 if (platformIsPreTag(element.tag)) { 9727 inPre = false; 9728 } 9729 // apply post-transforms 9730 for (var i = 0; i < postTransforms.length; i++) { 9731 postTransforms[i](element, options); 9732 } 9733 } 9734 9735 function trimEndingWhitespace (el) { 9736 // remove trailing whitespace node 9737 if (!inPre) { 9738 var lastNode; 9739 while ( 9740 (lastNode = el.children[el.children.length - 1]) && 9741 lastNode.type === 3 && 9742 lastNode.text === ' ' 9743 ) { 9744 el.children.pop(); 9745 } 9746 } 9747 } 9748 9749 function checkRootConstraints (el) { 9750 if (el.tag === 'slot' || el.tag === 'template') { 9751 warnOnce( 9752 "Cannot use <" + (el.tag) + "> as component root element because it may " + 9753 'contain multiple nodes.', 9754 { start: el.start } 9755 ); 9756 } 9757 if (el.attrsMap.hasOwnProperty('v-for')) { 9758 warnOnce( 9759 'Cannot use v-for on stateful component root element because ' + 9760 'it renders multiple elements.', 9761 el.rawAttrsMap['v-for'] 9762 ); 9763 } 9764 } 9765 9766 parseHTML(template, { 9767 warn: warn$2, 9768 expectHTML: options.expectHTML, 9769 isUnaryTag: options.isUnaryTag, 9770 canBeLeftOpenTag: options.canBeLeftOpenTag, 9771 shouldDecodeNewlines: options.shouldDecodeNewlines, 9772 shouldDecodeNewlinesForHref: options.shouldDecodeNewlinesForHref, 9773 shouldKeepComment: options.comments, 9774 outputSourceRange: options.outputSourceRange, 9775 start: function start (tag, attrs, unary, start$1, end) { 9776 // check namespace. 9777 // inherit parent ns if there is one 9778 var ns = (currentParent && currentParent.ns) || platformGetTagNamespace(tag); 9779 9780 // handle IE svg bug 9781 /* istanbul ignore if */ 9782 if (isIE && ns === 'svg') { 9783 attrs = guardIESVGBug(attrs); 9784 } 9785 9786 var element = createASTElement(tag, attrs, currentParent); 9787 if (ns) { 9788 element.ns = ns; 9789 } 9790 9791 { 9792 if (options.outputSourceRange) { 9793 element.start = start$1; 9794 element.end = end; 9795 element.rawAttrsMap = element.attrsList.reduce(function (cumulated, attr) { 9796 cumulated[attr.name] = attr; 9797 return cumulated 9798 }, {}); 9799 }
9800 attrs.forEach(function (attr) { 9801 if (invalidAttributeRE.test(attr.name)) { 9802 warn$2( 9803 "Invalid dynamic argument expression: attribute names cannot contain " + 9804 "spaces, quotes, <, >, / or =.", 9805 { 9806 start: attr.start + attr.name.indexOf("["), 9807 end: attr.start + attr.name.length 9808 } 9809 ); 9810 } 9811 }); 9812 } 9813 9814 if (isForbiddenTag(element) && !isServerRendering()) { 9815 element.forbidden = true; 9816 warn$2( 9817 'Templates should only be responsible for mapping the state to the ' + 9818 'UI. Avoid placing tags with side-effects in your templates, such as ' + 9819 "<" + tag + ">" + ', as they will not be parsed.', 9820 { start: element.start } 9821 ); 9822 } 9823 9824 // apply pre-transforms 9825 for (var i = 0; i < preTransforms.length; i++) { 9826 element = preTransforms[i](element, options) || element; 9827 } 9828 9829 if (!inVPre) { 9830 processPre(element); 9831 if (element.pre) { 9832 inVPre = true; 9833 } 9834 } 9835 if (platformIsPreTag(element.tag)) { 9836 inPre = true; 9837 } 9838 if (inVPre) { 9839 processRawAttrs(element); 9840 } else if (!element.processed) { 9841 // structural directives 9842 processFor(element); 9843 processIf(element); 9844 processOnce(element); 9845 } 9846 9847 if (!root) { 9848 root = element; 9849 { 9850 checkRootConstraints(root); 9851 } 9852 } 9853 9854 if (!unary) { 9855 currentParent = element; 9856 stack.push(element); 9857 } else { 9858 closeElement(element); 9859 } 9860 }, 9861 9862 end: function end (tag, start, end$1) { 9863 var element = stack[stack.length - 1]; 9864 // pop stack 9865 stack.length -= 1; 9866 currentParent = stack[stack.length - 1]; 9867 if (options.outputSourceRange) { 9868 element.end = end$1; 9869 } 9870 closeElement(element); 9871 }, 9872 9873 chars: function chars (text, start, end) { 9874 if (!currentParent) { 9875 { 9876 if (text === template) { 9877 warnOnce( 9878 'Component template requires a root element, rather than just text.', 9879 { start: start } 9880 ); 9881 } else if ((text = text.trim())) { 9882 warnOnce( 9883 ("text \"" + text + "\" outside root element will be ignored."), 9884 { start: start } 9885 ); 9886 } 9887 } 9888 return 9889 } 9890 // IE textarea placeholder bug 9891 /* istanbul ignore if */ 9892 if (isIE && 9893 currentParent.tag === 'textarea' && 9894 currentParent.attrsMap.placeholder === text 9895 ) { 9896 return 9897 } 9898 var children = currentParent.children; 9899 if (inPre || text.trim()) { 9900 text = isTextTag(currentParent) ? text : decodeHTMLCached(text); 9901 } else if (!children.length) { 9902 // remove the whitespace-only node right after an opening tag 9903 text = ''; 9904 } else if (whitespaceOption) { 9905 if (whitespaceOption === 'condense') { 9906 // in condense mode, remove the whitespace node if it contains 9907 // line break, otherwise condense to a single space 9908 text = lineBreakRE.test(text) ? '' : ' '; 9909 } else { 9910 text = ' '; 9911 } 9912 } else { 9913 text = preserveWhitespace ? ' ' : ''; 9914 } 9915 if (text) { 9916 if (!inPre && whitespaceOption === 'condense') { 9917 // condense consecutive whitespaces into single space 9918 text = text.replace(whitespaceRE$1, ' '); 9919 } 9920 var res; 9921 var child; 9922 if (!inVPre && text !== ' ' && (res = parseText(text, delimiters))) { 9923 child = { 9924 type: 2, 9925 expression: res.expression, 9926 tokens: res.tokens, 9927 text: text 9928 }; 9929 } else if (text !== ' ' || !children.length || children[children.length - 1].text !== ' ') { 9930 child = { 9931 type: 3, 9932 text: text 9933 }; 9934 } 9935 if (child) { 9936 if (options.outputSourceRange) { 9937 child.start = start; 9938 child.end = end; 9939 } 9940 children.push(child); 9941 } 9942 } 9943 }, 9944 comment: function comment (text, start, end) { 9945 // adding anything as a sibling to the root node is forbidden 9946 // comments should still be allowed, but ignored 9947 if (currentParent) { 9948 var child = { 9949 type: 3, 9950 text: text, 9951 isComment: true 9952 }; 9953 if (options.outputSourceRange) { 9954 child.start = start; 9955 child.end = end; 9956 } 9957 currentParent.children.push(child); 9958 } 9959 } 9960 }); 9961 return root 9962 } 9963 9964 function processPre (el) { 9965 if (getAndRemoveAttr(el, 'v-pre') != null) { 9966 el.pre = true; 9967 } 9968 } 9969 9970 function processRawAttrs (el) { 9971 var list = el.attrsList; 9972 var len = list.length; 9973 if (len) { 9974 var attrs = el.attrs = new Array(len); 9975 for (var i = 0; i < len; i++) { 9976 attrs[i] = { 9977 name: list[i].name, 9978 value: JSON.stringify(list[i].value) 9979 }; 9980 if (list[i].start != null) { 9981 attrs[i].start = list[i].start; 9982 attrs[i].end = list[i].end; 9983 } 9984 } 9985 } else if (!el.pre) {
9986 // non root node in pre blocks with no attributes 9987 el.plain = true; 9988 } 9989 } 9990 9991 function processElement ( 9992 element, 9993 options 9994 ) { 9995 processKey(element); 9996 9997 // determine whether this is a plain element after 9998 // removing structural attributes 9999 element.plain = ( 10000 !element.key && 10001 !element.scopedSlots && 10002 !element.attrsList.length 10003 ); 10004 10005 processRef(element); 10006 processSlotContent(element); 10007 processSlotOutlet(element); 10008 processComponent(element); 10009 for (var i = 0; i < transforms.length; i++) { 10010 element = transforms[i](element, options) || element; 10011 } 10012 processAttrs(element); 10013 return element 10014 } 10015 10016 function processKey (el) { 10017 var exp = getBindingAttr(el, 'key'); 10018 if (exp) { 10019 { 10020 if (el.tag === 'template') { 10021 warn$2( 10022 "<template> cannot be keyed. Place the key on real elements instead.", 10023 getRawBindingAttr(el, 'key') 10024 ); 10025 } 10026 if (el.for) { 10027 var iterator = el.iterator2 || el.iterator1; 10028 var parent = el.parent; 10029 if (iterator && iterator === exp && parent && parent.tag === 'transition-group') { 10030 warn$2( 10031 "Do not use v-for index as key on <transition-group> children, " + 10032 "this is the same as not using keys.", 10033 getRawBindingAttr(el, 'key'), 10034 true /* tip */ 10035 ); 10036 } 10037 } 10038 } 10039 el.key = exp; 10040 } 10041 } 10042 10043 function processRef (el) { 10044 var ref = getBindingAttr(el, 'ref'); 10045 if (ref) { 10046 el.ref = ref; 10047 el.refInFor = checkInFor(el); 10048 } 10049 } 10050 10051 function processFor (el) { 10052 var exp; 10053 if ((exp = getAndRemoveAttr(el, 'v-for'))) { 10054 var res = parseFor(exp); 10055 if (res) { 10056 extend(el, res); 10057 } else { 10058 warn$2( 10059 ("Invalid v-for expression: " + exp), 10060 el.rawAttrsMap['v-for'] 10061 ); 10062 } 10063 } 10064 } 10065 10066 10067 10068 function parseFor (exp) { 10069 var inMatch = exp.match(forAliasRE); 10070 if (!inMatch) { return } 10071 var res = {}; 10072 res.for = inMatch[2].trim(); 10073 var alias = inMatch[1].trim().replace(stripParensRE, ''); 10074 var iteratorMatch = alias.match(forIteratorRE); 10075 if (iteratorMatch) { 10076 res.alias = alias.replace(forIteratorRE, '').trim(); 10077 res.iterator1 = iteratorMatch[1].trim(); 10078 if (iteratorMatch[2]) { 10079 res.iterator2 = iteratorMatch[2].trim(); 10080 } 10081 } else { 10082 res.alias = alias; 10083 } 10084 return res 10085 } 10086 10087 function processIf (el) { 10088 var exp = getAndRemoveAttr(el, 'v-if'); 10089 if (exp) { 10090 el.if = exp; 10091 addIfCondition(el, { 10092 exp: exp, 10093 block: el 10094 }); 10095 } else { 10096 if (getAndRemoveAttr(el, 'v-else') != null) { 10097 el.else = true; 10098 } 10099 var elseif = getAndRemoveAttr(el, 'v-else-if'); 10100 if (elseif) { 10101 el.elseif = elseif; 10102 } 10103 } 10104 } 10105 10106 function processIfConditions (el, parent) { 10107 var prev = findPrevElement(parent.children); 10108 if (prev && prev.if) { 10109 addIfCondition(prev, { 10110 exp: el.elseif, 10111 block: el 10112 }); 10113 } else { 10114 warn$2( 10115 "v-" + (el.elseif ? ('else-if="' + el.elseif + '"') : 'else') + " " + 10116 "used on element <" + (el.tag) + "> without corresponding v-if.", 10117 el.rawAttrsMap[el.elseif ? 'v-else-if' : 'v-else'] 10118 ); 10119 } 10120 } 10121 10122 function findPrevElement (children) { 10123 var i = children.length; 10124 while (i--) { 10125 if (children[i].type === 1) { 10126 return children[i] 10127 } else { 10128 if (children[i].text !== ' ') { 10129 warn$2( 10130 "text \"" + (children[i].text.trim()) + "\" between v-if and v-else(-if) " + 10131 "will be ignored.", 10132 children[i] 10133 ); 10134 } 10135 children.pop(); 10136 } 10137 } 10138 } 10139 10140 function addIfCondition (el, condition) { 10141 if (!el.ifConditions) { 10142 el.ifConditions = []; 10143 } 10144 el.ifConditions.push(condition); 10145 } 10146 10147 function processOnce (el) { 10148 var once$$1 = getAndRemoveAttr(el, 'v-once'); 10149 if (once$$1 != null) { 10150 el.once = true; 10151 } 10152 } 10153 10154 // handle content being passed to a component as slot,
10155 // e.g. <template slot="xxx">, <div slot-scope="xxx"> 10156 function processSlotContent (el) { 10157 var slotScope; 10158 if (el.tag === 'template') { 10159 slotScope = getAndRemoveAttr(el, 'scope'); 10160 /* istanbul ignore if */ 10161 if (slotScope) { 10162 warn$2( 10163 "the \"scope\" attribute for scoped slots have been deprecated and " + 10164 "replaced by \"slot-scope\" since 2.5. The new \"slot-scope\" attribute " + 10165 "can also be used on plain elements in addition to <template> to " + 10166 "denote scoped slots.", 10167 el.rawAttrsMap['scope'], 10168 true 10169 ); 10170 } 10171 el.slotScope = slotScope || getAndRemoveAttr(el, 'slot-scope'); 10172 } else if ((slotScope = getAndRemoveAttr(el, 'slot-scope'))) { 10173 /* istanbul ignore if */ 10174 if (el.attrsMap['v-for']) { 10175 warn$2( 10176 "Ambiguous combined usage of slot-scope and v-for on <" + (el.tag) + "> " + 10177 "(v-for takes higher priority). Use a wrapper <template> for the " + 10178 "scoped slot to make it clearer.", 10179 el.rawAttrsMap['slot-scope'], 10180 true 10181 ); 10182 } 10183 el.slotScope = slotScope; 10184 } 10185 10186 // slot="xxx" 10187 var slotTarget = getBindingAttr(el, 'slot'); 10188 if (slotTarget) { 10189 el.slotTarget = slotTarget === '""' ? '"default"' : slotTarget; 10190 el.slotTargetDynamic = !!(el.attrsMap[':slot'] || el.attrsMap['v-bind:slot']); 10191 // preserve slot as an attribute for native shadow DOM compat 10192 // only for non-scoped slots. 10193 if (el.tag !== 'template' && !el.slotScope) { 10194 addAttr(el, 'slot', slotTarget, getRawBindingAttr(el, 'slot')); 10195 } 10196 } 10197 10198 // 2.6 v-slot syntax 10199 { 10200 if (el.tag === 'template') { 10201 // v-slot on <template> 10202 var slotBinding = getAndRemoveAttrByRegex(el, slotRE); 10203 if (slotBinding) { 10204 { 10205 if (el.slotTarget || el.slotScope) { 10206 warn$2( 10207 "Unexpected mixed usage of different slot syntaxes.", 10208 el 10209 ); 10210 } 10211 if (el.parent && !maybeComponent(el.parent)) { 10212 warn$2( 10213 "<template v-slot> can only appear at the root level inside " + 10214 "the receiving component", 10215 el 10216 ); 10217 } 10218 } 10219 var ref = getSlotName(slotBinding); 10220 var name = ref.name; 10221 var dynamic = ref.dynamic; 10222 el.slotTarget = name; 10223 el.slotTargetDynamic = dynamic; 10224 el.slotScope = slotBinding.value || emptySlotScopeToken; // force it into a scoped slot for perf 10225 } 10226 } else { 10227 // v-slot on component, denotes default slot 10228 var slotBinding$1 = getAndRemoveAttrByRegex(el, slotRE); 10229 if (slotBinding$1) { 10230 { 10231 if (!maybeComponent(el)) { 10232 warn$2( 10233 "v-slot can only be used on components or <template>.", 10234 slotBinding$1 10235 ); 10236 } 10237 if (el.slotScope || el.slotTarget) { 10238 warn$2( 10239 "Unexpected mixed usage of different slot syntaxes.", 10240 el 10241 ); 10242 } 10243 if (el.scopedSlots) { 10244 warn$2( 10245 "To avoid scope ambiguity, the default slot should also use " + 10246 "<template> syntax when there are other named slots.", 10247 slotBinding$1 10248 ); 10249 } 10250 } 10251 // add the component's children to its default slot 10252 var slots = el.scopedSlots || (el.scopedSlots = {}); 10253 var ref$1 = getSlotName(slotBinding$1); 10254 var name$1 = ref$1.name; 10255 var dynamic$1 = ref$1.dynamic; 10256 var slotContainer = slots[name$1] = createASTElement('template', [], el); 10257 slotContainer.slotTarget = name$1; 10258 slotContainer.slotTargetDynamic = dynamic$1; 10259 slotContainer.children = el.children.filter(function (c) { 10260 if (!c.slotScope) { 10261 c.parent = slotContainer; 10262 return true 10263 } 10264 }); 10265 slotContainer.slotScope = slotBinding$1.value || emptySlotScopeToken; 10266 // remove children as they are returned from scopedSlots now 10267 el.children = []; 10268 // mark el non-plain so data gets generated 10269 el.plain = false;
10270 } 10271 } 10272 } 10273 } 10274 10275 function getSlotName (binding) { 10276 var name = binding.name.replace(slotRE, ''); 10277 if (!name) { 10278 if (binding.name[0] !== '#') { 10279 name = 'default'; 10280 } else { 10281 warn$2( 10282 "v-slot shorthand syntax requires a slot name.", 10283 binding 10284 ); 10285 } 10286 } 10287 return dynamicArgRE.test(name) 10288 // dynamic [name] 10289 ? { name: name.slice(1, -1), dynamic: true } 10290 // static name 10291 : { name: ("\"" + name + "\""), dynamic: false } 10292 } 10293 10294 // handle <slot/> outlets 10295 function processSlotOutlet (el) { 10296 if (el.tag === 'slot') { 10297 el.slotName = getBindingAttr(el, 'name'); 10298 if (el.key) { 10299 warn$2( 10300 "`key` does not work on <slot> because slots are abstract outlets " + 10301 "and can possibly expand into multiple elements. " + 10302 "Use the key on a wrapping element instead.", 10303 getRawBindingAttr(el, 'key') 10304 ); 10305 } 10306 } 10307 } 10308 10309 function processComponent (el) { 10310 var binding; 10311 if ((binding = getBindingAttr(el, 'is'))) { 10312 el.component = binding; 10313 } 10314 if (getAndRemoveAttr(el, 'inline-template') != null) { 10315 el.inlineTemplate = true; 10316 } 10317 } 10318 10319 function processAttrs (el) { 10320 var list = el.attrsList; 10321 var i, l, name, rawName, value, modifiers, syncGen, isDynamic; 10322 for (i = 0, l = list.length; i < l; i++) { 10323 name = rawName = list[i].name; 10324 value = list[i].value; 10325 if (dirRE.test(name)) { 10326 // mark element as dynamic 10327 el.hasBindings = true; 10328 // modifiers 10329 modifiers = parseModifiers(name.replace(dirRE, '')); 10330 // support .foo shorthand syntax for the .prop modifier 10331 if (modifiers) { 10332 name = name.replace(modifierRE, ''); 10333 } 10334 if (bindRE.test(name)) { // v-bind 10335 name = name.replace(bindRE, ''); 10336 value = parseFilters(value); 10337 isDynamic = dynamicArgRE.test(name); 10338 if (isDynamic) { 10339 name = name.slice(1, -1); 10340 } 10341 if ( 10342 value.trim().length === 0 10343 ) { 10344 warn$2( 10345 ("The value for a v-bind expression cannot be empty. Found in \"v-bind:" + name + "\"") 10346 ); 10347 } 10348 if (modifiers) { 10349 if (modifiers.prop && !isDynamic) { 10350 name = camelize(name); 10351 if (name === 'innerHtml') { name = 'innerHTML'; } 10352 } 10353 if (modifiers.camel && !isDynamic) { 10354 name = camelize(name); 10355 } 10356 if (modifiers.sync) { 10357 syncGen = genAssignmentCode(value, "$event"); 10358 if (!isDynamic) { 10359 addHandler( 10360 el, 10361 ("update:" + (camelize(name))), 10362 syncGen, 10363 null, 10364 false, 10365 warn$2, 10366 list[i] 10367 ); 10368 if (hyphenate(name) !== camelize(name)) { 10369 addHandler( 10370 el, 10371 ("update:" + (hyphenate(name))), 10372 syncGen, 10373 null, 10374 false, 10375 warn$2, 10376 list[i] 10377 ); 10378 } 10379 } else { 10380 // handler w/ dynamic event name 10381 addHandler( 10382 el, 10383 ("\"update:\"+(" + name + ")"), 10384 syncGen, 10385 null, 10386 false, 10387 warn$2, 10388 list[i], 10389 true // dynamic 10390 ); 10391 } 10392 } 10393 } 10394 if ((modifiers && modifiers.prop) || ( 10395 !el.component && platformMustUseProp(el.tag, el.attrsMap.type, name) 10396 )) { 10397 addProp(el, name, value, list[i], isDynamic); 10398 } else { 10399 addAttr(el, name, value, list[i], isDynamic); 10400 } 10401 } else if (onRE.test(name)) { // v-on 10402 name = name.replace(onRE, ''); 10403 isDynamic = dynamicArgRE.test(name); 10404 if (isDynamic) { 10405 name = name.slice(1, -1); 10406 } 10407 addHandler(el, name, value, modifiers, false, warn$2, list[i], isDynamic); 10408 } else { // normal directives 10409 name = name.replace(dirRE, ''); 10410 // parse arg 10411 var argMatch = name.match(argRE); 10412 var arg = argMatch && argMatch[1]; 10413 isDynamic = false;
10414 if (arg) { 10415 name = name.slice(0, -(arg.length + 1)); 10416 if (dynamicArgRE.test(arg)) { 10417 arg = arg.slice(1, -1); 10418 isDynamic = true; 10419 } 10420 } 10421 addDirective(el, name, rawName, value, arg, isDynamic, modifiers, list[i]); 10422 if (name === 'model') { 10423 checkForAliasModel(el, value); 10424 } 10425 } 10426 } else { 10427 // literal attribute 10428 { 10429 var res = parseText(value, delimiters); 10430 if (res) { 10431 warn$2( 10432 name + "=\"" + value + "\": " + 10433 'Interpolation inside attributes has been removed. ' + 10434 'Use v-bind or the colon shorthand instead. For example, ' + 10435 'instead of <div id="{{ val }}">, use <div :id="val">.', 10436 list[i] 10437 ); 10438 } 10439 } 10440 addAttr(el, name, JSON.stringify(value), list[i]); 10441 // #6887 firefox doesn't update muted state if set via attribute 10442 // even immediately after element creation 10443 if (!el.component && 10444 name === 'muted' && 10445 platformMustUseProp(el.tag, el.attrsMap.type, name)) { 10446 addProp(el, name, 'true', list[i]); 10447 } 10448 } 10449 } 10450 } 10451 10452 function checkInFor (el) { 10453 var parent = el; 10454 while (parent) { 10455 if (parent.for !== undefined) { 10456 return true 10457 } 10458 parent = parent.parent; 10459 } 10460 return false 10461 } 10462 10463 function parseModifiers (name) { 10464 var match = name.match(modifierRE); 10465 if (match) { 10466 var ret = {}; 10467 match.forEach(function (m) { ret[m.slice(1)] = true; }); 10468 return ret 10469 } 10470 } 10471 10472 function makeAttrsMap (attrs) { 10473 var map = {}; 10474 for (var i = 0, l = attrs.length; i < l; i++) { 10475 if ( 10476 map[attrs[i].name] && !isIE && !isEdge 10477 ) { 10478 warn$2('duplicate attribute: ' + attrs[i].name, attrs[i]); 10479 } 10480 map[attrs[i].name] = attrs[i].value; 10481 } 10482 return map 10483 } 10484 10485 // for script (e.g. type="x/template") or style, do not decode content 10486 function isTextTag (el) { 10487 return el.tag === 'script' || el.tag === 'style' 10488 } 10489 10490 function isForbiddenTag (el) { 10491 return ( 10492 el.tag === 'style' || 10493 (el.tag === 'script' && ( 10494 !el.attrsMap.type || 10495 el.attrsMap.type === 'text/javascript' 10496 )) 10497 ) 10498 } 10499 10500 var ieNSBug = /^xmlns:NS\d+/; 10501 var ieNSPrefix = /^NS\d+:/; 10502 10503 /* istanbul ignore next */ 10504 function guardIESVGBug (attrs) { 10505 var res = []; 10506 for (var i = 0; i < attrs.length; i++) { 10507 var attr = attrs[i]; 10508 if (!ieNSBug.test(attr.name)) { 10509 attr.name = attr.name.replace(ieNSPrefix, ''); 10510 res.push(attr); 10511 } 10512 } 10513 return res 10514 } 10515 10516 function checkForAliasModel (el, value) { 10517 var _el = el; 10518 while (_el) { 10519 if (_el.for && _el.alias === value) { 10520 warn$2( 10521 "<" + (el.tag) + " v-model=\"" + value + "\">: " + 10522 "You are binding v-model directly to a v-for iteration alias. " + 10523 "This will not be able to modify the v-for source array because " + 10524 "writing to the alias is like modifying a function local variable. " + 10525 "Consider using an array of objects and use v-model on an object property instead.", 10526 el.rawAttrsMap['v-model'] 10527 ); 10528 } 10529 _el = _el.parent; 10530 } 10531 } 10532 10533 /* */ 10534 10535 function preTransformNode (el, options) { 10536 if (el.tag === 'input') { 10537 var map = el.attrsMap; 10538 if (!map['v-model']) { 10539 return 10540 } 10541 10542 var typeBinding; 10543 if (map[':type'] || map['v-bind:type']) { 10544 typeBinding = getBindingAttr(el, 'type'); 10545 } 10546 if (!map.type && !typeBinding && map['v-bind']) { 10547 typeBinding = "(" + (map['v-bind']) + ").type"; 10548 } 10549 10550 if (typeBinding) { 10551 var ifCondition = getAndRemoveAttr(el, 'v-if', true); 10552 var ifConditionExtra = ifCondition ? ("&&(" + ifCondition + ")") : ""; 10553 var hasElse = getAndRemoveAttr(el, 'v-else', true) != null; 10554 var elseIfCondition = getAndRemoveAttr(el, 'v-else-if', true); 10555 // 1. checkbox 10556 var branch0 = cloneASTElement(el); 10557 // process for on the main node 10558 processFor(branch0); 10559 addRawAttr(branch0, 'type', 'checkbox'); 10560 processElement(branch0, options); 10561 branch0.processed = true; // prevent it from double-processed 10562 branch0.if = "(" + typeBinding + ")==='checkbox'" + ifConditionExtra; 10563 addIfCondition(branch0, { 10564 exp: branch0.if, 10565 block: branch0 10566 }); 10567 // 2. add radio else-if condition 10568 var branch1 = cloneASTElement(el); 10569 getAndRemoveAttr(branch1, 'v-for', true); 10570 addRawAttr(branch1, 'type', 'radio'); 10571 processElement(branch1, options); 10572 addIfCondition(branch0, { 10573 exp: "(" + typeBinding + ")==='radio'" + ifConditionExtra, 10574 block: branch1 10575 }); 10576 // 3. other 10577 var branch2 = cloneASTElement(el); 10578 getAndRemoveAttr(branch2, 'v-for', true); 10579 addRawAttr(branch2, ':type', typeBinding); 10580 processElement(branch2, options); 10581 addIfCondition(branch0, { 10582 exp: ifCondition, 10583 block: branch2 10584 }); 10585 10586 if (hasElse) { 10587 branch0.else = true; 10588 } else if (elseIfCondition) { 10589 branch0.elseif = elseIfCondition; 10590 } 10591 10592 return branch0 10593 } 10594 } 10595 } 10596 10597 function cloneASTElement (el) { 10598 return createASTElement(el.tag, el.attrsList.slice(), el.parent) 10599 } 10600 10601 var model$1 = { 10602 preTransformNode: preTransformNode 10603 }; 10604 10605 var modules$1 = [ 10606 klass$1, 10607 style$1, 10608 model$1 10609 ]; 10610 10611 /* */ 10612 10613 function text (el, dir) { 10614 if (dir.value) { 10615 addProp(el, 'textContent', ("_s(" + (dir.value) + ")"), dir); 10616 } 10617 } 10618 10619 /* */ 10620 10621 function html (el, dir) { 10622 if (dir.value) { 10623 addProp(el, 'innerHTML', ("_s(" + (dir.value) + ")"), dir); 10624 } 10625 } 10626 10627 var directives$1 = { 10628 model: model, 10629 text: text, 10630 html: html 10631 }; 10632 10633 /* */ 10634 10635 var baseOptions = { 10636 expectHTML: true, 10637 modules: modules$1, 10638 directives: directives$1, 10639 isPreTag: isPreTag, 10640 isUnaryTag: isUnaryTag, 10641 mustUseProp: mustUseProp, 10642 canBeLeftOpenTag: canBeLeftOpenTag, 10643 isReservedTag: isReservedTag, 10644 getTagNamespace: getTagNamespace, 10645 staticKeys: genStaticKeys(modules$1) 10646 }; 10647 10648 /* */ 10649 10650 var isStaticKey; 10651 var isPlatformReservedTag; 10652
10653 var genStaticKeysCached = cached(genStaticKeys$1); 10654 10655 /** 10656 * Goal of the optimizer: walk the generated template AST tree 10657 * and detect sub-trees that are purely static, i.e. parts of 10658 * the DOM that never needs to change. 10659 * 10660 * Once we detect these sub-trees, we can: 10661 * 10662 * 1. Hoist them into constants, so that we no longer need to 10663 * create fresh nodes for them on each re-render; 10664 * 2. Completely skip them in the patching process. 10665 */ 10666 function optimize (root, options) { 10667 if (!root) { return } 10668 isStaticKey = genStaticKeysCached(options.staticKeys || ''); 10669 isPlatformReservedTag = options.isReservedTag || no; 10670 // first pass: mark all non-static nodes. 10671 markStatic$1(root); 10672 // second pass: mark static roots. 10673 markStaticRoots(root, false); 10674 } 10675 10676 function genStaticKeys$1 (keys) { 10677 return makeMap( 10678 'type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap' + 10679 (keys ? ',' + keys : '') 10680 ) 10681 } 10682 10683 function markStatic$1 (node) { 10684 node.static = isStatic(node); 10685 if (node.type === 1) { 10686 // do not make component slot content static. this avoids 10687 // 1. components not able to mutate slot nodes 10688 // 2. static slot content fails for hot-reloading 10689 if ( 10690 !isPlatformReservedTag(node.tag) && 10691 node.tag !== 'slot' && 10692 node.attrsMap['inline-template'] == null 10693 ) { 10694 return 10695 } 10696 for (var i = 0, l = node.children.length; i < l; i++) { 10697 var child = node.children[i]; 10698 markStatic$1(child); 10699 if (!child.static) { 10700 node.static = false; 10701 } 10702 } 10703 if (node.ifConditions) { 10704 for (var i$1 = 1, l$1 = node.ifConditions.length; i$1 < l$1; i$1++) { 10705 var block = node.ifConditions[i$1].block; 10706 markStatic$1(block); 10707 if (!block.static) { 10708 node.static = false; 10709 } 10710 } 10711 } 10712 } 10713 } 10714 10715 function markStaticRoots (node, isInFor) { 10716 if (node.type === 1) { 10717 if (node.static || node.once) { 10718 node.staticInFor = isInFor; 10719 } 10720 // For a node to qualify as a static root, it should have children that 10721 // are not just static text. Otherwise the cost of hoisting out will 10722 // outweigh the benefits and it's better off to just always render it fresh. 10723 if (node.static && node.children.length && !( 10724 node.children.length === 1 && 10725 node.children[0].type === 3 10726 )) { 10727 node.staticRoot = true; 10728 return 10729 } else { 10730 node.staticRoot = false; 10731 } 10732 if (node.children) { 10733 for (var i = 0, l = node.children.length; i < l; i++) { 10734 markStaticRoots(node.children[i], isInFor || !!node.for); 10735 } 10736 } 10737 if (node.ifConditions) { 10738 for (var i$1 = 1, l$1 = node.ifConditions.length; i$1 < l$1; i$1++) { 10739 markStaticRoots(node.ifConditions[i$1].block, isInFor); 10740 } 10741 } 10742 } 10743 } 10744 10745 function isStatic (node) { 10746 if (node.type === 2) { // expression 10747 return false 10748 } 10749 if (node.type === 3) { // text 10750 return true 10751 } 10752 return !!(node.pre || ( 10753 !node.hasBindings && // no dynamic bindings 10754 !node.if && !node.for && // not v-if or v-for or v-else 10755 !isBuiltInTag(node.tag) && // not a built-in 10756 isPlatformReservedTag(node.tag) && // not a component 10757 !isDirectChildOfTemplateFor(node) && 10758 Object.keys(node).every(isStaticKey) 10759 )) 10760 } 10761 10762 function isDirectChildOfTemplateFor (node) { 10763 while (node.parent) { 10764 node = node.parent; 10765 if (node.tag !== 'template') { 10766 return false 10767 } 10768 if (node.for) { 10769 return true 10770 } 10771 } 10772 return false 10773 } 10774 10775 /* */ 10776 10777 var fnExpRE = /^([\w$_]+|\([^)]*?\))\s*=>|^function(?:\s+[\w$]+)?\s*\(/; 10778 var fnInvokeRE = /\([^)]*?\);*$/; 10779 var simplePathRE = /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/; 10780 10781 // KeyboardEvent.keyCode aliases 10782 var keyCodes = { 10783 esc: 27, 10784 tab: 9, 10785 enter: 13, 10786 space: 32, 10787 up: 38, 10788 left: 37, 10789 right: 39, 10790 down: 40, 10791 'delete': [8, 46] 10792 }; 10793 10794 // KeyboardEvent.key aliases 10795 var keyNames = { 10796 // #7880: IE11 and Edge use `Esc` for Escape key name. 10797 esc: ['Esc', 'Escape'], 10798 tab: 'Tab', 10799 enter: 'Enter', 10800 // #9112: IE11 uses `Spacebar` for Space key name. 10801 space: [' ', 'Spacebar'], 10802 // #7806: IE11 uses key names without `Arrow` prefix for arrow keys. 10803 up: ['Up', 'ArrowUp'], 10804 left: ['Left', 'ArrowLeft'], 10805 right: ['Right', 'ArrowRight'],
10806 down: ['Down', 'ArrowDown'], 10807 // #9112: IE11 uses `Del` for Delete key name. 10808 'delete': ['Backspace', 'Delete', 'Del'] 10809 }; 10810 10811 // #4868: modifiers that prevent the execution of the listener 10812 // need to explicitly return null so that we can determine whether to remove 10813 // the listener for .once 10814 var genGuard = function (condition) { return ("if(" + condition + ")return null;"); }; 10815 10816 var modifierCode = { 10817 stop: '$event.stopPropagation();', 10818 prevent: '$event.preventDefault();', 10819 self: genGuard("$event.target !== $event.currentTarget"), 10820 ctrl: genGuard("!$event.ctrlKey"), 10821 shift: genGuard("!$event.shiftKey"), 10822 alt: genGuard("!$event.altKey"), 10823 meta: genGuard("!$event.metaKey"), 10824 left: genGuard("'button' in $event && $event.button !== 0"), 10825 middle: genGuard("'button' in $event && $event.button !== 1"), 10826 right: genGuard("'button' in $event && $event.button !== 2") 10827 }; 10828 10829 function genHandlers ( 10830 events, 10831 isNative 10832 ) { 10833 var prefix = isNative ? 'nativeOn:' : 'on:'; 10834 var staticHandlers = ""; 10835 var dynamicHandlers = ""; 10836 for (var name in events) { 10837 var handlerCode = genHandler(events[name]); 10838 if (events[name] && events[name].dynamic) { 10839 dynamicHandlers += name + "," + handlerCode + ","; 10840 } else { 10841 staticHandlers += "\"" + name + "\":" + handlerCode + ","; 10842 } 10843 } 10844 staticHandlers = "{" + (staticHandlers.slice(0, -1)) + "}"; 10845 if (dynamicHandlers) { 10846 return prefix + "_d(" + staticHandlers + ",[" + (dynamicHandlers.slice(0, -1)) + "])" 10847 } else { 10848 return prefix + staticHandlers 10849 } 10850 } 10851 10852 function genHandler (handler) { 10853 if (!handler) { 10854 return 'function(){}' 10855 } 10856 10857 if (Array.isArray(handler)) { 10858 return ("[" + (handler.map(function (handler) { return genHandler(handler); }).join(',')) + "]") 10859 } 10860 10861 var isMethodPath = simplePathRE.test(handler.value); 10862 var isFunctionExpression = fnExpRE.test(handler.value); 10863 var isFunctionInvocation = simplePathRE.test(handler.value.replace(fnInvokeRE, '')); 10864 10865 if (!handler.modifiers) { 10866 if (isMethodPath || isFunctionExpression) { 10867 return handler.value 10868 } 10869 return ("function($event){" + (isFunctionInvocation ? ("return " + (handler.value)) : handler.value) + "}") // inline statement 10870 } else { 10871 var code = ''; 10872 var genModifierCode = ''; 10873 var keys = []; 10874 for (var key in handler.modifiers) { 10875 if (modifierCode[key]) { 10876 genModifierCode += modifierCode[key]; 10877 // left/right 10878 if (keyCodes[key]) { 10879 keys.push(key); 10880 } 10881 } else if (key === 'exact') { 10882 var modifiers = (handler.modifiers); 10883 genModifierCode += genGuard( 10884 ['ctrl', 'shift', 'alt', 'meta'] 10885 .filter(function (keyModifier) { return !modifiers[keyModifier]; }) 10886 .map(function (keyModifier) { return ("$event." + keyModifier + "Key"); }) 10887 .join('||') 10888 ); 10889 } else { 10890 keys.push(key); 10891 } 10892 } 10893 if (keys.length) { 10894 code += genKeyFilter(keys); 10895 } 10896 // Make sure modifiers like prevent and stop get executed after key filtering 10897 if (genModifierCode) { 10898 code += genModifierCode; 10899 } 10900 var handlerCode = isMethodPath 10901 ? ("return " + (handler.value) + ".apply(null, arguments)") 10902 : isFunctionExpression 10903 ? ("return (" + (handler.value) + ").apply(null, arguments)") 10904 : isFunctionInvocation 10905 ? ("return " + (handler.value)) 10906 : handler.value; 10907 return ("function($event){" + code + handlerCode + "}") 10908 } 10909 } 10910 10911 function genKeyFilter (keys) { 10912 return ( 10913 // make sure the key filters only apply to KeyboardEvents 10914 // #9441: can't use 'keyCode' in $event because Chrome autofill fires fake 10915 // key events that do not have keyCode property... 10916 "if(!$event.type.indexOf('key')&&" + 10917 (keys.map(genFilterCode).join('&&')) + ")return null;" 10918 ) 10919 } 10920 10921 function genFilterCode (key) { 10922 var keyVal = parseInt(key, 10); 10923 if (keyVal) { 10924 return ("$event.keyCode!==" + keyVal) 10925 } 10926 var keyCode = keyCodes[key]; 10927 var keyName = keyNames[key]; 10928 return ( 10929 "_k($event.keyCode," + 10930 (JSON.stringify(key)) + "," + 10931 (JSON.stringify(keyCode)) + "," + 10932 "$event.key," + 10933 "" + (JSON.stringify(keyName)) + 10934 ")" 10935 ) 10936 } 10937 10938 /* */ 10939 10940 function on (el, dir) { 10941 if (dir.modifiers) { 10942 warn("v-on without argument does not support modifiers."); 10943 } 10944 el.wrapListeners = function (code) { return ("_g(" + code + "," + (dir.value) + ")"); }; 10945 } 10946 10947 /* */ 10948 10949 function bind$1 (el, dir) { 10950 el.wrapData = function (code) { 10951 return ("_b(" + code + ",'" + (el.tag) + "'," + (dir.value) + "," + (dir.modifiers && dir.modifiers.prop ? 'true' : 'false') + (dir.modifiers && dir.modifiers.sync ? ',true' : '') + ")") 10952 }; 10953 } 10954 10955 /* */ 10956 10957 var baseDirectives = { 10958 on: on, 10959 bind: bind$1, 10960 cloak: noop 10961 }; 10962 10963 /* */ 10964 10965 10966 10967 10968 10969 var CodegenState = function CodegenState (options) { 10970 this.options = options; 10971 this.warn = options.warn || baseWarn; 10972 this.transforms = pluckModuleFunction(options.modules, 'transformCode'); 10973 this.dataGenFns = pluckModuleFunction(options.modules, 'genData'); 10974 this.directives = extend(extend({}, baseDirectives), options.directives); 10975 var isReservedTag = options.isReservedTag || no; 10976 this.maybeComponent = function (el) { return !!el.component || !isReservedTag(el.tag); }; 10977 this.onceId = 0; 10978 this.staticRenderFns = []; 10979 this.pre = false;
10980 }; 10981 10982 10983 10984 function generate ( 10985 ast, 10986 options 10987 ) { 10988 var state = new CodegenState(options); 10989 // fix #11483, Root level <script> tags should not be rendered. 10990 var code = ast ? (ast.tag === 'script' ? 'null' : genElement(ast, state)) : '_c("div")'; 10991 return { 10992 render: ("with(this){return " + code + "}"), 10993 staticRenderFns: state.staticRenderFns 10994 } 10995 } 10996 10997 function genElement (el, state) { 10998 if (el.parent) { 10999 el.pre = el.pre || el.parent.pre; 11000 } 11001 11002 if (el.staticRoot && !el.staticProcessed) { 11003 return genStatic(el, state) 11004 } else if (el.once && !el.onceProcessed) { 11005 return genOnce(el, state) 11006 } else if (el.for && !el.forProcessed) { 11007 return genFor(el, state) 11008 } else if (el.if && !el.ifProcessed) { 11009 return genIf(el, state) 11010 } else if (el.tag === 'template' && !el.slotTarget && !state.pre) { 11011 return genChildren(el, state) || 'void 0' 11012 } else if (el.tag === 'slot') { 11013 return genSlot(el, state) 11014 } else { 11015 // component or element 11016 var code; 11017 if (el.component) { 11018 code = genComponent(el.component, el, state); 11019 } else { 11020 var data; 11021 if (!el.plain || (el.pre && state.maybeComponent(el))) { 11022 data = genData$2(el, state); 11023 } 11024 11025 var children = el.inlineTemplate ? null : genChildren(el, state, true); 11026 code = "_c('" + (el.tag) + "'" + (data ? ("," + data) : '') + (children ? ("," + children) : '') + ")"; 11027 } 11028 // module transforms 11029 for (var i = 0; i < state.transforms.length; i++) { 11030 code = state.transforms[i](el, code); 11031 } 11032 return code 11033 } 11034 } 11035 11036 // hoist static sub-trees out 11037 function genStatic (el, state) { 11038 el.staticProcessed = true; 11039 // Some elements (templates) need to behave differently inside of a v-pre 11040 // node. All pre nodes are static roots, so we can use this as a location to 11041 // wrap a state change and reset it upon exiting the pre node. 11042 var originalPreState = state.pre; 11043 if (el.pre) { 11044 state.pre = el.pre; 11045 } 11046 state.staticRenderFns.push(("with(this){return " + (genElement(el, state)) + "}")); 11047 state.pre = originalPreState; 11048 return ("_m(" + (state.staticRenderFns.length - 1) + (el.staticInFor ? ',true' : '') + ")") 11049 } 11050 11051 // v-once 11052 function genOnce (el, state) { 11053 el.onceProcessed = true; 11054 if (el.if && !el.ifProcessed) { 11055 return genIf(el, state) 11056 } else if (el.staticInFor) { 11057 var key = ''; 11058 var parent = el.parent; 11059 while (parent) { 11060 if (parent.for) { 11061 key = parent.key; 11062 break 11063 } 11064 parent = parent.parent; 11065 } 11066 if (!key) { 11067 state.warn( 11068 "v-once can only be used inside v-for that is keyed. ", 11069 el.rawAttrsMap['v-once'] 11070 ); 11071 return genElement(el, state) 11072 } 11073 return ("_o(" + (genElement(el, state)) + "," + (state.onceId++) + "," + key + ")") 11074 } else { 11075 return genStatic(el, state) 11076 } 11077 } 11078 11079 function genIf ( 11080 el, 11081 state, 11082 altGen, 11083 altEmpty 11084 ) { 11085 el.ifProcessed = true; // avoid recursion 11086 return genIfConditions(el.ifConditions.slice(), state, altGen, altEmpty) 11087 } 11088 11089 function genIfConditions ( 11090 conditions, 11091 state, 11092 altGen, 11093 altEmpty 11094 ) { 11095 if (!conditions.length) { 11096 return altEmpty || '_e()' 11097 } 11098 11099 var condition = conditions.shift(); 11100 if (condition.exp) { 11101 return ("(" + (condition.exp) + ")?" + (genTernaryExp(condition.block)) + ":" + (genIfConditions(conditions, state, altGen, altEmpty))) 11102 } else { 11103 return ("" + (genTernaryExp(condition.block))) 11104 } 11105 11106 // v-if with v-once should generate code like (a)?_m(0):_m(1) 11107 function genTernaryExp (el) { 11108 return altGen 11109 ? altGen(el, state) 11110 : el.once 11111 ? genOnce(el, state) 11112 : genElement(el, state) 11113 } 11114 } 11115 11116 function genFor ( 11117 el, 11118 state, 11119 altGen, 11120 altHelper 11121 ) { 11122 var exp = el.for; 11123 var alias = el.alias; 11124 var iterator1 = el.iterator1 ? ("," + (el.iterator1)) : ''; 11125 var iterator2 = el.iterator2 ? ("," + (el.iterator2)) : ''; 11126 11127 if (state.maybeComponent(el) && 11128 el.tag !== 'slot' && 11129 el.tag !== 'template' && 11130 !el.key 11131 ) { 11132 state.warn( 11133 "<" + (el.tag) + " v-for=\"" + alias + " in " + exp + "\">: component lists rendered with " + 11134 "v-for should have explicit keys. " + 11135 "See https://vuejs.org/guide/list.html#key for more info.", 11136 el.rawAttrsMap['v-for'], 11137 true /* tip */ 11138 ); 11139 } 11140 11141 el.forProcessed = true; // avoid recursion 11142 return (altHelper || '_l') + "((" + exp + ")," + 11143 "function(" + alias + iterator1 + iterator2 + "){" + 11144 "return " + ((altGen || genElement)(el, state)) + 11145 '})' 11146 } 11147 11148 function genData$2 (el, state) { 11149 var data = '{'; 11150 11151 // directives first. 11152 // directives may mutate the el's other properties before they are generated. 11153 var dirs = genDirectives(el, state); 11154 if (dirs) { data += dirs + ','; } 11155 11156 // key 11157 if (el.key) { 11158 data += "key:" + (el.key) + ","; 11159 } 11160 // ref 11161 if (el.ref) { 11162 data += "ref:" + (el.ref) + ","; 11163 } 11164 if (el.refInFor) { 11165 data += "refInFor:true,"; 11166 } 11167 // pre 11168 if (el.pre) { 11169 data += "pre:true,"; 11170 } 11171 // record original tag name for components using "is" attribute 11172 if (el.component) { 11173 data += "tag:\"" + (el.tag) + "\","; 11174 } 11175 // module data generation functions 11176 for (var i = 0; i < state.dataGenFns.length; i++) { 11177 data += state.dataGenFns[i](el); 11178 } 11179 // attributes 11180 if (el.attrs) {
11181 data += "attrs:" + (genProps(el.attrs)) + ","; 11182 } 11183 // DOM props 11184 if (el.props) { 11185 data += "domProps:" + (genProps(el.props)) + ","; 11186 } 11187 // event handlers 11188 if (el.events) { 11189 data += (genHandlers(el.events, false)) + ","; 11190 } 11191 if (el.nativeEvents) { 11192 data += (genHandlers(el.nativeEvents, true)) + ","; 11193 } 11194 // slot target 11195 // only for non-scoped slots 11196 if (el.slotTarget && !el.slotScope) { 11197 data += "slot:" + (el.slotTarget) + ","; 11198 } 11199 // scoped slots 11200 if (el.scopedSlots) { 11201 data += (genScopedSlots(el, el.scopedSlots, state)) + ","; 11202 } 11203 // component v-model 11204 if (el.model) { 11205 data += "model:{value:" + (el.model.value) + ",callback:" + (el.model.callback) + ",expression:" + (el.model.expression) + "},"; 11206 } 11207 // inline-template 11208 if (el.inlineTemplate) { 11209 var inlineTemplate = genInlineTemplate(el, state); 11210 if (inlineTemplate) { 11211 data += inlineTemplate + ","; 11212 } 11213 } 11214 data = data.replace(/,$/, '') + '}'; 11215 // v-bind dynamic argument wrap 11216 // v-bind with dynamic arguments must be applied using the same v-bind object 11217 // merge helper so that class/style/mustUseProp attrs are handled correctly. 11218 if (el.dynamicAttrs) { 11219 data = "_b(" + data + ",\"" + (el.tag) + "\"," + (genProps(el.dynamicAttrs)) + ")"; 11220 } 11221 // v-bind data wrap 11222 if (el.wrapData) { 11223 data = el.wrapData(data); 11224 } 11225 // v-on data wrap 11226 if (el.wrapListeners) { 11227 data = el.wrapListeners(data); 11228 } 11229 return data 11230 } 11231 11232 function genDirectives (el, state) { 11233 var dirs = el.directives; 11234 if (!dirs) { return } 11235 var res = 'directives:['; 11236 var hasRuntime = false; 11237 var i, l, dir, needRuntime; 11238 for (i = 0, l = dirs.length; i < l; i++) { 11239 dir = dirs[i]; 11240 needRuntime = true; 11241 var gen = state.directives[dir.name]; 11242 if (gen) { 11243 // compile-time directive that manipulates AST. 11244 // returns true if it also needs a runtime counterpart. 11245 needRuntime = !!gen(el, dir, state.warn); 11246 } 11247 if (needRuntime) { 11248 hasRuntime = true; 11249 res += "{name:\"" + (dir.name) + "\",rawName:\"" + (dir.rawName) + "\"" + (dir.value ? (",value:(" + (dir.value) + "),expression:" + (JSON.stringify(dir.value))) : '') + (dir.arg ? (",arg:" + (dir.isDynamicArg ? dir.arg : ("\"" + (dir.arg) + "\""))) : '') + (dir.modifiers ? (",modifiers:" + (JSON.stringify(dir.modifiers))) : '') + "},"; 11250 } 11251 } 11252 if (hasRuntime) { 11253 return res.slice(0, -1) + ']' 11254 } 11255 } 11256 11257 function genInlineTemplate (el, state) { 11258 var ast = el.children[0]; 11259 if (el.children.length !== 1 || ast.type !== 1) { 11260 state.warn( 11261 'Inline-template components must have exactly one child element.', 11262 { start: el.start } 11263 ); 11264 } 11265 if (ast && ast.type === 1) { 11266 var inlineRenderFns = generate(ast, state.options); 11267 return ("inlineTemplate:{render:function(){" + (inlineRenderFns.render) + "},staticRenderFns:[" + (inlineRenderFns.staticRenderFns.map(function (code) { return ("function(){" + code + "}"); }).join(',')) + "]}") 11268 } 11269 } 11270 11271 function genScopedSlots ( 11272 el, 11273 slots, 11274 state 11275 ) { 11276 // by default scoped slots are considered "stable", this allows child 11277 // components with only scoped slots to skip forced updates from parent. 11278 // but in some cases we have to bail-out of this optimization 11279 // for example if the slot contains dynamic names, has v-if or v-for on them... 11280 var needsForceUpdate = el.for || Object.keys(slots).some(function (key) { 11281 var slot = slots[key]; 11282 return ( 11283 slot.slotTargetDynamic || 11284 slot.if || 11285 slot.for || 11286 containsSlotChild(slot) // is passing down slot from parent which may be dynamic 11287 ) 11288 }); 11289 11290 // #9534: if a component with scoped slots is inside a conditional branch, 11291 // it's possible for the same component to be reused but with different 11292 // compiled slot content. To avoid that, we generate a unique key based on 11293 // the generated code of all the slot contents. 11294 var needsKey = !!el.if; 11295 11296 // OR when it is inside another scoped slot or v-for (the reactivity may be 11297 // disconnected due to the intermediate scope variable) 11298 // #9438, #9506 11299 // TODO: this can be further optimized by properly analyzing in-scope bindings 11300 // and skip force updating ones that do not actually use scope variables. 11301 if (!needsForceUpdate) { 11302 var parent = el.parent; 11303 while (parent) { 11304 if ( 11305 (parent.slotScope && parent.slotScope !== emptySlotScopeToken) || 11306 parent.for 11307 ) { 11308 needsForceUpdate = true; 11309 break 11310 } 11311 if (parent.if) { 11312 needsKey = true; 11313 } 11314 parent = parent.parent; 11315 } 11316 } 11317 11318 var generatedSlots = Object.keys(slots) 11319 .map(function (key) { return genScopedSlot(slots[key], state); }) 11320 .join(','); 11321 11322 return ("scopedSlots:_u([" + generatedSlots + "]" + (needsForceUpdate ? ",null,true" : "") + (!needsForceUpdate && needsKey ? (",null,fal
11322se," + (hash(generatedSlots))) : "") + ")") 11323 } 11324 11325 function hash(str) { 11326 var hash = 5381; 11327 var i = str.length; 11328 while(i) { 11329 hash = (hash * 33) ^ str.charCodeAt(--i); 11330 } 11331 return hash >>> 0 11332 } 11333 11334 function containsSlotChild (el) { 11335 if (el.type === 1) { 11336 if (el.tag === 'slot') { 11337 return true 11338 } 11339 return el.children.some(containsSlotChild) 11340 } 11341 return false 11342 } 11343 11344 function genScopedSlot ( 11345 el, 11346 state 11347 ) { 11348 var isLegacySyntax = el.attrsMap['slot-scope']; 11349 if (el.if && !el.ifProcessed && !isLegacySyntax) { 11350 return genIf(el, state, genScopedSlot, "null") 11351 } 11352 if (el.for && !el.forProcessed) { 11353 return genFor(el, state, genScopedSlot) 11354 } 11355 var slotScope = el.slotScope === emptySlotScopeToken 11356 ? "" 11357 : String(el.slotScope); 11358 var fn = "function(" + slotScope + "){" + 11359 "return " + (el.tag === 'template' 11360 ? el.if && isLegacySyntax 11361 ? ("(" + (el.if) + ")?" + (genChildren(el, state) || 'undefined') + ":undefined") 11362 : genChildren(el, state) || 'undefined' 11363 : genElement(el, state)) + "}"; 11364 // reverse proxy v-slot without scope on this.$slots 11365 var reverseProxy = slotScope ? "" : ",proxy:true"; 11366 return ("{key:" + (el.slotTarget || "\"default\"") + ",fn:" + fn + reverseProxy + "}") 11367 } 11368 11369 function genChildren ( 11370 el, 11371 state, 11372 checkSkip, 11373 altGenElement, 11374 altGenNode 11375 ) { 11376 var children = el.children; 11377 if (children.length) { 11378 var el$1 = children[0]; 11379 // optimize single v-for 11380 if (children.length === 1 && 11381 el$1.for && 11382 el$1.tag !== 'template' && 11383 el$1.tag !== 'slot' 11384 ) { 11385 var normalizationType = checkSkip 11386 ? state.maybeComponent(el$1) ? ",1" : ",0" 11387 : ""; 11388 return ("" + ((altGenElement || genElement)(el$1, state)) + normalizationType) 11389 } 11390 var normalizationType$1 = checkSkip 11391 ? getNormalizationType(children, state.maybeComponent) 11392 : 0; 11393 var gen = altGenNode || genNode; 11394 return ("[" + (children.map(function (c) { return gen(c, state); }).join(',')) + "]" + (normalizationType$1 ? ("," + normalizationType$1) : '')) 11395 } 11396 } 11397 11398 // determine the normalization needed for the children array. 11399 // 0: no normalization needed 11400 // 1: simple normalization needed (possible 1-level deep nested array) 11401 // 2: full normalization needed 11402 function getNormalizationType ( 11403 children, 11404 maybeComponent 11405 ) { 11406 var res = 0; 11407 for (var i = 0; i < children.length; i++) { 11408 var el = children[i]; 11409 if (el.type !== 1) { 11410 continue 11411 } 11412 if (needsNormalization(el) || 11413 (el.ifConditions && el.ifConditions.some(function (c) { return needsNormalization(c.block); }))) { 11414 res = 2; 11415 break 11416 } 11417 if (maybeComponent(el) || 11418 (el.ifConditions && el.ifConditions.some(function (c) { return maybeComponent(c.block); }))) { 11419 res = 1; 11420 } 11421 } 11422 return res 11423 } 11424 11425 function needsNormalization (el) { 11426 return el.for !== undefined || el.tag === 'template' || el.tag === 'slot' 11427 } 11428 11429 function genNode (node, state) { 11430 if (node.type === 1) { 11431 return genElement(node, state) 11432 } else if (node.type === 3 && node.isComment) { 11433 return genComment(node) 11434 } else { 11435 return genText(node) 11436 } 11437 } 11438 11439 function genText (text) { 11440 return ("_v(" + (text.type === 2 11441 ? text.expression // no need for () because already wrapped in _s() 11442 : transformSpecialNewlines(JSON.stringify(text.text))) + ")") 11443 } 11444 11445 function genComment (comment) { 11446 return ("_e(" + (JSON.stringify(comment.text)) + ")") 11447 } 11448 11449 function genSlot (el, state) { 11450 var slotName = el.slotName || '"default"'; 11451 var children = genChildren(el, state); 11452 var res = "_t(" + slotName + (children ? (",function(){return " + children + "}") : ''); 11453 var attrs = el.attrs || el.dynamicAttrs 11454 ? genProps((el.attrs || []).concat(el.dynamicAttrs || []).map(function (attr) { return ({ 11455 // slot props are camelized 11456 name: camelize(attr.name), 11457 value: attr.value, 11458 dynamic: attr.dynamic 11459 }); })) 11460 : null; 11461 var bind$$1 = el.attrsMap['v-bind']; 11462 if ((attrs || bind$$1) && !children) { 11463 res += ",null"; 11464 } 11465 if (attrs) { 11466 res += "," + attrs; 11467 } 11468 if (bind$$1) { 11469 res += (attrs ? '' : ',null') + "," + bind$$1; 11470 } 11471 return res + ')' 11472 } 11473 11474 // componentName is el.component, take it as argument to shun flow's pessimistic refinement 11475 function genComponent ( 11476 componentName, 11477 el, 11478 state 11479 ) { 11480 var children = el.inlineTemplate ? null : genChildren(el, state, true); 11481 return ("_c(" + componentName + "," + (genData$2(el, state)) + (children ? ("," + children) : '') + ")") 11482 } 11483 11484 function genProps (props) { 11485 var staticProps = ""; 11486 var dynamicProps = ""; 11487 for (var i = 0; i < props.length; i++) { 11488 var prop = props[i]; 11489 var value = transformSpecialNewlines(prop.value); 11490 if (prop.dynamic) { 11491 dynamicProps += (prop.name) + "," + value + ","; 11492 } else { 11493 staticProps += "\"" + (prop.name) + "\":" + value + ","; 11494 } 11495 } 11496 staticProps = "{" + (staticProps.slice(0, -1)) + "}"; 11497 if (dynamicProps) { 11498 return ("_d(" + staticProps + ",[" + (dynamicProps.slice(0, -1)) + "])") 11499 } else { 11500 return staticProps 11501 } 11502 } 11503 11504 // #3895, #4268 11505 function transformSpecialNewlines (text) { 11506 return text 11507 .replace(/\u2028/g, '\\u2028') 11508 .replace(/\u2029/g, '\\u2029') 11509 } 11510 11511 /* */ 11512 11513 11514 11515 // these keywords should not appear inside expressions, but operators like 11516 // typeof, instanceof and in are allowed 11517 var prohibitedKeywordRE = new RegExp('\\b' + ( 11518 'do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,' + 11519 'super,throw,while,yield,delete,export,import,return,switch,default,' + 11520 'extends,finally,continue,debugger,function,arguments' 11521 ).split(',').join('\\b|\\b') + '\\b'); 11522 11523 // these unary operators should not be used as property/method names 11524 var unaryOperatorsRE = new RegExp('\\b' + ( 11525 'delete,typeof,void' 11526 ).split(',').join('\\s*\\([^\\)]*\\)|\\b') + '\\s*\\([^\\)]*\\)'); 11527 11528 // strip strings in expressions 11529 var stripStringRE = /'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"|`(?:[^`\\]|\\.)*\$\{|\}(?:[^`\\]|\\.)*`|`(?:[^`\\]|\\.)*`/g; 11530 11531 // detect problematic expressions in a template 11532 function detectErrors (ast, warn) { 11533 if (ast) { 11534 checkNode(ast, warn); 11535 } 11536 } 11537 11538 function checkNode (node, warn) { 11539 if (node.type === 1) { 11540 for (var name in node.attrsMap) { 11541 if (dirRE.test(name)) { 11542 var value = node.attrsMap[name]; 11543 if (value) { 11544 var range = node.rawAttrsMap[name]; 11545 if (name === 'v-for') { 11546 checkFor(node, ("v-for=\"" + value + "\""), warn, range); 11547 } else if (name === 'v-slot' || name[0] === '#') { 11548 checkFunctionParameterExpression(value, (name + "=\"" + value + "\""), warn, range); 11549 } else if (onRE.test(name)) { 11550 checkEvent(value, (name + "=\"" + value + "\""), warn, range); 11551 } else { 11552 checkExpression(value, (name + "=\"" + value + "\""), warn, range); 11553 } 11554 } 11555 } 11556 } 11557 if (node.children) { 11558 for (var i = 0; i < node.children.length; i++) { 11559 checkNode(node.children[i], warn); 11560 } 11561 } 11562 } else if (node.type === 2) { 11563 checkExpression(node.expression, node.text, warn, node); 11564 } 11565 } 11566 11567 function checkEvent (exp, text, warn, range) { 11568 var stripped = exp.replace(stripStringRE, ''); 11569 var keywordMatch = stripped.match(unaryOperatorsRE); 11570 if (keywordMatch && stripped.charAt(keywordMatch.index - 1) !== '$') { 11571 warn( 11572 "avoid using JavaScript unary operator as property name: " + 11573 "\"" + (keywordMatch[0]) + "\" in expression " + (text.trim()), 11574 range 11575 ); 11576 } 11577 checkExpression(exp, text, warn, range); 11578 } 11579 11580 function checkFor (node, text, warn, range) { 11581 checkExpression(node.for || '', text, warn, range); 11582 checkIdentifier(node.alias, 'v-for alias', text, warn, range); 11583 checkIdentifier(node.iterator1, 'v-for iterator', text, warn, range); 11584 checkIdentifier(node.iterator2, 'v-for iterator', text, warn, range); 11585 } 11586 11587 function checkIdentifier ( 11588 ident, 11589 type, 11590 text, 11591 warn, 11592 range 11593 ) { 11594 if (typeof ident === 'string') {
11595 try { 11596 new Function(("var " + ident + "=_")); 11597 } catch (e) { 11598 warn(("invalid " + type + " \"" + ident + "\" in expression: " + (text.trim())), range); 11599 } 11600 } 11601 } 11602 11603 function checkExpression (exp, text, warn, range) { 11604 try { 11605 new Function(("return " + exp)); 11606 } catch (e) { 11607 var keywordMatch = exp.replace(stripStringRE, '').match(prohibitedKeywordRE); 11608 if (keywordMatch) { 11609 warn( 11610 "avoid using JavaScript keyword as property name: " + 11611 "\"" + (keywordMatch[0]) + "\"\n Raw expression: " + (text.trim()), 11612 range 11613 ); 11614 } else { 11615 warn( 11616 "invalid expression: " + (e.message) + " in\n\n" + 11617 " " + exp + "\n\n" + 11618 " Raw expression: " + (text.trim()) + "\n", 11619 range 11620 ); 11621 } 11622 } 11623 } 11624 11625 function checkFunctionParameterExpression (exp, text, warn, range) { 11626 try { 11627 new Function(exp, ''); 11628 } catch (e) { 11629 warn( 11630 "invalid function parameter expression: " + (e.message) + " in\n\n" + 11631 " " + exp + "\n\n" + 11632 " Raw expression: " + (text.trim()) + "\n", 11633 range 11634 ); 11635 } 11636 } 11637 11638 /* */ 11639 11640 var range = 2; 11641 11642 function generateCodeFrame ( 11643 source, 11644 start, 11645 end 11646 ) { 11647 if ( start === void 0 ) start = 0; 11648 if ( end === void 0 ) end = source.length; 11649 11650 var lines = source.split(/\r?\n/); 11651 var count = 0; 11652 var res = []; 11653 for (var i = 0; i < lines.length; i++) { 11654 count += lines[i].length + 1; 11655 if (count >= start) { 11656 for (var j = i - range; j <= i + range || end > count; j++) { 11657 if (j < 0 || j >= lines.length) { continue } 11658 res.push(("" + (j + 1) + (repeat$1(" ", 3 - String(j + 1).length)) + "| " + (lines[j]))); 11659 var lineLength = lines[j].length; 11660 if (j === i) { 11661 // push underline 11662 var pad = start - (count - lineLength) + 1; 11663 var length = end > count ? lineLength - pad : end - start; 11664 res.push(" | " + repeat$1(" ", pad) + repeat$1("^", length)); 11665 } else if (j > i) { 11666 if (end > count) { 11667 var length$1 = Math.min(end - count, lineLength); 11668 res.push(" | " + repeat$1("^", length$1)); 11669 } 11670 count += lineLength + 1; 11671 } 11672 } 11673 break 11674 } 11675 } 11676 return res.join('\n') 11677 } 11678 11679 function repeat$1 (str, n) { 11680 var result = ''; 11681 if (n > 0) { 11682 while (true) { // eslint-disable-line 11683 if (n & 1) { result += str; } 11684 n >>>= 1; 11685 if (n <= 0) { break } 11686 str += str; 11687 } 11688 } 11689 return result 11690 } 11691 11692 /* */ 11693 11694 11695 11696 function createFunction (code, errors) { 11697 try { 11698 return new Function(code) 11699 } catch (err) { 11700 errors.push({ err: err, code: code }); 11701 return noop 11702 } 11703 } 11704 11705 function createCompileToFunctionFn (compile) { 11706 var cache = Object.create(null); 11707 11708 return function compileToFunctions ( 11709 template, 11710 options, 11711 vm 11712 ) { 11713 options = extend({}, options); 11714 var warn$$1 = options.warn || warn; 11715 delete options.warn; 11716 11717 /* istanbul ignore if */ 11718 { 11719 // detect possible CSP restriction 11720 try { 11721 new Function('return 1'); 11722 } catch (e) { 11723 if (e.toString().match(/unsafe-eval|CSP/)) { 11724 warn$$1( 11725 'It seems you are using the standalone build of Vue.js in an ' + 11726 'environment with Content Security Policy that prohibits unsafe-eval. ' + 11727 'The template compiler cannot work in this environment. Consider ' + 11728 'relaxing the policy to allow unsafe-eval or pre-compiling your ' + 11729 'templates into render functions.' 11730 ); 11731 } 11732 } 11733 } 11734 11735 // check cache 11736 var key = options.delimiters 11737 ? String(options.delimiters) + template 11738 : template; 11739 if (cache[key]) { 11740 return cache[key] 11741 } 11742 11743 // compile 11744 var compiled = compile(template, options); 11745 11746 // check compilation errors/tips 11747 { 11748 if (compiled.errors && compiled.errors.length) { 11749 if (options.outputSourceRange) {
11750 compiled.errors.forEach(function (e) { 11751 warn$$1( 11752 "Error compiling template:\n\n" + (e.msg) + "\n\n" + 11753 generateCodeFrame(template, e.start, e.end), 11754 vm 11755 ); 11756 }); 11757 } else { 11758 warn$$1( 11759 "Error compiling template:\n\n" + template + "\n\n" + 11760 compiled.errors.map(function (e) { return ("- " + e); }).join('\n') + '\n', 11761 vm 11762 ); 11763 } 11764 } 11765 if (compiled.tips && compiled.tips.length) { 11766 if (options.outputSourceRange) { 11767 compiled.tips.forEach(function (e) { return tip(e.msg, vm); }); 11768 } else { 11769 compiled.tips.forEach(function (msg) { return tip(msg, vm); }); 11770 } 11771 } 11772 } 11773 11774 // turn code into functions 11775 var res = {}; 11776 var fnGenErrors = []; 11777 res.render = createFunction(compiled.render, fnGenErrors); 11778 res.staticRenderFns = compiled.staticRenderFns.map(function (code) { 11779 return createFunction(code, fnGenErrors) 11780 }); 11781 11782 // check function generation errors. 11783 // this should only happen if there is a bug in the compiler itself. 11784 // mostly for codegen development use 11785 /* istanbul ignore if */ 11786 { 11787 if ((!compiled.errors || !compiled.errors.length) && fnGenErrors.length) { 11788 warn$$1( 11789 "Failed to generate render function:\n\n" + 11790 fnGenErrors.map(function (ref) { 11791 var err = ref.err; 11792 var code = ref.code; 11793 11794 return ((err.toString()) + " in\n\n" + code + "\n"); 11795 }).join('\n'), 11796 vm 11797 ); 11798 } 11799 } 11800 11801 return (cache[key] = res) 11802 } 11803 } 11804 11805 /* */ 11806 11807 function createCompilerCreator (baseCompile) { 11808 return function createCompiler (baseOptions) { 11809 function compile ( 11810 template, 11811 options 11812 ) { 11813 var finalOptions = Object.create(baseOptions); 11814 var errors = []; 11815 var tips = []; 11816 11817 var warn = function (msg, range, tip) { 11818 (tip ? tips : errors).push(msg); 11819 }; 11820 11821 if (options) { 11822 if (options.outputSourceRange) { 11823 // $flow-disable-line 11824 var leadingSpaceLength = template.match(/^\s*/)[0].length; 11825 11826 warn = function (msg, range, tip) { 11827 var data = { msg: msg }; 11828 if (range) { 11829 if (range.start != null) { 11830 data.start = range.start + leadingSpaceLength; 11831 } 11832 if (range.end != null) { 11833 data.end = range.end + leadingSpaceLength; 11834 } 11835 } 11836 (tip ? tips : errors).push(data); 11837 }; 11838 } 11839 // merge custom modules 11840 if (options.modules) { 11841 finalOptions.modules = 11842 (baseOptions.modules || []).concat(options.modules); 11843 } 11844 // merge custom directives 11845 if (options.directives) { 11846 finalOptions.directives = extend( 11847 Object.create(baseOptions.directives || null), 11848 options.directives 11849 ); 11850 } 11851 // copy other options 11852 for (var key in options) { 11853 if (key !== 'modules' && key !== 'directives') { 11854 finalOptions[key] = options[key]; 11855 } 11856 } 11857 } 11858 11859 finalOptions.warn = warn; 11860 11861 var compiled = baseCompile(template.trim(), finalOptions); 11862 { 11863 detectErrors(compiled.ast, warn); 11864 } 11865 compiled.errors = errors; 11866 compiled.tips = tips; 11867 return compiled 11868 } 11869 11870 return { 11871 compile: compile, 11872 compileToFunctions: createCompileToFunctionFn(compile) 11873 } 11874 } 11875 } 11876 11877 /* */ 11878 11879 // `createCompilerCreator` allows creating compilers that use alternative 11880 // parser/optimizer/codegen, e.g the SSR optimizing compiler. 11881 // Here we just export a default compiler using the default parts. 11882 var createCompiler = createCompilerCreator(function baseCompile ( 11883 template, 11884 options 11885 ) { 11886 var ast = parse(template.trim(), options); 11887 if (options.optimize !== false) { 11888 optimize(ast, options); 11889 } 11890 var code = generate(ast, options); 11891 return { 11892 ast: ast, 11893 render: code.render, 11894 staticRenderFns: code.staticRenderFns 11895 } 11896 }); 11897 11898 /* */ 11899 11900 var ref$1 = createCompiler(baseOptions); 11901 var compile = ref$1.compile; 11902 var compileToFunctions = ref$1.compileToFunctions; 11903 11904 /* */ 11905 11906 // check whether current browser encodes a char inside attribute values 11907 var div; 11908 function getShouldDecode (href) { 11909 div = div || document.createElement('div'); 11910 div.innerHTML = href ? "<a href=\"\n\"/>" : "<div a=\"\n\"/>"; 11911 return div.innerHTML.indexOf(' ') > 0 11912 } 11913 11914 // #3663: IE encodes newlines inside attribute values while other browsers don't 11915 var shouldDecodeNewlines = inBrowser ? getShouldDecode(false) : false;
11916 // #6828: chrome encodes content in a[href] 11917 var shouldDecodeNewlinesForHref = inBrowser ? getShouldDecode(true) : false; 11918 11919 /* */ 11920 11921 var idToTemplate = cached(function (id) { 11922 var el = query(id); 11923 return el && el.innerHTML 11924 }); 11925 11926 var mount = Vue.prototype.$mount; 11927 Vue.prototype.$mount = function ( 11928 el, 11929 hydrating 11930 ) { 11931 el = el && query(el); 11932 11933 /* istanbul ignore if */ 11934 if (el === document.body || el === document.documentElement) { 11935 warn( 11936 "Do not mount Vue to <html> or <body> - mount to normal elements instead." 11937 ); 11938 return this 11939 } 11940 11941 var options = this.$options; 11942 // resolve template/el and convert to render function 11943 if (!options.render) { 11944 var template = options.template; 11945 if (template) { 11946 if (typeof template === 'string') { 11947 if (template.charAt(0) === '#') { 11948 template = idToTemplate(template); 11949 /* istanbul ignore if */ 11950 if (!template) { 11951 warn( 11952 ("Template element not found or is empty: " + (options.template)), 11953 this 11954 ); 11955 } 11956 } 11957 } else if (template.nodeType) { 11958 template = template.innerHTML; 11959 } else { 11960 { 11961 warn('invalid template option:' + template, this); 11962 } 11963 return this 11964 } 11965 } else if (el) { 11966 template = getOuterHTML(el); 11967 } 11968 if (template) { 11969 /* istanbul ignore if */ 11970 if (config.performance && mark) { 11971 mark('compile'); 11972 } 11973 11974 var ref = compileToFunctions(template, { 11975 outputSourceRange: "development" !== 'production', 11976 shouldDecodeNewlines: shouldDecodeNewlines, 11977 shouldDecodeNewlinesForHref: shouldDecodeNewlinesForHref, 11978 delimiters: options.delimiters, 11979 comments: options.comments 11980 }, this); 11981 var render = ref.render; 11982 var staticRenderFns = ref.staticRenderFns; 11983 options.render = render; 11984 options.staticRenderFns = staticRenderFns; 11985 11986 /* istanbul ignore if */ 11987 if (config.performance && mark) { 11988 mark('compile end'); 11989 measure(("vue " + (this._name) + " compile"), 'compile', 'compile end'); 11990 } 11991 } 11992 } 11993 return mount.call(this, el, hydrating) 11994 }; 11995 11996 /** 11997 * Get outerHTML of elements, taking care 11998 * of SVG elements in IE as well. 11999 */ 12000 function getOuterHTML (el) { 12001 if (el.outerHTML) { 12002 return el.outerHTML 12003 } else { 12004 var container = document.createElement('div'); 12005 container.appendChild(el.cloneNode(true)); 12006 return container.innerHTML 12007 } 12008 } 12009 12010 Vue.compile = compileToFunctions; 12011 12012 return Vue; 12013 12014}));
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.