/*!*Vue.jsv1.0.26*(c)2016EvanYou*ReleasedundertheMITLicense.*/layui.define("jquery",function(exports){ var jQuery=layui.jquery;(function (global, base_factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = base_factory() : typeof define === 'function' && define.amd ? define(base_factory) :(global.Vue = base_factory()); }(this, function () { 'use strict'; function set(obj, key, val) { if (hasOwn(obj, key)) { obj[key] = val; return; } if (obj._isVue) { set(obj._data, key, val); return; } var ob = obj.__ob__; if (!ob) { obj[key] = val; return; } ob.convert(key, val); ob.dep.notify(); if (ob.vms) { var i = ob.vms.length; while (i--) { var vm = ob.vms[i]; vm._proxy(key); vm._digest(); } } return val; } /***Deleteapropertyandtriggerchangeifnecessary.**@param{Object}obj*@param{String}key*/ function del(obj, key) { if (!hasOwn(obj, key)) { return; } delete obj[key]; var ob = obj.__ob__; if (!ob) { if (obj._isVue) { delete obj._data[key]; obj._digest(); } return; } ob.dep.notify(); if (ob.vms) { var i = ob.vms.length; while (i--) { var vm = ob.vms[i]; vm._unproxy(key); vm._digest(); } } } var hasOwnProperty = Object.prototype.hasOwnProperty; /***Checkwhethertheobjecthastheproperty.**@param{Object}obj*@param{String}key*@return{Boolean}*/ function hasOwn(obj, key) { return hasOwnProperty.call(obj, key); } /***Checkifanexpressionisaliteralvalue.**@param{String}exp*@return{Boolean}*/ var literalValueRE = /^\s?(true|false|-?[\d\.]+|'[^']*'|"[^"]*")\s?$/;functionisLiteral(exp){returnliteralValueRE.test(exp);}/** * Check if a string starts with $ or _ * * @param {String} str * @return {Boolean} */functionisReserved(str){varc=(str+'').charCodeAt(0);returnc===0x24||c===0x5F;}/** * Guard text output, make sure undefined outputs * empty string * * @param {*} value * @return {String} */function_toString(value){returnvalue==null?'':value.toString();}/** * Check and convert possible numeric strings to numbers * before setting back to data * * @param {*} value * @return {*|Number} */functiontoNumber(value){if(typeofvalue!=='string'){returnvalue;}else{varparsed=Number(value);returnisNaN(parsed)?value:parsed;}}/** * Convert string boolean literals into real booleans. * * @param {*} value * @return {*|Boolean} */functiontoBoolean(value){returnvalue==='true'?true:value==='false'?false:value;}/** * Strip quotes from a string * * @param {String} str * @return {String | false} */functionstripQuotes(str){vara=str.charCodeAt(0);varb=str.charCodeAt(str.length-1);returna===b&&(a===0x22||a===0x27)?str.slice(1,-1):str;}/** * Camelize a hyphen-delmited string. * * @param {String} str * @return {String} */varcamelizeRE=/-(\w)/g;functioncamelize(str){returnstr.replace(camelizeRE,toUpper);}functiontoUpper(_,c){returnc?c.toUpperCase():'';}/** * Hyphenate a camelCase string. * * @param {String} str * @return {String} */varhyphenateRE=/([a-z\d])([A-Z])/g;functionhyphenate(str){returnstr.replace(hyphenateRE,'$1-$2').toLowerCase();}/** * Converts hyphen/underscore/slashdelimiterednamesinto*camelizedclassNames.**e.g.my-component=>MyComponent*some_else=>SomeElse*some/comp=>SomeComp**@param{String}str*@return{String}*/ var classifyRE = /(?:^|[-_\/])(\w)/g;functionclassify(str){returnstr.replace(classifyRE,toUpper);}/** * Simple bind, faster than native * * @param {Function} fn * @param {Object} ctx * @return {Function} */functionbind(fn,ctx){returnfunction(a){varl=arguments.length;returnl?l>1?fn.apply(ctx,arguments):fn.call(ctx,a):fn.call(ctx);};}/** * Convert an Array-like object to a real Array. * * @param {Array-like} list * @param {Number} [start] - start index * @return {Array} */functiontoArray(list,start){start=start||0;vari=list.length-start;varret=newArray(i);while(i--){ret[i]=list[i+start];}returnret;}/** * Mix properties into target object. * * @param {Object} to * @param {Object} from */functionextend(to,from){varkeys=Object.keys(from);vari=keys.length;while(i--){to[keys[i]]=from[keys[i]];}returnto;}/** * Quick object check - this is primarily used to tell * Objects from primitive values when we know the value * is a JSON-compliant type. * * @param {*} obj * @return {Boolean} */functionisObject(obj){returnobj!==null&&typeofobj==='object';}/** * Strict object type check. Only returns true * for plain JavaScript objects. * * @param {*} obj * @return {Boolean} */vartoString=Object.prototype.toString;varOBJECT_STRING='[object Object]';functionisPlainObject(obj){returntoString.call(obj)===OBJECT_STRING;}/** * Array type check. * * @param {*} obj * @return {Boolean} */varisArray=Array.isArray;/** * Define a property. * * @param {Object} obj * @param {String} key * @param {*} val * @param {Boolean} [enumerable] */functiondef(obj,key,val,enumerable){Object.defineProperty(obj,key,{value:val,enumerable:!!enumerable,writable:true,configurable:true});}/** * Debounce a function so it only gets called after the * input stops arriving after the given wait period. * * @param {Function} func * @param {Number} wait * @return {Function} - the debounced function */function_debounce(func,wait){vartimeout,args,context,timestamp,result;varlater=functionlater(){varlast=Date.now()-timestamp;if(last<wait&&last>=0){timeout=setTimeout(later,wait-last);}else{timeout=null;result=func.apply(context,args);if(!timeout)context=args=null;}};returnfunction(){context=this;args=arguments;timestamp=Date.now();if(!timeout){timeout=setTimeout(later,wait);}returnresult;};}/** * Manual indexOf because it's slightly faster than * native. * * @param {Array} arr * @param {*} obj */functionindexOf(arr,obj){vari=arr.length;while(i--){if(arr[i]===obj)returni;}return-1;}/** * Make a cancellable version of an async callback. * * @param {Function} fn * @return {Function} */functioncancellable(fn){varcb=functioncb(){if(!cb.cancelled){returnfn.apply(this,arguments);}};cb.cancel=function(){cb.cancelled=true;};returncb;}/** * Check if two values are loosely equal - that is, * if they are plain objects, do they have the same shape? * * @param {*} a * @param {*} b * @return {Boolean} */functionlooseEqual(a,b){/* eslint-disable eqeqeq */returna==b||(isObject(a)&&isObject(b)?JSON.stringify(a)===JSON.stringify(b):false);/* eslint-enable eqeqeq */}varhasProto=('__proto__'in{});// Browser environment sniffingvarinBrowser=typeofwindow!=='undefined'&&Object.prototype.toString.call(window)!=='[object Object]';// detect devtoolsvardevtools=inBrowser&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;// UA sniffing for working around browser-specific quirksvarUA=inBrowser&&window.navigator.userAgent.toLowerCase();varisIE=UA&&UA.indexOf('trident')>0;varisIE9=UA&&UA.indexOf('msie 9.0')>0;varisAndroid=UA&&UA.indexOf('android')>0;varisIos=UA&&/(iphone|ipad|ipod|ios)/i.test(UA);variosVersionMatch=isIos&&UA.match(/os ([\d_]+)/);variosVersion=iosVersionMatch&&iosVersionMatch[1].split('_');// detecting iOS UIWebView by indexedDBvarhasMutationObserverBug=iosVersion&&Number(iosVersion[0])>=9&&Number(iosVersion[1])>=3&&!window.indexedDB;vartransitionProp=undefined;vartransitionEndEvent=undefined;varanimationProp=undefined;varanimationEndEvent=undefined;// Transition property/event sniffingif(inBrowser&&!isIE9){varisWebkitTrans=window.ontransitionend===undefined&&window.onwebkittransitionend!==undefined;varisWebkitAnim=window.onanimationend===undefined&&window.onwebkitanimationend!==undefined;transitionProp=isWebkitTrans?'WebkitTransition':'transition';transitionEndEvent=isWebkitTrans?'webkitTransitionEnd':'transitionend';animationProp=isWebkitAnim?'WebkitAnimation':'animation';animationEndEvent=isWebkitAnim?'webkitAnimationEnd':'animationend';}/** * Defer a task to execute it asynchronously. Ideally this * should be executed as a microtask, so we leverage * MutationObserver if it's available, and fallback to * setTimeout(0). * * @param {Function} cb * @param {Object} ctx */varnextTick=(function(){varcallbacks=[];varpending=false;vartimerFunc;functionnextTickHandler(){pending=false;varcopies=callbacks.slice(0);callbacks=[];for(vari=0;i<copies.length;i++){copies[i]();}}/* istanbul ignore if */if(typeofMutationObserver!=='undefined'&&!hasMutationObserverBug){varcounter=1;varobserver=newMutationObserver(nextTickHandler);vartextNode=document.createTextNode(counter);observer.observe(textNode,{characterData:true});timerFunc=function(){counter=(counter+1)%2;textNode.data=counter;};}else{// webpack attempts to inject a shim for setImmediate// if it is used as a global, so we have to work around that to// avoid bundling unnecessary code.varcontext=inBrowser?window:typeofglobal!=='undefined'?global:{};timerFunc=context.setImmediate||setTimeout;}returnfunction(cb,ctx){varfunc=ctx?function(){cb.call(ctx);}:cb;callbacks.push(func);if(pending)return;pending=true;timerFunc(nextTickHandler,0);};})();var_Set=undefined;/* istanbul ignore if */if(typeofSet!=='undefined'&&Set.toString().match(/native code/)){// use native Set when available._Set=Set;}else{// a non-standard Set polyfill that only works with primitive keys._Set=function(){this.set=Object.create(null);};_Set.prototype.has=function(key){returnthis.set[key]!==undefined;};_Set.prototype.add=function(key){this.set[key]=1;};_Set.prototype.clear=function(){this.set=Object.create(null);};}functionCache(limit){this.size=0;this.limit=limit;this.head=this.tail=undefined;this._keymap=Object.create(null);}varp=Cache.prototype;/** * Put <value> into the cache associated with <key>. * Returns the entry which was removed to make room for * the new entry. Otherwise undefined is returned. * (i.e. if there was enough room already). * * @param {String} key * @param {*} value * @return {Entry|undefined} */p.put=function(key,value){varremoved;varentry=this.get(key,true);if(!entry){if(this.size===this.limit){removed=this.shift();}entry={key:key};this._keymap[key]=entry;if(this.tail){this.tail.newer=entry;entry.older=this.tail;}else{this.head=entry;}this.tail=entry;this.size++;}entry.value=value;returnremoved;};/** * Purge the least recently used (oldest) entry from the * cache. Returns the removed entry or undefined if the * cache was empty. */p.shift=function(){varentry=this.head;if(entry){this.head=this.head.newer;this.head.older=undefined;entry.newer=entry.older=undefined;this._keymap[entry.key]=undefined;this.size--;}returnentry;};/** * Get and register recent use of <key>. Returns the value * associated with <key> or undefined if not in cache. * * @param {String} key * @param {Boolean} returnEntry * @return {Entry|*} */p.get=function(key,returnEntry){varentry=this._keymap[key];if(entry===undefined)return;if(entry===this.tail){returnreturnEntry?entry:entry.value;}// HEAD--------------TAIL// <.older .newer>// <--- add direction --// A B C <D> Eif(entry.newer){if(entry===this.head){this.head=entry.newer;}entry.newer.older=entry.older;// C <-- E.}if(entry.older){entry.older.newer=entry.newer;// C. --> E}entry.newer=undefined;// D --xentry.older=this.tail;// D. --> Eif(this.tail){this.tail.newer=entry;// E. <-- D}this.tail=entry;returnreturnEntry?entry:entry.value;};varcache$1=newCache(1000);varfilterTokenRE=/[^\s'"]+|'[^']*'|"[^"]*"/g;varreservedArgRE=/^in$|^-?\d+/;/** * Parser state */varstr;vardir;varc;varprev;vari;varl;varlastFilterIndex;varinSingle;varinDouble;varcurly;varsquare;varparen;/** * Push a filter to the current directive object */functionpushFilter(){varexp=str.slice(lastFilterIndex,i).trim();varfilter;if(exp){filter={};vartokens=exp.match(filterTokenRE);filter.name=tokens[0];if(tokens.length>1){filter.args=tokens.slice(1).map(processFilterArg);}}if(filter){(dir.filters=dir.filters||[]).push(filter);}lastFilterIndex=i+1;}/** * Check if an argument is dynamic and strip quotes. * * @param {String} arg * @return {Object} */functionprocessFilterArg(arg){if(reservedArgRE.test(arg)){return{value:toNumber(arg),dynamic:false};}else{varstripped=stripQuotes(arg);vardynamic=stripped===arg;return{value:dynamic?arg:stripped,dynamic:dynamic};}}/** * Parse a directive value and extract the expression * and its filters into a descriptor. * * Example: * * "a + 1 | uppercase" will yield: * { * expression: 'a + 1', * filters: [ * { name: 'uppercase', args: null } * ] * } * * @param {String} s * @return {Object} */functionparseDirective(s){varhit=cache$1.get(s);if(hit){returnhit;}// reset parser statestr=s;inSingle=inDouble=false;curly=square=paren=0;lastFilterIndex=0;dir={};for(i=0,l=str.length;i<l;i++){prev=c;c=str.charCodeAt(i);if(inSingle){// check single quoteif(c===0x27&&prev!==0x5C)inSingle=!inSingle;}elseif(inDouble){// check double quoteif(c===0x22&&prev!==0x5C)inDouble=!inDouble;}elseif(c===0x7C&&// pipestr.charCodeAt(i+1)!==0x7C&&str.charCodeAt(i-1)!==0x7C){if(dir.expression==null){// first filter, end of expressionlastFilterIndex=i+1;dir.expression=str.slice(0,i).trim();}else{// already has filterpushFilter();}}else{switch(c){case0x22:inDouble=true;break;// "case0x27:inSingle=true;break;// 'case0x28:paren++;break;// (case0x29:paren--;break;// )case0x5B:square++;break;// [case0x5D:square--;break;// ]case0x7B:curly++;break;// {case0x7D:curly--;break;// }}}}if(dir.expression==null){dir.expression=str.slice(0,i).trim();}elseif(lastFilterIndex!==0){pushFilter();}cache$1.put(s,dir);returndir;}vardirective=Object.freeze({parseDirective:parseDirective});varregexEscapeRE=/[-.*+?^${}()|[\]\/\\]/g;varcache=undefined;vartagRE=undefined;varhtmlRE=undefined;/** * Escape a string so it can be used in a RegExp * constructor. * * @param {String} str */functionescapeRegex(str){returnstr.replace(regexEscapeRE,'\\$&');}functioncompileRegex(){varopen=escapeRegex(config.delimiters[0]);varclose=escapeRegex(config.delimiters[1]);varunsafeOpen=escapeRegex(config.unsafeDelimiters[0]);varunsafeClose=escapeRegex(config.unsafeDelimiters[1]);tagRE=newRegExp(unsafeOpen+'((?:.|\\n)+?)'+unsafeClose+'|'+open+'((?:.|\\n)+?)'+close,'g');htmlRE=newRegExp('^'+unsafeOpen+'((?:.|\\n)+?)'+unsafeClose+'$');// reset cachecache=newCache(1000);}/** * Parse a template text string into an array of tokens. * * @param {String} text * @return {Array<Object> | null} * - {String} type * - {String} value * - {Boolean} [html] * - {Boolean} [oneTime] */functionparseText(text){if(!cache){compileRegex();}varhit=cache.get(text);if(hit){returnhit;}if(!tagRE.test(text)){returnnull;}vartokens=[];varlastIndex=tagRE.lastIndex=0;varmatch,index,html,value,first,oneTime;/* eslint-disable no-cond-assign */while(match=tagRE.exec(text)){/* eslint-enable no-cond-assign */index=match.index;// push text tokenif(index>lastIndex){tokens.push({value:text.slice(lastIndex,index)});}// tag tokenhtml=htmlRE.test(match[0]);value=html?match[1]:match[2];first=value.charCodeAt(0);oneTime=first===42;// *value=oneTime?value.slice(1):value;tokens.push({tag:true,value:value.trim(),html:html,oneTime:oneTime});lastIndex=index+match[0].length;}if(lastIndex<text.length){tokens.push({value:text.slice(lastIndex)});}cache.put(text,tokens);returntokens;}/** * Format a list of tokens into an expression. * e.g. tokens parsed from 'a {{b}} c' can be serialized * into one single expression as '"a " + b + " c"'. * * @param {Array} tokens * @param {Vue} [vm] * @return {String} */functiontokensToExp(tokens,vm){if(tokens.length>1){returntokens.map(function(token){returnformatToken(token,vm);}).join('+');}else{returnformatToken(tokens[0],vm,true);}}/** * Format a single token. * * @param {Object} token * @param {Vue} [vm] * @param {Boolean} [single] * @return {String} */functionformatToken(token,vm,single){returntoken.tag?token.oneTime&&vm?'"'+vm.$eval(token.value)+'"':inlineFilters(token.value,single):'"'+token.value+'"';}/** * For an attribute with multiple interpolation tags, * e.g. attr="some-{{thing | filter}}", in order to combine * the whole thing into a single watchable expression, we * have to inline those filters. This function does exactly * that. This is a bit hacky but it avoids heavy changes * to directive parser and watcher mechanism. * * @param {String} exp * @param {Boolean} single * @return {String} */varfilterRE=/[^|]\|[^|]/;functioninlineFilters(exp,single){if(!filterRE.test(exp)){returnsingle?exp:'('+exp+')';}else{vardir=parseDirective(exp);if(!dir.filters){return'('+exp+')';}else{return'this._applyFilters('+dir.expression+// value',null,'+// oldValue (null for read)JSON.stringify(dir.filters)+// filter descriptors',false)';// write?}}}vartext=Object.freeze({compileRegex:compileRegex,parseText:parseText,tokensToExp:tokensToExp});vardelimiters=['{{','}}'];varunsafeDelimiters=['{{{','}}}'];varconfig=Object.defineProperties({/***Whethertoprintdebugmessages.*Alsoenablesstacktraceforwarnings.**@type{Boolean}*/ debug: false, /***Whethertosuppresswarnings.**@type{Boolean}*/ silent: false, /***Whethertouseasyncrendering.*/ async: true, /***Whethertowarnagainsterrorscaughtwhenevaluating*expressions.*/ warnExpressionErrors: true, /***Whethertoallowdevtoolsinspection.*Disabledbydefaultinproductionbuilds.*/ devtools: 'development' !== 'production', /***Internalflagtoindicatethedelimitershavebeen*changed.**@type{Boolean}*/ _delimitersChanged: true, /***Listofassettypesthatacomponentcanown.**@type{Array}*/ _assetTypes: ['component', 'directive', 'elementDirective', 'filter', 'transition', 'partial'], /***propbindingmodes*/ _propBindingModes: { ONE_WAY: 0, TWO_WAY: 1, ONE_TIME: 2 }, /***Maxcircularupdatesallowedinabatcherflushcycle.*/ _maxUpdateCount: 100 }, { delimiters: { /***Interpolationdelimiters.Changingthesewouldtrigger*thetextparsertore-compiletheregularexpressions.**@type{Array<String>}*/ get: function get() { return delimiters; }, set: function set(val) { delimiters = val; compileRegex(); }, configurable: true, enumerable: true }, unsafeDelimiters: { get: function get() { return unsafeDelimiters; }, set: function set(val) { unsafeDelimiters = val; compileRegex(); }, configurable: true, enumerable: true } }); var warn = undefined; var formatComponentName = undefined; if ('development' !== 'production') {(function () { var hasConsole = typeof console !== 'undefined'; warn = function (msg, vm) { if (hasConsole && !config.silent) { console.error('[Vue warn]: ' + msg + (vm ? formatComponentName(vm) : '')); } }; formatComponentName = function (vm) { var name = vm._isVue ? vm.$options.name : vm.name; return name ? ' (found in component: <' + hyphenate(name) + '>)' : ''; }; })(); } /***Appendwithtransition.**@param{Element}el*@param{Element}target*@param{Vue}vm*@param{Function}[cb]*/ function appendWithTransition(el, target, vm, cb) { applyTransition(el, 1, function () { target.appendChild(el); }, vm, cb); } /***InsertBeforewithtransition.**@param{Element}el*@param{Element}target*@param{Vue}vm*@param{Function}[cb]*/ function beforeWithTransition(el, target, vm, cb) { applyTransition(el, 1, function () { before(el, target); }, vm, cb); } /***Removewithtransition.**@param{Element}el*@param{Vue}vm*@param{Function}[cb]*/ function removeWithTransition(el, vm, cb) { applyTransition(el, -1, function () { remove(el); }, vm, cb); } /***Applytransitionswithanoperationcallback.**@param{Element}el*@param{Number}direction*1:enter*-1:leave*@param{Function}op-theactualDOMoperation*@param{Vue}vm*@param{Function}[cb]*/ function applyTransition(el, direction, op, vm, cb) { var transition = el.__v_trans; if (!transition || //skipiftherearenojshooksandCSStransitionis// not supported!transition.hooks&&!transitionEndEvent||// skip transitions for initial compile!vm._isCompiled||// if the vm is being manipulated by a parent directive// during the parent's compilation phase, skip the// animation.vm.$parent&&!vm.$parent._isCompiled){op();if(cb)cb();return;}varaction=direction>0?'enter':'leave';transition[action](op,cb);}vartransition=Object.freeze({appendWithTransition:appendWithTransition,beforeWithTransition:beforeWithTransition,removeWithTransition:removeWithTransition,applyTransition:applyTransition});/** * Query an element selector if it's not an element already. * * @param {String|Element} el * @return {Element} */functionquery(el){if(typeofel==='string'){varselector=el;el=document.querySelector(el);if(!el){'development'!=='production'&&warn('Cannot find element: '+selector);}}returnel;}/** * Check if a node is in the document. * Note: document.documentElement.contains should work here * but always returns false for comment nodes in phantomjs, * making unit tests difficult. This is fixed by doing the * contains() check on the node's parentNode instead of * the node itself. * * @param {Node} node * @return {Boolean} */functioninDoc(node){if(!node)returnfalse;vardoc=node.ownerDocument.documentElement;varparent=node.parentNode;returndoc===node||doc===parent||!!(parent&&parent.nodeType===1&&doc.contains(parent));}/** * Get and remove an attribute from a node. * * @param {Node} node * @param {String} _attr */functiongetAttr(node,_attr){varval=node.getAttribute(_attr);if(val!==null){node.removeAttribute(_attr);}returnval;}/** * Get an attribute with colon or v-bind: prefix. * * @param {Node} node * @param {String} name * @return {String|null} */functiongetBindAttr(node,name){varval=getAttr(node,':'+name);if(val===null){val=getAttr(node,'v-bind:'+name);}returnval;}/** * Check the presence of a bind attribute. * * @param {Node} node * @param {String} name * @return {Boolean} */functionhasBindAttr(node,name){returnnode.hasAttribute(name)||node.hasAttribute(':'+name)||node.hasAttribute('v-bind:'+name);}/** * Insert el before target * * @param {Element} el * @param {Element} target */functionbefore(el,target){target.parentNode.insertBefore(el,target);}/** * Insert el after target * * @param {Element} el * @param {Element} target */functionafter(el,target){if(target.nextSibling){before(el,target.nextSibling);}else{target.parentNode.appendChild(el);}}/** * Remove el from DOM * * @param {Element} el */functionremove(el){el.parentNode.removeChild(el);}/** * Prepend el to target * * @param {Element} el * @param {Element} target */functionprepend(el,target){if(target.firstChild){before(el,target.firstChild);}else{target.appendChild(el);}}/** * Replace target with el * * @param {Element} target * @param {Element} el */functionreplace(target,el){varparent=target.parentNode;if(parent){parent.replaceChild(el,target);}}/** * Add event listener shorthand. * * @param {Element} el * @param {String} event * @param {Function} cb * @param {Boolean} [useCapture] */functionon(el,event,cb,useCapture){el.addEventListener(event,cb,useCapture);}/** * Remove event listener shorthand. * * @param {Element} el * @param {String} event * @param {Function} cb */functionoff(el,event,cb){el.removeEventListener(event,cb);}/** * For IE9 compat: when both class and :class are present * getAttribute('class') returns wrong value... * * @param {Element} el * @return {String} */functiongetClass(el){varclassname=el.className;if(typeofclassname==='object'){classname=classname.baseVal||'';}returnclassname;}/** * In IE9, setAttribute('class') will result in empty class * if the element also has the :class attribute; However in * PhantomJS, setting `className` does not work on SVG elements... * So we have to do a conditional check here. * * @param {Element} el * @param {String} cls */functionsetClass(el,cls){/* istanbul ignore if */if(isIE9&&!/svg$/.test(el.namespaceURI)){el.className=cls;}else{el.setAttribute('class',cls);}}/** * Add class with compatibility for IE & SVG * * @param {Element} el * @param {String} cls */functionaddClass(el,cls){if(el.classList){el.classList.add(cls);}else{varcur=' '+getClass(el)+' ';if(cur.indexOf(' '+cls+' ')<0){setClass(el,(cur+cls).trim());}}}/** * Remove class with compatibility for IE & SVG * * @param {Element} el * @param {String} cls */functionremoveClass(el,cls){if(el.classList){el.classList.remove(cls);}else{varcur=' '+getClass(el)+' ';vartar=' '+cls+' ';while(cur.indexOf(tar)>=0){cur=cur.replace(tar,' ');}setClass(el,cur.trim());}if(!el.className){el.removeAttribute('class');}}/** * Extract raw content inside an element into a temporary * container div * * @param {Element} el * @param {Boolean} asFragment * @return {Element|DocumentFragment} */functionextractContent(el,asFragment){varchild;varrawContent;/* istanbul ignore if */if(isTemplate(el)&&isFragment(el.content)){el=el.content;}if(el.hasChildNodes()){trimNode(el);rawContent=asFragment?document.createDocumentFragment():document.createElement('div');/* eslint-disable no-cond-assign */while(child=el.firstChild){/* eslint-enable no-cond-assign */rawContent.appendChild(child);}}returnrawContent;}/** * Trim possible empty head/tailtextandcomment*nodesinsideaparent.**@param{Node}node*/ function trimNode(node) { var child; /*eslint-disableno-sequences*/ while ((child = node.firstChild, isTrimmable(child))) { node.removeChild(child); } while ((child = node.lastChild, isTrimmable(child))) { node.removeChild(child); } /*eslint-enableno-sequences*/ } function isTrimmable(node) { return node && (node.nodeType === 3 && !node.data.trim() || node.nodeType === 8); } /***Checkifanelementisatemplatetag.*NoteifthetemplateappearsinsideanSVGitstagName*willbeinlowercase.**@param{Element}el*/ function isTemplate(el) { return el.tagName && el.tagName.toLowerCase() === 'template'; } /***Createan"anchor"forperformingdominsertion/removals.*Thisisusedinanumberofscenarios:*-fragmentinstance*-v-html*-v-if*-v-for*-component**@param{String}content*@param{Boolean}persist-IEtrashesemptytextNodeson*cloneNode(true),soincertain*casestheanchorneedstobe*non-emptytobepersistedin*templates.*@return{Comment|Text}*/ function createAnchor(content, persist) { var anchor = config.debug ? document.createComment(content) : document.createTextNode(persist ? ' ' : ''); anchor.__v_anchor = true; return anchor; } /***Findacomponentrefattributethatstartswith$.**@param{Element}node*@return{String|undefined}*/ var refRE = /^v-ref:/; function findRef(node) { if (node.hasAttributes()) { var attrs = node.attributes; for (var i = 0, l = attrs.length; i < l; i++) { var name = attrs[i].name; if (refRE.test(name)) { return camelize(name.replace(refRE, '')); } } } } /***Mapafunctiontoarangeofnodes.**@param{Node}node*@param{Node}end*@param{Function}op*/ function mapNodeRange(node, end, op) { var next; while (node !== end) { next = node.nextSibling; op(node); node = next; } op(end); } /***Removearangeofnodeswithtransition,store*thenodesinafragmentwithcorrectordering,*andcallcallbackwhendone.**@param{Node}start*@param{Node}end*@param{Vue}vm*@param{DocumentFragment}frag*@param{Function}cb*/ function removeNodeRange(start, end, vm, frag, cb) { var done = false; var removed = 0; var nodes = []; mapNodeRange(start, end, function (node) { if (node === end) done = true; nodes.push(node); removeWithTransition(node, vm, onRemoved); }); function onRemoved() { removed++; if (done && removed >= nodes.length) { for (var i = 0; i < nodes.length; i++) { frag.appendChild(nodes[i]); } cb && cb(); } } } /***CheckifanodeisaDocumentFragment.**@param{Node}node*@return{Boolean}*/ function isFragment(node) { return node && node.nodeType === 11; } /***GetouterHTMLofelements,takingcare*ofSVGelementsinIEaswell.**@param{Element}el*@return{String}*/ function getOuterHTML(el) { if (el.outerHTML) { return el.outerHTML; } else { var container = document.createElement('div'); container.appendChild(el.cloneNode(true)); return container.innerHTML; } } var commonTagRE = /^(div|p|span|img|a|b|i|br|ul|ol|li|h1|h2|h3|h4|h5|h6|code|pre|table|th|td|tr|form|label|input|select|option|nav|article|section|header|footer)$/i;varreservedTagRE=/^(slot|partial|component)$/i;varisUnknownElement=undefined;if('development'!=='production'){isUnknownElement=function(el,tag){if(tag.indexOf('-')>-1){// http://stackoverflow.com/a/28210364/1070244returnel.constructor===window.HTMLUnknownElement||el.constructor===window.HTMLElement;}else{return(/HTMLUnknownElement/.test(el.toString())&&// Chrome returns unknown for several HTML5 elements.// https://code.google.com/p/chromium/issues/detail?id=540526// Firefox returns unknown for some "Interactive elements."!/^(data|time|rtc|rb|details|dialog|summary)$/.test(tag));}};}/** * Check if an element is a component, if yes return its * component id. * * @param {Element} el * @param {Object} options * @return {Object|undefined} */functioncheckComponentAttr(el,options){vartag=el.tagName.toLowerCase();varhasAttrs=el.hasAttributes();if(!commonTagRE.test(tag)&&!reservedTagRE.test(tag)){if(resolveAsset(options,'components',tag)){return{id:tag};}else{varis=hasAttrs&&getIsBinding(el,options);if(is){returnis;}elseif('development'!=='production'){varexpectedTag=options._componentNameMap&&options._componentNameMap[tag];if(expectedTag){warn('Unknown custom element: <'+tag+'> - '+'did you mean <'+expectedTag+'>? '+'HTML is case-insensitive, remember to use kebab-case in templates.');}elseif(isUnknownElement(el,tag)){warn('Unknown custom element: <'+tag+'> - did you '+'register the component correctly? For recursive components, '+'make sure to provide the "name" option.');}}}}elseif(hasAttrs){returngetIsBinding(el,options);}}/** * Get "is" binding from an element. * * @param {Element} el * @param {Object} options * @return {Object|undefined} */functiongetIsBinding(el,options){// dynamic syntaxvarexp=el.getAttribute('is');if(exp!=null){if(resolveAsset(options,'components',exp)){el.removeAttribute('is');return{id:exp};}}else{exp=getBindAttr(el,'is');if(exp!=null){return{id:exp,dynamic:true};}}}/** * Option overwriting strategies are functions that handle * how to merge a parent option value and a child option * value into the final value. * * All strategy functions follow the same signature: * * @param {*} parentVal * @param {*} childVal * @param {Vue} [vm] */varstrats=config.optionMergeStrategies=Object.create(null);/** * Helper that recursively merges two data objects together. */functionmergeData(to,from){varkey,toVal,fromVal;for(keyinfrom){toVal=to[key];fromVal=from[key];if(!hasOwn(to,key)){set(to,key,fromVal);}elseif(isObject(toVal)&&isObject(fromVal)){mergeData(toVal,fromVal);}}returnto;}/** * Data */strats.data=function(parentVal,childVal,vm){if(!vm){// in a Vue.extend merge, both should be functionsif(!childVal){returnparentVal;}if(typeofchildVal!=='function'){'development'!=='production'&&warn('The "data" option should be a function '+'that returns a per-instance value in component '+'definitions.',vm);returnparentVal;}if(!parentVal){returnchildVal;}// when parentVal & childVal are both present,// we need to return a function that returns the// merged result of both functions... no need to// check if parentVal is a function here because// it has to be a function to pass previous merges.returnfunctionmergedDataFn(){returnmergeData(childVal.call(this),parentVal.call(this));};}elseif(parentVal||childVal){returnfunctionmergedInstanceDataFn(){// instance mergevarinstanceData=typeofchildVal==='function'?childVal.call(vm):childVal;vardefaultData=typeofparentVal==='function'?parentVal.call(vm):undefined;if(instanceData){returnmergeData(instanceData,defaultData);}else{returndefaultData;}};}};/** * El */strats.el=function(parentVal,childVal,vm){if(!vm&&childVal&&typeofchildVal!=='function'){'development'!=='production'&&warn('The "el" option should be a function '+'that returns a per-instance value in component '+'definitions.',vm);return;}varret=childVal||parentVal;// invoke the element base_factory if this is instance mergereturnvm&&typeofret==='function'?ret.call(vm):ret;};/** * Hooks and param attributes are merged as arrays. */strats.init=strats.created=strats.ready=strats.attached=strats.detached=strats.beforeCompile=strats.compiled=strats.beforeDestroy=strats.destroyed=strats.activate=function(parentVal,childVal){returnchildVal?parentVal?parentVal.concat(childVal):isArray(childVal)?childVal:[childVal]:parentVal;};/** * Assets * * When a vm is present (instance creation), we need to do * a three-way merge between constructor options, instance * options and parent options. */functionmergeAssets(parentVal,childVal){varres=Object.create(parentVal||null);returnchildVal?extend(res,guardArrayAssets(childVal)):res;}config._assetTypes.forEach(function(type){strats[type+'s']=mergeAssets;});/** * Events & Watchers. * * Events & watchers hashes should not overwrite one * another, so we merge them as arrays. */strats.watch=strats.events=function(parentVal,childVal){if(!childVal)returnparentVal;if(!parentVal)returnchildVal;varret={};extend(ret,parentVal);for(varkeyinchildVal){varparent=ret[key];varchild=childVal[key];if(parent&&!isArray(parent)){parent=[parent];}ret[key]=parent?parent.concat(child):[child];}returnret;};/** * Other object hashes. */strats.props=strats.methods=strats.computed=function(parentVal,childVal){if(!childVal)returnparentVal;if(!parentVal)returnchildVal;varret=Object.create(null);extend(ret,parentVal);extend(ret,childVal);returnret;};/** * Default strategy. */vardefaultStrat=functiondefaultStrat(parentVal,childVal){returnchildVal===undefined?parentVal:childVal;};/** * Make sure component options get converted to actual * constructors. * * @param {Object} options */functionguardComponents(options){if(options.components){varcomponents=options.components=guardArrayAssets(options.components);varids=Object.keys(components);vardef;if('development'!=='production'){varmap=options._componentNameMap={};}for(vari=0,l=ids.length;i<l;i++){varkey=ids[i];if(commonTagRE.test(key)||reservedTagRE.test(key)){'development'!=='production'&&warn('Do not use built-in or reserved HTML elements as component '+'id: '+key);continue;}// record a all lowercase <-> kebab-case mapping for// possible custom element case error warningif('development'!=='production'){map[key.replace(/-/g,'').toLowerCase()]=hyphenate(key);}def=components[key];if(isPlainObject(def)){components[key]=Vue.extend(def);}}}}/** * Ensure all props option syntax are normalized into the * Object-based format. * * @param {Object} options */functionguardProps(options){varprops=options.props;vari,val;if(isArray(props)){options.props={};i=props.length;while(i--){val=props[i];if(typeofval==='string'){options.props[val]=null;}elseif(val.name){options.props[val.name]=val;}}}elseif(isPlainObject(props)){varkeys=Object.keys(props);i=keys.length;while(i--){val=props[keys[i]];if(typeofval==='function'){props[keys[i]]={type:val};}}}}/** * Guard an Array-format assets option and converted it * into the key-value Object format. * * @param {Object|Array} assets * @return {Object} */functionguardArrayAssets(assets){if(isArray(assets)){varres={};vari=assets.length;varasset;while(i--){asset=assets[i];varid=typeofasset==='function'?asset.options&&asset.options.name||asset.id:asset.name||asset.id;if(!id){'development'!=='production'&&warn('Array-syntax assets must provide a "name" or "id" field.');}else{res[id]=asset;}}returnres;}returnassets;}/** * Merge two option objects into a new one. * Core utility used in both instantiation and inheritance. * * @param {Object} parent * @param {Object} child * @param {Vue} [vm] - if vm is present, indicates this is * an instantiation merge. */functionmergeOptions(parent,child,vm){guardComponents(child);guardProps(child);if('development'!=='production'){if(child.propsData&&!vm){warn('propsData can only be used as an instantiation option.');}}varoptions={};varkey;if(child['extends']){parent=typeofchild['extends']==='function'?mergeOptions(parent,child['extends'].options,vm):mergeOptions(parent,child['extends'],vm);}if(child.mixins){for(vari=0,l=child.mixins.length;i<l;i++){varmixin=child.mixins[i];varmixinOptions=mixin.prototypeinstanceofVue?mixin.options:mixin;parent=mergeOptions(parent,mixinOptions,vm);}}for(keyinparent){mergeField(key);}for(keyinchild){if(!hasOwn(parent,key)){mergeField(key);}}functionmergeField(key){varstrat=strats[key]||defaultStrat;options[key]=strat(parent[key],child[key],vm,key);}returnoptions;}/** * Resolve an asset. * This function is used because child instances need access * to assets defined in its ancestor chain. * * @param {Object} options * @param {String} type * @param {String} id * @param {Boolean} warnMissing * @return {Object|Function} */functionresolveAsset(options,type,id,warnMissing){/* istanbul ignore if */if(typeofid!=='string'){return;}varassets=options[type];varcamelizedId;varres=assets[id]||// camelCase IDassets[camelizedId=camelize(id)]||// Pascal Case IDassets[camelizedId.charAt(0).toUpperCase()+camelizedId.slice(1)];if('development'!=='production'&&warnMissing&&!res){warn('Failed to resolve '+type.slice(0,-1)+': '+id,options);}returnres;}varuid$1=0;/** * A dep is an observable that can have multiple * directives subscribing to it. * * @constructor */functionDep(){this.id=uid$1++;this.subs=[];}// the current target watcher being evaluated.// this is globally unique because there could be only one// watcher being evaluated at any time.Dep.target=null;/** * Add a directive subscriber. * * @param {Directive} sub */Dep.prototype.addSub=function(sub){this.subs.push(sub);};/** * Remove a directive subscriber. * * @param {Directive} sub */Dep.prototype.removeSub=function(sub){this.subs.$remove(sub);};/** * Add self as a dependency to the target watcher. */Dep.prototype.depend=function(){Dep.target.addDep(this);};/** * Notify all subscribers of a new value. */Dep.prototype.notify=function(){// stablize the subscriber list firstvarsubs=toArray(this.subs);for(vari=0,l=subs.length;i<l;i++){subs[i].update();}};vararrayProto=Array.prototype;vararrayMethods=Object.create(arrayProto)/***Interceptmutatingmethodsandemitevents*/ ;['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'].forEach(function (method) { //cacheoriginalmethodvaroriginal=arrayProto[method];def(arrayMethods,method,functionmutator(){// avoid leaking arguments:// http://jsperf.com/closure-with-argumentsvari=arguments.length;varargs=newArray(i);while(i--){args[i]=arguments[i];}varresult=original.apply(this,args);varob=this.__ob__;varinserted;switch(method){case'push':inserted=args;break;case'unshift':inserted=args;break;case'splice':inserted=args.slice(2);break;}if(inserted)ob.observeArray(inserted);// notify changeob.dep.notify();returnresult;});});/** * Swap the element at the given index with a new value * and emits corresponding event. * * @param {Number} index * @param {*} val * @return {*} - replaced element */def(arrayProto,'$set',function$set(index,val){if(index>=this.length){this.length=Number(index)+1;}returnthis.splice(index,1,val)[0];});/** * Convenience method to remove the element at given index or target element reference. * * @param {*} item */def(arrayProto,'$remove',function$remove(item){/* istanbul ignore if */if(!this.length)return;varindex=indexOf(this,item);if(index>-1){returnthis.splice(index,1);}});vararrayKeys=Object.getOwnPropertyNames(arrayMethods);/** * By default, when a reactive property is set, the new value is * also converted to become reactive. However in certain cases, e.g. * v-for scope alias and props, we don't want to force conversion * because the value may be a nested value under a frozen data structure. * * So whenever we want to set a reactive property without forcing * conversion on the new value, we wrap that call inside this function. */varshouldConvert=true;functionwithoutConversion(fn){shouldConvert=false;fn();shouldConvert=true;}/** * Observer class that are attached to each observed * object. Once attached, the observer converts target * object's property keys into getter/settersthat*collectdependenciesanddispatchesupdates.**@param{Array|Object}value*@constructor*/ function Observer(value) { this.value = value; this.dep = new Dep(); def(value, '__ob__', this); if (isArray(value)) { var augment = hasProto ? protoAugment : copyAugment; augment(value, arrayMethods, arrayKeys); this.observeArray(value); } else { this.walk(value); } } //Instancemethods/***Walkthrougheachpropertyandconverttheminto*getter/setters.Thismethodshouldonlybecalledwhen*valuetypeisObject.**@param{Object}obj*/ Observer.prototype.walk = function (obj) { var keys = Object.keys(obj); for (var i = 0, l = keys.length; i < l; i++) { this.convert(keys[i], obj[keys[i]]); } }; /***ObservealistofArrayitems.**@param{Array}items*/ Observer.prototype.observeArray = function (items) { for (var i = 0, l = items.length; i < l; i++) { observe(items[i]); } }; /***Convertapropertyintogetter/settersowecanemit*theeventswhenthepropertyisaccessed/changed.**@param{String}key*@param{*}val*/ Observer.prototype.convert = function (key, val) { defineReactive(this.value, key, val); }; /***Addanownervm,sothatwhen$set/$deletemutations*happenwecannotifyownervmstoproxythekeysand*digestthewatchers.Thisisonlycalledwhentheobject*isobservedasaninstance'sroot$data.**@param{Vue}vm*/ Observer.prototype.addVm = function (vm) {(this.vms || (this.vms = [])).push(vm); }; /***Removeanownervm.Thisiscalledwhentheobjectis*swappedoutasaninstance's$dataobject.**@param{Vue}vm*/ Observer.prototype.removeVm = function (vm) { this.vms.$remove(vm); }; //helpers/***AugmentantargetObjectorArraybyintercepting*theprototypechainusing__proto__**@param{Object|Array}target*@param{Object}src*/ function protoAugment(target, src) { /*eslint-disableno-proto*/ target.__proto__ = src; /*eslint-enableno-proto*/ } /***AugmentantargetObjectorArraybydefining*hiddenproperties.**@param{Object|Array}target*@param{Object}proto*/ function copyAugment(target, src, keys) { for (var i = 0, l = keys.length; i < l; i++) { var key = keys[i]; def(target, key, src[key]); } } /***Attempttocreateanobserverinstanceforavalue,*returnsthenewobserverifsuccessfullyobserved,*ortheexistingobserverifthevaluealreadyhasone.**@param{*}value*@param{Vue}[vm]*@return{Observer|undefined}*@static*/ function observe(value, vm) { if (!value || typeof value !== 'object') { return; } var ob; if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) { ob = value.__ob__; } else if (shouldConvert && (isArray(value) || isPlainObject(value)) && Object.isExtensible(value) && !value._isVue) { ob = new Observer(value); } if (ob && vm) { ob.addVm(vm); } return ob; } /***DefineareactivepropertyonanObject.**@param{Object}obj*@param{String}key*@param{*}val*/ function defineReactive(obj, key, val) { var dep = new Dep(); var property = Object.getOwnPropertyDescriptor(obj, key); if (property && property.configurable === false) { return; } //caterforpre-definedgetter/settersvargetter=property&&property.get;varsetter=property&&property.set;varchildOb=observe(val);Object.defineProperty(obj,key,{enumerable:true,configurable:true,get:functionreactiveGetter(){varvalue=getter?getter.call(obj):val;if(Dep.target){dep.depend();if(childOb){childOb.dep.depend();}if(isArray(value)){for(vare,i=0,l=value.length;i<l;i++){e=value[i];e&&e.__ob__&&e.__ob__.dep.depend();}}}returnvalue;},set:functionreactiveSetter(newVal){varvalue=getter?getter.call(obj):val;if(newVal===value){return;}if(setter){setter.call(obj,newVal);}else{val=newVal;}childOb=observe(newVal);dep.notify();}});}varutil=Object.freeze({defineReactive:defineReactive,set:set,del:del,hasOwn:hasOwn,isLiteral:isLiteral,isReserved:isReserved,_toString:_toString,toNumber:toNumber,toBoolean:toBoolean,stripQuotes:stripQuotes,camelize:camelize,hyphenate:hyphenate,classify:classify,bind:bind,toArray:toArray,extend:extend,isObject:isObject,isPlainObject:isPlainObject,def:def,debounce:_debounce,indexOf:indexOf,cancellable:cancellable,looseEqual:looseEqual,isArray:isArray,hasProto:hasProto,inBrowser:inBrowser,devtools:devtools,isIE:isIE,isIE9:isIE9,isAndroid:isAndroid,isIos:isIos,iosVersionMatch:iosVersionMatch,iosVersion:iosVersion,hasMutationObserverBug:hasMutationObserverBug,gettransitionProp(){returntransitionProp;},gettransitionEndEvent(){returntransitionEndEvent;},getanimationProp(){returnanimationProp;},getanimationEndEvent(){returnanimationEndEvent;},nextTick:nextTick,get_Set(){return_Set;},query:query,inDoc:inDoc,getAttr:getAttr,getBindAttr:getBindAttr,hasBindAttr:hasBindAttr,before:before,after:after,remove:remove,prepend:prepend,replace:replace,on:on,off:off,setClass:setClass,addClass:addClass,removeClass:removeClass,extractContent:extractContent,trimNode:trimNode,isTemplate:isTemplate,createAnchor:createAnchor,findRef:findRef,mapNodeRange:mapNodeRange,removeNodeRange:removeNodeRange,isFragment:isFragment,getOuterHTML:getOuterHTML,mergeOptions:mergeOptions,resolveAsset:resolveAsset,checkComponentAttr:checkComponentAttr,commonTagRE:commonTagRE,reservedTagRE:reservedTagRE,getwarn(){returnwarn;}});varuid=0;functioninitMixin(Vue){/** * The main init sequence. This is called for every * instance, including ones that are created from extended * constructors. * * @param {Object} options - this options object should be * the result of merging class * options and the options passed * in to the constructor. */Vue.prototype._init=function(options){options=options||{};this.$el=null;this.$parent=options.parent;this.$root=this.$parent?this.$parent.$root:this;this.$children=[];this.$refs={};// child vm referencesthis.$els={};// element referencesthis._watchers=[];// all watchers as an arraythis._directives=[];// all directives// a uidthis._uid=uid++;// a flag to avoid this being observedthis._isVue=true;// events bookkeepingthis._events={};// registered callbacksthis._eventsCount={};// for $broadcast optimization// fragment instance propertiesthis._isFragment=false;this._fragment=// @type {DocumentFragment}this._fragmentStart=// @type {Text|Comment}this._fragmentEnd=null;// @type {Text|Comment}// lifecycle statethis._isCompiled=this._isDestroyed=this._isReady=this._isAttached=this._isBeingDestroyed=this._vForRemoving=false;this._unlinkFn=null;// context:// if this is a transcluded component, context// will be the common parent vm of this instance// and its host.this._context=options._context||this.$parent;// scope:// if this is inside an inline v-for, the scope// will be the intermediate scope created for this// repeat fragment. this is used for linking props// and container directives.this._scope=options._scope;// fragment:// if this instance is compiled inside a Fragment, it// needs to reigster itself as a child of that fragment// for attach/detach to work properly.this._frag=options._frag;if(this._frag){this._frag.children.push(this);}// push self into parent / transclusion hostif(this.$parent){this.$parent.$children.push(this);}// merge options.options=this.$options=mergeOptions(this.constructor.options,options,this);// set refthis._updateRef();// initialize data as empty object.// it will be filled up in _initData().this._data={};// call init hookthis._callHook('init');// initialize data observation and scope inheritance.this._initState();// setup event system and option events.this._initEvents();// call created hookthis._callHook('created');// if `el` option is passed, start compilation.if(options.el){this.$mount(options.el);}};}varpathCache=newCache(1000);// actionsvarAPPEND=0;varPUSH=1;varINC_SUB_PATH_DEPTH=2;varPUSH_SUB_PATH=3;// statesvarBEFORE_PATH=0;varIN_PATH=1;varBEFORE_IDENT=2;varIN_IDENT=3;varIN_SUB_PATH=4;varIN_SINGLE_QUOTE=5;varIN_DOUBLE_QUOTE=6;varAFTER_PATH=7;varERROR=8;varpathStateMachine=[];pathStateMachine[BEFORE_PATH]={'ws':[BEFORE_PATH],'ident':[IN_IDENT,APPEND],'[':[IN_SUB_PATH],'eof':[AFTER_PATH]};pathStateMachine[IN_PATH]={'ws':[IN_PATH],'.':[BEFORE_IDENT],'[':[IN_SUB_PATH],'eof':[AFTER_PATH]};pathStateMachine[BEFORE_IDENT]={'ws':[BEFORE_IDENT],'ident':[IN_IDENT,APPEND]};pathStateMachine[IN_IDENT]={'ident':[IN_IDENT,APPEND],'0':[IN_IDENT,APPEND],'number':[IN_IDENT,APPEND],'ws':[IN_PATH,PUSH],'.':[BEFORE_IDENT,PUSH],'[':[IN_SUB_PATH,PUSH],'eof':[AFTER_PATH,PUSH]};pathStateMachine[IN_SUB_PATH]={"'":[IN_SINGLE_QUOTE,APPEND],'"':[IN_DOUBLE_QUOTE,APPEND],'[':[IN_SUB_PATH,INC_SUB_PATH_DEPTH],']':[IN_PATH,PUSH_SUB_PATH],'eof':ERROR,'else':[IN_SUB_PATH,APPEND]};pathStateMachine[IN_SINGLE_QUOTE]={"'":[IN_SUB_PATH,APPEND],'eof':ERROR,'else':[IN_SINGLE_QUOTE,APPEND]};pathStateMachine[IN_DOUBLE_QUOTE]={'"':[IN_SUB_PATH,APPEND],'eof':ERROR,'else':[IN_DOUBLE_QUOTE,APPEND]};/** * Determine the type of a character in a keypath. * * @param {Char} ch * @return {String} type */functiongetPathCharType(ch){if(ch===undefined){return'eof';}varcode=ch.charCodeAt(0);switch(code){case0x5B:// [case0x5D:// ]case0x2E:// .case0x22:// "case0x27:// 'case0x30:// 0returnch;case0x5F:// _case0x24:// $return'ident';case0x20:// Spacecase0x09:// Tabcase0x0A:// Newlinecase0x0D:// Returncase0xA0:// No-break spacecase0xFEFF:// Byte Order Markcase0x2028:// Line Separatorcase0x2029:// Paragraph Separatorreturn'ws';}// a-z, A-Zif(code>=0x61&&code<=0x7A||code>=0x41&&code<=0x5A){return'ident';}// 1-9if(code>=0x31&&code<=0x39){return'number';}return'else';}/** * Format a subPath, return its plain form if it is * a literal string or number. Otherwise prepend the * dynamic indicator (*). * * @param {String} path * @return {String} */functionformatSubPath(path){vartrimmed=path.trim();// invalid leading 0if(path.charAt(0)==='0'&&isNaN(path)){returnfalse;}returnisLiteral(trimmed)?stripQuotes(trimmed):'*'+trimmed;}/** * Parse a string path into an array of segments * * @param {String} path * @return {Array|undefined} */functionparse(path){varkeys=[];varindex=-1;varmode=BEFORE_PATH;varsubPathDepth=0;varc,newChar,key,type,transition,action,typeMap;varactions=[];actions[PUSH]=function(){if(key!==undefined){keys.push(key);key=undefined;}};actions[APPEND]=function(){if(key===undefined){key=newChar;}else{key+=newChar;}};actions[INC_SUB_PATH_DEPTH]=function(){actions[APPEND]();subPathDepth++;};actions[PUSH_SUB_PATH]=function(){if(subPathDepth>0){subPathDepth--;mode=IN_SUB_PATH;actions[APPEND]();}else{subPathDepth=0;key=formatSubPath(key);if(key===false){returnfalse;}else{actions[PUSH]();}}};functionmaybeUnescapeQuote(){varnextChar=path[index+1];if(mode===IN_SINGLE_QUOTE&&nextChar==="'"||mode===IN_DOUBLE_QUOTE&&nextChar==='"'){index++;newChar='\\'+nextChar;actions[APPEND]();returntrue;}}while(mode!=null){index++;c=path[index];if(c==='\\'&&maybeUnescapeQuote()){continue;}type=getPathCharType(c);typeMap=pathStateMachine[mode];transition=typeMap[type]||typeMap['else']||ERROR;if(transition===ERROR){return;// parse error}mode=transition[0];action=actions[transition[1]];if(action){newChar=transition[2];newChar=newChar===undefined?c:newChar;if(action()===false){return;}}if(mode===AFTER_PATH){keys.raw=path;returnkeys;}}}/** * External parse that check for a cache hit first * * @param {String} path * @return {Array|undefined} */functionparsePath(path){varhit=pathCache.get(path);if(!hit){hit=parse(path);if(hit){pathCache.put(path,hit);}}returnhit;}/** * Get from an object from a path string * * @param {Object} obj * @param {String} path */functiongetPath(obj,path){returnparseExpression(path).get(obj);}/** * Warn against setting non-existent root path on a vm. */varwarnNonExistent;if('development'!=='production'){warnNonExistent=function(path,vm){warn('You are setting a non-existent path "'+path.raw+'" '+'on a vm instance. Consider pre-initializing the property '+'with the "data" option for more reliable reactivity '+'and better performance.',vm);};}/** * Set on an object from a path * * @param {Object} obj * @param {String | Array} path * @param {*} val */functionsetPath(obj,path,val){varoriginal=obj;if(typeofpath==='string'){path=parse(path);}if(!path||!isObject(obj)){returnfalse;}varlast,key;for(vari=0,l=path.length;i<l;i++){last=obj;key=path[i];if(key.charAt(0)==='*'){key=parseExpression(key.slice(1)).get.call(original,original);}if(i<l-1){obj=obj[key];if(!isObject(obj)){obj={};if('development'!=='production'&&last._isVue){warnNonExistent(path,last);}set(last,key,obj);}}else{if(isArray(obj)){obj.$set(key,val);}elseif(keyinobj){obj[key]=val;}else{if('development'!=='production'&&obj._isVue){warnNonExistent(path,obj);}set(obj,key,val);}}}returntrue;}varpath=Object.freeze({parsePath:parsePath,getPath:getPath,setPath:setPath});varexpressionCache=newCache(1000);varallowedKeywords='Math,Date,this,true,false,null,undefined,Infinity,NaN,'+'isNaN,isFinite,decodeURI,decodeURIComponent,encodeURI,'+'encodeURIComponent,parseInt,parseFloat';varallowedKeywordsRE=newRegExp('^('+allowedKeywords.replace(/,/g,'\\b|')+'\\b)');// keywords that don't make sense inside expressionsvarimproperKeywords='break,case,class,catch,const,continue,debugger,default,'+'delete,do,else,export,extends,finally,for,function,if,'+'import,in,instanceof,let,return,super,switch,throw,try,'+'var,while,with,yield,enum,await,implements,package,'+'protected,static,interface,private,public';varimproperKeywordsRE=newRegExp('^('+improperKeywords.replace(/,/g,'\\b|')+'\\b)');varwsRE=/\s/g;varnewlineRE=/\n/g;varsaveRE=/[\{,]\s*[\w\$_]+\s*:|('(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"|`(?:[^`\\]|\\.)*\$\{|\}(?:[^`\\]|\\.)*`|`(?:[^`\\]|\\.)*`)|new |typeof |void /g;varrestoreRE=/"(\d+)"/g;varpathTestRE=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['.*?'\]|\[".*?"\]|\[\d+\]|\[[A-Za-z_$][\w$]*\])*$/;varidentRE=/[^\w$\.](?:[A-Za-z_$][\w$]*)/g;varliteralValueRE$1=/^(?:true|false|null|undefined|Infinity|NaN)$/;functionnoop(){}/** * Save /Rewrite/Restore**Whenrewritingpathsfoundinanexpression,itis*possibleforthesamelettersequencestobefoundin*stringsandObjectliteralpropertykeys.Thereforewe*removeandstorethesepartsinatemporaryarray,and*restorethemafterthepathrewrite.*/ var saved = []; /***Savereplacer**Thesaveregexcanmatchtwopossiblecases:*1.Anopeningobjectliteral*2.Astring*Ifmatchedasaplainstring,weneedtoescapeits*newlines,sincethestringneedstobepreservedwhen*generatingthefunctionbody.**@param{String}str*@param{String}isString-strifmatchedasastring*@return{String}-placeholderwithindex*/ function save(str, isString) { var i = saved.length; saved[i] = isString ? str.replace(newlineRE, '\\n') : str; return '"' + i + '"'; } /***Pathrewritereplacer**@param{String}raw*@return{String}*/ function rewrite(raw) { var c = raw.charAt(0); var path = raw.slice(1); if (allowedKeywordsRE.test(path)) { return raw; } else { path = path.indexOf('"') > -1 ? path.replace(restoreRE, restore) : path; return c + 'scope.' + path; } } /***Restorereplacer**@param{String}str*@param{String}i-matchedsaveindex*@return{String}*/ function restore(str, i) { return saved[i]; } /***Rewriteanexpression,prefixingallpathaccessorswith*`scope.`andgenerategetter/setterfunctions.**@param{String}exp*@return{Function}*/ function compileGetter(exp) { if (improperKeywordsRE.test(exp)) { 'development' !== 'production' && warn('Avoid using reserved keywords in expression: ' + exp); } //resetstatesaved.length=0;// save strings and object literal keysvarbody=exp.replace(saveRE,save).replace(wsRE,'');// rewrite all paths// pad 1 space here because the regex matches 1 extra charbody=(' '+body).replace(identRE,rewrite).replace(restoreRE,restore);returnmakeGetterFn(body);}/** * Build a getter function. Requires eval. * * We isolate the try/catchsoitdoesn'taffectthe*optimizationoftheparsefunctionwhenitisnotcalled.**@param{String}body*@return{Function|undefined}*/ function makeGetterFn(body) { try { /*eslint-disableno-new-func*/ return new Function('scope', 'return ' + body + ';'); /*eslint-enableno-new-func*/ } catch (e) { if ('development' !== 'production') { /*istanbulignoreif*/ if (e.toString().match(/unsafe-eval|CSP/)){warn('It seems you are using the default build of Vue.js in an environment '+'with Content Security Policy that prohibits unsafe-eval. '+'Use the CSP-compliant build instead: '+'http://vuejs.org/guide/installation.html#CSP-compliant-build');}else{warn('Invalid expression. '+'Generated function body: '+body);}}returnnoop;}}/** * Compile a setter function for the expression. * * @param {String} exp * @return {Function|undefined} */functioncompileSetter(exp){varpath=parsePath(exp);if(path){returnfunction(scope,val){setPath(scope,path,val);};}else{'development'!=='production'&&warn('Invalid setter expression: '+exp);}}/** * Parse an expression into re-written getter/setters.**@param{String}exp*@param{Boolean}needSet*@return{Function}*/ function parseExpression(exp, needSet) { exp = exp.trim(); //trycachevarhit=expressionCache.get(exp);if(hit){if(needSet&&!hit.set){hit.set=compileSetter(hit.exp);}returnhit;}varres={exp:exp};res.get=isSimplePath(exp)&&exp.indexOf('[')<0// optimized super simple getter?makeGetterFn('scope.'+exp)// dynamic getter:compileGetter(exp);if(needSet){res.set=compileSetter(exp);}expressionCache.put(exp,res);returnres;}/** * Check if an expression is a simple path. * * @param {String} exp * @return {Boolean} */functionisSimplePath(exp){returnpathTestRE.test(exp)&&// don't treat literal values as paths!literalValueRE$1.test(exp)&&// Math constants e.g. Math.PI, Math.E etc.exp.slice(0,5)!=='Math.';}varexpression=Object.freeze({parseExpression:parseExpression,isSimplePath:isSimplePath});// we have two separate queues: one for directive updates// and one for user watcher registered via $watch().// we want to guarantee directive updates to be called// before user watchers so that when user watchers are// triggered, the DOM would have already been in updated// state.varqueue=[];varuserQueue=[];varhas={};varcircular={};varwaiting=false;/** * Reset the batcher's state. */functionresetBatcherState(){queue.length=0;userQueue.length=0;has={};circular={};waiting=false;}/** * Flush both queues and run the watchers. */functionflushBatcherQueue(){var_again=true;_function:while(_again){_again=false;runBatcherQueue(queue);runBatcherQueue(userQueue);// user watchers triggered more watchers,// keep flushing until it depletesif(queue.length){_again=true;continue_function;}// dev tool hook/* istanbul ignore if */if(devtools&&config.devtools){devtools.emit('flush');}resetBatcherState();}}/** * Run the watchers in a single queue. * * @param {Array} queue */functionrunBatcherQueue(queue){// do not cache length because more watchers might be pushed// as we run existing watchersfor(vari=0;i<queue.length;i++){varwatcher=queue[i];varid=watcher.id;has[id]=null;watcher.run();// in dev build, check and stop circular updates.if('development'!=='production'&&has[id]!=null){circular[id]=(circular[id]||0)+1;if(circular[id]>config._maxUpdateCount){warn('You may have an infinite update loop for watcher '+'with expression "'+watcher.expression+'"',watcher.vm);break;}}}queue.length=0;}/** * Push a watcher into the watcher queue. * Jobs with duplicate IDs will be skipped unless it's * pushed when the queue is being flushed. * * @param {Watcher} watcher * properties: * - {Number} id * - {Function} run */functionpushWatcher(watcher){varid=watcher.id;if(has[id]==null){// push watcher into appropriate queuevarq=watcher.user?userQueue:queue;has[id]=q.length;q.push(watcher);// queue the flushif(!waiting){waiting=true;nextTick(flushBatcherQueue);}}}varuid$2=0;/** * A watcher parses an expression, collects dependencies, * and fires callback when the expression value changes. * This is used for both the $watch() api and directives. * * @param {Vue} vm * @param {String|Function} expOrFn * @param {Function} cb * @param {Object} options * - {Array} filters * - {Boolean} twoWay * - {Boolean} deep * - {Boolean} user * - {Boolean} sync * - {Boolean} lazy * - {Function} [preProcess] * - {Function} [postProcess] * @constructor */functionWatcher(vm,expOrFn,cb,options){// mix in optionsif(options){extend(this,options);}varisFn=typeofexpOrFn==='function';this.vm=vm;vm._watchers.push(this);this.expression=expOrFn;this.cb=cb;this.id=++uid$2;// uid for batchingthis.active=true;this.dirty=this.lazy;// for lazy watchersthis.deps=[];this.newDeps=[];this.depIds=new_Set();this.newDepIds=new_Set();this.prevError=null;// for async error stacks// parse expression for getter/setterif(isFn){this.getter=expOrFn;this.setter=undefined;}else{varres=parseExpression(expOrFn,this.twoWay);this.getter=res.get;this.setter=res.set;}this.value=this.lazy?undefined:this.get();// state for avoiding false triggers for deep and Array// watchers during vm._digest()this.queued=this.shallow=false;}/** * Evaluate the getter, and re-collect dependencies. */Watcher.prototype.get=function(){this.beforeGet();varscope=this.scope||this.vm;varvalue;try{value=this.getter.call(scope,scope);}catch(e){if('development'!=='production'&&config.warnExpressionErrors){warn('Error when evaluating expression '+'"'+this.expression+'": '+e.toString(),this.vm);}}// "touch" every property so they are all tracked as// dependencies for deep watchingif(this.deep){traverse(value);}if(this.preProcess){value=this.preProcess(value);}if(this.filters){value=scope._applyFilters(value,null,this.filters,false);}if(this.postProcess){value=this.postProcess(value);}this.afterGet();returnvalue;};/** * Set the corresponding value with the setter. * * @param {*} value */Watcher.prototype.set=function(value){varscope=this.scope||this.vm;if(this.filters){value=scope._applyFilters(value,this.value,this.filters,true);}try{this.setter.call(scope,scope,value);}catch(e){if('development'!=='production'&&config.warnExpressionErrors){warn('Error when evaluating setter '+'"'+this.expression+'": '+e.toString(),this.vm);}}// two-way sync for v-for aliasvarforContext=scope.$forContext;if(forContext&&forContext.alias===this.expression){if(forContext.filters){'development'!=='production'&&warn('It seems you are using two-way binding on '+'a v-for alias ('+this.expression+'), and the '+'v-for has filters. This will not work properly. '+'Either remove the filters or use an array of '+'objects and bind to object properties instead.',this.vm);return;}forContext._withLock(function(){if(scope.$key){// original is an objectforContext.rawValue[scope.$key]=value;}else{forContext.rawValue.$set(scope.$index,value);}});}};/** * Prepare for dependency collection. */Watcher.prototype.beforeGet=function(){Dep.target=this;};/** * Add a dependency to this directive. * * @param {Dep} dep */Watcher.prototype.addDep=function(dep){varid=dep.id;if(!this.newDepIds.has(id)){this.newDepIds.add(id);this.newDeps.push(dep);if(!this.depIds.has(id)){dep.addSub(this);}}};/** * Clean up for dependency collection. */Watcher.prototype.afterGet=function(){Dep.target=null;vari=this.deps.length;while(i--){vardep=this.deps[i];if(!this.newDepIds.has(dep.id)){dep.removeSub(this);}}vartmp=this.depIds;this.depIds=this.newDepIds;this.newDepIds=tmp;this.newDepIds.clear();tmp=this.deps;this.deps=this.newDeps;this.newDeps=tmp;this.newDeps.length=0;};/** * Subscriber interface. * Will be called when a dependency changes. * * @param {Boolean} shallow */Watcher.prototype.update=function(shallow){if(this.lazy){this.dirty=true;}elseif(this.sync||!config.async){this.run();}else{// if queued, only overwrite shallow with non-shallow,// but not the other way around.this.shallow=this.queued?shallow?this.shallow:false:!!shallow;this.queued=true;// record before-push error stack in debug mode/* istanbul ignore if */if('development'!=='production'&&config.debug){this.prevError=newError('[vue] async stack trace');}pushWatcher(this);}};/** * Batcher job interface. * Will be called by the batcher. */Watcher.prototype.run=function(){if(this.active){varvalue=this.get();if(value!==this.value||// Deep watchers and watchers on Object/Arrays should fire even// when the value is the same, because the value may// have mutated; but only do so if this is a// non-shallow update (caused by a vm digest).(isObject(value)||this.deep)&&!this.shallow){// set new valuevaroldValue=this.value;this.value=value;// in debug + async mode, when a watcher callbacks// throws, we also throw the saved before-push error// so the full cross-tick stack trace is available.varprevError=this.prevError;/* istanbul ignore if */if('development'!=='production'&&config.debug&&prevError){this.prevError=null;try{this.cb.call(this.vm,value,oldValue);}catch(e){nextTick(function(){throwprevError;},0);throwe;}}else{this.cb.call(this.vm,value,oldValue);}}this.queued=this.shallow=false;}};/** * Evaluate the value of the watcher. * This only gets called for lazy watchers. */Watcher.prototype.evaluate=function(){// avoid overwriting another watcher that is being// collected.varcurrent=Dep.target;this.value=this.get();this.dirty=false;Dep.target=current;};/** * Depend on all deps collected by this watcher. */Watcher.prototype.depend=function(){vari=this.deps.length;while(i--){this.deps[i].depend();}};/** * Remove self from all dependencies' subcriber list. */Watcher.prototype.teardown=function(){if(this.active){// remove self from vm's watcher list// this is a somewhat expensive operation so we skip it// if the vm is being destroyed or is performing a v-for// re-render (the watcher list is then filtered by v-for).if(!this.vm._isBeingDestroyed&&!this.vm._vForRemoving){this.vm._watchers.$remove(this);}vari=this.deps.length;while(i--){this.deps[i].removeSub(this);}this.active=false;this.vm=this.cb=this.value=null;}};/** * Recrusively traverse an object to evoke all converted * getters, so that every nested property inside the object * is collected as a "deep" dependency. * * @param {*} val */varseenObjects=new_Set();functiontraverse(val,seen){vari=undefined,keys=undefined;if(!seen){seen=seenObjects;seen.clear();}varisA=isArray(val);varisO=isObject(val);if((isA||isO)&&Object.isExtensible(val)){if(val.__ob__){vardepId=val.__ob__.dep.id;if(seen.has(depId)){return;}else{seen.add(depId);}}if(isA){i=val.length;while(i--)traverse(val[i],seen);}elseif(isO){keys=Object.keys(val);i=keys.length;while(i--)traverse(val[keys[i]],seen);}}}vartext$1={bind:functionbind(){this.attr=this.el.nodeType===3?'data':'textContent';},update:functionupdate(value){this.el[this.attr]=_toString(value);}};vartemplateCache=newCache(1000);varidSelectorCache=newCache(1000);varmap={efault:[0,'',''],legend:[1,'<fieldset>','</fieldset>'],tr:[2,'<table><tbody>','</tbody></table>'],col:[2,'<table><tbody></tbody><colgroup>','</colgroup></table>']};map.td=map.th=[3,'<table><tbody><tr>','</tr></tbody></table>'];map.option=map.optgroup=[1,'<select multiple="multiple">','</select>'];map.thead=map.tbody=map.colgroup=map.caption=map.tfoot=[1,'<table>','</table>'];map.g=map.defs=map.symbol=map.use=map.image=map.text=map.circle=map.ellipse=map.line=map.path=map.polygon=map.polyline=map.rect=[1,'<svg '+'xmlns="http://www.w3.org/2000/svg" '+'xmlns:xlink="http://www.w3.org/1999/xlink" '+'xmlns:ev="http://www.w3.org/2001/xml-events"'+'version="1.1">','</svg>'];/** * Check if a node is a supported template node with a * DocumentFragment content. * * @param {Node} node * @return {Boolean} */functionisRealTemplate(node){returnisTemplate(node)&&isFragment(node.content);}vartagRE$1=/<([\w:-]+)/;varentityRE=/&#?\w+?;/;varcommentRE=/<!--/;/** * Convert a string template to a DocumentFragment. * Determines correct wrapping by tag types. Wrapping * strategy found in jQuery & component/domify.**@param{String}templateString*@param{Boolean}raw*@return{DocumentFragment}*/ function stringToFragment(templateString, raw) { //tryacachehitfirstvarcacheKey=raw?templateString:templateString.trim();varhit=templateCache.get(cacheKey);if(hit){returnhit;}varfrag=document.createDocumentFragment();vartagMatch=templateString.match(tagRE$1);varentityMatch=entityRE.test(templateString);varcommentMatch=commentRE.test(templateString);if(!tagMatch&&!entityMatch&&!commentMatch){// text only, return a single text node.frag.appendChild(document.createTextNode(templateString));}else{vartag=tagMatch&&tagMatch[1];varwrap=map[tag]||map.efault;vardepth=wrap[0];varprefix=wrap[1];varsuffix=wrap[2];varnode=document.createElement('div');node.innerHTML=prefix+templateString+suffix;while(depth--){node=node.lastChild;}varchild;/* eslint-disable no-cond-assign */while(child=node.firstChild){/* eslint-enable no-cond-assign */frag.appendChild(child);}}if(!raw){trimNode(frag);}templateCache.put(cacheKey,frag);returnfrag;}/** * Convert a template node to a DocumentFragment. * * @param {Node} node * @return {DocumentFragment} */functionnodeToFragment(node){// if its a template tag and the browser supports it,// its content is already a document fragment. However, iOS Safari has// bug when using directly cloned template content with touch// events and can cause crashes when the nodes are removed from DOM, so we// have to treat template elements as string templates. (#2805)/* istanbul ignore if */if(isRealTemplate(node)){returnstringToFragment(node.innerHTML);}// script templateif(node.tagName==='SCRIPT'){returnstringToFragment(node.textContent);}// normal node, clone it to avoid mutating the originalvarclonedNode=cloneNode(node);varfrag=document.createDocumentFragment();varchild;/* eslint-disable no-cond-assign */while(child=clonedNode.firstChild){/* eslint-enable no-cond-assign */frag.appendChild(child);}trimNode(frag);returnfrag;}// Test for the presence of the Safari template cloning bug// https://bugs.webkit.org/showug.cgi?id=137755varhasBrokenTemplate=(function(){/* istanbul ignore else */if(inBrowser){vara=document.createElement('div');a.innerHTML='<template>1</template>';return!a.cloneNode(true).firstChild.innerHTML;}else{returnfalse;}})();// Test for IE10/11 textarea placeholder clone bugvarhasTextareaCloneBug=(function(){/* istanbul ignore else */if(inBrowser){vart=document.createElement('textarea');t.placeholder='t';returnt.cloneNode(true).value==='t';}else{returnfalse;}})();/** * 1. Deal with Safari cloning nested <template> bug by * manually cloning all template instances. * 2. Deal with IE10/11textareaplaceholderbugbysetting*thecorrectvalueaftercloning.**@param{Element|DocumentFragment}node*@return{Element|DocumentFragment}*/ function cloneNode(node) { /*istanbulignoreif*/ if (!node.querySelectorAll) { return node.cloneNode(); } var res = node.cloneNode(true); var i, original, cloned; /*istanbulignoreif*/ if (hasBrokenTemplate) { var tempClone = res; if (isRealTemplate(node)) { node = node.content; tempClone = res.content; } original = node.querySelectorAll('template'); if (original.length) { cloned = tempClone.querySelectorAll('template'); i = cloned.length; while (i--) { cloned[i].parentNode.replaceChild(cloneNode(original[i]), cloned[i]); } } } /*istanbulignoreif*/ if (hasTextareaCloneBug) { if (node.tagName === 'TEXTAREA') { res.value = node.value; } else { original = node.querySelectorAll('textarea'); if (original.length) { cloned = res.querySelectorAll('textarea'); i = cloned.length; while (i--) { cloned[i].value = original[i].value; } } } } return res; } /***Processthetemplateoptionandnormalizesitintoa*aDocumentFragmentthatcanbeusedasapartialora*instancetemplate.**@param{*}template*Possiblevaluesinclude:*-DocumentFragmentobject*-NodeobjectoftypeTemplate*-idselector:'#some-template-id'*-templatestring:'<div><span>{{msg}}</span></div>'*@param{Boolean}shouldClone*@param{Boolean}raw*inlineHTMLinterpolation.Donotcheckforid*selectorandkeepwhitespaceinthestring.*@return{DocumentFragment|undefined}*/ function parseTemplate(template, shouldClone, raw) { var node, frag; //ifthetemplateisalreadyadocumentfragment,// do nothingif(isFragment(template)){trimNode(template);returnshouldClone?cloneNode(template):template;}if(typeoftemplate==='string'){// id selectorif(!raw&&template.charAt(0)==='#'){// id selector can be cached toofrag=idSelectorCache.get(template);if(!frag){node=document.getElementById(template.slice(1));if(node){frag=nodeToFragment(node);// save selector to cacheidSelectorCache.put(template,frag);}}}else{// normal string templatefrag=stringToFragment(template,raw);}}elseif(template.nodeType){// a direct nodefrag=nodeToFragment(template);}returnfrag&&shouldClone?cloneNode(frag):frag;}vartemplate=Object.freeze({cloneNode:cloneNode,parseTemplate:parseTemplate});varhtml={bind:functionbind(){// a comment node means this is a binding for// {{{ inline unescaped html }}}if(this.el.nodeType===8){// hold nodesthis.nodes=[];// replace the placeholder with proper anchorthis.anchor=createAnchor('v-html');replace(this.el,this.anchor);}},update:functionupdate(value){value=_toString(value);if(this.nodes){this.swap(value);}else{this.el.innerHTML=value;}},swap:functionswap(value){// remove old nodesvari=this.nodes.length;while(i--){remove(this.nodes[i]);}// convert new value to a fragment// do not attempt to retrieve from id selectorvarfrag=parseTemplate(value,true,true);// save a reference to these nodes so we can remove laterthis.nodes=toArray(frag.childNodes);before(frag,this.anchor);}};/** * Abstraction for a partially-compiled fragment. * Can optionally compile content with a child scope. * * @param {Function} linker * @param {Vue} vm * @param {DocumentFragment} frag * @param {Vue} [host] * @param {Object} [scope] * @param {Fragment} [parentFrag] */functionFragment(linker,vm,frag,host,scope,parentFrag){this.children=[];this.childFrags=[];this.vm=vm;this.scope=scope;this.inserted=false;this.parentFrag=parentFrag;if(parentFrag){parentFrag.childFrags.push(this);}this.unlink=linker(vm,frag,host,scope,this);varsingle=this.single=frag.childNodes.length===1&&// do not go single mode if the only node is an anchor!frag.childNodes[0].__v_anchor;if(single){this.node=frag.childNodes[0];this.before=singleBefore;this.remove=singleRemove;}else{this.node=createAnchor('fragment-start');this.end=createAnchor('fragment-end');this.frag=frag;prepend(this.node,frag);frag.appendChild(this.end);this.before=multiBefore;this.remove=multiRemove;}this.node.__v_frag=this;}/** * Call attach/detachforallcomponentscontainedwithin*thisfragment.Alsodosorecursivelyforallchild*fragments.**@param{Function}hook*/ Fragment.prototype.callHook = function (hook) { var i, l; for (i = 0, l = this.childFrags.length; i < l; i++) { this.childFrags[i].callHook(hook); } for (i = 0, l = this.children.length; i < l; i++) { hook(this.children[i]); } }; /***Insertfragmentbeforetarget,singlenodeversion**@param{Node}target*@param{Boolean}withTransition*/ function singleBefore(target, withTransition) { this.inserted = true; var method = withTransition !== false ? beforeWithTransition : before; method(this.node, target, this.vm); if (inDoc(this.node)) { this.callHook(attach); } } /***Removefragment,singlenodeversion*/ function singleRemove() { this.inserted = false; var shouldCallRemove = inDoc(this.node); var self = this; this.beforeRemove(); removeWithTransition(this.node, this.vm, function () { if (shouldCallRemove) { self.callHook(detach); } self.destroy(); }); } /***Insertfragmentbeforetarget,multi-nodesversion**@param{Node}target*@param{Boolean}withTransition*/ function multiBefore(target, withTransition) { this.inserted = true; var vm = this.vm; var method = withTransition !== false ? beforeWithTransition : before; mapNodeRange(this.node, this.end, function (node) { method(node, target, vm); }); if (inDoc(this.node)) { this.callHook(attach); } } /***Removefragment,multi-nodesversion*/ function multiRemove() { this.inserted = false; var self = this; var shouldCallRemove = inDoc(this.node); this.beforeRemove(); removeNodeRange(this.node, this.end, this.vm, this.frag, function () { if (shouldCallRemove) { self.callHook(detach); } self.destroy(); }); } /***Preparethefragmentforremoval.*/ Fragment.prototype.beforeRemove = function () { var i, l; for (i = 0, l = this.childFrags.length; i < l; i++) { //callthesamemethodrecursivelyonchild// fragments, depth-firstthis.childFrags[i].beforeRemove(false);}for(i=0,l=this.children.length;i<l;i++){// Call destroy for all contained instances,// with remove:false and defer:true.// Defer is necessary because we need to// keep the children to call detach hooks// on them.this.children[i].$destroy(false,true);}vardirs=this.unlink.dirs;for(i=0,l=dirs.length;i<l;i++){// disable the watchers on all the directives// so that the rendered content stays the same// during removal.dirs[i]._watcher&&dirs[i]._watcher.teardown();}};/** * Destroy the fragment. */Fragment.prototype.destroy=function(){if(this.parentFrag){this.parentFrag.childFrags.$remove(this);}this.node.__v_frag=null;this.unlink();};/** * Call attach hook for a Vue instance. * * @param {Vue} child */functionattach(child){if(!child._isAttached&&inDoc(child.$el)){child._callHook('attached');}}/** * Call detach hook for a Vue instance. * * @param {Vue} child */functiondetach(child){if(child._isAttached&&!inDoc(child.$el)){child._callHook('detached');}}varlinkerCache=newCache(5000);/** * A base_factory that can be used to create instances of a * fragment. Caches the compiled linker if possible. * * @param {Vue} vm * @param {Element|String} el */functionFragmentFactory(vm,el){this.vm=vm;vartemplate;varisString=typeofel==='string';if(isString||isTemplate(el)&&!el.hasAttribute('v-if')){template=parseTemplate(el,true);}else{template=document.createDocumentFragment();template.appendChild(el);}this.template=template;// linker can be cached, but only for componentsvarlinker;varcid=vm.constructor.cid;if(cid>0){varcacheId=cid+(isString?el:getOuterHTML(el));linker=linkerCache.get(cacheId);if(!linker){linker=compile(template,vm.$options,true);linkerCache.put(cacheId,linker);}}else{linker=compile(template,vm.$options,true);}this.linker=linker;}/** * Create a fragment instance with given host and scope. * * @param {Vue} host * @param {Object} scope * @param {Fragment} parentFrag */FragmentFactory.prototype.create=function(host,scope,parentFrag){varfrag=cloneNode(this.template);returnnewFragment(this.linker,this.vm,frag,host,scope,parentFrag);};varON=700;varMODEL=800;varBIND=850;varTRANSITION=1100;varEL=1500;varCOMPONENT=1500;varPARTIAL=1750;varIF=2100;varFOR=2200;varSLOT=2300;varuid$3=0;varvFor={priority:FOR,terminal:true,params:['track-by','stagger','enter-stagger','leave-stagger'],bind:functionbind(){// support "item in/of items" syntaxvarinMatch=this.expression.match(/(.*)(?:in|of)(.*)/);if(inMatch){varitMatch=inMatch[1].match(/\((.*),(.*)\)/);if(itMatch){this.iterator=itMatch[1].trim();this.alias=itMatch[2].trim();}else{this.alias=inMatch[1].trim();}this.expression=inMatch[2];}if(!this.alias){'development'!=='production'&&warn('Invalid v-for expression "'+this.descriptor.raw+'": '+'alias is required.',this.vm);return;}// uid as a cache identifierthis.id='__v-for__'+++uid$3;// check if this is an option list,// so that we know if we need to update the <select>'s// v-model when the option list has changed.// because v-model has a lower priority than v-for,// the v-model is not bound here yet, so we have to// retrive it in the actual updateModel() function.vartag=this.el.tagName;this.isOption=(tag==='OPTION'||tag==='OPTGROUP')&&this.el.parentNode.tagName==='SELECT';// setup anchor nodesthis.start=createAnchor('v-for-start');this.end=createAnchor('v-for-end');replace(this.el,this.end);before(this.start,this.end);// cachethis.cache=Object.create(null);// fragment base_factorythis.base_factory=newFragmentFactory(this.vm,this.el);},update:functionupdate(data){this.diff(data);this.updateRef();this.updateModel();},/** * Diff, based on new data and old data, determine the * minimum amount of DOM manipulations needed to make the * DOM reflect the new data Array. * * The algorithm diffs the new data Array by storing a * hidden reference to an owner vm instance on previously * seen data. This allows us to achieve O(n) which is * better than a levenshtein distance based algorithm, * which is O(m * n). * * @param {Array} data */diff:functiondiff(data){// check if the Array was converted from an Objectvaritem=data[0];varconvertedFromObject=this.fromObject=isObject(item)&&hasOwn(item,'$key')&&hasOwn(item,'$value');vartrackByKey=this.params.trackBy;varoldFrags=this.frags;varfrags=this.frags=newArray(data.length);varalias=this.alias;variterator=this.iterator;varstart=this.start;varend=this.end;varinDocument=inDoc(start);varinit=!oldFrags;vari,l,frag,key,value,primitive;// First pass, go through the new Array and fill up// the new frags array. If a piece of data has a cached// instance for it, we reuse it. Otherwise build a new// instance.for(i=0,l=data.length;i<l;i++){item=data[i];key=convertedFromObject?item.$key:null;value=convertedFromObject?item.$value:item;primitive=!isObject(value);frag=!init&&this.getCachedFrag(value,i,key);if(frag){// reusable fragmentfrag.reused=true;// update $indexfrag.scope.$index=i;// update $keyif(key){frag.scope.$key=key;}// update iteratorif(iterator){frag.scope[iterator]=key!==null?key:i;}// update data for track-by, object repeat &// primitive values.if(trackByKey||convertedFromObject||primitive){withoutConversion(function(){frag.scope[alias]=value;});}}else{// new isntancefrag=this.create(value,alias,i,key);frag.fresh=!init;}frags[i]=frag;if(init){frag.before(end);}}// we're done for the initial render.if(init){return;}// Second pass, go through the old fragments and// destroy those who are not reused (and remove them// from cache)varremovalIndex=0;vartotalRemoved=oldFrags.length-frags.length;// when removing a large number of fragments, watcher removal// turns out to be a perf bottleneck, so we batch the watcher// removals into a single filter call!this.vm._vForRemoving=true;for(i=0,l=oldFrags.length;i<l;i++){frag=oldFrags[i];if(!frag.reused){this.deleteCachedFrag(frag);this.remove(frag,removalIndex++,totalRemoved,inDocument);}}this.vm._vForRemoving=false;if(removalIndex){this.vm._watchers=this.vm._watchers.filter(function(w){returnw.active;});}// Final pass, move/insert new fragments into the// right place.vartargetPrev,prevEl,currentPrev;varinsertionIndex=0;for(i=0,l=frags.length;i<l;i++){frag=frags[i];// this is the frag that we should be aftertargetPrev=frags[i-1];prevEl=targetPrev?targetPrev.staggerCb?targetPrev.staggerAnchor:targetPrev.end||targetPrev.node:start;if(frag.reused&&!frag.staggerCb){currentPrev=findPrevFrag(frag,start,this.id);if(currentPrev!==targetPrev&&(!currentPrev||// optimization for moving a single item.// thanks to suggestions by @livoras in #1807findPrevFrag(currentPrev,start,this.id)!==targetPrev)){this.move(frag,prevEl);}}else{// new instance, or still in stagger.// insert with updated stagger index.this.insert(frag,insertionIndex++,prevEl,inDocument);}frag.reused=frag.fresh=false;}},/** * Create a new fragment instance. * * @param {*} value * @param {String} alias * @param {Number} index * @param {String} [key] * @return {Fragment} */create:functioncreate(value,alias,index,key){varhost=this._host;// create iteration scopevarparentScope=this._scope||this.vm;varscope=Object.create(parentScope);// ref holder for the scopescope.$refs=Object.create(parentScope.$refs);scope.$els=Object.create(parentScope.$els);// make sure point $parent to parent scopescope.$parent=parentScope;// for two-way binding on aliasscope.$forContext=this;// define scope properties// important: define the scope alias without forced conversion// so that frozen data structures remain non-reactive.withoutConversion(function(){defineReactive(scope,alias,value);});defineReactive(scope,'$index',index);if(key){defineReactive(scope,'$key',key);}elseif(scope.$key){// avoid accidental fallbackdef(scope,'$key',null);}if(this.iterator){defineReactive(scope,this.iterator,key!==null?key:index);}varfrag=this.base_factory.create(host,scope,this._frag);frag.forId=this.id;this.cacheFrag(value,frag,index,key);returnfrag;},/** * Update the v-ref on owner vm. */updateRef:functionupdateRef(){varref=this.descriptor.ref;if(!ref)return;varhash=(this._scope||this.vm).$refs;varrefs;if(!this.fromObject){refs=this.frags.map(findVmFromFrag);}else{refs={};this.frags.forEach(function(frag){refs[frag.scope.$key]=findVmFromFrag(frag);});}hash[ref]=refs;},/** * For option lists, update the containing v-model on * parent <select>. */updateModel:functionupdateModel(){if(this.isOption){varparent=this.start.parentNode;varmodel=parent&&parent.__v_model;if(model){model.forceUpdate();}}},/** * Insert a fragment. Handles staggering. * * @param {Fragment} frag * @param {Number} index * @param {Node} prevEl * @param {Boolean} inDocument */insert:functioninsert(frag,index,prevEl,inDocument){if(frag.staggerCb){frag.staggerCb.cancel();frag.staggerCb=null;}varstaggerAmount=this.getStagger(frag,index,null,'enter');if(inDocument&&staggerAmount){// create an anchor and insert it synchronously,// so that we can resolve the correct order without// worrying about some elements not inserted yetvaranchor=frag.staggerAnchor;if(!anchor){anchor=frag.staggerAnchor=createAnchor('stagger-anchor');anchor.__v_frag=frag;}after(anchor,prevEl);varop=frag.staggerCb=cancellable(function(){frag.staggerCb=null;frag.before(anchor);remove(anchor);});setTimeout(op,staggerAmount);}else{vartarget=prevEl.nextSibling;/* istanbul ignore if */if(!target){// reset end anchor position in case the position was messed up// by an external drag-n-drop library.after(this.end,prevEl);target=this.end;}frag.before(target);}},/** * Remove a fragment. Handles staggering. * * @param {Fragment} frag * @param {Number} index * @param {Number} total * @param {Boolean} inDocument */remove:functionremove(frag,index,total,inDocument){if(frag.staggerCb){frag.staggerCb.cancel();frag.staggerCb=null;// it's not possible for the same frag to be removed// twice, so if we have a pending stagger callback,// it means this frag is queued for enter but removed// before its transition started. Since it is already// destroyed, we can just leave it in detached state.return;}varstaggerAmount=this.getStagger(frag,index,total,'leave');if(inDocument&&staggerAmount){varop=frag.staggerCb=cancellable(function(){frag.staggerCb=null;frag.remove();});setTimeout(op,staggerAmount);}else{frag.remove();}},/** * Move a fragment to a new position. * Force no transition. * * @param {Fragment} frag * @param {Node} prevEl */move:functionmove(frag,prevEl){// fix a common issue with Sortable:// if prevEl doesn't have nextSibling, this means it's// been dragged after the end anchor. Just re-position// the end anchor to the end of the container./* istanbul ignore if */if(!prevEl.nextSibling){this.end.parentNode.appendChild(this.end);}frag.before(prevEl.nextSibling,false);},/** * Cache a fragment using track-by or the object key. * * @param {*} value * @param {Fragment} frag * @param {Number} index * @param {String} [key] */cacheFrag:functioncacheFrag(value,frag,index,key){vartrackByKey=this.params.trackBy;varcache=this.cache;varprimitive=!isObject(value);varid;if(key||trackByKey||primitive){id=getTrackByKey(index,key,value,trackByKey);if(!cache[id]){cache[id]=frag;}elseif(trackByKey!=='$index'){'development'!=='production'&&this.warnDuplicate(value);}}else{id=this.id;if(hasOwn(value,id)){if(value[id]===null){value[id]=frag;}else{'development'!=='production'&&this.warnDuplicate(value);}}elseif(Object.isExtensible(value)){def(value,id,frag);}elseif('development'!=='production'){warn('Frozen v-for objects cannot be automatically tracked, make sure to '+'provide a track-by key.');}}frag.raw=value;},/** * Get a cached fragment from the value/index/key**@param{*}value*@param{Number}index*@param{String}key*@return{Fragment}*/ getCachedFrag: function getCachedFrag(value, index, key) { var trackByKey = this.params.trackBy; var primitive = !isObject(value); var frag; if (key || trackByKey || primitive) { var id = getTrackByKey(index, key, value, trackByKey); frag = this.cache[id]; } else { frag = value[this.id]; } if (frag && (frag.reused || frag.fresh)) { 'development' !== 'production' && this.warnDuplicate(value); } return frag; }, /***Deleteafragmentfromcache.**@param{Fragment}frag*/ deleteCachedFrag: function deleteCachedFrag(frag) { var value = frag.raw; var trackByKey = this.params.trackBy; var scope = frag.scope; var index = scope.$index; //fix#948:avoidaccidentallyfallthroughto// a parent repeater which happens to have $key.varkey=hasOwn(scope,'$key')&&scope.$key;varprimitive=!isObject(value);if(trackByKey||key||primitive){varid=getTrackByKey(index,key,value,trackByKey);this.cache[id]=null;}else{value[this.id]=null;frag.raw=null;}},/** * Get the stagger amount for an insertion/removal.**@param{Fragment}frag*@param{Number}index*@param{Number}total*@param{String}type*/ getStagger: function getStagger(frag, index, total, type) { type = type + 'Stagger'; var trans = frag.node.__v_trans; var hooks = trans && trans.hooks; var hook = hooks && (hooks[type] || hooks.stagger); return hook ? hook.call(frag, index, total) : index * parseInt(this.params[type] || this.params.stagger, 10); }, /***Pre-processthevaluebeforepipingitthroughthe*filters.Thisispassedtoandcalledbythewatcher.*/ _preProcess: function _preProcess(value) { //regardlessoftype,storetheun-filteredrawvalue.this.rawValue=value;returnvalue;},/** * Post-process the value after it has been piped through * the filters. This is passed to and called by the watcher. * * It is necessary for this to be called during the * watcher's dependency collection phase because we want * the v-for to update when the source Object is mutated. */_postProcess:function_postProcess(value){if(isArray(value)){returnvalue;}elseif(isPlainObject(value)){// convert plain object to array.varkeys=Object.keys(value);vari=keys.length;varres=newArray(i);varkey;while(i--){key=keys[i];res[i]={$key:key,$value:value[key]};}returnres;}else{if(typeofvalue==='number'&&!isNaN(value)){value=range(value);}returnvalue||[];}},unbind:functionunbind(){if(this.descriptor.ref){(this._scope||this.vm).$refs[this.descriptor.ref]=null;}if(this.frags){vari=this.frags.length;varfrag;while(i--){frag=this.frags[i];this.deleteCachedFrag(frag);frag.destroy();}}}};/** * Helper to find the previous element that is a fragment * anchor. This is necessary because a destroyed frag's * element could still be lingering in the DOM before its * leaving transition finishes, but its inserted flag * should have been set to false so we can skip them. * * If this is a block repeat, we want to make sure we only * return frag that is bound to this v-for. (see #929) * * @param {Fragment} frag * @param {Comment|Text} anchor * @param {String} id * @return {Fragment} */functionfindPrevFrag(frag,anchor,id){varel=frag.node.previousSibling;/* istanbul ignore if */if(!el)return;frag=el.__v_frag;while((!frag||frag.forId!==id||!frag.inserted)&&el!==anchor){el=el.previousSibling;/* istanbul ignore if */if(!el)return;frag=el.__v_frag;}returnfrag;}/** * Find a vm from a fragment. * * @param {Fragment} frag * @return {Vue|undefined} */functionfindVmFromFrag(frag){varnode=frag.node;// handle multi-node fragif(frag.end){while(!node.__vue__&&node!==frag.end&&node.nextSibling){node=node.nextSibling;}}returnnode.__vue__;}/** * Create a range array from given number. * * @param {Number} n * @return {Array} */functionrange(n){vari=-1;varret=newArray(Math.floor(n));while(++i<n){ret[i]=i;}returnret;}/** * Get the track by key for an item. * * @param {Number} index * @param {String} key * @param {*} value * @param {String} [trackByKey] */functiongetTrackByKey(index,key,value,trackByKey){returntrackByKey?trackByKey==='$index'?index:trackByKey.charAt(0).match(/\w/)?getPath(value,trackByKey):value[trackByKey]:key||value;}if('development'!=='production'){vFor.warnDuplicate=function(value){warn('Duplicate value found in v-for="'+this.descriptor.raw+'": '+JSON.stringify(value)+'. Use track-by="$index" if '+'you are expecting duplicate values.',this.vm);};}varvIf={priority:IF,terminal:true,bind:functionbind(){varel=this.el;if(!el.__vue__){// check else blockvarnext=el.nextElementSibling;if(next&&getAttr(next,'v-else')!==null){remove(next);this.elseEl=next;}// check main blockthis.anchor=createAnchor('v-if');replace(el,this.anchor);}else{'development'!=='production'&&warn('v-if="'+this.expression+'" cannot be '+'used on an instance root element.',this.vm);this.invalid=true;}},update:functionupdate(value){if(this.invalid)return;if(value){if(!this.frag){this.insert();}}else{this.remove();}},insert:functioninsert(){if(this.elseFrag){this.elseFrag.remove();this.elseFrag=null;}// lazy init base_factoryif(!this.base_factory){this.base_factory=newFragmentFactory(this.vm,this.el);}this.frag=this.base_factory.create(this._host,this._scope,this._frag);this.frag.before(this.anchor);},remove:functionremove(){if(this.frag){this.frag.remove();this.frag=null;}if(this.elseEl&&!this.elseFrag){if(!this.elseFactory){this.elseFactory=newFragmentFactory(this.elseEl._context||this.vm,this.elseEl);}this.elseFrag=this.elseFactory.create(this._host,this._scope,this._frag);this.elseFrag.before(this.anchor);}},unbind:functionunbind(){if(this.frag){this.frag.destroy();}if(this.elseFrag){this.elseFrag.destroy();}}};varshow={bind:functionbind(){// check else blockvarnext=this.el.nextElementSibling;if(next&&getAttr(next,'v-else')!==null){this.elseEl=next;}},update:functionupdate(value){this.apply(this.el,value);if(this.elseEl){this.apply(this.elseEl,!value);}},apply:functionapply(el,value){if(inDoc(el)){applyTransition(el,value?1:-1,toggle,this.vm);}else{toggle();}functiontoggle(){el.style.display=value?'':'none';}}};vartext$2={bind:functionbind(){varself=this;varel=this.el;varisRange=el.type==='range';varlazy=this.params.lazy;varnumber=this.params.number;vardebounce=this.params.debounce;// handle composition events.// http://blog.evanyou.me/2014/01/03/composition-event/// skip this for Android because it handles composition// events quite differently. Android doesn't trigger// composition events for language input methods e.g.// Chinese, but instead triggers them for spelling// suggestions... (see Discussion/#162)varcomposing=false;if(!isAndroid&&!isRange){this.on('compositionstart',function(){composing=true;});this.on('compositionend',function(){composing=false;// in IE11 the "compositionend" event fires AFTER// the "input" event, so the input handler is blocked// at the end... have to call it here.//// #1327: in lazy mode this is unecessary.if(!lazy){self.listener();}});}// prevent messing with the input when user is typing,// and force update on blur.this.focused=false;if(!isRange&&!lazy){this.on('focus',function(){self.focused=true;});this.on('blur',function(){self.focused=false;// do not sync value after fragment removal (#2017)if(!self._frag||self._frag.inserted){self.rawListener();}});}// Now attach the main listenerthis.listener=this.rawListener=function(){if(composing||!self._bound){return;}varval=number||isRange?toNumber(el.value):el.value;self.set(val);// force update on next tick to avoid lock & same value// also only update when user is not typingnextTick(function(){if(self._bound&&!self.focused){self.update(self._watcher.value);}});};// apply debounceif(debounce){this.listener=_debounce(this.listener,debounce);}// Support jQuery events, since jQuery.trigger() doesn't// trigger native events in some cases and some plugins// rely on $.trigger()//// We want to make sure if a listener is attached using// jQuery, it is also removed with jQuery, that's why// we do the check for each directive instance and// store that check result on itself. This also allows// easier test coverage control by unsetting the global// jQuery variable in tests.this.hasjQuery=typeofjQuery==='function';if(this.hasjQuery){varmethod=jQuery.fn.on?'on':'bind';jQuery(el)[method]('change',this.rawListener);if(!lazy){jQuery(el)[method]('input',this.listener);}}else{this.on('change',this.rawListener);if(!lazy){this.on('input',this.listener);}}// IE9 doesn't fire input event on backspace/del/cutif(!lazy&&isIE9){this.on('cut',function(){nextTick(self.listener);});this.on('keyup',function(e){if(e.keyCode===46||e.keyCode===8){self.listener();}});}// set initial value if presentif(el.hasAttribute('value')||el.tagName==='TEXTAREA'&&el.value.trim()){this.afterBind=this.listener;}},update:functionupdate(value){// #3029 only update when the value changes. This prevent// browsers from overwriting values like selectionStartvalue=_toString(value);if(value!==this.el.value)this.el.value=value;},unbind:functionunbind(){varel=this.el;if(this.hasjQuery){varmethod=jQuery.fn.off?'off':'unbind';jQuery(el)[method]('change',this.listener);jQuery(el)[method]('input',this.listener);}}};varradio={bind:functionbind(){varself=this;varel=this.el;this.getValue=function(){// value overwrite via v-bind:valueif(el.hasOwnProperty('_value')){returnel._value;}varval=el.value;if(self.params.number){val=toNumber(val);}returnval;};this.listener=function(){self.set(self.getValue());};this.on('change',this.listener);if(el.hasAttribute('checked')){this.afterBind=this.listener;}},update:functionupdate(value){this.el.checked=looseEqual(value,this.getValue());}};varselect={bind:functionbind(){var_this=this;varself=this;varel=this.el;// method to force update DOM using latest value.this.forceUpdate=function(){if(self._watcher){self.update(self._watcher.get());}};// check if this is a multiple selectvarmultiple=this.multiple=el.hasAttribute('multiple');// attach listenerthis.listener=function(){varvalue=getValue(el,multiple);value=self.params.number?isArray(value)?value.map(toNumber):toNumber(value):value;self.set(value);};this.on('change',this.listener);// if has initial value, set afterBindvarinitValue=getValue(el,multiple,true);if(multiple&&initValue.length||!multiple&&initValue!==null){this.afterBind=this.listener;}// All major browsers except Firefox resets// selectedIndex with value -1 to 0 when the element// is appended to a new parent, therefore we have to// force a DOM update whenever that happens...this.vm.$on('hook:attached',function(){nextTick(_this.forceUpdate);});if(!inDoc(el)){nextTick(this.forceUpdate);}},update:functionupdate(value){varel=this.el;el.selectedIndex=-1;varmulti=this.multiple&&isArray(value);varoptions=el.options;vari=options.length;varop,val;while(i--){op=options[i];val=op.hasOwnProperty('_value')?op._value:op.value;/* eslint-disable eqeqeq */op.selected=multi?indexOf$1(value,val)>-1:looseEqual(value,val);/* eslint-enable eqeqeq */}},unbind:functionunbind(){/* istanbul ignore next */this.vm.$off('hook:attached',this.forceUpdate);}};/** * Get select value * * @param {SelectElement} el * @param {Boolean} multi * @param {Boolean} init * @return {Array|*} */functiongetValue(el,multi,init){varres=multi?[]:null;varop,val,selected;for(vari=0,l=el.options.length;i<l;i++){op=el.options[i];selected=init?op.hasAttribute('selected'):op.selected;if(selected){val=op.hasOwnProperty('_value')?op._value:op.value;if(multi){res.push(val);}else{returnval;}}}returnres;}/** * Native Array.indexOf uses strict equal, but in this * case we need to match string/numberswithcustomequal.**@param{Array}arr*@param{*}val*/ function indexOf$1(arr, val) { var i = arr.length; while (i--) { if (looseEqual(arr[i], val)) { return i; } } return -1; } var checkbox = { bind: function bind() { var self = this; var el = this.el; this.getValue = function () { return el.hasOwnProperty('_value')? el._value : self.params.number ? toNumber(el.value) : el.value; }; function getBooleanValue() { var val = el.checked; if (val && el.hasOwnProperty('_trueValue')) { return el._trueValue; } if (!val && el.hasOwnProperty('_falseValue')) { return el._falseValue; } return val; } this.listener = function () { var model = self._watcher.value; if (isArray(model)) { var val = self.getValue(); if (el.checked) { if (indexOf(model, val) < 0) { model.push(val); } } else { model.$remove(val); } } else { self.set(getBooleanValue()); } }; this.on('change', this.listener); if (el.hasAttribute('checked')) { this.afterBind = this.listener; } }, update: function update(value) { var el = this.el; if (isArray(value)) { el.checked = indexOf(value, this.getValue()) > -1; } else { if (el.hasOwnProperty('_trueValue')) { el.checked = looseEqual(value, el._trueValue); } else { el.checked = !!value; } } } }; var handlers = { text: text$2, radio: radio, select: select, checkbox: checkbox }; var model = { priority: MODEL, twoWay: true, handlers: handlers, params: ['lazy', 'number', 'debounce'], /***Possibleelements:*<select>*<textarea>*<inputtype="*">*-text*-checkbox*-radio*-number*/ bind: function bind() { //friendlywarning...this.checkFilters();if(this.hasRead&&!this.hasWrite){'development'!=='production'&&warn('It seems you are using a read-only filter with '+'v-model="'+this.descriptor.raw+'". '+'You might want to use a two-way filter to ensure correct behavior.',this.vm);}varel=this.el;vartag=el.tagName;varhandler;if(tag==='INPUT'){handler=handlers[el.type]||handlers.text;}elseif(tag==='SELECT'){handler=handlers.select;}elseif(tag==='TEXTAREA'){handler=handlers.text;}else{'development'!=='production'&&warn('v-model does not support element type: '+tag,this.vm);return;}el.__v_model=this;handler.bind.call(this);this.update=handler.update;this._unbind=handler.unbind;},/** * Check read/writefilterstats.*/ checkFilters: function checkFilters() { var filters = this.filters; if (!filters) return; var i = filters.length; while (i--) { var filter = resolveAsset(this.vm.$options, 'filters', filters[i].name); if (typeof filter === 'function' || filter.read) { this.hasRead = true; } if (filter.write) { this.hasWrite = true; } } }, unbind: function unbind() { this.el.__v_model = null; this._unbind && this._unbind(); } }; //keyCodealiasesvarkeyCodes={esc:27,tab:9,enter:13,space:32,'delete':[8,46],up:38,left:37,right:39,down:40};functionkeyFilter(handler,keys){varcodes=keys.map(function(key){varcharCode=key.charCodeAt(0);if(charCode>47&&charCode<58){returnparseInt(key,10);}if(key.length===1){charCode=key.toUpperCase().charCodeAt(0);if(charCode>64&&charCode<91){returncharCode;}}returnkeyCodes[key];});codes=[].concat.apply([],codes);returnfunctionkeyHandler(e){if(codes.indexOf(e.keyCode)>-1){returnhandler.call(this,e);}};}functionstopFilter(handler){returnfunctionstopHandler(e){e.stopPropagation();returnhandler.call(this,e);};}functionpreventFilter(handler){returnfunctionpreventHandler(e){e.preventDefault();returnhandler.call(this,e);};}functionselfFilter(handler){returnfunctionselfHandler(e){if(e.target===e.currentTarget){returnhandler.call(this,e);}};}varon$1={priority:ON,acceptStatement:true,keyCodes:keyCodes,bind:functionbind(){// deal with iframesif(this.el.tagName==='IFRAME'&&this.arg!=='load'){varself=this;this.iframeBind=function(){on(self.el.contentWindow,self.arg,self.handler,self.modifiers.capture);};this.on('load',this.iframeBind);}},update:functionupdate(handler){// stub a noop for v-on with no value,// e.g. @mousedown.preventif(!this.descriptor.raw){handler=function(){};}if(typeofhandler!=='function'){'development'!=='production'&&warn('v-on:'+this.arg+'="'+this.expression+'" expects a function value, '+'got '+handler,this.vm);return;}// apply modifiersif(this.modifiers.stop){handler=stopFilter(handler);}if(this.modifiers.prevent){handler=preventFilter(handler);}if(this.modifiers.self){handler=selfFilter(handler);}// key filtervarkeys=Object.keys(this.modifiers).filter(function(key){returnkey!=='stop'&&key!=='prevent'&&key!=='self'&&key!=='capture';});if(keys.length){handler=keyFilter(handler,keys);}this.reset();this.handler=handler;if(this.iframeBind){this.iframeBind();}else{on(this.el,this.arg,this.handler,this.modifiers.capture);}},reset:functionreset(){varel=this.iframeBind?this.el.contentWindow:this.el;if(this.handler){off(el,this.arg,this.handler);}},unbind:functionunbind(){this.reset();}};varprefixes=['-webkit-','-moz-','-ms-'];varcamelPrefixes=['Webkit','Moz','ms'];varimportantRE=/!important;?$/;varpropCache=Object.create(null);vartestEl=null;varstyle={deep:true,update:functionupdate(value){if(typeofvalue==='string'){this.el.style.cssText=value;}elseif(isArray(value)){this.handleObject(value.reduce(extend,{}));}else{this.handleObject(value||{});}},handleObject:functionhandleObject(value){// cache object styles so that only changed props// are actually updated.varcache=this.cache||(this.cache={});varname,val;for(nameincache){if(!(nameinvalue)){this.handleSingle(name,null);deletecache[name];}}for(nameinvalue){val=value[name];if(val!==cache[name]){cache[name]=val;this.handleSingle(name,val);}}},handleSingle:functionhandleSingle(prop,value){prop=normalize(prop);if(!prop)return;// unsupported prop// cast possible numbers/booleans into stringsif(value!=null)value+='';if(value){varisImportant=importantRE.test(value)?'important':'';if(isImportant){/* istanbul ignore if */if('development'!=='production'){warn('It\'s probably a bad idea to use !important with inline rules. '+'This feature will be deprecated in a future version of Vue.');}value=value.replace(importantRE,'').trim();this.el.style.setProperty(prop.kebab,value,isImportant);}else{this.el.style[prop.camel]=value;}}else{this.el.style[prop.camel]='';}}};/** * Normalize a CSS property name. * - cache result * - auto prefix * - camelCase -> dash-case * * @param {String} prop * @return {String} */functionnormalize(prop){if(propCache[prop]){returnpropCache[prop];}varres=prefix(prop);propCache[prop]=propCache[res]=res;returnres;}/** * Auto detect the appropriate prefix for a CSS property. * https://gist.github.com/paulirish/523692**@param{String}prop*@return{String}*/ function prefix(prop) { prop = hyphenate(prop); var camel = camelize(prop); var upper = camel.charAt(0).toUpperCase() + camel.slice(1); if (!testEl) { testEl = document.createElement('div'); } var i = prefixes.length; var prefixed; if (camel !== 'filter' && camel in testEl.style) { return { kebab: prop, camel: camel }; } while (i--) { prefixed = camelPrefixes[i] + upper; if (prefixed in testEl.style) { return { kebab: prefixes[i] + prop, camel: prefixed }; } } } //xlinkvarxlinkNS='http://www.w3.org/1999/xlink';varxlinkRE=/^xlink:/;// check for attributes that prohibit interpolationsvardisallowedInterpAttrRE=/^v-|^:|^@|^(?:is|transition|transition-mode|debounce|track-by|stagger|enter-stagger|leave-stagger)$/;// these attributes should also set their corresponding properties// because they only affect the initial state of the elementvarattrWithPropsRE=/^(?:value|checked|selected|muted)$/;// these attributes expect enumrated values of "true" or "false"// but are not boolean attributesvarenumeratedAttrRE=/^(?:draggable|contenteditable|spellcheck)$/;// these attributes should set a hidden property for// binding v-model to object valuesvarmodelProps={value:'_value','true-value':'_trueValue','false-value':'_falseValue'};varbind$1={priority:BIND,bind:functionbind(){varattr=this.arg;vartag=this.el.tagName;// should be deep watch on object modeif(!attr){this.deep=true;}// handle interpolation bindingsvardescriptor=this.descriptor;vartokens=descriptor.interp;if(tokens){// handle interpolations with one-time tokensif(descriptor.hasOneTime){this.expression=tokensToExp(tokens,this._scope||this.vm);}// only allow binding on native attributesif(disallowedInterpAttrRE.test(attr)||attr==='name'&&(tag==='PARTIAL'||tag==='SLOT')){'development'!=='production'&&warn(attr+'="'+descriptor.raw+'": '+'attribute interpolation is not allowed in Vue.js '+'directives and special attributes.',this.vm);this.el.removeAttribute(attr);this.invalid=true;}/* istanbul ignore if */if('development'!=='production'){varraw=attr+'="'+descriptor.raw+'": ';// warn srcif(attr==='src'){warn(raw+'interpolation in "src" attribute will cause '+'a 404 request. Use v-bind:src instead.',this.vm);}// warn styleif(attr==='style'){warn(raw+'interpolation in "style" attribute will cause '+'the attribute to be discarded in Internet Explorer. '+'Use v-bind:style instead.',this.vm);}}}},update:functionupdate(value){if(this.invalid){return;}varattr=this.arg;if(this.arg){this.handleSingle(attr,value);}else{this.handleObject(value||{});}},// share object handler with v-bind:classhandleObject:style.handleObject,handleSingle:functionhandleSingle(attr,value){varel=this.el;varinterp=this.descriptor.interp;if(this.modifiers.camel){attr=camelize(attr);}if(!interp&&attrWithPropsRE.test(attr)&&attrinel){varattrValue=attr==='value'?value==null// IE9 will set input.value to "null" for null...?'':value:value;if(el[attr]!==attrValue){el[attr]=attrValue;}}// set model propsvarmodelProp=modelProps[attr];if(!interp&&modelProp){el[modelProp]=value;// update v-model if presentvarmodel=el.__v_model;if(model){model.listener();}}// do not set value attribute for textareaif(attr==='value'&&el.tagName==='TEXTAREA'){el.removeAttribute(attr);return;}// update attributeif(enumeratedAttrRE.test(attr)){el.setAttribute(attr,value?'true':'false');}elseif(value!=null&&value!==false){if(attr==='class'){// handle edge case #1960:// class interpolation should not overwrite Vue transition classif(el.__v_trans){value+=' '+el.__v_trans.id+'-transition';}setClass(el,value);}elseif(xlinkRE.test(attr)){el.setAttributeNS(xlinkNS,attr,value===true?'':value);}else{el.setAttribute(attr,value===true?'':value);}}else{el.removeAttribute(attr);}}};varel={priority:EL,bind:functionbind(){/* istanbul ignore if */if(!this.arg){return;}varid=this.id=camelize(this.arg);varrefs=(this._scope||this.vm).$els;if(hasOwn(refs,id)){refs[id]=this.el;}else{defineReactive(refs,id,this.el);}},unbind:functionunbind(){varrefs=(this._scope||this.vm).$els;if(refs[this.id]===this.el){refs[this.id]=null;}}};varref={bind:functionbind(){'development'!=='production'&&warn('v-ref:'+this.arg+' must be used on a child '+'component. Found on <'+this.el.tagName.toLowerCase()+'>.',this.vm);}};varcloak={bind:functionbind(){varel=this.el;this.vm.$once('pre-hook:compiled',function(){el.removeAttribute('v-cloak');});}};// must export plain objectvardirectives={text:text$1,html:html,'for':vFor,'if':vIf,show:show,model:model,on:on$1,bind:bind$1,el:el,ref:ref,cloak:cloak};varvClass={deep:true,update:functionupdate(value){if(!value){this.cleanup();}elseif(typeofvalue==='string'){this.setClass(value.trim().split(/\s+/));}else{this.setClass(normalize$1(value));}},setClass:functionsetClass(value){this.cleanup(value);for(vari=0,l=value.length;i<l;i++){varval=value[i];if(val){apply(this.el,val,addClass);}}this.prevKeys=value;},cleanup:functioncleanup(value){varprevKeys=this.prevKeys;if(!prevKeys)return;vari=prevKeys.length;while(i--){varkey=prevKeys[i];if(!value||value.indexOf(key)<0){apply(this.el,key,removeClass);}}}};/** * Normalize objects and arrays (potentially containing objects) * into array of strings. * * @param {Object|Array<String|Object>} value * @return {Array<String>} */functionnormalize$1(value){varres=[];if(isArray(value)){for(vari=0,l=value.length;i<l;i++){var_key=value[i];if(_key){if(typeof_key==='string'){res.push(_key);}else{for(varkin_key){if(_key[k])res.push(k);}}}}}elseif(isObject(value)){for(varkeyinvalue){if(value[key])res.push(key);}}returnres;}/** * Add or remove a class/classesonanelement**@param{Element}el*@param{String}keyTheclassname.Thismayormaynot*containaspacecharacter,insucha*casewe'lldealwithmultipleclass*namesatonce.*@param{Function}fn*/ function apply(el, key, fn) { key = key.trim(); if (key.indexOf(' ') === -1) { fn(el, key); return; } //Thekeycontainsoneormorespacecharacters.// Since a class name doesn't accept such characters, we// treat it as multiple classes.varkeys=key.split(/\s+/);for(vari=0,l=keys.length;i<l;i++){fn(el,keys[i]);}}varcomponent={priority:COMPONENT,params:['keep-alive','transition-mode','inline-template'],/** * Setup. Two possible usages: * * - static: * <comp> or <div v-component="comp"> * * - dynamic: * <component :is="view"> */bind:functionbind(){if(!this.el.__vue__){// keep-alive cachethis.keepAlive=this.params.keepAlive;if(this.keepAlive){this.cache={};}// check inline-templateif(this.params.inlineTemplate){// extract inline template as a DocumentFragmentthis.inlineTemplate=extractContent(this.el,true);}// component resolution related statethis.pendingComponentCb=this.Component=null;// transition related statethis.pendingRemovals=0;this.pendingRemovalCb=null;// create a ref anchorthis.anchor=createAnchor('v-component');replace(this.el,this.anchor);// remove is attribute.// this is removed during compilation, but because compilation is// cached, when the component is used elsewhere this attribute// will remain at link time.this.el.removeAttribute('is');this.el.removeAttribute(':is');// remove ref, same as aboveif(this.descriptor.ref){this.el.removeAttribute('v-ref:'+hyphenate(this.descriptor.ref));}// if static, build right now.if(this.literal){this.setComponent(this.expression);}}else{'development'!=='production'&&warn('cannot mount component "'+this.expression+'" '+'on already mounted element: '+this.el);}},/** * Public update, called by the watcher in the dynamic * literal scenario, e.g. <component :is="view"> */update:functionupdate(value){if(!this.literal){this.setComponent(value);}},/** * Switch dynamic components. May resolve the component * asynchronously, and perform transition based on * specified transition mode. Accepts a few additional * arguments specifically for vue-router. * * The callback is called when the full transition is * finished. * * @param {String} value * @param {Function} [cb] */setComponent:functionsetComponent(value,cb){this.invalidatePending();if(!value){// just remove currentthis.unbuild(true);this.remove(this.childVM,cb);this.childVM=null;}else{varself=this;this.resolveComponent(value,function(){self.mountComponent(cb);});}},/** * Resolve the component constructor to use when creating * the child vm. * * @param {String|Function} value * @param {Function} cb */resolveComponent:functionresolveComponent(value,cb){varself=this;this.pendingComponentCb=cancellable(function(Component){self.ComponentName=Component.options.name||(typeofvalue==='string'?value:null);self.Component=Component;cb();});this.vm._resolveComponent(value,this.pendingComponentCb);},/** * Create a new instance using the current constructor and * replace the existing instance. This method doesn't care * whether the new component and the old one are actually * the same. * * @param {Function} [cb] */mountComponent:functionmountComponent(cb){// actual mountthis.unbuild(true);varself=this;varactivateHooks=this.Component.options.activate;varcached=this.getCached();varnewComponent=this.build();if(activateHooks&&!cached){this.waitingFor=newComponent;callActivateHooks(activateHooks,newComponent,function(){if(self.waitingFor!==newComponent){return;}self.waitingFor=null;self.transition(newComponent,cb);});}else{// update ref for kept-alive componentif(cached){newComponent._updateRef();}this.transition(newComponent,cb);}},/** * When the component changes or unbinds before an async * constructor is resolved, we need to invalidate its * pending callback. */invalidatePending:functioninvalidatePending(){if(this.pendingComponentCb){this.pendingComponentCb.cancel();this.pendingComponentCb=null;}},/** * Instantiate/insertanewchildvm.*Ifkeepaliveandhascachedinstance,insertthat*instance;otherwisebuildanewoneandcacheit.**@param{Object}[extraOptions]*@return{Vue}-thecreatedinstance*/ build: function build(extraOptions) { var cached = this.getCached(); if (cached) { return cached; } if (this.Component) { //defaultoptionsvaroptions={name:this.ComponentName,el:cloneNode(this.el),template:this.inlineTemplate,// make sure to add the child with correct parent// if this is a transcluded component, its parent// should be the transclusion host.parent:this._host||this.vm,// if no inline-template, then the compiled// linker can be cached for better performance._linkerCachable:!this.inlineTemplate,_ref:this.descriptor.ref,_asComponent:true,_isRouterView:this._isRouterView,// if this is a transcluded component, context// will be the common parent vm of this instance// and its host._context:this.vm,// if this is inside an inline v-for, the scope// will be the intermediate scope created for this// repeat fragment. this is used for linking props// and container directives._scope:this._scope,// pass in the owner fragment of this component.// this is necessary so that the fragment can keep// track of its contained components in order to// call attach/detach hooks for them._frag:this._frag};// extra options// in 1.0.0 this is used by vue-router only/* istanbul ignore if */if(extraOptions){extend(options,extraOptions);}varchild=newthis.Component(options);if(this.keepAlive){this.cache[this.Component.cid]=child;}/* istanbul ignore if */if('development'!=='production'&&this.el.hasAttribute('transition')&&child._isFragment){warn('Transitions will not work on a fragment instance. '+'Template: '+child.$options.template,child);}returnchild;}},/** * Try to get a cached instance of the current component. * * @return {Vue|undefined} */getCached:functiongetCached(){returnthis.keepAlive&&this.cache[this.Component.cid];},/** * Teardown the current child, but defers cleanup so * that we can separate the destroy and removal steps. * * @param {Boolean} defer */unbuild:functionunbuild(defer){if(this.waitingFor){if(!this.keepAlive){this.waitingFor.$destroy();}this.waitingFor=null;}varchild=this.childVM;if(!child||this.keepAlive){if(child){// remove refchild._inactive=true;child._updateRef(true);}return;}// the sole purpose of `deferCleanup` is so that we can// "deactivate" the vm right now and perform DOM removal// later.child.$destroy(false,defer);},/** * Remove current destroyed child and manually do * the cleanup after removal. * * @param {Function} cb */remove:functionremove(child,cb){varkeepAlive=this.keepAlive;if(child){// we may have a component switch when a previous// component is still being transitioned out.// we want to trigger only one lastest insertion cb// when the existing transition finishes. (#1119)this.pendingRemovals++;this.pendingRemovalCb=cb;varself=this;child.$remove(function(){self.pendingRemovals--;if(!keepAlive)child._cleanup();if(!self.pendingRemovals&&self.pendingRemovalCb){self.pendingRemovalCb();self.pendingRemovalCb=null;}});}elseif(cb){cb();}},/** * Actually swap the components, depending on the * transition mode. Defaults to simultaneous. * * @param {Vue} target * @param {Function} [cb] */transition:functiontransition(target,cb){varself=this;varcurrent=this.childVM;// for devtool inspectionif(current)current._inactive=true;target._inactive=false;this.childVM=target;switch(self.params.transitionMode){case'in-out':target.$before(self.anchor,function(){self.remove(current,cb);});break;case'out-in':self.remove(current,function(){target.$before(self.anchor,cb);});break;default:self.remove(current);target.$before(self.anchor,cb);}},/** * Unbind. */unbind:functionunbind(){this.invalidatePending();// Do not defer cleanup when unbindingthis.unbuild();// destroy all keep-alive cached instancesif(this.cache){for(varkeyinthis.cache){this.cache[key].$destroy();}this.cache=null;}}};/** * Call activate hooks in order (asynchronous) * * @param {Array} hooks * @param {Vue} vm * @param {Function} cb */functioncallActivateHooks(hooks,vm,cb){vartotal=hooks.length;varcalled=0;hooks[0].call(vm,next);functionnext(){if(++called>=total){cb();}else{hooks[called].call(vm,next);}}}varpropBindingModes=config._propBindingModes;varempty={};// regexesvaridentRE$1=/^[$_a-zA-Z]+[\w$]*$/;varsettablePathRE=/^[A-Za-z_$][\w$]*(\.[A-Za-z_$][\w$]*|\[[^\[\]]+\])*$/;/** * Compile props on a root element and return * a props link function. * * @param {Element|DocumentFragment} el * @param {Array} propOptions * @param {Vue} vm * @return {Function} propsLinkFn */functioncompileProps(el,propOptions,vm){varprops=[];varnames=Object.keys(propOptions);vari=names.length;varoptions,name,attr,value,path,parsed,prop;while(i--){name=names[i];options=propOptions[name]||empty;if('development'!=='production'&&name==='$data'){warn('Do not use $data as prop.',vm);continue;}// props could contain dashes, which will be// interpreted as minus calculations by the parser// so we need to camelize the path herepath=camelize(name);if(!identRE$1.test(path)){'development'!=='production'&&warn('Invalid prop key: "'+name+'". Prop keys '+'must be valid identifiers.',vm);continue;}prop={name:name,path:path,options:options,mode:propBindingModes.ONE_WAY,raw:null};attr=hyphenate(name);// first check dynamic versionif((value=getBindAttr(el,attr))===null){if((value=getBindAttr(el,attr+'.sync'))!==null){prop.mode=propBindingModes.TWO_WAY;}elseif((value=getBindAttr(el,attr+'.once'))!==null){prop.mode=propBindingModes.ONE_TIME;}}if(value!==null){// has dynamic binding!prop.raw=value;parsed=parseDirective(value);value=parsed.expression;prop.filters=parsed.filters;// check binding typeif(isLiteral(value)&&!parsed.filters){// for expressions containing literal numbers and// booleans, there's no need to setup a prop binding,// so we can optimize them as a one-time set.prop.optimizedLiteral=true;}else{prop.dynamic=true;// check non-settable path for two-way bindingsif('development'!=='production'&&prop.mode===propBindingModes.TWO_WAY&&!settablePathRE.test(value)){prop.mode=propBindingModes.ONE_WAY;warn('Cannot bind two-way prop with non-settable '+'parent path: '+value,vm);}}prop.parentPath=value;// warn required two-wayif('development'!=='production'&&options.twoWay&&prop.mode!==propBindingModes.TWO_WAY){warn('Prop "'+name+'" expects a two-way binding type.',vm);}}elseif((value=getAttr(el,attr))!==null){// has literal binding!prop.raw=value;}elseif('development'!=='production'){// check possible camelCase prop usagevarlowerCaseName=path.toLowerCase();value=/[A-Z\-]/.test(name)&&(el.getAttribute(lowerCaseName)||el.getAttribute(':'+lowerCaseName)||el.getAttribute('v-bind:'+lowerCaseName)||el.getAttribute(':'+lowerCaseName+'.once')||el.getAttribute('v-bind:'+lowerCaseName+'.once')||el.getAttribute(':'+lowerCaseName+'.sync')||el.getAttribute('v-bind:'+lowerCaseName+'.sync'));if(value){warn('Possible usage error for prop `'+lowerCaseName+'` - '+'did you mean `'+attr+'`? HTML is case-insensitive, remember to use '+'kebab-case for props in templates.',vm);}elseif(options.required){// warn missing requiredwarn('Missing required prop: '+name,vm);}}// push propprops.push(prop);}returnmakePropsLinkFn(props);}/** * Build a function that applies props to a vm. * * @param {Array} props * @return {Function} propsLinkFn */functionmakePropsLinkFn(props){returnfunctionpropsLinkFn(vm,scope){// store resolved props infovm._props={};varinlineProps=vm.$options.propsData;vari=props.length;varprop,path,options,value,raw;while(i--){prop=props[i];raw=prop.raw;path=prop.path;options=prop.options;vm._props[path]=prop;if(inlineProps&&hasOwn(inlineProps,path)){initProp(vm,prop,inlineProps[path]);}if(raw===null){// initialize absent propinitProp(vm,prop,undefined);}elseif(prop.dynamic){// dynamic propif(prop.mode===propBindingModes.ONE_TIME){// one time bindingvalue=(scope||vm._context||vm).$get(prop.parentPath);initProp(vm,prop,value);}else{if(vm._context){// dynamic bindingvm._bindDir({name:'prop',def:propDef,prop:prop},null,null,scope);// el, host, scope}else{// root instanceinitProp(vm,prop,vm.$get(prop.parentPath));}}}elseif(prop.optimizedLiteral){// optimized literal, cast it and just set oncevarstripped=stripQuotes(raw);value=stripped===raw?toBoolean(toNumber(raw)):stripped;initProp(vm,prop,value);}else{// string literal, but we need to cater for// Boolean props with no value, or with same// literal value (e.g. disabled="disabled")// see https://github.com/vuejs/vue-loader/issues/182value=options.type===Boolean&&(raw===''||raw===hyphenate(prop.name))?true:raw;initProp(vm,prop,value);}}};}/** * Process a prop with a rawValue, applying necessary coersions, * default values & assertions and call the given callback with * processed value. * * @param {Vue} vm * @param {Object} prop * @param {*} rawValue * @param {Function} fn */functionprocessPropValue(vm,prop,rawValue,fn){varisSimple=prop.dynamic&&isSimplePath(prop.parentPath);varvalue=rawValue;if(value===undefined){value=getPropDefaultValue(vm,prop);}value=coerceProp(prop,value,vm);varcoerced=value!==rawValue;if(!assertProp(prop,value,vm)){value=undefined;}if(isSimple&&!coerced){withoutConversion(function(){fn(value);});}else{fn(value);}}/** * Set a prop's initial value on a vm and its data object. * * @param {Vue} vm * @param {Object} prop * @param {*} value */functioninitProp(vm,prop,value){processPropValue(vm,prop,value,function(value){defineReactive(vm,prop.path,value);});}/** * Update a prop's value on a vm. * * @param {Vue} vm * @param {Object} prop * @param {*} value */functionupdateProp(vm,prop,value){processPropValue(vm,prop,value,function(value){vm[prop.path]=value;});}/** * Get the default value of a prop. * * @param {Vue} vm * @param {Object} prop * @return {*} */functiongetPropDefaultValue(vm,prop){// no default, return undefinedvaroptions=prop.options;if(!hasOwn(options,'default')){// absent boolean value defaults to falsereturnoptions.type===Boolean?false:undefined;}vardef=options['default'];// warn against non-base_factory defaults for Object & Arrayif(isObject(def)){'development'!=='production'&&warn('Invalid default value for prop "'+prop.name+'": '+'Props with type Object/Array must use a base_factory function '+'to return the default value.',vm);}// call base_factory function for non-Function typesreturntypeofdef==='function'&&options.type!==Function?def.call(vm):def;}/** * Assert whether a prop is valid. * * @param {Object} prop * @param {*} value * @param {Vue} vm */functionassertProp(prop,value,vm){if(!prop.options.required&&(// non-requiredprop.raw===null||// abscentvalue==null)// null or undefined){returntrue;}varoptions=prop.options;vartype=options.type;varvalid=!type;varexpectedTypes=[];if(type){if(!isArray(type)){type=[type];}for(vari=0;i<type.length&&!valid;i++){varassertedType=assertType(value,type[i]);expectedTypes.push(assertedType.expectedType);valid=assertedType.valid;}}if(!valid){if('development'!=='production'){warn('Invalid prop: type check failed for prop "'+prop.name+'".'+' Expected '+expectedTypes.map(formatType).join(', ')+', got '+formatValue(value)+'.',vm);}returnfalse;}varvalidator=options.validator;if(validator){if(!validator(value)){'development'!=='production'&&warn('Invalid prop: custom validator check failed for prop "'+prop.name+'".',vm);returnfalse;}}returntrue;}/** * Force parsing value with coerce option. * * @param {*} value * @param {Object} options * @return {*} */functioncoerceProp(prop,value,vm){varcoerce=prop.options.coerce;if(!coerce){returnvalue;}if(typeofcoerce==='function'){returncoerce(value);}else{'development'!=='production'&&warn('Invalid coerce for prop "'+prop.name+'": expected function, got '+typeofcoerce+'.',vm);returnvalue;}}/** * Assert the type of a value * * @param {*} value * @param {Function} type * @return {Object} */functionassertType(value,type){varvalid;varexpectedType;if(type===String){expectedType='string';valid=typeofvalue===expectedType;}elseif(type===Number){expectedType='number';valid=typeofvalue===expectedType;}elseif(type===Boolean){expectedType='boolean';valid=typeofvalue===expectedType;}elseif(type===Function){expectedType='function';valid=typeofvalue===expectedType;}elseif(type===Object){expectedType='object';valid=isPlainObject(value);}elseif(type===Array){expectedType='array';valid=isArray(value);}else{valid=valueinstanceoftype;}return{valid:valid,expectedType:expectedType};}/** * Format type for output * * @param {String} type * @return {String} */functionformatType(type){returntype?type.charAt(0).toUpperCase()+type.slice(1):'custom type';}/** * Format value * * @param {*} value * @return {String} */functionformatValue(val){returnObject.prototype.toString.call(val).slice(8,-1);}varbindingModes=config._propBindingModes;varpropDef={bind:functionbind(){varchild=this.vm;varparent=child._context;// passed in from compiler directlyvarprop=this.descriptor.prop;varchildKey=prop.path;varparentKey=prop.parentPath;vartwoWay=prop.mode===bindingModes.TWO_WAY;varparentWatcher=this.parentWatcher=newWatcher(parent,parentKey,function(val){updateProp(child,prop,val);},{twoWay:twoWay,filters:prop.filters,// important: props need to be observed on the// v-for scope if presentscope:this._scope});// set the child initial value.initProp(child,prop,parentWatcher.value);// setup two-way bindingif(twoWay){// important: defer the child watcher creation until// the created hook (after data observation)varself=this;child.$once('pre-hook:created',function(){self.childWatcher=newWatcher(child,childKey,function(val){parentWatcher.set(val);},{// ensure sync upward before parent sync down.// this is necessary in cases e.g. the child// mutates a prop array, then replaces it. (#1683)sync:true});});}},unbind:functionunbind(){this.parentWatcher.teardown();if(this.childWatcher){this.childWatcher.teardown();}}};varqueue$1=[];varqueued=false;/** * Push a job into the queue. * * @param {Function} job */functionpushJob(job){queue$1.push(job);if(!queued){queued=true;nextTick(flush);}}/** * Flush the queue, and do one forced reflow before * triggering transitions. */functionflush(){// Force layoutvarf=document.documentElement.offsetHeight;for(vari=0;i<queue$1.length;i++){queue$1[i]();}queue$1=[];queued=false;// dummy return, so js linters don't complain about// unused variable freturnf;}varTYPE_TRANSITION='transition';varTYPE_ANIMATION='animation';vartransDurationProp=transitionProp+'Duration';varanimDurationProp=animationProp+'Duration';/** * If a just-entered element is applied the * leave class while its enter transition hasn't started yet, * and the transitioned property has the same value for both * enter/leave,thentheleavetransitionwillbeskippedand*thetransitionendeventneverfires.Thisfunctionensures*itscallbacktobecalledafteratransitionhasstarted*bywaitingfordoubleraf.**ItfallsbacktosetTimeoutondevicesthatsupportCSS*transitionsbutnotraf(e.g.Android4.2browser)-since*theseenvironmentsareusuallyslow,wearegivingita*relativelylargetimeout.*/ var raf = inBrowser && window.requestAnimationFrame; var waitForTransitionStart = raf /*istanbulignorenext*/? function (fn) { raf(function () { raf(fn); }); } : function (fn) { setTimeout(fn, 50); }; /***ATransitionobjectthatencapsulatesthestateandlogic*ofthetransition.**@param{Element}el*@param{String}id*@param{Object}hooks*@param{Vue}vm*/ function Transition(el, id, hooks, vm) { this.id = id; this.el = el; this.enterClass = hooks && hooks.enterClass || id + '-enter'; this.leaveClass = hooks && hooks.leaveClass || id + '-leave'; this.hooks = hooks; this.vm = vm; //asyncstatethis.pendingCssEvent=this.pendingCssCb=this.cancel=this.pendingJsCb=this.op=this.cb=null;this.justEntered=false;this.entered=this.left=false;this.typeCache={};// check css transition typethis.type=hooks&&hooks.type;/* istanbul ignore if */if('development'!=='production'){if(this.type&&this.type!==TYPE_TRANSITION&&this.type!==TYPE_ANIMATION){warn('invalid CSS transition type for transition="'+this.id+'": '+this.type,vm);}}// bindvarself=this;['enterNextTick','enterDone','leaveNextTick','leaveDone'].forEach(function(m){self[m]=bind(self[m],self);});}varp$1=Transition.prototype;/** * Start an entering transition. * * 1. enter transition triggered * 2. call beforeEnter hook * 3. add enter class * 4. insert/showelement*5.callenterhook(withpossibleexplicitjscallback)*6.reflow*7.basedontransitiontype:*-transition:*removeclassnow,waitfortransitionend,*thendoneifthere'snoexplicitjscallback.*-animation:*waitforanimationend,removeclass,*thendoneifthere'snoexplicitjscallback.*-nocsstransition:*donenowifthere'snoexplicitjscallback.*8.waitforeitherdoneorjscallback,thencall*afterEnterhook.**@param{Function}op-insert/showtheelement*@param{Function}[cb]*/ p$1.enter = function (op, cb) { this.cancelPending(); this.callHook('beforeEnter'); this.cb = cb; addClass(this.el, this.enterClass); op(); this.entered = false; this.callHookWithCb('enter'); if (this.entered) { return; //usercalleddonesynchronously.}this.cancel=this.hooks&&this.hooks.enterCancelled;pushJob(this.enterNextTick);};/** * The "nextTick" phase of an entering transition, which is * to be pushed into a queue and executed after a reflow so * that removing the class can trigger a CSS transition. */p$1.enterNextTick=function(){var_this=this;// prevent transition skippingthis.justEntered=true;waitForTransitionStart(function(){_this.justEntered=false;});varenterDone=this.enterDone;vartype=this.getCssTransitionType(this.enterClass);if(!this.pendingJsCb){if(type===TYPE_TRANSITION){// trigger transition by removing enter class nowremoveClass(this.el,this.enterClass);this.setupCssCb(transitionEndEvent,enterDone);}elseif(type===TYPE_ANIMATION){this.setupCssCb(animationEndEvent,enterDone);}else{enterDone();}}elseif(type===TYPE_TRANSITION){removeClass(this.el,this.enterClass);}};/** * The "cleanup" phase of an entering transition. */p$1.enterDone=function(){this.entered=true;this.cancel=this.pendingJsCb=null;removeClass(this.el,this.enterClass);this.callHook('afterEnter');if(this.cb)this.cb();};/** * Start a leaving transition. * * 1. leave transition triggered. * 2. call beforeLeave hook * 3. add leave class (trigger css transition) * 4. call leave hook (with possible explicit js callback) * 5. reflow if no explicit js callback is provided * 6. based on transition type: * - transition or animation: * wait for end event, remove class, then done if * there's no explicit js callback. * - no css transition: * done if there's no explicit js callback. * 7. wait for either done or js callback, then call * afterLeave hook. * * @param {Function} op - remove/hidetheelement*@param{Function}[cb]*/ p$1.leave = function (op, cb) { this.cancelPending(); this.callHook('beforeLeave'); this.op = op; this.cb = cb; addClass(this.el, this.leaveClass); this.left = false; this.callHookWithCb('leave'); if (this.left) { return; //usercalleddonesynchronously.}this.cancel=this.hooks&&this.hooks.leaveCancelled;// only need to handle leaveDone if// 1. the transition is already done (synchronously called// by the user, which causes this.op set to null)// 2. there's no explicit js callbackif(this.op&&!this.pendingJsCb){// if a CSS transition leaves immediately after enter,// the transitionend event never fires. therefore we// detect such cases and end the leave immediately.if(this.justEntered){this.leaveDone();}else{pushJob(this.leaveNextTick);}}};/** * The "nextTick" phase of a leaving transition. */p$1.leaveNextTick=function(){vartype=this.getCssTransitionType(this.leaveClass);if(type){varevent=type===TYPE_TRANSITION?transitionEndEvent:animationEndEvent;this.setupCssCb(event,this.leaveDone);}else{this.leaveDone();}};/** * The "cleanup" phase of a leaving transition. */p$1.leaveDone=function(){this.left=true;this.cancel=this.pendingJsCb=null;this.op();removeClass(this.el,this.leaveClass);this.callHook('afterLeave');if(this.cb)this.cb();this.op=null;};/** * Cancel any pending callbacks from a previously running * but not finished transition. */p$1.cancelPending=function(){this.op=this.cb=null;varhasPending=false;if(this.pendingCssCb){hasPending=true;off(this.el,this.pendingCssEvent,this.pendingCssCb);this.pendingCssEvent=this.pendingCssCb=null;}if(this.pendingJsCb){hasPending=true;this.pendingJsCb.cancel();this.pendingJsCb=null;}if(hasPending){removeClass(this.el,this.enterClass);removeClass(this.el,this.leaveClass);}if(this.cancel){this.cancel.call(this.vm,this.el);this.cancel=null;}};/** * Call a user-provided synchronous hook function. * * @param {String} type */p$1.callHook=function(type){if(this.hooks&&this.hooks[type]){this.hooks[type].call(this.vm,this.el);}};/** * Call a user-provided, potentially-async hook function. * We check for the length of arguments to see if the hook * expects a `done` callback. If true, the transition's end * will be determined by when the user calls that callback; * otherwise, the end is determined by the CSS transition or * animation. * * @param {String} type */p$1.callHookWithCb=function(type){varhook=this.hooks&&this.hooks[type];if(hook){if(hook.length>1){this.pendingJsCb=cancellable(this[type+'Done']);}hook.call(this.vm,this.el,this.pendingJsCb);}};/** * Get an element's transition type based on the * calculated styles. * * @param {String} className * @return {Number} */p$1.getCssTransitionType=function(className){/* istanbul ignore if */if(!transitionEndEvent||// skip CSS transitions if page is not visible -// this solves the issue of transitionend events not// firing until the page is visible again.// pageVisibility API is supported in IE10+, same as// CSS transitions.document.hidden||// explicit js-only transitionthis.hooks&&this.hooks.css===false||// element is hiddenisHidden(this.el)){return;}vartype=this.type||this.typeCache[className];if(type)returntype;varinlineStyles=this.el.style;varcomputedStyles=window.getComputedStyle(this.el);vartransDuration=inlineStyles[transDurationProp]||computedStyles[transDurationProp];if(transDuration&&transDuration!=='0s'){type=TYPE_TRANSITION;}else{varanimDuration=inlineStyles[animDurationProp]||computedStyles[animDurationProp];if(animDuration&&animDuration!=='0s'){type=TYPE_ANIMATION;}}if(type){this.typeCache[className]=type;}returntype;};/** * Setup a CSS transitionend/animationendcallback.**@param{String}event*@param{Function}cb*/ p$1.setupCssCb = function (event, cb) { this.pendingCssEvent = event; var self = this; var el = this.el; var onEnd = this.pendingCssCb = function (e) { if (e.target === el) { off(el, event, onEnd); self.pendingCssEvent = self.pendingCssCb = null; if (!self.pendingJsCb && cb) { cb(); } } }; on(el, event, onEnd); }; /***Checkifanelementishidden-inthatcasewecanjust*skipthetransitionalltogether.**@param{Element}el*@return{Boolean}*/ function isHidden(el) { if (/svg$/.test(el.namespaceURI)){// SVG elements do not have offset(Width|Height)// so we need to check the client rectvarrect=el.getBoundingClientRect();return!(rect.width||rect.height);}else{return!(el.offsetWidth||el.offsetHeight||el.getClientRects().length);}}vartransition$1={priority:TRANSITION,update:functionupdate(id,oldId){varel=this.el;// resolve on owner vmvarhooks=resolveAsset(this.vm.$options,'transitions',id);id=id||'v';oldId=oldId||'v';el.__v_trans=newTransition(el,id,hooks,this.vm);removeClass(el,oldId+'-transition');addClass(el,id+'-transition');}};varinternalDirectives={style:style,'class':vClass,component:component,prop:propDef,transition:transition$1};// special binding prefixesvarbindRE=/^v-bind:|^:/;varonRE=/^v-on:|^@/;vardirAttrRE=/^v-([^:]+)(?:$|:(.*)$)/;varmodifierRE=/\.[^\.]+/g;vartransitionRE=/^(v-bind:|:)?transition$/;// default directive priorityvarDEFAULT_PRIORITY=1000;varDEFAULT_TERMINAL_PRIORITY=2000;/** * Compile a template and return a reusable composite link * function, which recursively contains more link functions * inside. This top level compile function would normally * be called on instance root nodes, but can also be used * for partial compilation if the partial argument is true. * * The returned composite link function, when called, will * return an unlink function that tearsdown all directives * created during the linking phase. * * @param {Element|DocumentFragment} el * @param {Object} options * @param {Boolean} partial * @return {Function} */functioncompile(el,options,partial){// link function for the node itself.varnodeLinkFn=partial||!options._asComponent?compileNode(el,options):null;// link function for the childNodesvarchildLinkFn=!(nodeLinkFn&&nodeLinkFn.terminal)&&!isScript(el)&&el.hasChildNodes()?compileNodeList(el.childNodes,options):null;/** * A composite linker function to be called on a already * compiled piece of DOM, which instantiates all directive * instances. * * @param {Vue} vm * @param {Element|DocumentFragment} el * @param {Vue} [host] - host vm of transcluded content * @param {Object} [scope] - v-for scope * @param {Fragment} [frag] - link context fragment * @return {Function|undefined} */returnfunctioncompositeLinkFn(vm,el,host,scope,frag){// cache childNodes before linking parent, fix #657varchildNodes=toArray(el.childNodes);// linkvardirs=linkAndCapture(functioncompositeLinkCapturer(){if(nodeLinkFn)nodeLinkFn(vm,el,host,scope,frag);if(childLinkFn)childLinkFn(vm,childNodes,host,scope,frag);},vm);returnmakeUnlinkFn(vm,dirs);};}/** * Apply a linker to a vm/elementpairandcapturethe*directivescreatedduringtheprocess.**@param{Function}linker*@param{Vue}vm*/ function linkAndCapture(linker, vm) { /*istanbulignoreif*/ if ('development' === 'production') { } var originalDirCount = vm._directives.length; linker(); var dirs = vm._directives.slice(originalDirCount); dirs.sort(directiveComparator); for (var i = 0, l = dirs.length; i < l; i++) { dirs[i]._bind(); } return dirs; } /***Directiveprioritysortcomparator**@param{Object}a*@param{Object}b*/ function directiveComparator(a, b) { a = a.descriptor.def.priority || DEFAULT_PRIORITY; b = b.descriptor.def.priority || DEFAULT_PRIORITY; return a > b ? -1 : a === b ? 0 : 1; } /***Linkerfunctionsreturnanunlinkfunctionthat*tearsdownalldirectivesinstancesgeneratedduring*theprocess.**Wecreateunlinkfunctionswithonlythenecessary*informationtoavoidretainingadditionalclosures.**@param{Vue}vm*@param{Array}dirs*@param{Vue}[context]*@param{Array}[contextDirs]*@return{Function}*/ function makeUnlinkFn(vm, dirs, context, contextDirs) { function unlink(destroying) { teardownDirs(vm, dirs, destroying); if (context && contextDirs) { teardownDirs(context, contextDirs); } } //exposelinkeddirectivesunlink.dirs=dirs;returnunlink;}/** * Teardown partial linked directives. * * @param {Vue} vm * @param {Array} dirs * @param {Boolean} destroying */functionteardownDirs(vm,dirs,destroying){vari=dirs.length;while(i--){dirs[i]._teardown();if('development'!=='production'&&!destroying){vm._directives.$remove(dirs[i]);}}}/** * Compile link props on an instance. * * @param {Vue} vm * @param {Element} el * @param {Object} props * @param {Object} [scope] * @return {Function} */functioncompileAndLinkProps(vm,el,props,scope){varpropsLinkFn=compileProps(el,props,vm);varpropDirs=linkAndCapture(function(){propsLinkFn(vm,scope);},vm);returnmakeUnlinkFn(vm,propDirs);}/** * Compile the root element of an instance. * * 1. attrs on context container (context scope) * 2. attrs on the component template root node, if * replace:true (child scope) * * If this is a fragment instance, we only need to compile 1. * * @param {Element} el * @param {Object} options * @param {Object} contextOptions * @return {Function} */functioncompileRoot(el,options,contextOptions){varcontainerAttrs=options._containerAttrs;varreplacerAttrs=options._replacerAttrs;varcontextLinkFn,replacerLinkFn;// only need to compile other attributes for// non-fragment instancesif(el.nodeType!==11){// for components, container and replacer need to be// compiled separately and linked in different scopes.if(options._asComponent){// 2. container attributesif(containerAttrs&&contextOptions){contextLinkFn=compileDirectives(containerAttrs,contextOptions);}if(replacerAttrs){// 3. replacer attributesreplacerLinkFn=compileDirectives(replacerAttrs,options);}}else{// non-component, just compile as a normal element.replacerLinkFn=compileDirectives(el.attributes,options);}}elseif('development'!=='production'&&containerAttrs){// warn container directives for fragment instancesvarnames=containerAttrs.filter(function(attr){// allow vue-loader/vueify scoped css attributesreturnattr.name.indexOf('_v-')<0&&// allow event listeners!onRE.test(attr.name)&&// allow slotsattr.name!=='slot';}).map(function(attr){return'"'+attr.name+'"';});if(names.length){varplural=names.length>1;warn('Attribute'+(plural?'s ':' ')+names.join(', ')+(plural?' are':' is')+' ignored on component '+'<'+options.el.tagName.toLowerCase()+'> because '+'the component is a fragment instance: '+'http://vuejs.org/guide/components.html#Fragment-Instance');}}options._containerAttrs=options._replacerAttrs=null;returnfunctionrootLinkFn(vm,el,scope){// link context scope dirsvarcontext=vm._context;varcontextDirs;if(context&&contextLinkFn){contextDirs=linkAndCapture(function(){contextLinkFn(context,el,null,scope);},context);}// link selfvarselfDirs=linkAndCapture(function(){if(replacerLinkFn)replacerLinkFn(vm,el);},vm);// return the unlink function that tearsdown context// container directives.returnmakeUnlinkFn(vm,selfDirs,context,contextDirs);};}/** * Compile a node and return a nodeLinkFn based on the * node type. * * @param {Node} node * @param {Object} options * @return {Function|null} */functioncompileNode(node,options){vartype=node.nodeType;if(type===1&&!isScript(node)){returncompileElement(node,options);}elseif(type===3&&node.data.trim()){returncompileTextNode(node,options);}else{returnnull;}}/** * Compile an element and return a nodeLinkFn. * * @param {Element} el * @param {Object} options * @return {Function|null} */functioncompileElement(el,options){// preprocess textareas.// textarea treats its text content as the initial value.// just bind it as an attr directive for value.if(el.tagName==='TEXTAREA'){vartokens=parseText(el.value);if(tokens){el.setAttribute(':value',tokensToExp(tokens));el.value='';}}varlinkFn;varhasAttrs=el.hasAttributes();varattrs=hasAttrs&&toArray(el.attributes);// check terminal directives (for & if)if(hasAttrs){linkFn=checkTerminalDirectives(el,attrs,options);}// check element directivesif(!linkFn){linkFn=checkElementDirectives(el,options);}// check componentif(!linkFn){linkFn=checkComponent(el,options);}// normal directivesif(!linkFn&&hasAttrs){linkFn=compileDirectives(attrs,options);}returnlinkFn;}/** * Compile a textNode and return a nodeLinkFn. * * @param {TextNode} node * @param {Object} options * @return {Function|null} textNodeLinkFn */functioncompileTextNode(node,options){// skip marked text nodesif(node._skip){returnremoveText;}vartokens=parseText(node.wholeText);if(!tokens){returnnull;}// mark adjacent text nodes as skipped,// because we are using node.wholeText to compile// all adjacent text nodes together. This fixes// issues in IE where sometimes it splits up a single// text node into multiple ones.varnext=node.nextSibling;while(next&&next.nodeType===3){next._skip=true;next=next.nextSibling;}varfrag=document.createDocumentFragment();varel,token;for(vari=0,l=tokens.length;i<l;i++){token=tokens[i];el=token.tag?processTextToken(token,options):document.createTextNode(token.value);frag.appendChild(el);}returnmakeTextNodeLinkFn(tokens,frag,options);}/** * Linker for an skipped text node. * * @param {Vue} vm * @param {Text} node */functionremoveText(vm,node){remove(node);}/** * Process a single text token. * * @param {Object} token * @param {Object} options * @return {Node} */functionprocessTextToken(token,options){varel;if(token.oneTime){el=document.createTextNode(token.value);}else{if(token.html){el=document.createComment('v-html');setTokenType('html');}else{// IE will clean up empty textNodes during// frag.cloneNode(true), so we have to give it// something here...el=document.createTextNode(' ');setTokenType('text');}}functionsetTokenType(type){if(token.descriptor)return;varparsed=parseDirective(token.value);token.descriptor={name:type,def:directives[type],expression:parsed.expression,filters:parsed.filters};}returnel;}/** * Build a function that processes a textNode. * * @param {Array<Object>} tokens * @param {DocumentFragment} frag */functionmakeTextNodeLinkFn(tokens,frag){returnfunctiontextNodeLinkFn(vm,el,host,scope){varfragClone=frag.cloneNode(true);varchildNodes=toArray(fragClone.childNodes);vartoken,value,node;for(vari=0,l=tokens.length;i<l;i++){token=tokens[i];value=token.value;if(token.tag){node=childNodes[i];if(token.oneTime){value=(scope||vm).$eval(value);if(token.html){replace(node,parseTemplate(value,true));}else{node.data=_toString(value);}}else{vm._bindDir(token.descriptor,node,host,scope);}}}replace(el,fragClone);};}/** * Compile a node list and return a childLinkFn. * * @param {NodeList} nodeList * @param {Object} options * @return {Function|undefined} */functioncompileNodeList(nodeList,options){varlinkFns=[];varnodeLinkFn,childLinkFn,node;for(vari=0,l=nodeList.length;i<l;i++){node=nodeList[i];nodeLinkFn=compileNode(node,options);childLinkFn=!(nodeLinkFn&&nodeLinkFn.terminal)&&node.tagName!=='SCRIPT'&&node.hasChildNodes()?compileNodeList(node.childNodes,options):null;linkFns.push(nodeLinkFn,childLinkFn);}returnlinkFns.length?makeChildLinkFn(linkFns):null;}/** * Make a child link function for a node's childNodes. * * @param {Array<Function>} linkFns * @return {Function} childLinkFn */functionmakeChildLinkFn(linkFns){returnfunctionchildLinkFn(vm,nodes,host,scope,frag){varnode,nodeLinkFn,childrenLinkFn;for(vari=0,n=0,l=linkFns.length;i<l;n++){node=nodes[n];nodeLinkFn=linkFns[i++];childrenLinkFn=linkFns[i++];// cache childNodes before linking parent, fix #657varchildNodes=toArray(node.childNodes);if(nodeLinkFn){nodeLinkFn(vm,node,host,scope,frag);}if(childrenLinkFn){childrenLinkFn(vm,childNodes,host,scope,frag);}}};}/** * Check for element directives (custom elements that should * be resovled as terminal directives). * * @param {Element} el * @param {Object} options */functioncheckElementDirectives(el,options){vartag=el.tagName.toLowerCase();if(commonTagRE.test(tag)){return;}vardef=resolveAsset(options,'elementDirectives',tag);if(def){returnmakeTerminalNodeLinkFn(el,tag,'',options,def);}}/** * Check if an element is a component. If yes, return * a component link function. * * @param {Element} el * @param {Object} options * @return {Function|undefined} */functioncheckComponent(el,options){varcomponent=checkComponentAttr(el,options);if(component){varref=findRef(el);vardescriptor={name:'component',ref:ref,expression:component.id,def:internalDirectives.component,modifiers:{literal:!component.dynamic}};varcomponentLinkFn=functioncomponentLinkFn(vm,el,host,scope,frag){if(ref){defineReactive((scope||vm).$refs,ref,null);}vm._bindDir(descriptor,el,host,scope,frag);};componentLinkFn.terminal=true;returncomponentLinkFn;}}/** * Check an element for terminal directives in fixed order. * If it finds one, return a terminal link function. * * @param {Element} el * @param {Array} attrs * @param {Object} options * @return {Function} terminalLinkFn */functioncheckTerminalDirectives(el,attrs,options){// skip v-preif(getAttr(el,'v-pre')!==null){returnskip;}// skip v-else block, but only if following v-ifif(el.hasAttribute('v-else')){varprev=el.previousElementSibling;if(prev&&prev.hasAttribute('v-if')){returnskip;}}varattr,name,value,modifiers,matched,dirName,rawName,arg,def,termDef;for(vari=0,j=attrs.length;i<j;i++){attr=attrs[i];name=attr.name.replace(modifierRE,'');if(matched=name.match(dirAttrRE)){def=resolveAsset(options,'directives',matched[1]);if(def&&def.terminal){if(!termDef||(def.priority||DEFAULT_TERMINAL_PRIORITY)>termDef.priority){termDef=def;rawName=attr.name;modifiers=parseModifiers(attr.name);value=attr.value;dirName=matched[1];arg=matched[2];}}}}if(termDef){returnmakeTerminalNodeLinkFn(el,dirName,value,options,termDef,rawName,arg,modifiers);}}functionskip(){}skip.terminal=true;/** * Build a node link function for a terminal directive. * A terminal link function terminates the current * compilation recursion and handles compilation of the * subtree in the directive. * * @param {Element} el * @param {String} dirName * @param {String} value * @param {Object} options * @param {Object} def * @param {String} [rawName] * @param {String} [arg] * @param {Object} [modifiers] * @return {Function} terminalLinkFn */functionmakeTerminalNodeLinkFn(el,dirName,value,options,def,rawName,arg,modifiers){varparsed=parseDirective(value);vardescriptor={name:dirName,arg:arg,expression:parsed.expression,filters:parsed.filters,raw:value,attr:rawName,modifiers:modifiers,def:def};// check ref for v-for and router-viewif(dirName==='for'||dirName==='router-view'){descriptor.ref=findRef(el);}varfn=functionterminalNodeLinkFn(vm,el,host,scope,frag){if(descriptor.ref){defineReactive((scope||vm).$refs,descriptor.ref,null);}vm._bindDir(descriptor,el,host,scope,frag);};fn.terminal=true;returnfn;}/** * Compile the directives on an element and return a linker. * * @param {Array|NamedNodeMap} attrs * @param {Object} options * @return {Function} */functioncompileDirectives(attrs,options){vari=attrs.length;vardirs=[];varattr,name,value,rawName,rawValue,dirName,arg,modifiers,dirDef,tokens,matched;while(i--){attr=attrs[i];name=rawName=attr.name;value=rawValue=attr.value;tokens=parseText(value);// reset argarg=null;// check modifiersmodifiers=parseModifiers(name);name=name.replace(modifierRE,'');// attribute interpolationsif(tokens){value=tokensToExp(tokens);arg=name;pushDir('bind',directives.bind,tokens);// warn against mixing mustaches with v-bindif('development'!=='production'){if(name==='class'&&Array.prototype.some.call(attrs,function(attr){returnattr.name===':class'||attr.name==='v-bind:class';})){warn('class="'+rawValue+'": Do not mix mustache interpolation '+'and v-bind for "class" on the same element. Use one or the other.',options);}}}else// special attribute: transitionif(transitionRE.test(name)){modifiers.literal=!bindRE.test(name);pushDir('transition',internalDirectives.transition);}else// event handlersif(onRE.test(name)){arg=name.replace(onRE,'');pushDir('on',directives.on);}else// attribute bindingsif(bindRE.test(name)){dirName=name.replace(bindRE,'');if(dirName==='style'||dirName==='class'){pushDir(dirName,internalDirectives[dirName]);}else{arg=dirName;pushDir('bind',directives.bind);}}else// normal directivesif(matched=name.match(dirAttrRE)){dirName=matched[1];arg=matched[2];// skip v-else (when used with v-show)if(dirName==='else'){continue;}dirDef=resolveAsset(options,'directives',dirName,true);if(dirDef){pushDir(dirName,dirDef);}}}/** * Push a directive. * * @param {String} dirName * @param {Object|Function} def * @param {Array} [interpTokens] */functionpushDir(dirName,def,interpTokens){varhasOneTimeToken=interpTokens&&hasOneTime(interpTokens);varparsed=!hasOneTimeToken&&parseDirective(value);dirs.push({name:dirName,attr:rawName,raw:rawValue,def:def,arg:arg,modifiers:modifiers,// conversion from interpolation strings with one-time token// to expression is differed until directive bind time so that we// have access to the actual vm context for one-time bindings.expression:parsed&&parsed.expression,filters:parsed&&parsed.filters,interp:interpTokens,hasOneTime:hasOneTimeToken});}if(dirs.length){returnmakeNodeLinkFn(dirs);}}/** * Parse modifiers from directive attribute name. * * @param {String} name * @return {Object} */functionparseModifiers(name){varres=Object.create(null);varmatch=name.match(modifierRE);if(match){vari=match.length;while(i--){res[match[i].slice(1)]=true;}}returnres;}/** * Build a link function for all directives on a single node. * * @param {Array} directives * @return {Function} directivesLinkFn */functionmakeNodeLinkFn(directives){returnfunctionnodeLinkFn(vm,el,host,scope,frag){// reverse apply because it's sorted low to highvari=directives.length;while(i--){vm._bindDir(directives[i],el,host,scope,frag);}};}/** * Check if an interpolation string contains one-time tokens. * * @param {Array} tokens * @return {Boolean} */functionhasOneTime(tokens){vari=tokens.length;while(i--){if(tokens[i].oneTime)returntrue;}}functionisScript(el){returnel.tagName==='SCRIPT'&&(!el.hasAttribute('type')||el.getAttribute('type')==='text/javascript');}varspecialCharRE=/[^\w\-:\.]/;/** * Process an element or a DocumentFragment based on a * instance option object. This allows us to transclude * a template node/fragmentbeforetheinstanceiscreated,*sotheprocessedfragmentcanthenbeclonedandreused*inv-for.**@param{Element}el*@param{Object}options*@return{Element|DocumentFragment}*/ function transclude(el, options) { //extractcontainerattributestopassthemdown// to compiler, because they need to be compiled in// parent scope. we are mutating the options object here// assuming the same object will be used for compile// right after this.if(options){options._containerAttrs=extractAttrs(el);}// for template tags, what we want is its content as// a documentFragment (for fragment instances)if(isTemplate(el)){el=parseTemplate(el);}if(options){if(options._asComponent&&!options.template){options.template='<slot></slot>';}if(options.template){options._content=extractContent(el);el=transcludeTemplate(el,options);}}if(isFragment(el)){// anchors for fragment instance// passing in `persist: true` to avoid them being// discarded by IE during template cloningprepend(createAnchor('v-start',true),el);el.appendChild(createAnchor('v-end',true));}returnel;}/** * Process the template option. * If the replace option is true this will swap the $el. * * @param {Element} el * @param {Object} options * @return {Element|DocumentFragment} */functiontranscludeTemplate(el,options){vartemplate=options.template;varfrag=parseTemplate(template,true);if(frag){varreplacer=frag.firstChild;vartag=replacer.tagName&&replacer.tagName.toLowerCase();if(options.replace){/* istanbul ignore if */if(el===document.body){'development'!=='production'&&warn('You are mounting an instance with a template to '+'<body>. This will replace <body> entirely. You '+'should probably use `replace: false` here.');}// there are many cases where the instance must// become a fragment instance: basically anything that// can create more than 1 root nodes.if(// multi-children templatefrag.childNodes.length>1||// non-element templatereplacer.nodeType!==1||// single nested componenttag==='component'||resolveAsset(options,'components',tag)||hasBindAttr(replacer,'is')||// element directiveresolveAsset(options,'elementDirectives',tag)||// for blockreplacer.hasAttribute('v-for')||// if blockreplacer.hasAttribute('v-if')){returnfrag;}else{options._replacerAttrs=extractAttrs(replacer);mergeAttrs(el,replacer);returnreplacer;}}else{el.appendChild(frag);returnel;}}else{'development'!=='production'&&warn('Invalid template option: '+template);}}/** * Helper to extract a component container's attributes * into a plain object array. * * @param {Element} el * @return {Array} */functionextractAttrs(el){if(el.nodeType===1&&el.hasAttributes()){returntoArray(el.attributes);}}/** * Merge the attributes of two elements, and make sure * the class names are merged properly. * * @param {Element} from * @param {Element} to */functionmergeAttrs(from,to){varattrs=from.attributes;vari=attrs.length;varname,value;while(i--){name=attrs[i].name;value=attrs[i].value;if(!to.hasAttribute(name)&&!specialCharRE.test(name)){to.setAttribute(name,value);}elseif(name==='class'&&!parseText(value)&&(value=value.trim())){value.split(/\s+/).forEach(function(cls){addClass(to,cls);});}}}/** * Scan and determine slot content distribution. * We do this during transclusion instead at compile time so that * the distribution is decoupled from the compilation order of * the slots. * * @param {Element|DocumentFragment} template * @param {Element} content * @param {Vue} vm */functionresolveSlots(vm,content){if(!content){return;}varcontents=vm._slotContents=Object.create(null);varel,name;for(vari=0,l=content.children.length;i<l;i++){el=content.children[i];/* eslint-disable no-cond-assign */if(name=el.getAttribute('slot')){(contents[name]||(contents[name]=[])).push(el);}/* eslint-enable no-cond-assign */if('development'!=='production'&&getBindAttr(el,'slot')){warn('The "slot" attribute must be static.',vm.$parent);}}for(nameincontents){contents[name]=extractFragment(contents[name],content);}if(content.hasChildNodes()){varnodes=content.childNodes;if(nodes.length===1&&nodes[0].nodeType===3&&!nodes[0].data.trim()){return;}contents['default']=extractFragment(content.childNodes,content);}}/** * Extract qualified content nodes from a node list. * * @param {NodeList} nodes * @return {DocumentFragment} */functionextractFragment(nodes,parent){varfrag=document.createDocumentFragment();nodes=toArray(nodes);for(vari=0,l=nodes.length;i<l;i++){varnode=nodes[i];if(isTemplate(node)&&!node.hasAttribute('v-if')&&!node.hasAttribute('v-for')){parent.removeChild(node);node=parseTemplate(node,true);}frag.appendChild(node);}returnfrag;}varcompiler=Object.freeze({compile:compile,compileAndLinkProps:compileAndLinkProps,compileRoot:compileRoot,transclude:transclude,resolveSlots:resolveSlots});functionstateMixin(Vue){/** * Accessor for `$data` property, since setting $data * requires observing the new object and updating * proxied properties. */Object.defineProperty(Vue.prototype,'$data',{get:functionget(){returnthis._data;},set:functionset(newData){if(newData!==this._data){this._setData(newData);}}});/** * Setup the scope of an instance, which contains: * - observed data * - computed properties * - user methods * - meta properties */Vue.prototype._initState=function(){this._initProps();this._initMeta();this._initMethods();this._initData();this._initComputed();};/** * Initialize props. */Vue.prototype._initProps=function(){varoptions=this.$options;varel=options.el;varprops=options.props;if(props&&!el){'development'!=='production'&&warn('Props will not be compiled if no `el` option is '+'provided at instantiation.',this);}// make sure to convert string selectors into element nowel=options.el=query(el);this._propsUnlinkFn=el&&el.nodeType===1&&props// props must be linked in proper scope if inside v-for?compileAndLinkProps(this,el,props,this._scope):null;};/** * Initialize the data. */Vue.prototype._initData=function(){vardataFn=this.$options.data;vardata=this._data=dataFn?dataFn():{};if(!isPlainObject(data)){data={};'development'!=='production'&&warn('data functions should return an object.',this);}varprops=this._props;// proxy data on instancevarkeys=Object.keys(data);vari,key;i=keys.length;while(i--){key=keys[i];// there are two scenarios where we can proxy a data key:// 1. it's not already defined as a prop// 2. it's provided via a instantiation option AND there are no// template prop presentif(!props||!hasOwn(props,key)){this._proxy(key);}elseif('development'!=='production'){warn('Data field "'+key+'" is already defined '+'as a prop. To provide default value for a prop, use the "default" '+'prop option; if you want to pass prop values to an instantiation '+'call, use the "propsData" option.',this);}}// observe dataobserve(data,this);};/** * Swap the instance's $data. Called in $data's setter. * * @param {Object} newData */Vue.prototype._setData=function(newData){newData=newData||{};varoldData=this._data;this._data=newData;varkeys,key,i;// unproxy keys not present in new datakeys=Object.keys(oldData);i=keys.length;while(i--){key=keys[i];if(!(keyinnewData)){this._unproxy(key);}}// proxy keys not already proxied,// and trigger change for changed valueskeys=Object.keys(newData);i=keys.length;while(i--){key=keys[i];if(!hasOwn(this,key)){// new propertythis._proxy(key);}}oldData.__ob__.removeVm(this);observe(newData,this);this._digest();};/** * Proxy a property, so that * vm.prop === vm._data.prop * * @param {String} key */Vue.prototype._proxy=function(key){if(!isReserved(key)){// need to store ref to self here// because these getter/setters might// be called by child scopes via// prototype inheritance.varself=this;Object.defineProperty(self,key,{configurable:true,enumerable:true,get:functionproxyGetter(){returnself._data[key];},set:functionproxySetter(val){self._data[key]=val;}});}};/** * Unproxy a property. * * @param {String} key */Vue.prototype._unproxy=function(key){if(!isReserved(key)){deletethis[key];}};/** * Force update on every watcher in scope. */Vue.prototype._digest=function(){for(vari=0,l=this._watchers.length;i<l;i++){this._watchers[i].update(true);// shallow updates}};/** * Setup computed properties. They are essentially * special getter/setters*/ function noop() { } Vue.prototype._initComputed = function () { var computed = this.$options.computed; if (computed) { for (var key in computed) { var userDef = computed[key]; var def = { enumerable: true, configurable: true }; if (typeof userDef === 'function') { def.get = makeComputedGetter(userDef, this); def.set = noop; } else { def.get = userDef.get ? userDef.cache !== false ? makeComputedGetter(userDef.get, this) : bind(userDef.get, this) : noop; def.set = userDef.set ? bind(userDef.set, this) : noop; } Object.defineProperty(this, key, def); } } }; function makeComputedGetter(getter, owner) { var watcher = new Watcher(owner, getter, null, { lazy: true }); return function computedGetter() { if (watcher.dirty) { watcher.evaluate(); } if (Dep.target) { watcher.depend(); } return watcher.value; }; } /***Setupinstancemethods.Methodsmustbeboundtothe*instancesincetheymightbepasseddownasapropto*childcomponents.*/ Vue.prototype._initMethods = function () { var methods = this.$options.methods; if (methods) { for (var key in methods) { this[key] = bind(methods[key], this); } } }; /***Initializemetainformationlike$index,$key&$value.*/ Vue.prototype._initMeta = function () { var metas = this.$options._meta; if (metas) { for (var key in metas) { defineReactive(this, key, metas[key]); } } }; } var eventRE = /^v-on:|^@/;functioneventsMixin(Vue){/** * Setup the instance's option events & watchers. * If the value is a string, we pull it from the * instance's methods by name. */Vue.prototype._initEvents=function(){varoptions=this.$options;if(options._asComponent){registerComponentEvents(this,options.el);}registerCallbacks(this,'$on',options.events);registerCallbacks(this,'$watch',options.watch);};/** * Register v-on events on a child component * * @param {Vue} vm * @param {Element} el */functionregisterComponentEvents(vm,el){varattrs=el.attributes;varname,value,handler;for(vari=0,l=attrs.length;i<l;i++){name=attrs[i].name;if(eventRE.test(name)){name=name.replace(eventRE,'');// force the expression into a statement so that// it always dynamically resolves the method to call (#2670)// kinda ugly hack, but does the job.value=attrs[i].value;if(isSimplePath(value)){value+='.apply(this, $arguments)';}handler=(vm._scope||vm._context).$eval(value,true);handler._fromParent=true;vm.$on(name.replace(eventRE),handler);}}}/** * Register callbacks for option events and watchers. * * @param {Vue} vm * @param {String} action * @param {Object} hash */functionregisterCallbacks(vm,action,hash){if(!hash)return;varhandlers,key,i,j;for(keyinhash){handlers=hash[key];if(isArray(handlers)){for(i=0,j=handlers.length;i<j;i++){register(vm,action,key,handlers[i]);}}else{register(vm,action,key,handlers);}}}/** * Helper to register an event/watchcallback.**@param{Vue}vm*@param{String}action*@param{String}key*@param{Function|String|Object}handler*@param{Object}[options]*/ function register(vm, action, key, handler, options) { var type = typeof handler; if (type === 'function') { vm[action](key, handler, options); } else if (type === 'string') { var methods = vm.$options.methods; var method = methods && methods[handler]; if (method) { vm[action](key, method, options); } else { 'development' !== 'production' && warn('Unknown method: "' + handler + '" when ' + 'registering callback for ' + action + ': "' + key + '".', vm); } } else if (handler && type === 'object') { register(vm, action, key, handler.handler, handler); } } /***Setuprecursiveattached/detachedcalls*/ Vue.prototype._initDOMHooks = function () { this.$on('hook:attached', onAttached); this.$on('hook:detached', onDetached); }; /***Callbacktorecursivelycallattachedhookonchildren*/ function onAttached() { if (!this._isAttached) { this._isAttached = true; this.$children.forEach(callAttach); } } /***Iteratortocallattachedhook**@param{Vue}child*/ function callAttach(child) { if (!child._isAttached && inDoc(child.$el)) { child._callHook('attached'); } } /***Callbacktorecursivelycalldetachedhookonchildren*/ function onDetached() { if (this._isAttached) { this._isAttached = false; this.$children.forEach(callDetach); } } /***Iteratortocalldetachedhook**@param{Vue}child*/ function callDetach(child) { if (child._isAttached && !inDoc(child.$el)) { child._callHook('detached'); } } /***Triggerallhandlersforahook**@param{String}hook*/ Vue.prototype._callHook = function (hook) { this.$emit('pre-hook:' + hook); var handlers = this.$options[hook]; if (handlers) { for (var i = 0, j = handlers.length; i < j; i++) { handlers[i].call(this); } } this.$emit('hook:' + hook); }; } function noop$1() { } /***AdirectivelinksaDOMelementwithapieceofdata,*whichistheresultofevaluatinganexpression.*Itregistersawatcherwiththeexpressionandcalls*theDOMupdatefunctionwhenachangeistriggered.**@param{Object}descriptor*-{String}name*-{Object}def*-{String}expression*-{Array<Object>}[filters]*-{Object}[modifiers]*-{Boolean}literal*-{String}attr*-{String}arg*-{String}raw*-{String}[ref]*-{Array<Object>}[interp]*-{Boolean}[hasOneTime]*@param{Vue}vm*@param{Node}el*@param{Vue}[host]-transclusionhostcomponent*@param{Object}[scope]-v-forscope*@param{Fragment}[frag]-ownerfragment*@constructor*/ function Directive(descriptor, vm, el, host, scope, frag) { this.vm = vm; this.el = el; //copydescriptorpropertiesthis.descriptor=descriptor;this.name=descriptor.name;this.expression=descriptor.expression;this.arg=descriptor.arg;this.modifiers=descriptor.modifiers;this.filters=descriptor.filters;this.literal=this.modifiers&&this.modifiers.literal;// privatethis._locked=false;this._bound=false;this._listeners=null;// link contextthis._host=host;this._scope=scope;this._frag=frag;// store directives on node in dev modeif('development'!=='production'&&this.el){this.el._vue_directives=this.el._vue_directives||[];this.el._vue_directives.push(this);}}/** * Initialize the directive, mixin definition properties, * setup the watcher, call definition bind() and update() * if present. */Directive.prototype._bind=function(){varname=this.name;vardescriptor=this.descriptor;// remove attributeif((name!=='cloak'||this.vm._isCompiled)&&this.el&&this.el.removeAttribute){varattr=descriptor.attr||'v-'+name;this.el.removeAttribute(attr);}// copy def propertiesvardef=descriptor.def;if(typeofdef==='function'){this.update=def;}else{extend(this,def);}// setup directive paramsthis._setupParams();// initial bindif(this.bind){this.bind();}this._bound=true;if(this.literal){this.update&&this.update(descriptor.raw);}elseif((this.expression||this.modifiers)&&(this.update||this.twoWay)&&!this._checkStatement()){// wrapped updater for contextvardir=this;if(this.update){this._update=function(val,oldVal){if(!dir._locked){dir.update(val,oldVal);}};}else{this._update=noop$1;}varpreProcess=this._preProcess?bind(this._preProcess,this):null;varpostProcess=this._postProcess?bind(this._postProcess,this):null;varwatcher=this._watcher=newWatcher(this.vm,this.expression,this._update,// callback{filters:this.filters,twoWay:this.twoWay,deep:this.deep,preProcess:preProcess,postProcess:postProcess,scope:this._scope});// v-model with inital inline value need to sync back to// model instead of update to DOM on init. They would// set the afterBind hook to indicate that.if(this.afterBind){this.afterBind();}elseif(this.update){this.update(watcher.value);}}};/** * Setup all param attributes, e.g. track-by, * transition-mode, etc... */Directive.prototype._setupParams=function(){if(!this.params){return;}varparams=this.params;// swap the params array with a fresh object.this.params=Object.create(null);vari=params.length;varkey,val,mappedKey;while(i--){key=hyphenate(params[i]);mappedKey=camelize(key);val=getBindAttr(this.el,key);if(val!=null){// dynamicthis._setupParamWatcher(mappedKey,val);}else{// staticval=getAttr(this.el,key);if(val!=null){this.params[mappedKey]=val===''?true:val;}}}};/** * Setup a watcher for a dynamic param. * * @param {String} key * @param {String} expression */Directive.prototype._setupParamWatcher=function(key,expression){varself=this;varcalled=false;varunwatch=(this._scope||this.vm).$watch(expression,function(val,oldVal){self.params[key]=val;// since we are in immediate mode,// only call the param change callbacks if this is not the first update.if(called){varcb=self.paramWatchers&&self.paramWatchers[key];if(cb){cb.call(self,val,oldVal);}}else{called=true;}},{immediate:true,user:false});(this._paramUnwatchFns||(this._paramUnwatchFns=[])).push(unwatch);};/** * Check if the directive is a function caller * and if the expression is a callable one. If both true, * we wrap up the expression and use it as the event * handler. * * e.g. on-click="a++" * * @return {Boolean} */Directive.prototype._checkStatement=function(){varexpression=this.expression;if(expression&&this.acceptStatement&&!isSimplePath(expression)){varfn=parseExpression(expression).get;varscope=this._scope||this.vm;varhandler=functionhandler(e){scope.$event=e;fn.call(scope,scope);scope.$event=null;};if(this.filters){handler=scope._applyFilters(handler,null,this.filters);}this.update(handler);returntrue;}};/** * Set the corresponding value with the setter. * This should only be used in two-way directives * e.g. v-model. * * @param {*} value * @public */Directive.prototype.set=function(value){/* istanbul ignore else */if(this.twoWay){this._withLock(function(){this._watcher.set(value);});}elseif('development'!=='production'){warn('Directive.set() can only be used inside twoWay'+'directives.');}};/** * Execute a function while preventing that function from * triggering updates on this directive instance. * * @param {Function} fn */Directive.prototype._withLock=function(fn){varself=this;self._locked=true;fn.call(self);nextTick(function(){self._locked=false;});};/** * Convenience method that attaches a DOM event listener * to the directive element and autometically tears it down * during unbind. * * @param {String} event * @param {Function} handler * @param {Boolean} [useCapture] */Directive.prototype.on=function(event,handler,useCapture){on(this.el,event,handler,useCapture);(this._listeners||(this._listeners=[])).push([event,handler]);};/** * Teardown the watcher and call unbind. */Directive.prototype._teardown=function(){if(this._bound){this._bound=false;if(this.unbind){this.unbind();}if(this._watcher){this._watcher.teardown();}varlisteners=this._listeners;vari;if(listeners){i=listeners.length;while(i--){off(this.el,listeners[i][0],listeners[i][1]);}}varunwatchFns=this._paramUnwatchFns;if(unwatchFns){i=unwatchFns.length;while(i--){unwatchFns[i]();}}if('development'!=='production'&&this.el){this.el._vue_directives.$remove(this);}this.vm=this.el=this._watcher=this._listeners=null;}};functionlifecycleMixin(Vue){/** * Update v-ref for component. * * @param {Boolean} remove */Vue.prototype._updateRef=function(remove){varref=this.$options._ref;if(ref){varrefs=(this._scope||this._context).$refs;if(remove){if(refs[ref]===this){refs[ref]=null;}}else{refs[ref]=this;}}};/** * Transclude, compile and link element. * * If a pre-compiled linker is available, that means the * passed in element will be pre-transcluded and compiled * as well - all we need to do is to call the linker. * * Otherwise we need to call transclude/compile/linkhere.**@param{Element}el*/ Vue.prototype._compile = function (el) { var options = this.$options; //transcludeandinitelement// transclude can potentially replace original// so we need to keep reference; this step also injects// the template and caches the original attributes// on the container node and replacer node.varoriginal=el;el=transclude(el,options);this._initElement(el);// handle v-pre on root node (#2026)if(el.nodeType===1&&getAttr(el,'v-pre')!==null){return;}// root is always compiled per-instance, because// container attrs and props can be different every time.varcontextOptions=this._context&&this._context.$options;varrootLinker=compileRoot(el,options,contextOptions);// resolve slot distributionresolveSlots(this,options._content);// compile and link the restvarcontentLinkFn;varctor=this.constructor;// component compilation can be cached// as long as it's not using inline-templateif(options._linkerCachable){contentLinkFn=ctor.linker;if(!contentLinkFn){contentLinkFn=ctor.linker=compile(el,options);}}// link phase// make sure to link root with prop scope!varrootUnlinkFn=rootLinker(this,el,this._scope);varcontentUnlinkFn=contentLinkFn?contentLinkFn(this,el):compile(el,options)(this,el);// register composite unlink function// to be called during instance destructionthis._unlinkFn=function(){rootUnlinkFn();// passing destroying: true to avoid searching and// splicing the directivescontentUnlinkFn(true);};// finally replace originalif(options.replace){replace(original,el);}this._isCompiled=true;this._callHook('compiled');};/** * Initialize instance element. Called in the public * $mount() method. * * @param {Element} el */Vue.prototype._initElement=function(el){if(isFragment(el)){this._isFragment=true;this.$el=this._fragmentStart=el.firstChild;this._fragmentEnd=el.lastChild;// set persisted text anchors to emptyif(this._fragmentStart.nodeType===3){this._fragmentStart.data=this._fragmentEnd.data='';}this._fragment=el;}else{this.$el=el;}this.$el.__vue__=this;this._callHook('beforeCompile');};/** * Create and bind a directive to an element. * * @param {Object} descriptor - parsed directive descriptor * @param {Node} node - target node * @param {Vue} [host] - transclusion host component * @param {Object} [scope] - v-for scope * @param {Fragment} [frag] - owner fragment */Vue.prototype._bindDir=function(descriptor,node,host,scope,frag){this._directives.push(newDirective(descriptor,this,node,host,scope,frag));};/** * Teardown an instance, unobserves the data, unbind all the * directives, turn off all the event listeners, etc. * * @param {Boolean} remove - whether to remove the DOM node. * @param {Boolean} deferCleanup - if true, defer cleanup to * be called later */Vue.prototype._destroy=function(remove,deferCleanup){if(this._isBeingDestroyed){if(!deferCleanup){this._cleanup();}return;}vardestroyReady;varpendingRemoval;varself=this;// Cleanup should be called either synchronously or asynchronoysly as// callback of this.$remove(), or if remove and deferCleanup are false.// In any case it should be called after all other removing, unbinding and// turning of is donevarcleanupIfPossible=functioncleanupIfPossible(){if(destroyReady&&!pendingRemoval&&!deferCleanup){self._cleanup();}};// remove DOM elementif(remove&&this.$el){pendingRemoval=true;this.$remove(function(){pendingRemoval=false;cleanupIfPossible();});}this._callHook('beforeDestroy');this._isBeingDestroyed=true;vari;// remove self from parent. only necessary// if parent is not being destroyed as well.varparent=this.$parent;if(parent&&!parent._isBeingDestroyed){parent.$children.$remove(this);// unregister ref (remove: true)this._updateRef(true);}// destroy all children.i=this.$children.length;while(i--){this.$children[i].$destroy();}// teardown propsif(this._propsUnlinkFn){this._propsUnlinkFn();}// teardown all directives. this also tearsdown all// directive-owned watchers.if(this._unlinkFn){this._unlinkFn();}i=this._watchers.length;while(i--){this._watchers[i].teardown();}// remove reference to self on $elif(this.$el){this.$el.__vue__=null;}destroyReady=true;cleanupIfPossible();};/** * Clean up to ensure garbage collection. * This is called after the leave transition if there * is any. */Vue.prototype._cleanup=function(){if(this._isDestroyed){return;}// remove self from owner fragment// do it in cleanup so that we can call $destroy with// defer right when a fragment is about to be removed.if(this._frag){this._frag.children.$remove(this);}// remove reference from data ob// frozen object may not have observer.if(this._data&&this._data.__ob__){this._data.__ob__.removeVm(this);}// Clean up references to private properties and other// instances. preserve reference to _data so that proxy// accessors still work. The only potential side effect// here is that mutating the instance after it's destroyed// may affect the state of other components that are still// observing the same object, but that seems to be a// reasonable responsibility for the user rather than// always throwing an error on them.this.$el=this.$parent=this.$root=this.$children=this._watchers=this._context=this._scope=this._directives=null;// call the last hook...this._isDestroyed=true;this._callHook('destroyed');// turn off all instance listeners.this.$off();};}functionmiscMixin(Vue){/** * Apply a list of filter (descriptors) to a value. * Using plain for loops here because this will be called in * the getter of any watcher with filters so it is very * performance sensitive. * * @param {*} value * @param {*} [oldValue] * @param {Array} filters * @param {Boolean} write * @return {*} */Vue.prototype._applyFilters=function(value,oldValue,filters,write){varfilter,fn,args,arg,offset,i,l,j,k;for(i=0,l=filters.length;i<l;i++){filter=filters[write?l-i-1:i];fn=resolveAsset(this.$options,'filters',filter.name,true);if(!fn)continue;fn=write?fn.write:fn.read||fn;if(typeoffn!=='function')continue;args=write?[value,oldValue]:[value];offset=write?2:1;if(filter.args){for(j=0,k=filter.args.length;j<k;j++){arg=filter.args[j];args[j+offset]=arg.dynamic?this.$get(arg.value):arg.value;}}value=fn.apply(this,args);}returnvalue;};/** * Resolve a component, depending on whether the component * is defined normally or using an async base_factory function. * Resolves synchronously if already resolved, otherwise * resolves asynchronously and caches the resolved * constructor on the base_factory. * * @param {String|Function} value * @param {Function} cb */Vue.prototype._resolveComponent=function(value,cb){varbase_factory;if(typeofvalue==='function'){base_factory=value;}else{base_factory=resolveAsset(this.$options,'components',value,true);}/* istanbul ignore if */if(!base_factory){return;}// async component base_factoryif(!base_factory.options){if(base_factory.resolved){// cachedcb(base_factory.resolved);}elseif(base_factory.requested){// pool callbacksbase_factory.pendingCallbacks.push(cb);}else{base_factory.requested=true;varcbs=base_factory.pendingCallbacks=[cb];base_factory.call(this,functionresolve(res){if(isPlainObject(res)){res=Vue.extend(res);}// cache resolvedbase_factory.resolved=res;// invoke callbacksfor(vari=0,l=cbs.length;i<l;i++){cbs[i](res);}},functionreject(reason){'development'!=='production'&&warn('Failed to resolve async component'+(typeofvalue==='string'?': '+value:'')+'. '+(reason?'\nReason: '+reason:''));});}}else{// normal componentcb(base_factory);}};}varfilterRE$1=/[^|]\|[^|]/;functiondataAPI(Vue){/** * Get the value from an expression on this vm. * * @param {String} exp * @param {Boolean} [asStatement] * @return {*} */Vue.prototype.$get=function(exp,asStatement){varres=parseExpression(exp);if(res){if(asStatement){varself=this;returnfunctionstatementHandler(){self.$arguments=toArray(arguments);varresult=res.get.call(self,self);self.$arguments=null;returnresult;};}else{try{returnres.get.call(this,this);}catch(e){}}}};/** * Set the value from an expression on this vm. * The expression must be a valid left-hand * expression in an assignment. * * @param {String} exp * @param {*} val */Vue.prototype.$set=function(exp,val){varres=parseExpression(exp,true);if(res&&res.set){res.set.call(this,this,val);}};/** * Delete a property on the VM * * @param {String} key */Vue.prototype.$delete=function(key){del(this._data,key);};/** * Watch an expression, trigger callback when its * value changes. * * @param {String|Function} expOrFn * @param {Function} cb * @param {Object} [options] * - {Boolean} deep * - {Boolean} immediate * @return {Function} - unwatchFn */Vue.prototype.$watch=function(expOrFn,cb,options){varvm=this;varparsed;if(typeofexpOrFn==='string'){parsed=parseDirective(expOrFn);expOrFn=parsed.expression;}varwatcher=newWatcher(vm,expOrFn,cb,{deep:options&&options.deep,sync:options&&options.sync,filters:parsed&&parsed.filters,user:!options||options.user!==false});if(options&&options.immediate){cb.call(vm,watcher.value);}returnfunctionunwatchFn(){watcher.teardown();};};/** * Evaluate a text directive, including filters. * * @param {String} text * @param {Boolean} [asStatement] * @return {String} */Vue.prototype.$eval=function(text,asStatement){// check for filters.if(filterRE$1.test(text)){vardir=parseDirective(text);// the filter regex check might give false positive// for pipes inside strings, so it's possible that// we don't get any filters herevarval=this.$get(dir.expression,asStatement);returndir.filters?this._applyFilters(val,null,dir.filters):val;}else{// no filterreturnthis.$get(text,asStatement);}};/** * Interpolate a piece of template text. * * @param {String} text * @return {String} */Vue.prototype.$interpolate=function(text){vartokens=parseText(text);varvm=this;if(tokens){if(tokens.length===1){returnvm.$eval(tokens[0].value)+'';}else{returntokens.map(function(token){returntoken.tag?vm.$eval(token.value):token.value;}).join('');}}else{returntext;}};/** * Log instance data as a plain JS object * so that it is easier to inspect in console. * This method assumes console is available. * * @param {String} [path] */Vue.prototype.$log=function(path){vardata=path?getPath(this._data,path):this._data;if(data){data=clean(data);}// include computed fieldsif(!path){varkey;for(keyinthis.$options.computed){data[key]=clean(this[key]);}if(this._props){for(keyinthis._props){data[key]=clean(this[key]);}}}console.log(data);};/** * "clean" a getter/setterconvertedobjectintoaplain*objectcopy.**@param{Object}-obj*@return{Object}*/ function clean(obj) { return JSON.parse(JSON.stringify(obj)); } } function domAPI(Vue) { /***Convenienceon-instancenextTick.Thecallbackis*auto-boundtotheinstance,andthisavoidscomponent*moduleshavingtorelyontheglobalVue.**@param{Function}fn*/ Vue.prototype.$nextTick = function (fn) { nextTick(fn, this); }; /***Appendinstancetotarget**@param{Node}target*@param{Function}[cb]*@param{Boolean}[withTransition]-defaultstotrue*/ Vue.prototype.$appendTo = function (target, cb, withTransition) { return insert(this, target, cb, withTransition, append, appendWithTransition); }; /***Prependinstancetotarget**@param{Node}target*@param{Function}[cb]*@param{Boolean}[withTransition]-defaultstotrue*/ Vue.prototype.$prependTo = function (target, cb, withTransition) { target = query(target); if (target.hasChildNodes()) { this.$before(target.firstChild, cb, withTransition); } else { this.$appendTo(target, cb, withTransition); } return this; }; /***Insertinstancebeforetarget**@param{Node}target*@param{Function}[cb]*@param{Boolean}[withTransition]-defaultstotrue*/ Vue.prototype.$before = function (target, cb, withTransition) { return insert(this, target, cb, withTransition, beforeWithCb, beforeWithTransition); }; /***Insertinstanceaftertarget**@param{Node}target*@param{Function}[cb]*@param{Boolean}[withTransition]-defaultstotrue*/ Vue.prototype.$after = function (target, cb, withTransition) { target = query(target); if (target.nextSibling) { this.$before(target.nextSibling, cb, withTransition); } else { this.$appendTo(target.parentNode, cb, withTransition); } return this; }; /***RemoveinstancefromDOM**@param{Function}[cb]*@param{Boolean}[withTransition]-defaultstotrue*/ Vue.prototype.$remove = function (cb, withTransition) { if (!this.$el.parentNode) { return cb && cb(); } var inDocument = this._isAttached && inDoc(this.$el); //ifwearenotindocument,noneedtocheck// for transitionsif(!inDocument)withTransition=false;varself=this;varrealCb=functionrealCb(){if(inDocument)self._callHook('detached');if(cb)cb();};if(this._isFragment){removeNodeRange(this._fragmentStart,this._fragmentEnd,this,this._fragment,realCb);}else{varop=withTransition===false?removeWithCb:removeWithTransition;op(this.$el,this,realCb);}returnthis;};/** * Shared DOM insertion function. * * @param {Vue} vm * @param {Element} target * @param {Function} [cb] * @param {Boolean} [withTransition] * @param {Function} op1 - op for non-transition insert * @param {Function} op2 - op for transition insert * @return vm */functioninsert(vm,target,cb,withTransition,op1,op2){target=query(target);vartargetIsDetached=!inDoc(target);varop=withTransition===false||targetIsDetached?op1:op2;varshouldCallHook=!targetIsDetached&&!vm._isAttached&&!inDoc(vm.$el);if(vm._isFragment){mapNodeRange(vm._fragmentStart,vm._fragmentEnd,function(node){op(node,target,vm);});cb&&cb();}else{op(vm.$el,target,vm,cb);}if(shouldCallHook){vm._callHook('attached');}returnvm;}/** * Check for selectors * * @param {String|Element} el */functionquery(el){returntypeofel==='string'?document.querySelector(el):el;}/** * Append operation that takes a callback. * * @param {Node} el * @param {Node} target * @param {Vue} vm - unused * @param {Function} [cb] */functionappend(el,target,vm,cb){target.appendChild(el);if(cb)cb();}/** * InsertBefore operation that takes a callback. * * @param {Node} el * @param {Node} target * @param {Vue} vm - unused * @param {Function} [cb] */functionbeforeWithCb(el,target,vm,cb){before(el,target);if(cb)cb();}/** * Remove operation that takes a callback. * * @param {Node} el * @param {Vue} vm - unused * @param {Function} [cb] */functionremoveWithCb(el,vm,cb){remove(el);if(cb)cb();}}functioneventsAPI(Vue){/** * Listen on the given `event` with `fn`. * * @param {String} event * @param {Function} fn */Vue.prototype.$on=function(event,fn){(this._events[event]||(this._events[event]=[])).push(fn);modifyListenerCount(this,event,1);returnthis;};/** * Adds an `event` listener that will be invoked a single * time then automatically removed. * * @param {String} event * @param {Function} fn */Vue.prototype.$once=function(event,fn){varself=this;functionon(){self.$off(event,on);fn.apply(this,arguments);}on.fn=fn;this.$on(event,on);returnthis;};/** * Remove the given callback for `event` or all * registered callbacks. * * @param {String} event * @param {Function} fn */Vue.prototype.$off=function(event,fn){varcbs;// allif(!arguments.length){if(this.$parent){for(eventinthis._events){cbs=this._events[event];if(cbs){modifyListenerCount(this,event,-cbs.length);}}}this._events={};returnthis;}// specific eventcbs=this._events[event];if(!cbs){returnthis;}if(arguments.length===1){modifyListenerCount(this,event,-cbs.length);this._events[event]=null;returnthis;}// specific handlervarcb;vari=cbs.length;while(i--){cb=cbs[i];if(cb===fn||cb.fn===fn){modifyListenerCount(this,event,-1);cbs.splice(i,1);break;}}returnthis;};/** * Trigger an event on self. * * @param {String|Object} event * @return {Boolean} shouldPropagate */Vue.prototype.$emit=function(event){varisSource=typeofevent==='string';event=isSource?event:event.name;varcbs=this._events[event];varshouldPropagate=isSource||!cbs;if(cbs){cbs=cbs.length>1?toArray(cbs):cbs;// this is a somewhat hacky solution to the question raised// in #2102: for an inline component listener like <comp @test="doThis">,// the propagation handling is somewhat broken. Therefore we// need to treat these inline callbacks differently.varhasParentCbs=isSource&&cbs.some(function(cb){returncb._fromParent;});if(hasParentCbs){shouldPropagate=false;}varargs=toArray(arguments,1);for(vari=0,l=cbs.length;i<l;i++){varcb=cbs[i];varres=cb.apply(this,args);if(res===true&&(!hasParentCbs||cb._fromParent)){shouldPropagate=true;}}}returnshouldPropagate;};/** * Recursively broadcast an event to all children instances. * * @param {String|Object} event * @param {...*} additional arguments */Vue.prototype.$broadcast=function(event){varisSource=typeofevent==='string';event=isSource?event:event.name;// if no child has registered for this event,// then there's no need to broadcast.if(!this._eventsCount[event])return;varchildren=this.$children;varargs=toArray(arguments);if(isSource){// use object event to indicate non-source emit// on childrenargs[0]={name:event,source:this};}for(vari=0,l=children.length;i<l;i++){varchild=children[i];varshouldPropagate=child.$emit.apply(child,args);if(shouldPropagate){child.$broadcast.apply(child,args);}}returnthis;};/** * Recursively propagate an event up the parent chain. * * @param {String} event * @param {...*} additional arguments */Vue.prototype.$dispatch=function(event){varshouldPropagate=this.$emit.apply(this,arguments);if(!shouldPropagate)return;varparent=this.$parent;varargs=toArray(arguments);// use object event to indicate non-source emit// on parentsargs[0]={name:event,source:this};while(parent){shouldPropagate=parent.$emit.apply(parent,args);parent=shouldPropagate?parent.$parent:null;}returnthis;};/** * Modify the listener counts on all parents. * This bookkeeping allows $broadcast to return early when * no child has listened to a certain event. * * @param {Vue} vm * @param {String} event * @param {Number} count */varhookRE=/^hook:/;functionmodifyListenerCount(vm,event,count){varparent=vm.$parent;// hooks do not get broadcasted so no need// to do bookkeeping for themif(!parent||!count||hookRE.test(event))return;while(parent){parent._eventsCount[event]=(parent._eventsCount[event]||0)+count;parent=parent.$parent;}}}functionlifecycleAPI(Vue){/** * Set instance target element and kick off the compilation * process. The passed in `el` can be a selector string, an * existing Element, or a DocumentFragment (for block * instances). * * @param {Element|DocumentFragment|string} el * @public */Vue.prototype.$mount=function(el){if(this._isCompiled){'development'!=='production'&&warn('$mount() should be called only once.',this);return;}el=query(el);if(!el){el=document.createElement('div');}this._compile(el);this._initDOMHooks();if(inDoc(this.$el)){this._callHook('attached');ready.call(this);}else{this.$once('hook:attached',ready);}returnthis;};/** * Mark an instance as ready. */functionready(){this._isAttached=true;this._isReady=true;this._callHook('ready');}/** * Teardown the instance, simply delegate to the internal * _destroy. * * @param {Boolean} remove * @param {Boolean} deferCleanup */Vue.prototype.$destroy=function(remove,deferCleanup){this._destroy(remove,deferCleanup);};/** * Partially compile a piece of DOM and return a * decompile function. * * @param {Element|DocumentFragment} el * @param {Vue} [host] * @param {Object} [scope] * @param {Fragment} [frag] * @return {Function} */Vue.prototype.$compile=function(el,host,scope,frag){returncompile(el,this.$options,true)(this,el,host,scope,frag);};}/** * The exposed Vue constructor. * * API conventions: * - public API methods/propertiesareprefixedwith`$`*-internalmethods/propertiesareprefixedwith`_`*-non-prefixedpropertiesareassumedtobeproxieduser*data.**@constructor*@param{Object}[options]*@public*/ function Vue(options) { this._init(options); } //installinternalsinitMixin(Vue);stateMixin(Vue);eventsMixin(Vue);lifecycleMixin(Vue);miscMixin(Vue);// install instance APIsdataAPI(Vue);domAPI(Vue);eventsAPI(Vue);lifecycleAPI(Vue);varslot={priority:SLOT,params:['name'],bind:functionbind(){// this was resolved during component transclusionvarname=this.params.name||'default';varcontent=this.vm._slotContents&&this.vm._slotContents[name];if(!content||!content.hasChildNodes()){this.fallback();}else{this.compile(content.cloneNode(true),this.vm._context,this.vm);}},compile:functioncompile(content,context,host){if(content&&context){if(this.el.hasChildNodes()&&content.childNodes.length===1&&content.childNodes[0].nodeType===1&&content.childNodes[0].hasAttribute('v-if')){// if the inserted slot has v-if// inject fallback content as the v-elsevarelseBlock=document.createElement('template');elseBlock.setAttribute('v-else','');elseBlock.innerHTML=this.el.innerHTML;// the else block should be compiled in child scopeelseBlock._context=this.vm;content.appendChild(elseBlock);}varscope=host?host._scope:this._scope;this.unlink=context.$compile(content,host,scope,this._frag);}if(content){replace(this.el,content);}else{remove(this.el);}},fallback:functionfallback(){this.compile(extractContent(this.el,true),this.vm);},unbind:functionunbind(){if(this.unlink){this.unlink();}}};varpartial={priority:PARTIAL,params:['name'],// watch changes to name for dynamic partialsparamWatchers:{name:functionname(value){vIf.remove.call(this);if(value){this.insert(value);}}},bind:functionbind(){this.anchor=createAnchor('v-partial');replace(this.el,this.anchor);this.insert(this.params.name);},insert:functioninsert(id){varpartial=resolveAsset(this.vm.$options,'partials',id,true);if(partial){this.base_factory=newFragmentFactory(this.vm,partial);vIf.insert.call(this);}},unbind:functionunbind(){if(this.frag){this.frag.destroy();}}};varelementDirectives={slot:slot,partial:partial};varconvertArray=vFor._postProcess;/** * Limit filter for arrays * * @param {Number} n * @param {Number} offset (Decimal expected) */functionlimitBy(arr,n,offset){offset=offset?parseInt(offset,10):0;n=toNumber(n);returntypeofn==='number'?arr.slice(offset,offset+n):arr;}/** * Filter filter for arrays * * @param {String} search * @param {String} [delimiter] * @param {String} ...dataKeys */functionfilterBy(arr,search,delimiter){arr=convertArray(arr);if(search==null){returnarr;}if(typeofsearch==='function'){returnarr.filter(search);}// cast to lowercase stringsearch=(''+search).toLowerCase();// allow optional `in` delimiter// because why notvarn=delimiter==='in'?3:2;// extract and flatten keysvarkeys=Array.prototype.concat.apply([],toArray(arguments,n));varres=[];varitem,key,val,j;for(vari=0,l=arr.length;i<l;i++){item=arr[i];val=item&&item.$value||item;j=keys.length;if(j){while(j--){key=keys[j];if(key==='$key'&&contains(item.$key,search)||contains(getPath(val,key),search)){res.push(item);break;}}}elseif(contains(item,search)){res.push(item);}}returnres;}/** * Filter filter for arrays * * @param {String|Array<String>|Function} ...sortKeys * @param {Number} [order] */functionorderBy(arr){varcomparator=null;varsortKeys=undefined;arr=convertArray(arr);// determine order (last argument)varargs=toArray(arguments,1);varorder=args[args.length-1];if(typeoforder==='number'){order=order<0?-1:1;args=args.length>1?args.slice(0,-1):args;}else{order=1;}// determine sortKeys & comparatorvarfirstArg=args[0];if(!firstArg){returnarr;}elseif(typeoffirstArg==='function'){// custom comparatorcomparator=function(a,b){returnfirstArg(a,b)*order;};}else{// string keys. flatten firstsortKeys=Array.prototype.concat.apply([],args);comparator=function(a,b,i){i=i||0;returni>=sortKeys.length-1?baseCompare(a,b,i):baseCompare(a,b,i)||comparator(a,b,i+1);};}functionbaseCompare(a,b,sortKeyIndex){varsortKey=sortKeys[sortKeyIndex];if(sortKey){if(sortKey!=='$key'){if(isObject(a)&&'$value'ina)a=a.$value;if(isObject(b)&&'$value'inb)b=b.$value;}a=isObject(a)?getPath(a,sortKey):a;b=isObject(b)?getPath(b,sortKey):b;}returna===b?0:a>b?order:-order;}// sort on a copy to avoid mutating original arrayreturnarr.slice().sort(comparator);}/** * String contain helper * * @param {*} val * @param {String} search */functioncontains(val,search){vari;if(isPlainObject(val)){varkeys=Object.keys(val);i=keys.length;while(i--){if(contains(val[keys[i]],search)){returntrue;}}}elseif(isArray(val)){i=val.length;while(i--){if(contains(val[i],search)){returntrue;}}}elseif(val!=null){returnval.toString().toLowerCase().indexOf(search)>-1;}}vardigitsRE=/(\d{3})(?=\d)/g;// asset collections must be a plain object.varfilters={orderBy:orderBy,filterBy:filterBy,limitBy:limitBy,/** * Stringify value. * * @param {Number} indent */json:{read:functionread(value,indent){returntypeofvalue==='string'?value:JSON.stringify(value,null,arguments.length>1?indent:2);},write:functionwrite(value){try{returnJSON.parse(value);}catch(e){returnvalue;}}},/** * 'abc' => 'Abc' */capitalize:functioncapitalize(value){if(!value&&value!==0)return'';value=value.toString();returnvalue.charAt(0).toUpperCase()+value.slice(1);},/** * 'abc' => 'ABC' */uppercase:functionuppercase(value){returnvalue||value===0?value.toString().toUpperCase():'';},/** * 'AbC' => 'abc' */lowercase:functionlowercase(value){returnvalue||value===0?value.toString().toLowerCase():'';},/** * 12345 => $12,345.00 * * @param {String} sign * @param {Number} decimals Decimal places */currency:functioncurrency(value,_currency,decimals){value=parseFloat(value);if(!isFinite(value)||!value&&value!==0)return'';_currency=_currency!=null?_currency:'$';decimals=decimals!=null?decimals:2;varstringified=Math.abs(value).toFixed(decimals);var_int=decimals?stringified.slice(0,-1-decimals):stringified;vari=_int.length%3;varhead=i>0?_int.slice(0,i)+(_int.length>3?',':''):'';var_float=decimals?stringified.slice(-1-decimals):'';varsign=value<0?'-':'';returnsign+_currency+head+_int.slice(i).replace(digitsRE,'$1,')+_float;},/** * 'item' => 'items' * * @params * an array of strings corresponding to * the single, double, triple ... forms of the word to * be pluralized. When the number to be pluralized * exceeds the length of the args, it will use the last * entry in the array. * * e.g. ['single', 'double', 'triple', 'multiple'] */pluralize:functionpluralize(value){varargs=toArray(arguments,1);varlength=args.length;if(length>1){varindex=value%10-1;returnindexinargs?args[index]:args[length-1];}else{returnargs[0]+(value===1?'':'s');}},/** * Debounce a handler function. * * @param {Function} handler * @param {Number} delay = 300 * @return {Function} */debounce:functiondebounce(handler,delay){if(!handler)return;if(!delay){delay=300;}return_debounce(handler,delay);}};functioninstallGlobalAPI(Vue){/** * Vue and every constructor that extends Vue has an * associated options object, which can be accessed during * compilation steps as `this.constructor.options`. * * These can be seen as the default options of every * Vue instance. */Vue.options={directives:directives,elementDirectives:elementDirectives,filters:filters,transitions:{},components:{},partials:{},replace:true};/** * Expose useful internals */Vue.util=util;Vue.config=config;Vue.set=set;Vue['delete']=del;Vue.nextTick=nextTick;/** * The following are exposed for advanced usage /plugins*/ Vue.compiler = compiler; Vue.FragmentFactory = FragmentFactory; Vue.internalDirectives = internalDirectives; Vue.parsers = { path: path, text: text, template: template, directive: directive, expression: expression }; /***Eachinstanceconstructor,includingVue,hasaunique*cid.Thisenablesustocreatewrapped"child*constructors"forprototypalinheritanceandcachethem.*/ Vue.cid = 0; var cid = 1; /***Classinheritance**@param{Object}extendOptions*/ Vue.extend = function (extendOptions) { extendOptions = extendOptions || {}; var Super = this; var isFirstExtend = Super.cid === 0; if (isFirstExtend && extendOptions._Ctor) { return extendOptions._Ctor; } var name = extendOptions.name || Super.options.name; if ('development' !== 'production') { if (!/^[a-zA-Z][\w-]*$/.test(name)){warn('Invalid component name: "'+name+'". Component names '+'can only contain alphanumeric characaters and the hyphen.');name=null;}}varSub=createClass(name||'VueComponent');Sub.prototype=Object.create(Super.prototype);Sub.prototype.constructor=Sub;Sub.cid=cid++;Sub.options=mergeOptions(Super.options,extendOptions);Sub['super']=Super;// allow further extensionSub.extend=Super.extend;// create asset registers, so extended classes// can have their private assets too.config._assetTypes.forEach(function(type){Sub[type]=Super[type];});// enable recursive self-lookupif(name){Sub.options.components[name]=Sub;}// cache constructorif(isFirstExtend){extendOptions._Ctor=Sub;}returnSub;};/** * A function that returns a sub-class constructor with the * given name. This gives us much nicer output when * logging instances in the console. * * @param {String} name * @return {Function} */functioncreateClass(name){/* eslint-disable no-new-func */returnnewFunction('return function '+classify(name)+' (options) { this._init(options) }')();/* eslint-enable no-new-func */}/** * Plugin system * * @param {Object} plugin */Vue.use=function(plugin){/* istanbul ignore if */if(plugin.installed){return;}// additional parametersvarargs=toArray(arguments,1);args.unshift(this);if(typeofplugin.install==='function'){plugin.install.apply(plugin,args);}else{plugin.apply(null,args);}plugin.installed=true;returnthis;};/** * Apply a global mixin by merging it into the default * options. */Vue.mixin=function(mixin){Vue.options=mergeOptions(Vue.options,mixin);};/** * Create asset registration methods with the following * signature: * * @param {String} id * @param {*} definition */config._assetTypes.forEach(function(type){Vue[type]=function(id,definition){if(!definition){returnthis.options[type+'s'][id];}else{/* istanbul ignore if */if('development'!=='production'){if(type==='component'&&(commonTagRE.test(id)||reservedTagRE.test(id))){warn('Do not use built-in or reserved HTML elements as component '+'id: '+id);}}if(type==='component'&&isPlainObject(definition)){if(!definition.name){definition.name=id;}definition=Vue.extend(definition);}this.options[type+'s'][id]=definition;returndefinition;}};});// expose internal transition APIextend(Vue.transition,transition);}installGlobalAPI(Vue);Vue.version='1.0.26';// devtools global hook/* istanbul ignore next */setTimeout(function(){if(config.devtools){if(devtools){devtools.emit('init',Vue);}elseif('development'!=='production'&&inBrowser&&/Chrome\/\d+/.test(window.navigator.userAgent)){console.log('Download the Vue Devtools for a better development experience:\n'+'https://github.com/vuejs/vue-devtools');}}},0);returnVue;}));exports('vue');});