.'
- );
- }
- }
- el.staticStyle = JSON.stringify(parseStyleText(staticStyle));
- }
-
- var styleBinding = getBindingAttr(el, 'style', false /* getStatic */);
- if (styleBinding) {
- el.styleBinding = styleBinding;
- }
- }
-
- function genData$1(el) {
- var data = '';
- if (el.staticStyle) {
- data += "staticStyle:" + (el.staticStyle) + ",";
- }
- if (el.styleBinding) {
- data += "style:(" + (el.styleBinding) + "),";
- }
- return data
- }
-
- var style$1 = {
- staticKeys: ['staticStyle'],
- transformNode: transformNode$1,
- genData: genData$1
- };
-
- /* */
-
- var decoder;
-
- var he = {
- decode: function decode(html) {
- decoder = decoder || document.createElement('div');
- decoder.innerHTML = html;
- return decoder.textContent
- }
- };
-
- /* */
-
- var isUnaryTag = makeMap(
- 'area,base,br,col,embed,frame,hr,img,input,isindex,keygen,' +
- 'link,meta,param,source,track,wbr'
- );
-
- // Elements that you can, intentionally, leave open
- // (and which close themselves)
- var canBeLeftOpenTag = makeMap(
- 'colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source'
- );
-
- // HTML5 tags https://html.spec.whatwg.org/multipage/indices.html#elements-3
- // Phrasing Content https://html.spec.whatwg.org/multipage/dom.html#phrasing-content
- var isNonPhrasingTag = makeMap(
- 'address,article,aside,base,blockquote,body,caption,col,colgroup,dd,' +
- 'details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,' +
- 'h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,' +
- 'optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,' +
- 'title,tr,track'
- );
-
- /**
- * Not type-checking this file because it's mostly vendor code.
- */
-
- /*!
- * HTML Parser By John Resig (ejohn.org)
- * Modified by Juriy "kangax" Zaytsev
- * Original code by Erik Arvidsson, Mozilla Public License
- * http://erik.eae.net/simplehtmlparser/simplehtmlparser.js
- */
-
- // Regular Expressions for parsing tags and attributes
- var attribute = /^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/;
- // could use https://www.w3.org/TR/1999/REC-xml-names-19990114/#NT-QName
- // but for Vue templates we can enforce a simple charset
- var ncname = '[a-zA-Z_][\\w\\-\\.]*';
- var qnameCapture = "((?:" + ncname + "\\:)?" + ncname + ")";
- var startTagOpen = new RegExp(("^<" + qnameCapture));
- var startTagClose = /^\s*(\/?)>/;
- var endTag = new RegExp(("^<\\/" + qnameCapture + "[^>]*>"));
- var doctype = /^]+>/i;
- var comment = /^');
-
- if (commentEnd >= 0) {
- if (options.shouldKeepComment) {
- options.comment(html.substring(4, commentEnd));
- }
- advance(commentEnd + 3);
- continue
- }
- }
-
- // http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-revealed_conditional_comment
- if (conditionalComment.test(html)) {
- var conditionalEnd = html.indexOf(']>');
-
- if (conditionalEnd >= 0) {
- advance(conditionalEnd + 2);
- continue
- }
- }
-
- // Doctype:
- var doctypeMatch = html.match(doctype);
- if (doctypeMatch) {
- advance(doctypeMatch[0].length);
- continue
- }
-
- // End tag:
- var endTagMatch = html.match(endTag);
- if (endTagMatch) {
- var curIndex = index;
- advance(endTagMatch[0].length);
- parseEndTag(endTagMatch[1], curIndex, index);
- continue
- }
-
- // Start tag:
- var startTagMatch = parseStartTag();
- if (startTagMatch) {
- handleStartTag(startTagMatch);
- if (shouldIgnoreFirstNewline(lastTag, html)) {
- advance(1);
- }
- continue
- }
- }
-
- var text = (void 0), rest = (void 0), next = (void 0);
- if (textEnd >= 0) {
- rest = html.slice(textEnd);
- while (
- !endTag.test(rest) &&
- !startTagOpen.test(rest) &&
- !comment.test(rest) &&
- !conditionalComment.test(rest)
- ) {
- // < in plain text, be forgiving and treat it as text
- next = rest.indexOf('<', 1);
- if (next < 0) { break }
- textEnd += next;
- rest = html.slice(textEnd);
- }
- text = html.substring(0, textEnd);
- advance(textEnd);
- }
-
- if (textEnd < 0) {
- text = html;
- html = '';
- }
-
- if (options.chars && text) {
- options.chars(text);
- }
- } else {
- var endTagLength = 0;
- var stackedTag = lastTag.toLowerCase();
- var reStackedTag = reCache[stackedTag] || (reCache[stackedTag] = new RegExp('([\\s\\S]*?)(' + stackedTag + '[^>]*>)', 'i'));
- var rest$1 = html.replace(reStackedTag, function (all, text, endTag) {
- endTagLength = endTag.length;
- if (!isPlainTextElement(stackedTag) && stackedTag !== 'noscript') {
- text = text
- .replace(//g, '$1')
- .replace(//g, '$1');
- }
- if (shouldIgnoreFirstNewline(stackedTag, text)) {
- text = text.slice(1);
- }
- if (options.chars) {
- options.chars(text);
- }
- return ''
- });
- index += html.length - rest$1.length;
- html = rest$1;
- parseEndTag(stackedTag, index - endTagLength, index);
- }
-
- if (html === last) {
- options.chars && options.chars(html);
- if ("development" !== 'production' && !stack.length && options.warn) {
- options.warn(("Mal-formatted tag at end of template: \"" + html + "\""));
- }
+ } else {
+ // iterate and compare children lists
+ var childrenMatch = true;
+ var childNode = elm.firstChild;
+ for (var i$1 = 0; i$1 < children.length; i$1++) {
+ if (!childNode || !hydrate(childNode, children[i$1], insertedVnodeQueue, inVPre)) {
+ childrenMatch = false;
break
+ }
+ childNode = childNode.nextSibling;
}
+ // if childNode is not null, it means the actual childNodes list is
+ // longer than the virtual children list.
+ if (!childrenMatch || childNode) {
+ /* istanbul ignore if */
+ if ("development" !== 'production' &&
+ typeof console !== 'undefined' &&
+ !hydrationBailed
+ ) {
+ hydrationBailed = true;
+ console.warn('Parent: ', elm);
+ console.warn('Mismatching childNodes vs. VNodes: ', elm.childNodes, children);
+ }
+ return false
+ }
+ }
}
-
- // Clean up any remaining tags
- parseEndTag();
-
- function advance(n) {
- index += n;
- html = html.substring(n);
+ }
+ if (isDef(data)) {
+ var fullInvoke = false;
+ for (var key in data) {
+ if (!isRenderedModule(key)) {
+ fullInvoke = true;
+ invokeCreateHooks(vnode, insertedVnodeQueue);
+ break
+ }
}
-
- function parseStartTag() {
- var start = html.match(startTagOpen);
- if (start) {
- var match = {
- tagName: start[1],
- attrs: [],
- start: index
- };
- advance(start[0].length);
- var end, attr;
- while (!(end = html.match(startTagClose)) && (attr = html.match(attribute))) {
- advance(attr[0].length);
- match.attrs.push(attr);
- }
- if (end) {
- match.unarySlash = end[1];
- advance(end[0].length);
- match.end = index;
- return match
- }
- }
+ if (!fullInvoke && data['class']) {
+ // ensure collecting deps for deep class bindings for future updates
+ traverse(data['class']);
}
+ }
+ } else if (elm.data !== vnode.text) {
+ elm.data = vnode.text;
+ }
+ return true
+ }
- function handleStartTag(match) {
- var tagName = match.tagName;
- var unarySlash = match.unarySlash;
+ function assertNodeMatch (node, vnode, inVPre) {
+ if (isDef(vnode.tag)) {
+ return vnode.tag.indexOf('vue-component') === 0 || (
+ !isUnknownElement$$1(vnode, inVPre) &&
+ vnode.tag.toLowerCase() === (node.tagName && node.tagName.toLowerCase())
+ )
+ } else {
+ return node.nodeType === (vnode.isComment ? 8 : 3)
+ }
+ }
- if (expectHTML) {
- if (lastTag === 'p' && isNonPhrasingTag(tagName)) {
- parseEndTag(lastTag);
- }
- if (canBeLeftOpenTag$$1(tagName) && lastTag === tagName) {
- parseEndTag(tagName);
- }
- }
+ return function patch (oldVnode, vnode, hydrating, removeOnly, parentElm, refElm) {
+ if (isUndef(vnode)) {
+ if (isDef(oldVnode)) { invokeDestroyHook(oldVnode); }
+ return
+ }
- var unary = isUnaryTag$$1(tagName) || !!unarySlash;
+ var isInitialPatch = false;
+ var insertedVnodeQueue = [];
- var l = match.attrs.length;
- var attrs = new Array(l);
- for (var i = 0; i < l; i++) {
- var args = match.attrs[i];
- // hackish work around FF bug https://bugzilla.mozilla.org/show_bug.cgi?id=369778
- if (IS_REGEX_CAPTURING_BROKEN && args[0].indexOf('""') === -1) {
- if (args[3] === '') { delete args[3]; }
- if (args[4] === '') { delete args[4]; }
- if (args[5] === '') { delete args[5]; }
- }
- var value = args[3] || args[4] || args[5] || '';
- attrs[i] = {
- name: args[1],
- value: decodeAttr(
- value,
- options.shouldDecodeNewlines
- )
- };
- }
-
- if (!unary) {
- stack.push({ tag: tagName, lowerCasedTag: tagName.toLowerCase(), attrs: attrs });
- lastTag = tagName;
- }
-
- if (options.start) {
- options.start(tagName, attrs, unary, match.start, match.end);
- }
- }
-
- function parseEndTag(tagName, start, end) {
- var pos, lowerCasedTagName;
- if (start == null) { start = index; }
- if (end == null) { end = index; }
-
- if (tagName) {
- lowerCasedTagName = tagName.toLowerCase();
- }
-
- // Find the closest opened tag of the same type
- if (tagName) {
- for (pos = stack.length - 1; pos >= 0; pos--) {
- if (stack[pos].lowerCasedTag === lowerCasedTagName) {
- break
- }
- }
+ if (isUndef(oldVnode)) {
+ // empty mount (likely as component), create new root element
+ isInitialPatch = true;
+ createElm(vnode, insertedVnodeQueue, parentElm, refElm);
+ } else {
+ var isRealElement = isDef(oldVnode.nodeType);
+ if (!isRealElement && sameVnode(oldVnode, vnode)) {
+ // patch existing root node
+ patchVnode(oldVnode, vnode, insertedVnodeQueue, removeOnly);
+ } else {
+ if (isRealElement) {
+ // mounting to a real element
+ // check if this is server-rendered content and if we can perform
+ // a successful hydration.
+ if (oldVnode.nodeType === 1 && oldVnode.hasAttribute(SSR_ATTR)) {
+ oldVnode.removeAttribute(SSR_ATTR);
+ hydrating = true;
+ }
+ if (isTrue(hydrating)) {
+ if (hydrate(oldVnode, vnode, insertedVnodeQueue)) {
+ invokeInsertHook(vnode, insertedVnodeQueue, true);
+ return oldVnode
} else {
- // If no tag name is provided, clean shop
- pos = 0;
- }
-
- if (pos >= 0) {
- // Close all the open elements, up the stack
- for (var i = stack.length - 1; i >= pos; i--) {
- if ("development" !== 'production' &&
- (i > pos || !tagName) &&
- options.warn
- ) {
- options.warn(
- ("tag <" + (stack[i].tag) + "> has no matching end tag.")
- );
- }
- if (options.end) {
- options.end(stack[i].tag, start, end);
- }
- }
-
- // Remove the open elements from the stack
- stack.length = pos;
- lastTag = pos && stack[pos - 1].tag;
- } else if (lowerCasedTagName === 'br') {
- if (options.start) {
- options.start(tagName, [], true, start, end);
- }
- } else if (lowerCasedTagName === 'p') {
- if (options.start) {
- options.start(tagName, [], false, start, end);
- }
- if (options.end) {
- options.end(tagName, start, end);
- }
- }
- }
- }
-
- /* */
-
- var onRE = /^@|^v-on:/;
- var dirRE = /^v-|^@|^:/;
- var forAliasRE = /(.*?)\s+(?:in|of)\s+(.*)/;
- var forIteratorRE = /\((\{[^}]*\}|[^,]*),([^,]*)(?:,([^,]*))?\)/;
-
- var argRE = /:(.*)$/;
- var bindRE = /^:|^v-bind:/;
- var modifierRE = /\.[^.]+/g;
-
- var decodeHTMLCached = cached(he.decode);
-
- // configurable state
- var warn$2;
- var delimiters;
- var transforms;
- var preTransforms;
- var postTransforms;
- var platformIsPreTag;
- var platformMustUseProp;
- var platformGetTagNamespace;
-
-
-
- function createASTElement(
- tag,
- attrs,
- parent
- ) {
- return {
- type: 1,
- tag: tag,
- attrsList: attrs,
- attrsMap: makeAttrsMap(attrs),
- parent: parent,
- children: []
- }
- }
-
- /**
- * Convert HTML string to AST.
- */
- function parse(
- template,
- options
- ) {
- warn$2 = options.warn || baseWarn;
-
- platformIsPreTag = options.isPreTag || no;
- platformMustUseProp = options.mustUseProp || no;
- platformGetTagNamespace = options.getTagNamespace || no;
-
- transforms = pluckModuleFunction(options.modules, 'transformNode');
- preTransforms = pluckModuleFunction(options.modules, 'preTransformNode');
- postTransforms = pluckModuleFunction(options.modules, 'postTransformNode');
-
- delimiters = options.delimiters;
-
- var stack = [];
- var preserveWhitespace = options.preserveWhitespace !== false;
- var root;
- var currentParent;
- var inVPre = false;
- var inPre = false;
- var warned = false;
-
- function warnOnce(msg) {
- if (!warned) {
- warned = true;
- warn$2(msg);
+ warn(
+ 'The client-side rendered virtual DOM tree is not matching ' +
+ 'server-rendered content. This is likely caused by incorrect ' +
+ 'HTML markup, for example nesting block-level elements inside ' +
+ '
, or missing
. Bailing hydration and performing ' +
+ 'full client-side render.'
+ );
}
+ }
+ // either not server-rendered, or hydration failed.
+ // create an empty node and replace it
+ oldVnode = emptyNodeAt(oldVnode);
}
- function endPre(element) {
- // check pre state
- if (element.pre) {
- inVPre = false;
+ // replacing existing element
+ var oldElm = oldVnode.elm;
+ var parentElm$1 = nodeOps.parentNode(oldElm);
+
+ // create new node
+ createElm(
+ vnode,
+ insertedVnodeQueue,
+ // extremely rare edge case: do not insert if old element is in a
+ // leaving transition. Only happens when combining transition +
+ // keep-alive + HOCs. (#4590)
+ oldElm._leaveCb ? null : parentElm$1,
+ nodeOps.nextSibling(oldElm)
+ );
+
+ // update parent placeholder node element, recursively
+ if (isDef(vnode.parent)) {
+ var ancestor = vnode.parent;
+ var patchable = isPatchable(vnode);
+ while (ancestor) {
+ for (var i = 0; i < cbs.destroy.length; ++i) {
+ cbs.destroy[i](ancestor);
}
- if (platformIsPreTag(element.tag)) {
- inPre = false;
- }
- }
-
- parseHTML(template, {
- warn: warn$2,
- expectHTML: options.expectHTML,
- isUnaryTag: options.isUnaryTag,
- canBeLeftOpenTag: options.canBeLeftOpenTag,
- shouldDecodeNewlines: options.shouldDecodeNewlines,
- shouldKeepComment: options.comments,
- start: function start(tag, attrs, unary) {
- // check namespace.
- // inherit parent ns if there is one
- var ns = (currentParent && currentParent.ns) || platformGetTagNamespace(tag);
-
- // handle IE svg bug
- /* istanbul ignore if */
- if (isIE && ns === 'svg') {
- attrs = guardIESVGBug(attrs);
- }
-
- var element = createASTElement(tag, attrs, currentParent);
- if (ns) {
- element.ns = ns;
- }
-
- if (isForbiddenTag(element) && !isServerRendering()) {
- element.forbidden = true;
- "development" !== 'production' && warn$2(
- 'Templates should only be responsible for mapping the state to the ' +
- 'UI. Avoid placing tags with side-effects in your templates, such as ' +
- "<" + tag + ">" + ', as they will not be parsed.'
- );
- }
-
- // apply pre-transforms
- for (var i = 0; i < preTransforms.length; i++) {
- element = preTransforms[i](element, options) || element;
- }
-
- if (!inVPre) {
- processPre(element);
- if (element.pre) {
- inVPre = true;
- }
- }
- if (platformIsPreTag(element.tag)) {
- inPre = true;
- }
- if (inVPre) {
- processRawAttrs(element);
- } else if (!element.processed) {
- // structural directives
- processFor(element);
- processIf(element);
- processOnce(element);
- // element-scope stuff
- processElement(element, options);
- }
-
- function checkRootConstraints(el) {
- {
- if (el.tag === 'slot' || el.tag === 'template') {
- warnOnce(
- "Cannot use <" + (el.tag) + "> as component root element because it may " +
- 'contain multiple nodes.'
- );
- }
- if (el.attrsMap.hasOwnProperty('v-for')) {
- warnOnce(
- 'Cannot use v-for on stateful component root element because ' +
- 'it renders multiple elements.'
- );
- }
- }
- }
-
- // tree management
- if (!root) {
- root = element;
- checkRootConstraints(root);
- } else if (!stack.length) {
- // allow root elements with v-if, v-else-if and v-else
- if (root.if && (element.elseif || element.else)) {
- checkRootConstraints(element);
- addIfCondition(root, {
- exp: element.elseif,
- block: element
- });
- } else {
- warnOnce(
- "Component template should contain exactly one root element. " +
- "If you are using v-if on multiple elements, " +
- "use v-else-if to chain them instead."
- );
- }
- }
- if (currentParent && !element.forbidden) {
- if (element.elseif || element.else) {
- processIfConditions(element, currentParent);
- } else if (element.slotScope) { // scoped slot
- currentParent.plain = false;
- var name = element.slotTarget || '"default"'; (currentParent.scopedSlots || (currentParent.scopedSlots = {}))[name] = element;
- } else {
- currentParent.children.push(element);
- element.parent = currentParent;
- }
- }
- if (!unary) {
- currentParent = element;
- stack.push(element);
- } else {
- endPre(element);
- }
- // apply post-transforms
- for (var i$1 = 0; i$1 < postTransforms.length; i$1++) {
- postTransforms[i$1](element, options);
- }
- },
-
- end: function end() {
- // remove trailing whitespace
- var element = stack[stack.length - 1];
- var lastNode = element.children[element.children.length - 1];
- if (lastNode && lastNode.type === 3 && lastNode.text === ' ' && !inPre) {
- element.children.pop();
- }
- // pop stack
- stack.length -= 1;
- currentParent = stack[stack.length - 1];
- endPre(element);
- },
-
- chars: function chars(text) {
- if (!currentParent) {
- {
- if (text === template) {
- warnOnce(
- 'Component template requires a root element, rather than just text.'
- );
- } else if ((text = text.trim())) {
- warnOnce(
- ("text \"" + text + "\" outside root element will be ignored.")
- );
- }
- }
- return
- }
- // IE textarea placeholder bug
- /* istanbul ignore if */
- if (isIE &&
- currentParent.tag === 'textarea' &&
- currentParent.attrsMap.placeholder === text
- ) {
- return
- }
- var children = currentParent.children;
- text = inPre || text.trim()
- ? isTextTag(currentParent) ? text : decodeHTMLCached(text)
- // only preserve whitespace if its not right after a starting tag
- : preserveWhitespace && children.length ? ' ' : '';
- if (text) {
- var expression;
- if (!inVPre && text !== ' ' && (expression = parseText(text, delimiters))) {
- children.push({
- type: 2,
- expression: expression,
- text: text
- });
- } else if (text !== ' ' || !children.length || children[children.length - 1].text !== ' ') {
- children.push({
- type: 3,
- text: text
- });
- }
- }
- },
- comment: function comment(text) {
- currentParent.children.push({
- type: 3,
- text: text,
- isComment: true
- });
- }
- });
- return root
- }
-
- function processPre(el) {
- if (getAndRemoveAttr(el, 'v-pre') != null) {
- el.pre = true;
- }
- }
-
- function processRawAttrs(el) {
- var l = el.attrsList.length;
- if (l) {
- var attrs = el.attrs = new Array(l);
- for (var i = 0; i < l; i++) {
- attrs[i] = {
- name: el.attrsList[i].name,
- value: JSON.stringify(el.attrsList[i].value)
- };
- }
- } else if (!el.pre) {
- // non root node in pre blocks with no attributes
- el.plain = true;
- }
- }
-
- function processElement(element, options) {
- processKey(element);
-
- // determine whether this is a plain element after
- // removing structural attributes
- element.plain = !element.key && !element.attrsList.length;
-
- processRef(element);
- processSlot(element);
- processComponent(element);
- for (var i = 0; i < transforms.length; i++) {
- element = transforms[i](element, options) || element;
- }
- processAttrs(element);
- }
-
- function processKey(el) {
- var exp = getBindingAttr(el, 'key');
- if (exp) {
- if ("development" !== 'production' && el.tag === 'template') {
- warn$2(" cannot be keyed. Place the key on real elements instead.");
- }
- el.key = exp;
- }
- }
-
- function processRef(el) {
- var ref = getBindingAttr(el, 'ref');
- if (ref) {
- el.ref = ref;
- el.refInFor = checkInFor(el);
- }
- }
-
- function processFor(el) {
- var exp;
- if ((exp = getAndRemoveAttr(el, 'v-for'))) {
- var inMatch = exp.match(forAliasRE);
- if (!inMatch) {
- "development" !== 'production' && warn$2(
- ("Invalid v-for expression: " + exp)
- );
- return
- }
- el.for = inMatch[2].trim();
- var alias = inMatch[1].trim();
- var iteratorMatch = alias.match(forIteratorRE);
- if (iteratorMatch) {
- el.alias = iteratorMatch[1].trim();
- el.iterator1 = iteratorMatch[2].trim();
- if (iteratorMatch[3]) {
- el.iterator2 = iteratorMatch[3].trim();
+ ancestor.elm = vnode.elm;
+ if (patchable) {
+ for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {
+ cbs.create[i$1](emptyNode, ancestor);
+ }
+ // #6513
+ // invoke insert hooks that may have been merged by create hooks.
+ // e.g. for directives that uses the "inserted" hook.
+ var insert = ancestor.data.hook.insert;
+ if (insert.merged) {
+ // start at index 1 to avoid re-invoking component mounted hook
+ for (var i$2 = 1; i$2 < insert.fns.length; i$2++) {
+ insert.fns[i$2]();
}
+ }
} else {
- el.alias = alias;
+ registerRef(ancestor);
}
+ ancestor = ancestor.parent;
+ }
}
- }
- function processIf(el) {
- var exp = getAndRemoveAttr(el, 'v-if');
- if (exp) {
- el.if = exp;
- addIfCondition(el, {
- exp: exp,
- block: el
- });
- } else {
- if (getAndRemoveAttr(el, 'v-else') != null) {
- el.else = true;
- }
- var elseif = getAndRemoveAttr(el, 'v-else-if');
- if (elseif) {
- el.elseif = elseif;
- }
+ // destroy old node
+ if (isDef(parentElm$1)) {
+ removeVnodes(parentElm$1, [oldVnode], 0, 0);
+ } else if (isDef(oldVnode.tag)) {
+ invokeDestroyHook(oldVnode);
}
+ }
}
- function processIfConditions(el, parent) {
- var prev = findPrevElement(parent.children);
- if (prev && prev.if) {
- addIfCondition(prev, {
- exp: el.elseif,
- block: el
- });
- } else {
- warn$2(
- "v-" + (el.elseif ? ('else-if="' + el.elseif + '"') : 'else') + " " +
- "used on element <" + (el.tag) + "> without corresponding v-if."
- );
- }
+ invokeInsertHook(vnode, insertedVnodeQueue, isInitialPatch);
+ return vnode.elm
+ }
+}
+
+/* */
+
+var directives = {
+ create: updateDirectives,
+ update: updateDirectives,
+ destroy: function unbindDirectives (vnode) {
+ updateDirectives(vnode, emptyNode);
+ }
+};
+
+function updateDirectives (oldVnode, vnode) {
+ if (oldVnode.data.directives || vnode.data.directives) {
+ _update(oldVnode, vnode);
+ }
+}
+
+function _update (oldVnode, vnode) {
+ var isCreate = oldVnode === emptyNode;
+ var isDestroy = vnode === emptyNode;
+ var oldDirs = normalizeDirectives$1(oldVnode.data.directives, oldVnode.context);
+ var newDirs = normalizeDirectives$1(vnode.data.directives, vnode.context);
+
+ var dirsWithInsert = [];
+ var dirsWithPostpatch = [];
+
+ var key, oldDir, dir;
+ for (key in newDirs) {
+ oldDir = oldDirs[key];
+ dir = newDirs[key];
+ if (!oldDir) {
+ // new directive, bind
+ callHook$1(dir, 'bind', vnode, oldVnode);
+ if (dir.def && dir.def.inserted) {
+ dirsWithInsert.push(dir);
+ }
+ } else {
+ // existing directive, update
+ dir.oldValue = oldDir.value;
+ callHook$1(dir, 'update', vnode, oldVnode);
+ if (dir.def && dir.def.componentUpdated) {
+ dirsWithPostpatch.push(dir);
+ }
}
+ }
- function findPrevElement(children) {
- var i = children.length;
- while (i--) {
- if (children[i].type === 1) {
- return children[i]
- } else {
- if ("development" !== 'production' && children[i].text !== ' ') {
- warn$2(
- "text \"" + (children[i].text.trim()) + "\" between v-if and v-else(-if) " +
- "will be ignored."
- );
- }
- children.pop();
- }
- }
- }
-
- function addIfCondition(el, condition) {
- if (!el.ifConditions) {
- el.ifConditions = [];
- }
- el.ifConditions.push(condition);
- }
-
- function processOnce(el) {
- var once$$1 = getAndRemoveAttr(el, 'v-once');
- if (once$$1 != null) {
- el.once = true;
- }
- }
-
- function processSlot(el) {
- if (el.tag === 'slot') {
- el.slotName = getBindingAttr(el, 'name');
- if ("development" !== 'production' && el.key) {
- warn$2(
- "`key` does not work on because slots are abstract outlets " +
- "and can possibly expand into multiple elements. " +
- "Use the key on a wrapping element instead."
- );
- }
- } else {
- var slotScope;
- if (el.tag === 'template') {
- slotScope = getAndRemoveAttr(el, 'scope');
- /* istanbul ignore if */
- if ("development" !== 'production' && slotScope) {
- warn$2(
- "the \"scope\" attribute for scoped slots have been deprecated and " +
- "replaced by \"slot-scope\" since 2.5. The new \"slot-scope\" attribute " +
- "can also be used on plain elements in addition to to " +
- "denote scoped slots.",
- true
- );
- }
- el.slotScope = slotScope || getAndRemoveAttr(el, 'slot-scope');
- } else if ((slotScope = getAndRemoveAttr(el, 'slot-scope'))) {
- el.slotScope = slotScope;
- }
- var slotTarget = getBindingAttr(el, 'slot');
- if (slotTarget) {
- el.slotTarget = slotTarget === '""' ? '"default"' : slotTarget;
- // preserve slot as an attribute for native shadow DOM compat
- // only for non-scoped slots.
- if (!el.slotScope) {
- addAttr(el, 'slot', slotTarget);
- }
- }
- }
- }
-
- function processComponent(el) {
- var binding;
- if ((binding = getBindingAttr(el, 'is'))) {
- el.component = binding;
- }
- if (getAndRemoveAttr(el, 'inline-template') != null) {
- el.inlineTemplate = true;
- }
- }
-
- function processAttrs(el) {
- var list = el.attrsList;
- var i, l, name, rawName, value, modifiers, isProp;
- for (i = 0, l = list.length; i < l; i++) {
- name = rawName = list[i].name;
- value = list[i].value;
- if (dirRE.test(name)) {
- // mark element as dynamic
- el.hasBindings = true;
- // modifiers
- modifiers = parseModifiers(name);
- if (modifiers) {
- name = name.replace(modifierRE, '');
- }
- if (bindRE.test(name)) { // v-bind
- name = name.replace(bindRE, '');
- value = parseFilters(value);
- isProp = false;
- if (modifiers) {
- if (modifiers.prop) {
- isProp = true;
- name = camelize(name);
- if (name === 'innerHtml') { name = 'innerHTML'; }
- }
- if (modifiers.camel) {
- name = camelize(name);
- }
- if (modifiers.sync) {
- addHandler(
- el,
- ("update:" + (camelize(name))),
- genAssignmentCode(value, "$event")
- );
- }
- }
- if (isProp || (
- !el.component && platformMustUseProp(el.tag, el.attrsMap.type, name)
- )) {
- addProp(el, name, value);
- } else {
- addAttr(el, name, value);
- }
- } else if (onRE.test(name)) { // v-on
- name = name.replace(onRE, '');
- addHandler(el, name, value, modifiers, false, warn$2);
- } else { // normal directives
- name = name.replace(dirRE, '');
- // parse arg
- var argMatch = name.match(argRE);
- var arg = argMatch && argMatch[1];
- if (arg) {
- name = name.slice(0, -(arg.length + 1));
- }
- addDirective(el, name, rawName, value, arg, modifiers);
- if ("development" !== 'production' && name === 'model') {
- checkForAliasModel(el, value);
- }
- }
- } else {
- // literal attribute
- {
- var expression = parseText(value, delimiters);
- if (expression) {
- warn$2(
- name + "=\"" + value + "\": " +
- 'Interpolation inside attributes has been removed. ' +
- 'Use v-bind or the colon shorthand instead. For example, ' +
- 'instead of , use
.'
- );
- }
- }
- addAttr(el, name, JSON.stringify(value));
- }
- }
- }
-
- function checkInFor(el) {
- var parent = el;
- while (parent) {
- if (parent.for !== undefined) {
- return true
- }
- parent = parent.parent;
- }
- return false
- }
-
- function parseModifiers(name) {
- var match = name.match(modifierRE);
- if (match) {
- var ret = {};
- match.forEach(function (m) { ret[m.slice(1)] = true; });
- return ret
- }
- }
-
- function makeAttrsMap(attrs) {
- var map = {};
- for (var i = 0, l = attrs.length; i < l; i++) {
- if (
- "development" !== 'production' &&
- map[attrs[i].name] && !isIE && !isEdge
- ) {
- warn$2('duplicate attribute: ' + attrs[i].name);
- }
- map[attrs[i].name] = attrs[i].value;
- }
- return map
- }
-
- // for script (e.g. type="x/template") or style, do not decode content
- function isTextTag(el) {
- return el.tag === 'script' || el.tag === 'style'
- }
-
- function isForbiddenTag(el) {
- return (
- el.tag === 'style' ||
- (el.tag === 'script' && (
- !el.attrsMap.type ||
- el.attrsMap.type === 'text/javascript'
- ))
- )
- }
-
- var ieNSBug = /^xmlns:NS\d+/;
- var ieNSPrefix = /^NS\d+:/;
-
- /* istanbul ignore next */
- function guardIESVGBug(attrs) {
- var res = [];
- for (var i = 0; i < attrs.length; i++) {
- var attr = attrs[i];
- if (!ieNSBug.test(attr.name)) {
- attr.name = attr.name.replace(ieNSPrefix, '');
- res.push(attr);
- }
- }
- return res
- }
-
- function checkForAliasModel(el, value) {
- var _el = el;
- while (_el) {
- if (_el.for && _el.alias === value) {
- warn$2(
- "<" + (el.tag) + " v-model=\"" + value + "\">: " +
- "You are binding v-model directly to a v-for iteration alias. " +
- "This will not be able to modify the v-for source array because " +
- "writing to the alias is like modifying a function local variable. " +
- "Consider using an array of objects and use v-model on an object property instead."
- );
- }
- _el = _el.parent;
- }
- }
-
- /* */
-
- /**
- * Expand input[v-model] with dyanmic type bindings into v-if-else chains
- * Turn this:
- *
- * into this:
- *
- *
- *
- */
-
- function preTransformNode(el, options) {
- if (el.tag === 'input') {
- var map = el.attrsMap;
- if (map['v-model'] && (map['v-bind:type'] || map[':type'])) {
- var typeBinding = getBindingAttr(el, 'type');
- var ifCondition = getAndRemoveAttr(el, 'v-if', true);
- var ifConditionExtra = ifCondition ? ("&&(" + ifCondition + ")") : "";
- // 1. checkbox
- var branch0 = cloneASTElement(el);
- // process for on the main node
- processFor(branch0);
- addRawAttr(branch0, 'type', 'checkbox');
- processElement(branch0, options);
- branch0.processed = true; // prevent it from double-processed
- branch0.if = "(" + typeBinding + ")==='checkbox'" + ifConditionExtra;
- addIfCondition(branch0, {
- exp: branch0.if,
- block: branch0
- });
- // 2. add radio else-if condition
- var branch1 = cloneASTElement(el);
- getAndRemoveAttr(branch1, 'v-for', true);
- addRawAttr(branch1, 'type', 'radio');
- processElement(branch1, options);
- addIfCondition(branch0, {
- exp: "(" + typeBinding + ")==='radio'" + ifConditionExtra,
- block: branch1
- });
- // 3. other
- var branch2 = cloneASTElement(el);
- getAndRemoveAttr(branch2, 'v-for', true);
- addRawAttr(branch2, ':type', typeBinding);
- processElement(branch2, options);
- addIfCondition(branch0, {
- exp: ifCondition,
- block: branch2
- });
- return branch0
- }
- }
- }
-
- function cloneASTElement(el) {
- return createASTElement(el.tag, el.attrsList.slice(), el.parent)
- }
-
- function addRawAttr(el, name, value) {
- el.attrsMap[name] = value;
- el.attrsList.push({ name: name, value: value });
- }
-
- var model$2 = {
- preTransformNode: preTransformNode
+ if (dirsWithInsert.length) {
+ var callInsert = function () {
+ for (var i = 0; i < dirsWithInsert.length; i++) {
+ callHook$1(dirsWithInsert[i], 'inserted', vnode, oldVnode);
+ }
};
-
- var modules$1 = [
- klass$1,
- style$1,
- model$2
- ];
-
- /* */
-
- function text(el, dir) {
- if (dir.value) {
- addProp(el, 'textContent', ("_s(" + (dir.value) + ")"));
- }
+ if (isCreate) {
+ mergeVNodeHook(vnode, 'insert', callInsert);
+ } else {
+ callInsert();
}
+ }
- /* */
+ if (dirsWithPostpatch.length) {
+ mergeVNodeHook(vnode, 'postpatch', function () {
+ for (var i = 0; i < dirsWithPostpatch.length; i++) {
+ callHook$1(dirsWithPostpatch[i], 'componentUpdated', vnode, oldVnode);
+ }
+ });
+ }
- function html(el, dir) {
- if (dir.value) {
- addProp(el, 'innerHTML', ("_s(" + (dir.value) + ")"));
- }
+ if (!isCreate) {
+ for (key in oldDirs) {
+ if (!newDirs[key]) {
+ // no longer present, unbind
+ callHook$1(oldDirs[key], 'unbind', oldVnode, oldVnode, isDestroy);
+ }
}
+ }
+}
- var directives$1 = {
- model: model,
- text: text,
- html: html
- };
+var emptyModifiers = Object.create(null);
- /* */
-
- var baseOptions = {
- expectHTML: true,
- modules: modules$1,
- directives: directives$1,
- isPreTag: isPreTag,
- isUnaryTag: isUnaryTag,
- mustUseProp: mustUseProp,
- canBeLeftOpenTag: canBeLeftOpenTag,
- isReservedTag: isReservedTag,
- getTagNamespace: getTagNamespace,
- staticKeys: genStaticKeys(modules$1)
- };
-
- /* */
-
- var isStaticKey;
- var isPlatformReservedTag;
-
- var genStaticKeysCached = cached(genStaticKeys$1);
-
- /**
- * Goal of the optimizer: walk the generated template AST tree
- * and detect sub-trees that are purely static, i.e. parts of
- * the DOM that never needs to change.
- *
- * Once we detect these sub-trees, we can:
- *
- * 1. Hoist them into constants, so that we no longer need to
- * create fresh nodes for them on each re-render;
- * 2. Completely skip them in the patching process.
- */
- function optimize(root, options) {
- if (!root) { return }
- isStaticKey = genStaticKeysCached(options.staticKeys || '');
- isPlatformReservedTag = options.isReservedTag || no;
- // first pass: mark all non-static nodes.
- markStatic$1(root);
- // second pass: mark static roots.
- markStaticRoots(root, false);
+function normalizeDirectives$1 (
+ dirs,
+ vm
+) {
+ var res = Object.create(null);
+ if (!dirs) {
+ // $flow-disable-line
+ return res
+ }
+ var i, dir;
+ for (i = 0; i < dirs.length; i++) {
+ dir = dirs[i];
+ if (!dir.modifiers) {
+ // $flow-disable-line
+ dir.modifiers = emptyModifiers;
}
+ res[getRawDirName(dir)] = dir;
+ dir.def = resolveAsset(vm.$options, 'directives', dir.name, true);
+ }
+ // $flow-disable-line
+ return res
+}
- function genStaticKeys$1(keys) {
- return makeMap(
- 'type,tag,attrsList,attrsMap,plain,parent,children,attrs' +
- (keys ? ',' + keys : '')
- )
+function getRawDirName (dir) {
+ return dir.rawName || ((dir.name) + "." + (Object.keys(dir.modifiers || {}).join('.')))
+}
+
+function callHook$1 (dir, hook, vnode, oldVnode, isDestroy) {
+ var fn = dir.def && dir.def[hook];
+ if (fn) {
+ try {
+ fn(vnode.elm, dir, vnode, oldVnode, isDestroy);
+ } catch (e) {
+ handleError(e, vnode.context, ("directive " + (dir.name) + " " + hook + " hook"));
}
+ }
+}
- function markStatic$1(node) {
- node.static = isStatic(node);
- if (node.type === 1) {
- // do not make component slot content static. this avoids
- // 1. components not able to mutate slot nodes
- // 2. static slot content fails for hot-reloading
- if (
- !isPlatformReservedTag(node.tag) &&
- node.tag !== 'slot' &&
- node.attrsMap['inline-template'] == null
- ) {
- return
- }
- for (var i = 0, l = node.children.length; i < l; i++) {
- var child = node.children[i];
- markStatic$1(child);
- if (!child.static) {
- node.static = false;
- }
- }
- if (node.ifConditions) {
- for (var i$1 = 1, l$1 = node.ifConditions.length; i$1 < l$1; i$1++) {
- var block = node.ifConditions[i$1].block;
- markStatic$1(block);
- if (!block.static) {
- node.static = false;
- }
- }
- }
- }
+var baseModules = [
+ ref,
+ directives
+];
+
+/* */
+
+function updateAttrs (oldVnode, vnode) {
+ var opts = vnode.componentOptions;
+ if (isDef(opts) && opts.Ctor.options.inheritAttrs === false) {
+ return
+ }
+ if (isUndef(oldVnode.data.attrs) && isUndef(vnode.data.attrs)) {
+ return
+ }
+ var key, cur, old;
+ var elm = vnode.elm;
+ var oldAttrs = oldVnode.data.attrs || {};
+ var attrs = vnode.data.attrs || {};
+ // clone observed objects, as the user probably wants to mutate it
+ if (isDef(attrs.__ob__)) {
+ attrs = vnode.data.attrs = extend({}, attrs);
+ }
+
+ for (key in attrs) {
+ cur = attrs[key];
+ old = oldAttrs[key];
+ if (old !== cur) {
+ setAttr(elm, key, cur);
}
-
- function markStaticRoots(node, isInFor) {
- if (node.type === 1) {
- if (node.static || node.once) {
- node.staticInFor = isInFor;
- }
- // For a node to qualify as a static root, it should have children that
- // are not just static text. Otherwise the cost of hoisting out will
- // outweigh the benefits and it's better off to just always render it fresh.
- if (node.static && node.children.length && !(
- node.children.length === 1 &&
- node.children[0].type === 3
- )) {
- node.staticRoot = true;
- return
- } else {
- node.staticRoot = false;
- }
- if (node.children) {
- for (var i = 0, l = node.children.length; i < l; i++) {
- markStaticRoots(node.children[i], isInFor || !!node.for);
- }
- }
- if (node.ifConditions) {
- for (var i$1 = 1, l$1 = node.ifConditions.length; i$1 < l$1; i$1++) {
- markStaticRoots(node.ifConditions[i$1].block, isInFor);
- }
- }
- }
+ }
+ // #4391: in IE9, setting type can reset value for input[type=radio]
+ // #6666: IE/Edge forces progress value down to 1 before setting a max
+ /* istanbul ignore if */
+ if ((isIE || isEdge) && attrs.value !== oldAttrs.value) {
+ setAttr(elm, 'value', attrs.value);
+ }
+ for (key in oldAttrs) {
+ if (isUndef(attrs[key])) {
+ if (isXlink(key)) {
+ elm.removeAttributeNS(xlinkNS, getXlinkProp(key));
+ } else if (!isEnumeratedAttr(key)) {
+ elm.removeAttribute(key);
+ }
}
+ }
+}
- function isStatic(node) {
- if (node.type === 2) { // expression
- return false
- }
- if (node.type === 3) { // text
- return true
- }
- return !!(node.pre || (
- !node.hasBindings && // no dynamic bindings
- !node.if && !node.for && // not v-if or v-for or v-else
- !isBuiltInTag(node.tag) && // not a built-in
- isPlatformReservedTag(node.tag) && // not a component
- !isDirectChildOfTemplateFor(node) &&
- Object.keys(node).every(isStaticKey)
- ))
+function setAttr (el, key, value) {
+ if (isBooleanAttr(key)) {
+ // set attribute for blank value
+ // e.g.
+ if (isFalsyAttrValue(value)) {
+ el.removeAttribute(key);
+ } else {
+ // technically allowfullscreen is a boolean attribute for