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