智能照明系统APP-本地串口
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
LightingSystemApp-serial/.svn/pristine/95/9504511012dcda0b3d717677a11...

5167 lines
145 KiB

"use strict"
Object.defineProperty(exports, "__esModule", { value: true })
function _interopDefault(ex) {
return ex && typeof ex === "object" && "default" in ex ? ex["default"] : ex
}
var deindent = _interopDefault(require("de-indent"))
var he = _interopDefault(require("he"))
var babel = _interopDefault(require("@babel/core"))//fixed by xxxxxx
var prettier = _interopDefault(require("prettier"))
var t = require("@babel/types")//fixed by xxxxxx
var generate = _interopDefault(require("@babel/generator"))//fixed by xxxxxx
var template = _interopDefault(require("@babel/template"))//fixed by xxxxxx
//fixed by xxxxxx
function makeRandom(len) {
return 'E';
// var text = "";
// var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
//
// for (var i = 0; i < len; i++)
// text += possible.charAt(Math.floor(Math.random() * possible.length));
//
// return text;
}
/* */
// these helpers produces better vm code in JS engines due to their
// explicitness and function inlining
/**
* Check if value is primitive
*/
/**
* Quick object check - this is primarily used to tell
* Objects from primitive values when we know the value
* is a JSON-compliant type.
*/
function isObject(obj) {
return obj !== null && typeof obj === "object"
}
var _toString = Object.prototype.toString
/**
* Strict object type check. Only returns true
* for plain JavaScript objects.
*/
function isPlainObject(obj) {
return _toString.call(obj) === "[object Object]"
}
/**
* Check if val is a valid array index.
*/
function isValidArrayIndex(val) {
var n = parseFloat(val)
return n >= 0 && Math.floor(n) === n && isFinite(val)
}
/**
* Convert a value to a string that is actually rendered.
*/
/**
* Convert a input value to a number for persistence.
* If the conversion fails, return original string.
*/
/**
* Make a map and return a function for checking if a key
* is in that map.
*/
function makeMap(str, expectsLowerCase) {
var map = Object.create(null)
var list = str.split(",")
for (var i = 0; i < list.length; i++) {
map[list[i]] = true
}
return expectsLowerCase
? function(val) {
return map[val.toLowerCase()]
}
: function(val) {
return map[val]
}
}
/**
* Check if a tag is a built-in tag.
*/
var isBuiltInTag = makeMap("slot,component", true)
/**
* Check if a attribute is a reserved attribute.
*/
var isReservedAttribute = makeMap("key,ref,slot,is")
/**
* Remove an item from an array
*/
function remove(arr, item) {
if (arr.length) {
var index = arr.indexOf(item)
if (index > -1) {
return arr.splice(index, 1)
}
}
}
/**
* Check whether the object has the property.
*/
var hasOwnProperty = Object.prototype.hasOwnProperty
function hasOwn(obj, key) {
return hasOwnProperty.call(obj, key)
}
/**
* Create a cached version of a pure function.
*/
function cached(fn) {
var cache = Object.create(null)
return function cachedFn(str) {
var hit = cache[str]
return hit || (cache[str] = fn(str))
}
}
/**
* Camelize a hyphen-delimited string.
*/
var camelizeRE = /-(\w)/g
var camelize = cached(function(str) {
return str.replace(camelizeRE, function(_, c) {
return c ? c.toUpperCase() : ""
})
})
/**
* Capitalize a string.
*/
/**
* Hyphenate a camelCase string.
*/
var hyphenateRE = /([^-])([A-Z])/g
var hyphenate = cached(function(str) {
return str
.replace(hyphenateRE, "$1-$2")
.replace(hyphenateRE, "$1-$2")
.toLowerCase()
})
/**
* Simple bind, faster than native
*/
/**
* Convert an Array-like object to a real Array.
*/
/**
* Mix properties into target object.
*/
function extend(to, _from) {
for (var key in _from) {
to[key] = _from[key]
}
return to
}
/**
* Merge an Array of Objects into a single Object.
*/
/**
* Perform no operation.
* Stubbing args to make Flow happy without leaving useless transpiled code
* with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/)
*/
function noop(a, b, c) {}
/**
* Always return false.
*/
var no = function(a, b, c) {
return false
}
/**
* Return same value
*/
var identity = function(_) {
return _
}
/**
* Generate a static keys string from compiler modules.
*/
function genStaticKeys(modules) {
return modules
.reduce(function(keys, m) {
return keys.concat(m.staticKeys || [])
}, [])
.join(",")
}
/**
* Check if two values are loosely equal - that is,
* if they are plain objects, do they have the same shape?
*/
/**
* Ensure a function is called only once.
*/
/* */
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 singleAttrIdentifier = /([^\s"'<>/=]+)/
var singleAttrAssign = /(?:=)/
var singleAttrValues = [
// attr value double quotes
/"([^"]*)"+/.source,
// attr value, single quotes
/'([^']*)'+/.source,
// attr value, no quotes
/([^\s"'=<>`]+)/.source
]
var attribute = new RegExp(
"^\\s*" +
singleAttrIdentifier.source +
"(?:\\s*(" +
singleAttrAssign.source +
")" +
"\\s*(?:" +
singleAttrValues.join("|") +
"))?"
)
// 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 = /^<!DOCTYPE [^>]+>/i
var comment = /^<!--/
var conditionalComment = /^<!\[/
var IS_REGEX_CAPTURING_BROKEN = false
"x".replace(/x(.)?/g, function(m, g) {
IS_REGEX_CAPTURING_BROKEN = g === ""
})
// Special Elements (can contain anything)
var isPlainTextElement = makeMap("script,style,textarea", true)
var reCache = {}
var decodingMap = {
"&lt;": "<",
"&gt;": ">",
"&quot;": '"',
"&amp;": "&",
"&#10;": "\n"
}
var encodedAttr = /&(?:lt|gt|quot|amp);/g
var encodedAttrWithNewLines = /&(?:lt|gt|quot|amp|#10);/g
// #5992
var isIgnoreNewlineTag = makeMap("pre,textarea", true)
var shouldIgnoreFirstNewline = function(tag, html) {
return tag && isIgnoreNewlineTag(tag) && html[0] === "\n"
}
function decodeAttr(value, shouldDecodeNewlines) {
var re = shouldDecodeNewlines ? encodedAttrWithNewLines : encodedAttr
return value.replace(re, function(match) {
return decodingMap[match]
})
}
function parseHTML(html, options) {
var stack = []
var expectHTML = options.expectHTML
var isUnaryTag$$1 = options.isUnaryTag || no
var canBeLeftOpenTag$$1 = options.canBeLeftOpenTag || no
var index = 0
var last, lastTag
while (html) {
last = html
// Make sure we're not in a plaintext content element like script/style
if (!lastTag || !isPlainTextElement(lastTag)) {
if (shouldIgnoreFirstNewline(lastTag, html)) {
advance(1)
}
var textEnd = html.indexOf("<")
if (textEnd === 0) {
// Comment:
if (comment.test(html)) {
var commentEnd = html.indexOf("-->")
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)
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(/<!--([\s\S]*?)-->/g, "$1")
.replace(/<!\[CDATA\[([\s\S]*?)]]>/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 (process.env.NODE_ENV !== "production" && !stack.length && options.warn) {
options.warn('Mal-formatted tag at end of template: "' + html + '"')
}
break
}
}
// Clean up any remaining tags
parseEndTag()
function advance(n) {
index += n
html = html.substring(n)
}
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
}
}
}
function handleStartTag(match) {
var tagName = match.tagName
var unarySlash = match.unarySlash
if (expectHTML) {
if (lastTag === "p" && isNonPhrasingTag(tagName)) {
parseEndTag(lastTag)
}
if (canBeLeftOpenTag$$1(tagName) && lastTag === tagName) {
parseEndTag(tagName)
}
}
var unary = isUnaryTag$$1(tagName) || !!unarySlash
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
}
}
} 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 (
process.env.NODE_ENV !== "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 splitRE = /\r?\n/g
var replaceRE = /./g
var isSpecialTag = makeMap("script,style,template", true)
/**
* Parse a single-file component (*.vue) file into an SFC Descriptor Object.
*/
function parseComponent(content, options) {
if (options === void 0) options = {}
var sfc = {
template: null,
script: null,
styles: [],
customBlocks: []
}
var depth = 0
var currentBlock = null
function start(tag, attrs, unary, start, end) {
if (depth === 0) {
currentBlock = {
type: tag,
content: "",
start: end,
attrs: attrs.reduce(function(cumulated, ref) {
var name = ref.name
var value = ref.value
cumulated[name] = value || true
return cumulated
}, Object.create(null))
}
if (isSpecialTag(tag)) {
checkAttrs(currentBlock, attrs)
if (tag === "style") {
sfc.styles.push(currentBlock)
} else {
sfc[tag] = currentBlock
}
} else {
// custom blocks
sfc.customBlocks.push(currentBlock)
}
}
if (!unary) {
depth++
}
}
function checkAttrs(block, attrs) {
for (var i = 0; i < attrs.length; i++) {
var attr = attrs[i]
if (attr.name === "lang") {
block.lang = attr.value
}
if (attr.name === "scoped") {
block.scoped = true
}
if (attr.name === "module") {
block.module = attr.value || true
}
if (attr.name === "src") {
block.src = attr.value
}
}
}
function end(tag, start, end) {
if (depth === 1 && currentBlock) {
currentBlock.end = start
var text = deindent(content.slice(currentBlock.start, currentBlock.end))
// pad content so that linters and pre-processors can output correct
// line numbers in errors and warnings
if (currentBlock.type !== "template" && options.pad) {
text = padContent(currentBlock, options.pad) + text
}
currentBlock.content = text
currentBlock = null
}
depth--
}
function padContent(block, pad) {
if (pad === "space") {
return content.slice(0, block.start).replace(replaceRE, " ")
} else {
var offset = content.slice(0, block.start).split(splitRE).length
var padChar =
block.type === "script" && !block.lang //fixed by xxxxxx script 节点使用//注释后会影响 babel 的retainLines
? "\n"
: "\n"
return Array(offset).join(padChar)
}
}
parseHTML(content, {
start: start,
end: end
})
return sfc
}
/* globals renderer */
var isPreTag = function(tag) {
return tag === "pre"
}
var isReservedTag = makeMap(
"template,script,style,element,content,slot,link,meta,svg,view," +
"a,div,img,image,text,span,richtext,input,switch,textarea,spinner,select," +
"slider,slider-neighbor,indicator,trisition,trisition-group,canvas," +
"list,cell,header,loading,loading-indicator,refresh,scrollable,scroller," +
"video,web,embed,tabbar,tabheader,datepicker,timepicker,marquee,countdown",
true
)
// these are reserved for web because they are directly compiled away
// during template compilation
var isReservedAttr = makeMap("style,class")
// Elements that you can, intentionally, leave open (and which close themselves)
// more flexable than web
var canBeLeftOpenTag$1 = makeMap(
"web,spinner,switch,video,textarea,canvas," + "indicator,marquee,countdown",
true
)
var isUnaryTag$1 = makeMap("embed,img,image,input,link,meta", true)
function mustUseProp() {
/* console.log('mustUseProp') */
}
function getTagNamespace() {
/* console.log('getTagNamespace') */
}
// 用于小程序的 event type 到 web 的 event
/* */
var validDivisionCharRE = /[\w).+\-_$\]]/
function parseFilters(exp) {
var inSingle = false
var inDouble = false
var inTemplateString = false
var inRegex = false
var curly = 0
var square = 0
var paren = 0
var lastFilterIndex = 0
var c, prev, i, expression, filters
for (i = 0; i < exp.length; i++) {
prev = c
c = exp.charCodeAt(i)
if (inSingle) {
if (c === 0x27 && prev !== 0x5c) {
inSingle = false
}
} else if (inDouble) {
if (c === 0x22 && prev !== 0x5c) {
inDouble = false
}
} else if (inTemplateString) {
if (c === 0x60 && prev !== 0x5c) {
inTemplateString = false
}
} else if (inRegex) {
if (c === 0x2f && prev !== 0x5c) {
inRegex = false
}
} else if (
c === 0x7c && // pipe
exp.charCodeAt(i + 1) !== 0x7c &&
exp.charCodeAt(i - 1) !== 0x7c &&
!curly &&
!square &&
!paren
) {
if (expression === undefined) {
// first filter, end of expression
lastFilterIndex = i + 1
expression = exp.slice(0, i).trim()
} else {
pushFilter()
}
} else {
switch (c) {
case 0x22:
inDouble = true
break // "
case 0x27:
inSingle = true
break // '
case 0x60:
inTemplateString = true
break // `
case 0x28:
paren++
break // (
case 0x29:
paren--
break // )
case 0x5b:
square++
break // [
case 0x5d:
square--
break // ]
case 0x7b:
curly++
break // {
case 0x7d:
curly--
break // }
}
if (c === 0x2f) {
// /
var j = i - 1
var p = void 0
// find first non-whitespace prev char
for (; j >= 0; j--) {
p = exp.charAt(j)
if (p !== " ") {
break
}
}
if (!p || !validDivisionCharRE.test(p)) {
inRegex = true
}
}
}
}
if (expression === undefined) {
expression = exp.slice(0, i).trim()
} else if (lastFilterIndex !== 0) {
pushFilter()
}
function pushFilter() {
;(filters || (filters = [])).push(exp.slice(lastFilterIndex, i).trim())
lastFilterIndex = i + 1
}
if (filters) {
for (i = 0; i < filters.length; i++) {
expression = wrapFilter(expression, filters[i])
}
}
return expression
}
function wrapFilter(exp, filter) {
var i = filter.indexOf("(")
if (i < 0) {
// _f: resolveFilter
return '_f("' + filter + '")(' + exp + ")"
} else {
var name = filter.slice(0, i)
var args = filter.slice(i + 1)
return '_f("' + name + '")(' + exp + "," + args
}
}
/* */
var defaultTagRE = /\{\{((?:.|\n)+?)\}\}/g
var regexEscapeRE = /[-.*+?^${}()|[\]\/\\]/g
var buildRegex = cached(function(delimiters) {
var open = delimiters[0].replace(regexEscapeRE, "\\$&")
var close = delimiters[1].replace(regexEscapeRE, "\\$&")
return new RegExp(open + "((?:.|\\n)+?)" + close, "g")
})
function parseText(text, delimiters) {
var tagRE = delimiters ? buildRegex(delimiters) : defaultTagRE
if (!tagRE.test(text)) {
return
}
var tokens = []
var lastIndex = (tagRE.lastIndex = 0)
var match, index
while ((match = tagRE.exec(text))) {
index = match.index
// push text token
if (index > lastIndex) {
tokens.push(JSON.stringify(text.slice(lastIndex, index)))
}
// tag token
var exp = parseFilters(match[1].trim())
tokens.push("_s(" + exp + ")")
lastIndex = index + match[0].length
}
if (lastIndex < text.length) {
tokens.push(JSON.stringify(text.slice(lastIndex)))
}
return tokens.join("+")
}
/* */
function baseWarn(msg) {
console.error("[Vue compiler]: " + msg)
}
function pluckModuleFunction(modules, key) {
return modules
? modules
.map(function(m) {
return m[key]
})
.filter(function(_) {
return _
})
: []
}
function addProp(el, name, value) {
;(el.props || (el.props = [])).push({ name: name, value: value })
}
function addAttr(el, name, value) {
;(el.attrs || (el.attrs = [])).push({ name: name, value: value })
}
function addDirective(el, name, rawName, value, arg, modifiers) {
;(el.directives || (el.directives = [])).push({
name: name,
rawName: rawName,
value: value,
arg: arg,
modifiers: modifiers
})
}
function addHandler(el, name, value, modifiers, important, warn) {
// warn prevent and passive modifier
/* istanbul ignore if */
if (
process.env.NODE_ENV !== "production" &&
warn &&
modifiers &&
modifiers.prevent &&
modifiers.passive
) {
warn(
"passive and prevent can't be used together. " +
"Passive handler can't prevent default event."
)
}
// check capture modifier
if (modifiers && modifiers.capture) {
delete modifiers.capture
name = "!" + name // mark the event as captured
}
if (modifiers && modifiers.once) {
delete modifiers.once
name = "~" + name // mark the event as once
}
/* istanbul ignore if */
if (modifiers && modifiers.passive) {
delete modifiers.passive
name = "&" + name // mark the event as passive
}
var events
if (modifiers && modifiers.native) {
delete modifiers.native
events = el.nativeEvents || (el.nativeEvents = {})
} else {
events = el.events || (el.events = {})
}
var newHandler = { value: value, modifiers: modifiers }
var handlers = events[name]
/* istanbul ignore if */
if (Array.isArray(handlers)) {
important ? handlers.unshift(newHandler) : handlers.push(newHandler)
} else if (handlers) {
events[name] = important ? [newHandler, handlers] : [handlers, newHandler]
} else {
events[name] = newHandler
}
}
function getBindingAttr(el, name, getStatic) {
var dynamicValue = getAndRemoveAttr(el, ":" + name) || getAndRemoveAttr(el, "v-bind:" + name)
if (dynamicValue != null) {
return parseFilters(dynamicValue)
} else if (getStatic !== false) {
var staticValue = getAndRemoveAttr(el, name)
if (staticValue != null) {
return JSON.stringify(staticValue)
}
}
}
function getAndRemoveAttr(el, name) {
var val
if ((val = el.attrsMap[name]) != null) {
var list = el.attrsList
for (var i = 0, l = list.length; i < l; i++) {
if (list[i].name === name) {
list.splice(i, 1)
break
}
}
}
return val
}
/* */
function transformNode(el, options) {
var warn = options.warn || baseWarn
var staticClass = getAndRemoveAttr(el, "class")
if (process.env.NODE_ENV !== "production" && staticClass) {
var expression = parseText(staticClass, options.delimiters)
if (expression) {
warn(
'class="' +
staticClass +
'": ' +
"Interpolation inside attributes has been removed. " +
"Use v-bind or the colon shorthand instead. For example, " +
'instead of <div class="{{ val }}">, use <div :class="val">.'
)
}
}
if (staticClass) {
el.staticClass = JSON.stringify(staticClass)
}
var classBinding = getBindingAttr(el, "class", false /* getStatic */)
if (classBinding) {
el.classBinding = classBinding
}
}
function genData(el) {
var data = ""
if (el.staticClass) {
data += "staticClass:" + el.staticClass + ","
}
if (el.classBinding) {
data += "class:" + el.classBinding + ","
}
return data
}
var klass = {
staticKeys: ["staticClass"],
transformNode: transformNode,
genData: genData
}
/* */
var parseStyleText = cached(function(cssText) {
var res = {}
var listDelimiter = /;(?![^(]*\))/g
var propertyDelimiter = /:(.+)/
cssText.split(listDelimiter).forEach(function(item) {
if (item) {
var tmp = item.split(propertyDelimiter)
tmp.length > 1 && (res[tmp[0].trim()] = tmp[1].trim())
}
})
return res
})
// normalize possible array / string values into Object
/**
* parent component style should be after child's
* so that parent component's style could override it
*/
/* */
function transformNode$1(el, options) {
var warn = options.warn || baseWarn
var staticStyle = getAndRemoveAttr(el, "style")
if (staticStyle) {
/* istanbul ignore if */
if (process.env.NODE_ENV !== "production") {
var expression = parseText(staticStyle, options.delimiters)
if (expression) {
warn(
'style="' +
staticStyle +
'": ' +
"Interpolation inside attributes has been removed. " +
"Use v-bind or the colon shorthand instead. For example, " +
'instead of <div style="{{ val }}">, use <div :style="val">.'
)
}
}
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 = {
staticKeys: ["staticStyle"],
transformNode: transformNode$1,
genData: genData$1
}
var modules = [klass, style]
var ASSET_TYPES = ["component", "directive", "filter"]
var LIFECYCLE_HOOKS = [
"beforeCreate",
"created",
"beforeMount",
"mounted",
"beforeUpdate",
"updated",
"beforeDestroy",
"destroyed",
"activated",
"deactivated",
"onLaunch",
"onLoad",
"onShow",
"onReady",
"onHide",
"onUnload",
"onPullDownRefresh",
"onReachBottom",
"onShareAppMessage",
"onPageScroll",
"onTabItemTap",
"attached",
"ready",
"moved",
"detached"
]
/* */
var config = {
/**
* Option merge strategies (used in core/util/options)
*/
optionMergeStrategies: Object.create(null),
/**
* Whether to suppress warnings.
*/
silent: false,
/**
* Show production mode tip message on boot?
*/
productionTip: process.env.NODE_ENV !== "production",
/**
* Whether to enable devtools
*/
devtools: process.env.NODE_ENV !== "production",
/**
* Whether to record perf
*/
performance: false,
/**
* Error handler for watcher errors
*/
errorHandler: null,
/**
* Warn handler for watcher warns
*/
warnHandler: null,
/**
* Ignore certain custom elements
*/
ignoredElements: [],
/**
* Custom user key aliases for v-on
*/
keyCodes: Object.create(null),
/**
* Check if a tag is reserved so that it cannot be registered as a
* component. This is platform-dependent and may be overwritten.
*/
isReservedTag: no,
/**
* Check if an attribute is reserved so that it cannot be used as a component
* prop. This is platform-dependent and may be overwritten.
*/
isReservedAttr: no,
/**
* Check if a tag is an unknown element.
* Platform-dependent.
*/
isUnknownElement: no,
/**
* Get the namespace of an element
*/
getTagNamespace: noop,
/**
* Parse the real tag name for the specific platform.
*/
parsePlatformTagName: identity,
/**
* Check if an attribute must be bound using property, e.g. value
* Platform-dependent.
*/
mustUseProp: no,
/**
* Exposed for legacy reasons
*/
_lifecycleHooks: LIFECYCLE_HOOKS
}
/* */
/**
* Cross-platform code generation for component v-model
*/
function genComponentModel(el, value, modifiers) {
var ref = modifiers || {}
var number = ref.number
var trim = ref.trim
var baseValueExpression = "$$v"
var valueExpression = baseValueExpression
if (trim) {
valueExpression =
"(typeof " +
baseValueExpression +
" === 'string'" +
"? " +
baseValueExpression +
".trim()" +
": " +
baseValueExpression +
")"
}
if (number) {
valueExpression = "_n(" + valueExpression + ")"
}
var assignment = genAssignmentCode(value, valueExpression)
el.model = {
value: "(" + value + ")",
expression: '"' + value + '"',
callback: "function (" + baseValueExpression + ") {" + assignment + "}"
}
}
/**
* Cross-platform codegen helper for generating v-model value assignment code.
*/
function genAssignmentCode(value, assignment) {
var modelRs = parseModel(value)
if (modelRs.idx === null) {
return value + "=" + assignment
} else {
return "$set(" + modelRs.exp + ", " + modelRs.idx + ", " + assignment + ")"
}
}
/**
* parse directive model to do the array update transform. a[idx] = val => $$a.splice($$idx, 1, val)
*
* for loop possible cases:
*
* - test
* - test[idx]
* - test[test1[idx]]
* - test["a"][idx]
* - xxx.test[a[a].test1[idx]]
* - test.xxx.a["asa"][test1[idx]]
*
*/
var len
var str
var chr
var index
var expressionPos
var expressionEndPos
function parseModel(val) {
str = val
len = str.length
index = expressionPos = expressionEndPos = 0
if (val.indexOf("[") < 0 || val.lastIndexOf("]") < len - 1) {
return {
exp: val,
idx: null
}
}
while (!eof()) {
chr = next()
/* istanbul ignore if */
if (isStringStart(chr)) {
parseString(chr)
} else if (chr === 0x5b) {
parseBracket(chr)
}
}
return {
exp: val.substring(0, expressionPos),
idx: val.substring(expressionPos + 1, expressionEndPos)
}
}
function next() {
return str.charCodeAt(++index)
}
function eof() {
return index >= len
}
function isStringStart(chr) {
return chr === 0x22 || chr === 0x27
}
function parseBracket(chr) {
var inBracket = 1
expressionPos = index
while (!eof()) {
chr = next()
if (isStringStart(chr)) {
parseString(chr)
continue
}
if (chr === 0x5b) {
inBracket++
}
if (chr === 0x5d) {
inBracket--
}
if (inBracket === 0) {
expressionEndPos = index
break
}
}
}
function parseString(chr) {
var stringQuote = chr
while (!eof()) {
chr = next()
if (chr === stringQuote) {
break
}
}
}
/* */
var warn
// in some cases, the event used has to be determined at runtime
// so we used some reserved tokens during compile.
var RANGE_TOKEN = "__r"
var CHECKBOX_RADIO_TOKEN = "__c"
function model(el, dir, _warn) {
warn = _warn
var value = dir.value
var modifiers = dir.modifiers
var tag = el.tag
var type = el.attrsMap.type
if (process.env.NODE_ENV !== "production") {
var dynamicType = el.attrsMap["v-bind:type"] || el.attrsMap[":type"]
if (tag === "input" && dynamicType) {
warn(
'<input :type="' +
dynamicType +
'" v-model="' +
value +
'">:\n' +
"v-model does not support dynamic input types. Use v-if branches instead."
)
}
// inputs with type="file" are read only and setting the input's
// value will throw an error.
if (tag === "input" && type === "file") {
warn(
"<" +
el.tag +
' v-model="' +
value +
'" type="file">:\n' +
"File inputs are read only. Use a v-on:change listener instead."
)
}
}
if (el.component) {
genComponentModel(el, value, modifiers)
// component v-model doesn't need extra runtime
return false
} else if (tag === "select") {
genSelect(el, value, modifiers)
} else if (tag === "input" && type === "checkbox") {
genCheckboxModel(el, value, modifiers)
} else if (tag === "input" && type === "radio") {
genRadioModel(el, value, modifiers)
} else if (tag === "input" || tag === "textarea") {
genDefaultModel(el, value, modifiers)
} else if (!config.isReservedTag(tag)) {
genComponentModel(el, value, modifiers)
// component v-model doesn't need extra runtime
return false
} else if (process.env.NODE_ENV !== "production") {
warn(
"<" +
el.tag +
' v-model="' +
value +
'">: ' +
"v-model is not supported on this element type. " +
"If you are working with contenteditable, it's recommended to " +
"wrap a library dedicated for that purpose inside a custom component."
)
}
// ensure runtime directive metadata
return true
}
function genCheckboxModel(el, value, modifiers) {
var number = modifiers && modifiers.number
var valueBinding = getBindingAttr(el, "value") || "null"
var trueValueBinding = getBindingAttr(el, "true-value") || "true"
var falseValueBinding = getBindingAttr(el, "false-value") || "false"
addProp(
el,
"checked",
"Array.isArray(" +
value +
")" +
"?_i(" +
value +
"," +
valueBinding +
")>-1" +
(trueValueBinding === "true"
? ":(" + value + ")"
: ":_q(" + value + "," + trueValueBinding + ")")
)
addHandler(
el,
CHECKBOX_RADIO_TOKEN,
"var $$a=" +
value +
"," +
"$$el=$event.target," +
"$$c=$$el.checked?(" +
trueValueBinding +
"):(" +
falseValueBinding +
");" +
"if(Array.isArray($$a)){" +
"var $$v=" +
(number ? "_n(" + valueBinding + ")" : valueBinding) +
"," +
"$$i=_i($$a,$$v);" +
"if($$c){$$i<0&&(" +
value +
"=$$a.concat($$v))}" +
"else{$$i>-1&&(" +
value +
"=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}" +
"}else{" +
genAssignmentCode(value, "$$c") +
"}",
null,
true
)
}
function genRadioModel(el, value, modifiers) {
var number = modifiers && modifiers.number
var valueBinding = getBindingAttr(el, "value") || "null"
valueBinding = number ? "_n(" + valueBinding + ")" : valueBinding
addProp(el, "checked", "_q(" + value + "," + valueBinding + ")")
addHandler(el, CHECKBOX_RADIO_TOKEN, genAssignmentCode(value, valueBinding), null, true)
}
function genSelect(el, value, modifiers) {
var number = modifiers && modifiers.number
var selectedVal =
"Array.prototype.filter" +
".call($event.target.options,function(o){return o.selected})" +
'.map(function(o){var val = "_value" in o ? o._value : o.value;' +
"return " +
(number ? "_n(val)" : "val") +
"})"
var assignment = "$event.target.multiple ? $$selectedVal : $$selectedVal[0]"
var code = "var $$selectedVal = " + selectedVal + ";"
code = code + " " + genAssignmentCode(value, assignment)
addHandler(el, "change", code, null, true)
}
function genDefaultModel(el, value, modifiers) {
var type = el.attrsMap.type
var ref = modifiers || {}
var lazy = ref.lazy
var number = ref.number
var trim = ref.trim
var needCompositionGuard = !lazy && type !== "range"
var event = lazy ? "change" : type === "range" ? RANGE_TOKEN : "input"
var valueExpression = "$event.target.value"
if (trim) {
valueExpression = "$event.target.value.trim()"
}
if (number) {
valueExpression = "_n(" + valueExpression + ")"
}
var code = genAssignmentCode(value, valueExpression)
if (needCompositionGuard) {
code = "if($event.target.composing)return;" + code
}
addProp(el, "value", "(" + value + ")")
addHandler(el, event, code, null, true)
if (trim || number) {
addHandler(el, "blur", "$forceUpdate()")
}
}
/* */
function text(el, dir) {
if (dir.value) {
addProp(el, "textContent", "_s(" + dir.value + ")")
}
}
/* */
function html(el, dir) {
if (dir.value) {
addProp(el, "innerHTML", "_s(" + dir.value + ")")
}
}
var directives = {
model: model,
text: text,
html: html
}
/* */
var isUnaryTag$2 = 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$2 = 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$1 = 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"
)
/* */
var baseOptions = {
expectHTML: true,
modules: modules,
directives: directives,
isPreTag: isPreTag,
isUnaryTag: isUnaryTag$2,
mustUseProp: mustUseProp,
canBeLeftOpenTag: canBeLeftOpenTag$2,
isReservedTag: isReservedTag,
getTagNamespace: getTagNamespace,
staticKeys: genStaticKeys(modules)
}
/* */
var warn$2 = noop
var tip = noop
var formatComponentName = null // work around flow check
if (process.env.NODE_ENV !== "production") {
var hasConsole = typeof console !== "undefined"
var classifyRE = /(?:^|[-_])(\w)/g
var classify = function(str) {
return str
.replace(classifyRE, function(c) {
return c.toUpperCase()
})
.replace(/[-_]/g, "")
}
warn$2 = function(msg, vm) {
var trace = vm ? generateComponentTrace(vm) : ""
if (config.warnHandler) {
config.warnHandler.call(null, msg, vm, trace)
} else if (hasConsole && !config.silent) {
console.error("[Vue warn]: " + msg + trace)
}
}
tip = function(msg, vm) {
if (hasConsole && !config.silent) {
console.warn("[Vue tip]: " + msg + (vm ? generateComponentTrace(vm) : ""))
}
}
formatComponentName = function(vm, includeFile) {
if (vm.$root === vm) {
return "<Root>"
}
var name =
typeof vm === "string"
? vm
: typeof vm === "function" && vm.options
? vm.options.name
: vm._isVue
? vm.$options.name || vm.$options._componentTag
: vm.name
var file = vm._isVue && vm.$options.__file
if (!name && file) {
var match = file.match(/([^/\\]+)\.vue$/)
name = match && match[1]
}
return (
(name ? "<" + classify(name) + ">" : "<Anonymous>") +
(file && includeFile !== false ? " at " + file : "")
)
}
var repeat = function(str, n) {
var res = ""
while (n) {
if (n % 2 === 1) {
res += str
}
if (n > 1) {
str += str
}
n >>= 1
}
return res
}
var generateComponentTrace = function(vm) {
if (vm._isVue && vm.$parent) {
var tree = []
var currentRecursiveSequence = 0
while (vm) {
if (tree.length > 0) {
var last = tree[tree.length - 1]
if (last.constructor === vm.constructor) {
currentRecursiveSequence++
vm = vm.$parent
continue
} else if (currentRecursiveSequence > 0) {
tree[tree.length - 1] = [last, currentRecursiveSequence]
currentRecursiveSequence = 0
}
}
tree.push(vm)
vm = vm.$parent
}
return (
"\n\nfound in\n\n" +
tree
.map(function(vm, i) {
return (
"" +
(i === 0 ? "---> " : repeat(" ", 5 + i * 2)) +
(Array.isArray(vm)
? formatComponentName(vm[0]) + "... (" + vm[1] + " recursive calls)"
: formatComponentName(vm))
)
})
.join("\n")
)
} else {
return "\n\n(found in " + formatComponentName(vm) + ")"
}
}
}
/* */
function handleError(err, vm, info) {
if (config.errorHandler) {
config.errorHandler.call(null, err, vm, info)
} else {
if (process.env.NODE_ENV !== "production") {
warn$2("Error in " + info + ': "' + err.toString() + '"', vm)
}
/* istanbul ignore else */
if (inBrowser && typeof console !== "undefined") {
//fixed by xxxxxx
//console.error(err);
} else {
throw err
}
}
}
/* */
// can we use __proto__?
var hasProto = "__proto__" in {}
// Browser environment sniffing
var inBrowser = typeof window !== "undefined"
var UA = ["mpvue-runtime"].join()
var isIE = UA && /msie|trident/.test(UA)
var isIE9 = UA && UA.indexOf("msie 9.0") > 0
var isEdge = UA && UA.indexOf("edge/") > 0
var isAndroid = UA && UA.indexOf("android") > 0
var isIOS = UA && /iphone|ipad|ipod|ios/.test(UA)
var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge
// Firefix has a "watch" function on Object.prototype...
var nativeWatch = {}.watch
var supportsPassive = false
if (inBrowser) {
try {
var opts = {}
Object.defineProperty(opts, "passive", {
get: function get() {
/* istanbul ignore next */
supportsPassive = true
}
}) // https://github.com/facebook/flow/issues/285
window.addEventListener("test-passive", null, opts)
} catch (e) {}
}
// this needs to be lazy-evaled because vue may be required before
// vue-server-renderer can set VUE_ENV
var _isServer
var isServerRendering = function() {
if (_isServer === undefined) {
/* istanbul ignore if */
if (!inBrowser && typeof global !== "undefined") {
// detect presence of vue-server-renderer and avoid
// Webpack shimming the process
_isServer = global["process"].env.VUE_ENV === "server"
} else {
_isServer = false
}
}
return _isServer
}
// detect devtools
/* istanbul ignore next */
function isNative(Ctor) {
return typeof Ctor === "function" && /native code/.test(Ctor.toString())
}
var hasSymbol =
typeof Symbol !== "undefined" &&
isNative(Symbol) &&
typeof Reflect !== "undefined" &&
isNative(Reflect.ownKeys)
/**
* Defer a task to execute it asynchronously.
*/
var nextTick = (function() {
var callbacks = []
var pending = false
var timerFunc
function nextTickHandler() {
pending = false
var copies = callbacks.slice(0)
callbacks.length = 0
for (var i = 0; i < copies.length; i++) {
copies[i]()
}
}
// the nextTick behavior leverages the microtask queue, which can be accessed
// via either native Promise.then or MutationObserver.
// MutationObserver has wider support, however it is seriously bugged in
// UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It
// completely stops working after triggering a few times... so, if native
// Promise is available, we will use it:
/* istanbul ignore if */
if (typeof Promise !== "undefined" && isNative(Promise)) {
var p = Promise.resolve()
var logError = function(err) {
console.error(err)
}
timerFunc = function() {
p.then(nextTickHandler).catch(logError)
// in problematic UIWebViews, Promise.then doesn't completely break, but
// it can get stuck in a weird state where callbacks are pushed into the
// microtask queue but the queue isn't being flushed, until the browser
// needs to do some other work, e.g. handle a timer. Therefore we can
// "force" the microtask queue to be flushed by adding an empty timer.
if (isIOS) {
setTimeout(noop)
}
}
// } else if (typeof MutationObserver !== 'undefined' && (
// isNative(MutationObserver) ||
// // PhantomJS and iOS 7.x
// MutationObserver.toString() === '[object MutationObserverConstructor]'
// )) {
// // use MutationObserver where native Promise is not available,
// // e.g. PhantomJS IE11, iOS7, Android 4.4
// var counter = 1
// var observer = new MutationObserver(nextTickHandler)
// var textNode = document.createTextNode(String(counter))
// observer.observe(textNode, {
// characterData: true
// })
// timerFunc = () => {
// counter = (counter + 1) % 2
// textNode.data = String(counter)
// }
} else {
// fallback to setTimeout
/* istanbul ignore next */
timerFunc = function() {
setTimeout(nextTickHandler, 0)
}
}
return function queueNextTick(cb, ctx) {
var _resolve
callbacks.push(function() {
if (cb) {
try {
cb.call(ctx)
} catch (e) {
handleError(e, ctx, "nextTick")
}
} else if (_resolve) {
_resolve(ctx)
}
})
if (!pending) {
pending = true
timerFunc()
}
if (!cb && typeof Promise !== "undefined") {
return new Promise(function(resolve, reject) {
_resolve = resolve
})
}
}
})()
var _Set
/* istanbul ignore if */
if (typeof Set !== "undefined" && isNative(Set)) {
// use native Set when available.
_Set = Set
} else {
// a non-standard Set polyfill that only works with primitive keys.
_Set = (function() {
function Set() {
this.set = Object.create(null)
}
Set.prototype.has = function has(key) {
return this.set[key] === true
}
Set.prototype.add = function add(key) {
this.set[key] = true
}
Set.prototype.clear = function clear() {
this.set = Object.create(null)
}
return Set
})()
}
/* */
var onRE = /^@|^v-on:/
var dirRE = /^v-|^@|^:/
var forAliasRE = /(.*?)\s+(?:in|of)\s+(.*)/
// fix: 解决括号内无,和iterator时匹配错误的问题 fix by gsq
var forIteratorRE = /\((\{[^}]*\}|[^,]*),?([^,]*)(?:,([^,]*))?\)/
var argRE = /:(.*)$/
var bindRE = /^:|^v-bind:/
var modifierRE = /\.[^.]+/g
var decodeHTMLCached = cached(he.decode)
// configurable state
var warn$1
var delimiters
var transforms
var preTransforms
var postTransforms
var platformIsPreTag
var platformMustUseProp
var platformGetTagNamespace
/**
* Convert HTML string to AST.
*/
function parse(template$$1, options) {
warn$1 = 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$1(msg)
}
}
function endPre(element) {
// check pre state
if (element.pre) {
inVPre = false
}
if (platformIsPreTag(element.tag)) {
inPre = false
}
// apply post-transforms
for (var i$2 = 0; i$2 < postTransforms.length; i$2++) {
postTransforms[i$2](element, options)
}
}
parseHTML(template$$1, {
warn: warn$1,
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 = {
type: 1,
tag: tag,
attrsList: attrs,
attrsMap: makeAttrsMap(attrs),
parent: currentParent,
children: []
}
if (ns) {
element.ns = ns
}
if (isForbiddenTag(element) && !isServerRendering()) {
element.forbidden = true
process.env.NODE_ENV !== "production" &&
warn$1(
"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++) {
preTransforms[i](element, options)
}
if (!inVPre) {
processPre(element)
if (element.pre) {
inVPre = true
}
}
if (platformIsPreTag(element.tag)) {
inPre = true
}
if (inVPre) {
processRawAttrs(element)
} else {
processFor(element)
processIf(element)
processOnce(element)
processKey(element)
// determine whether this is a plain element after
// removing structural attributes
element.plain = !element.key && !attrs.length
processRef(element)
processSlot(element)
processComponent(element)
for (var i$1 = 0; i$1 < transforms.length; i$1++) {
transforms[i$1](element, options)
}
processAttrs(element)
}
function checkRootConstraints(el) {
if (process.env.NODE_ENV !== "production") {
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 if (process.env.NODE_ENV !== "production") {
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)
}
},
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 (process.env.NODE_ENV !== "production") {
if (text === template$$1) {
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 processKey(el) {
var exp = getBindingAttr(el, "key")
if (exp) {
if (process.env.NODE_ENV !== "production" && el.tag === "template") {
warn$1("<template> 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) {
process.env.NODE_ENV !== "production" && warn$1("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()
}
} else {
el.alias = alias
}
}
}
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
}
}
}
function processIfConditions(el, parent) {
var prev = findPrevElement(parent.children)
if (prev && prev.if) {
addIfCondition(prev, {
exp: el.elseif,
block: el
})
} else if (process.env.NODE_ENV !== "production") {
warn$1(
"v-" +
(el.elseif ? 'else-if="' + el.elseif + '"' : "else") +
" " +
"used on element <" +
el.tag +
"> without corresponding v-if."
)
}
}
function findPrevElement(children) {
var i = children.length
while (i--) {
if (children[i].type === 1) {
return children[i]
} else {
if (process.env.NODE_ENV !== "production" && children[i].text !== " ") {
warn$1(
'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 (process.env.NODE_ENV !== "production" && el.key) {
warn$1(
"`key` does not work on <slot> because slots are abstract outlets " +
"and can possibly expand into multiple elements. " +
"Use the key on a wrapping element instead."
)
}
} else {
var slotTarget = getBindingAttr(el, "slot")
if (slotTarget) {
el.slotTarget = slotTarget === '""' ? '"default"' : slotTarget
}
if (el.tag === "template") {
el.slotScope = getAndRemoveAttr(el, "scope")
}
}
}
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 (
!el.component &&
(isProp || 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$1)
} 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 (process.env.NODE_ENV !== "production" && name === "model") {
checkForAliasModel(el, value)
}
}
} else {
// literal attribute
if (process.env.NODE_ENV !== "production") {
var expression = parseText(value, delimiters)
if (expression) {
warn$1(
name +
'="' +
value +
'": ' +
"Interpolation inside attributes has been removed. " +
"Use v-bind or the colon shorthand instead. For example, " +
'instead of <div id="{{ val }}">, use <div :id="val">.'
)
}
}
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 (process.env.NODE_ENV !== "production" && map[attrs[i].name] && !isIE && !isEdge) {
warn$1("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$1(
"<" +
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
}
}
/* */
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(root)
// second pass: mark static roots.
markStaticRoots(root, false)
}
function genStaticKeys$1(keys) {
return makeMap(
"type,tag,attrsList,attrsMap,plain,parent,children,attrs" + (keys ? "," + keys : "")
)
}
function markStatic(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(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(block)
if (!block.static) {
node.static = false
}
}
}
}
}
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)
}
}
}
}
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 isDirectChildOfTemplateFor(node) {
while (node.parent) {
node = node.parent
if (node.tag !== "template") {
return false
}
if (node.for) {
return true
}
}
return false
}
/* */
var fnExpRE = /^\s*([\w$_]+|\([^)]*?\))\s*=>|^function\s*\(/
var simplePathRE = /^\s*[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['.*?']|\[".*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*\s*$/
// keyCode aliases
var keyCodes = {
esc: 27,
tab: 9,
enter: 13,
space: 32,
up: 38,
left: 37,
right: 39,
down: 40,
delete: [8, 46]
}
// #4868: modifiers that prevent the execution of the listener
// need to explicitly return null so that we can determine whether to remove
// the listener for .once
var genGuard = function(condition) {
return "if(" + condition + ")return null;"
}
var modifierCode = {
stop: "$event.stopPropagation();",
prevent: "$event.preventDefault();",
self: genGuard("$event.target !== $event.currentTarget"),
ctrl: genGuard("!$event.ctrlKey"),
shift: genGuard("!$event.shiftKey"),
alt: genGuard("!$event.altKey"),
meta: genGuard("!$event.metaKey"),
left: genGuard("'button' in $event && $event.button !== 0"),
middle: genGuard("'button' in $event && $event.button !== 1"),
right: genGuard("'button' in $event && $event.button !== 2")
}
function genHandlers(events, isNative, warn) {
var res = isNative ? "nativeOn:{" : "on:{"
for (var name in events) {
var handler = events[name]
// #5330: warn click.right, since right clicks do not actually fire click events.
if (
process.env.NODE_ENV !== "production" &&
name === "click" &&
handler &&
handler.modifiers &&
handler.modifiers.right
) {
warn(
'Use "contextmenu" instead of "click.right" since right clicks ' +
'do not actually fire "click" events.'
)
}
res += '"' + name + '":' + genHandler(name, handler) + ","
}
return res.slice(0, -1) + "}"
}
function genHandler(name, handler) {
if (!handler) {
return "function(){}"
}
if (Array.isArray(handler)) {
return (
"[" +
handler
.map(function(handler) {
return genHandler(name, handler)
})
.join(",") +
"]"
)
}
var isMethodPath = simplePathRE.test(handler.value)
var isFunctionExpression = fnExpRE.test(handler.value)
if (!handler.modifiers) {
return isMethodPath || isFunctionExpression
? handler.value
: "function($event){" + handler.value + "}" // inline statement
} else {
var code = ""
var genModifierCode = ""
var keys = []
for (var key in handler.modifiers) {
if (modifierCode[key]) {
genModifierCode += modifierCode[key]
// left/right
if (keyCodes[key]) {
keys.push(key)
}
} else {
keys.push(key)
}
}
if (keys.length) {
code += genKeyFilter(keys)
}
// Make sure modifiers like prevent and stop get executed after key filtering
if (genModifierCode) {
code += genModifierCode
}
var handlerCode = isMethodPath
? handler.value + "($event)"
: isFunctionExpression
? "(" + handler.value + ")($event)"
: handler.value
return "function($event){" + code + handlerCode + "}"
}
}
function genKeyFilter(keys) {
return "if(!('button' in $event)&&" + keys.map(genFilterCode).join("&&") + ")return null;"
}
function genFilterCode(key) {
var keyVal = parseInt(key, 10)
if (keyVal) {
return "$event.keyCode!==" + keyVal
}
var alias = keyCodes[key]
return (
"_k($event.keyCode," +
JSON.stringify(key) +
(alias ? "," + JSON.stringify(alias) : "") +
")"
)
}
/* */
var emptyObject = Object.freeze({})
/**
* Check if a string starts with $ or _
*/
/**
* Define a property.
*/
function def(obj, key, val, enumerable) {
Object.defineProperty(obj, key, {
value: val,
enumerable: !!enumerable,
writable: true,
configurable: true
})
}
/* */
var uid = 0
/**
* A dep is an observable that can have multiple
* directives subscribing to it.
*/
var Dep = function Dep() {
this.id = uid++
this.subs = []
}
Dep.prototype.addSub = function addSub(sub) {
this.subs.push(sub)
}
Dep.prototype.removeSub = function removeSub(sub) {
remove(this.subs, sub)
}
Dep.prototype.depend = function depend() {
if (Dep.target) {
Dep.target.addDep(this)
}
}
Dep.prototype.notify = function notify() {
// stabilize the subscriber list first
var subs = this.subs.slice()
for (var i = 0, l = subs.length; i < l; i++) {
subs[i].update()
}
}
// 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
/*
* not type checking this file because flow doesn't play well with
* dynamically accessing methods on Array prototype
*/
var arrayProto = Array.prototype
var arrayMethods = Object.create(arrayProto)
;["push", "pop", "shift", "unshift", "splice", "sort", "reverse"].forEach(function(method) {
// cache original method
var original = arrayProto[method]
def(arrayMethods, method, function mutator() {
var args = [],
len = arguments.length
while (len--) args[len] = arguments[len]
var result = original.apply(this, args)
var ob = this.__ob__
var inserted
switch (method) {
case "push":
case "unshift":
inserted = args
break
case "splice":
inserted = args.slice(2)
break
}
if (inserted) {
ob.observeArray(inserted)
}
// notify change
ob.dep.notify()
return result
})
})
/* */
var arrayKeys = Object.getOwnPropertyNames(arrayMethods)
/**
* By default, when a reactive property is set, the new value is
* also converted to become reactive. However when passing down props,
* we don't want to force conversion because the value may be a nested value
* under a frozen data structure. Converting it would defeat the optimization.
*/
var observerState = {
shouldConvert: true
}
/**
* Observer class that are attached to each observed
* object. Once attached, the observer converts target
* object's property keys into getter/setters that
* collect dependencies and dispatches updates.
*/
var Observer = function Observer(value) {
this.value = value
this.dep = new Dep()
this.vmCount = 0
def(value, "__ob__", this)
if (Array.isArray(value)) {
var augment = hasProto ? protoAugment : copyAugment
augment(value, arrayMethods, arrayKeys)
this.observeArray(value)
} else {
this.walk(value)
}
}
/**
* Walk through each property and convert them into
* getter/setters. This method should only be called when
* value type is Object.
*/
Observer.prototype.walk = function walk(obj) {
var keys = Object.keys(obj)
for (var i = 0; i < keys.length; i++) {
defineReactive$$1(obj, keys[i], obj[keys[i]])
}
}
/**
* Observe a list of Array items.
*/
Observer.prototype.observeArray = function observeArray(items) {
for (var i = 0, l = items.length; i < l; i++) {
observe(items[i])
}
}
// helpers
/**
* Augment an target Object or Array by intercepting
* the prototype chain using __proto__
*/
function protoAugment(target, src, keys) {
/* eslint-disable no-proto */
target.__proto__ = src
/* eslint-enable no-proto */
}
/**
* Augment an target Object or Array by defining
* hidden properties.
*/
/* istanbul ignore next */
function copyAugment(target, src, keys) {
for (var i = 0, l = keys.length; i < l; i++) {
var key = keys[i]
def(target, key, src[key])
}
}
/**
* Attempt to create an observer instance for a value,
* returns the new observer if successfully observed,
* or the existing observer if the value already has one.
*/
function observe(value, asRootData) {
if (!isObject(value)) {
return
}
var ob
if (hasOwn(value, "__ob__") && value.__ob__ instanceof Observer) {
ob = value.__ob__
} else if (
observerState.shouldConvert &&
!isServerRendering() &&
(Array.isArray(value) || isPlainObject(value)) &&
Object.isExtensible(value) &&
!value._isVue
) {
ob = new Observer(value)
}
if (asRootData && ob) {
ob.vmCount++
}
return ob
}
/**
* Define a reactive property on an Object.
*/
function defineReactive$$1(obj, key, val, customSetter, shallow) {
var dep = new Dep()
var property = Object.getOwnPropertyDescriptor(obj, key)
if (property && property.configurable === false) {
return
}
// cater for pre-defined getter/setters
var getter = property && property.get
var setter = property && property.set
var childOb = !shallow && observe(val)
Object.defineProperty(obj, key, {
enumerable: true,
configurable: true,
get: function reactiveGetter() {
var value = getter ? getter.call(obj) : val
if (Dep.target) {
dep.depend()
if (childOb) {
childOb.dep.depend()
}
if (Array.isArray(value)) {
dependArray(value)
}
}
return value
},
set: function reactiveSetter(newVal) {
var value = getter ? getter.call(obj) : val
/* eslint-disable no-self-compare */
if (newVal === value || (newVal !== newVal && value !== value)) {
return
}
/* eslint-enable no-self-compare */
if (process.env.NODE_ENV !== "production" && customSetter) {
customSetter()
}
if (setter) {
setter.call(obj, newVal)
} else {
val = newVal
}
childOb = !shallow && observe(newVal)
dep.notify()
}
})
}
/**
* Set a property on an object. Adds the new property and
* triggers change notification if the property doesn't
* already exist.
*/
function set(target, key, val) {
if (Array.isArray(target) && isValidArrayIndex(key)) {
target.length = Math.max(target.length, key)
target.splice(key, 1, val)
return val
}
if (hasOwn(target, key)) {
target[key] = val
return val
}
var ob = target.__ob__
if (target._isVue || (ob && ob.vmCount)) {
process.env.NODE_ENV !== "production" &&
warn$2(
"Avoid adding reactive properties to a Vue instance or its root $data " +
"at runtime - declare it upfront in the data option."
)
return val
}
if (!ob) {
target[key] = val
return val
}
defineReactive$$1(ob.value, key, val)
ob.dep.notify()
return val
}
/**
* Delete a property and trigger change if necessary.
*/
/**
* Collect dependencies on array elements when the array is touched, since
* we cannot intercept array element access like property getters.
*/
function dependArray(value) {
for (var e = void 0, i = 0, l = value.length; i < l; i++) {
e = value[i]
e && e.__ob__ && e.__ob__.dep.depend()
if (Array.isArray(e)) {
dependArray(e)
}
}
}
/* */
/**
* Option overwriting strategies are functions that handle
* how to merge a parent option value and a child option
* value into the final value.
*/
var strats = config.optionMergeStrategies
/**
* Options with restrictions
*/
if (process.env.NODE_ENV !== "production") {
strats.el = strats.propsData = function(parent, child, vm, key) {
if (!vm) {
warn$2(
'option "' +
key +
'" can only be used during instance ' +
"creation with the `new` keyword."
)
}
return defaultStrat(parent, child)
}
}
/**
* Helper that recursively merges two data objects together.
*/
function mergeData(to, from) {
if (!from) {
return to
}
var key, toVal, fromVal
var keys = Object.keys(from)
for (var i = 0; i < keys.length; i++) {
key = keys[i]
toVal = to[key]
fromVal = from[key]
if (!hasOwn(to, key)) {
set(to, key, fromVal)
} else if (isPlainObject(toVal) && isPlainObject(fromVal)) {
mergeData(toVal, fromVal)
}
}
return to
}
/**
* Data
*/
function mergeDataOrFn(parentVal, childVal, vm) {
if (!vm) {
// in a Vue.extend merge, both should be functions
if (!childVal) {
return parentVal
}
if (!parentVal) {
return childVal
}
// 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.
return function mergedDataFn() {
return mergeData(
typeof childVal === "function" ? childVal.call(this) : childVal,
parentVal.call(this)
)
}
} else if (parentVal || childVal) {
return function mergedInstanceDataFn() {
// instance merge
var instanceData = typeof childVal === "function" ? childVal.call(vm) : childVal
var defaultData = typeof parentVal === "function" ? parentVal.call(vm) : undefined
if (instanceData) {
return mergeData(instanceData, defaultData)
} else {
return defaultData
}
}
}
}
strats.data = function(parentVal, childVal, vm) {
if (!vm) {
if (childVal && typeof childVal !== "function") {
process.env.NODE_ENV !== "production" &&
warn$2(
'The "data" option should be a function ' +
"that returns a per-instance value in component " +
"definitions.",
vm
)
return parentVal
}
return mergeDataOrFn.call(this, parentVal, childVal)
}
return mergeDataOrFn(parentVal, childVal, vm)
}
/**
* Hooks and props are merged as arrays.
*/
function mergeHook(parentVal, childVal) {
return childVal
? parentVal
? parentVal.concat(childVal)
: Array.isArray(childVal)
? childVal
: [childVal]
: parentVal
}
LIFECYCLE_HOOKS.forEach(function(hook) {
strats[hook] = mergeHook
})
/**
* Assets
*
* When a vm is present (instance creation), we need to do
* a three-way merge between constructor options, instance
* options and parent options.
*/
function mergeAssets(parentVal, childVal) {
var res = Object.create(parentVal || null)
return childVal ? extend(res, childVal) : res
}
ASSET_TYPES.forEach(function(type) {
strats[type + "s"] = mergeAssets
})
/**
* Watchers.
*
* Watchers hashes should not overwrite one
* another, so we merge them as arrays.
*/
strats.watch = function(parentVal, childVal) {
// work around Firefox's Object.prototype.watch...
if (parentVal === nativeWatch) {
parentVal = undefined
}
if (childVal === nativeWatch) {
childVal = undefined
}
/* istanbul ignore if */
if (!childVal) {
return Object.create(parentVal || null)
}
if (!parentVal) {
return childVal
}
var ret = {}
extend(ret, parentVal)
for (var key in childVal) {
var parent = ret[key]
var child = childVal[key]
if (parent && !Array.isArray(parent)) {
parent = [parent]
}
ret[key] = parent ? parent.concat(child) : Array.isArray(child) ? child : [child]
}
return ret
}
/**
* Other object hashes.
*/
strats.props = strats.methods = strats.inject = strats.computed = function(parentVal, childVal) {
if (!childVal) {
return Object.create(parentVal || null)
}
if (!parentVal) {
return childVal
}
var ret = Object.create(null)
extend(ret, parentVal)
extend(ret, childVal)
return ret
}
strats.provide = mergeDataOrFn
/**
* Default strategy.
*/
var defaultStrat = function(parentVal, childVal) {
return childVal === undefined ? parentVal : childVal
}
/**
* Merge two option objects into a new one.
* Core utility used in both instantiation and inheritance.
*/
/**
* Resolve an asset.
* This function is used because child instances need access
* to assets defined in its ancestor chain.
*/
/* */
/* */
/* */
function on(el, dir) {
if (process.env.NODE_ENV !== "production" && dir.modifiers) {
warn$2("v-on without argument does not support modifiers.")
}
el.wrapListeners = function(code) {
return "_g(" + code + "," + dir.value + ")"
}
}
/* */
function bind$1(el, dir) {
el.wrapData = function(code) {
return (
"_b(" +
code +
",'" +
el.tag +
"'," +
dir.value +
"," +
(dir.modifiers && dir.modifiers.prop ? "true" : "false") +
(dir.modifiers && dir.modifiers.sync ? ",true" : "") +
")"
)
}
}
/* */
var baseDirectives = {
on: on,
bind: bind$1,
cloak: noop
}
/* */
var CodegenState = function CodegenState(options) {
this.options = options
this.warn = options.warn || baseWarn
this.transforms = pluckModuleFunction(options.modules, "transformCode")
this.dataGenFns = pluckModuleFunction(options.modules, "genData")
this.directives = extend(extend({}, baseDirectives), options.directives)
var isReservedTag = options.isReservedTag || no
this.maybeComponent = function(el) {
return !isReservedTag(el.tag)
}
this.onceId = 0
this.staticRenderFns = []
}
function generate$1(ast, options) {
var state = new CodegenState(options)
var code = ast ? genElement(ast, state) : '_c("div")'
return {
render: "with(this){return " + code + "}",
staticRenderFns: state.staticRenderFns
}
}
function genElement(el, state) {
if (el.staticRoot && !el.staticProcessed) {
return genStatic(el, state)
} else if (el.once && !el.onceProcessed) {
return genOnce(el, state)
} else if (el.for && !el.forProcessed) {
return genFor(el, state)
} else if (el.if && !el.ifProcessed) {
return genIf(el, state)
} else if (el.tag === "template" && !el.slotTarget) {
return genChildren(el, state) || "void 0"
} else if (el.tag === "slot") {
return genSlot(el, state)
} else {
// component or element
var code
if (el.component) {
code = genComponent(el.component, el, state)
} else {
var data = el.plain ? undefined : genData$2(el, state)
var children = el.inlineTemplate ? null : genChildren(el, state, true)
code =
"_c('" +
el.tag +
"'" +
(data ? "," + data : "") +
(children ? "," + children : "") +
")"
}
// module transforms
for (var i = 0; i < state.transforms.length; i++) {
code = state.transforms[i](el, code)
}
return code
}
}
// hoist static sub-trees out
function genStatic(el, state) {
el.staticProcessed = true
state.staticRenderFns.push("with(this){return " + genElement(el, state) + "}")
return "_m(" + (state.staticRenderFns.length - 1) + (el.staticInFor ? ",true" : "") + ")"
}
// v-once
function genOnce(el, state) {
el.onceProcessed = true
if (el.if && !el.ifProcessed) {
return genIf(el, state)
} else if (el.staticInFor) {
var key = ""
var parent = el.parent
while (parent) {
if (parent.for) {
key = parent.key
break
}
parent = parent.parent
}
if (!key) {
process.env.NODE_ENV !== "production" &&
state.warn("v-once can only be used inside v-for that is keyed. ")
return genElement(el, state)
}
return "_o(" + genElement(el, state) + "," + state.onceId++ + (key ? "," + key : "") + ")"
} else {
return genStatic(el, state)
}
}
function genIf(el, state, altGen, altEmpty) {
el.ifProcessed = true // avoid recursion
return genIfConditions(el.ifConditions.slice(), state, altGen, altEmpty)
}
function genIfConditions(conditions, state, altGen, altEmpty) {
if (!conditions.length) {
return altEmpty || "_e()"
}
var condition = conditions.shift()
if (condition.exp) {
return (
"(" +
condition.exp +
")?" +
genTernaryExp(condition.block) +
":" +
genIfConditions(conditions, state, altGen, altEmpty)
)
} else {
return "" + genTernaryExp(condition.block)
}
// v-if with v-once should generate code like (a)?_m(0):_m(1)
function genTernaryExp(el) {
return altGen ? altGen(el, state) : el.once ? genOnce(el, state) : genElement(el, state)
}
}
function genFor(el, state, altGen, altHelper) {
var exp = el.for
var alias = el.alias
var iterator1 = el.iterator1 ? "," + el.iterator1 : ""
var iterator2 = el.iterator2 ? "," + el.iterator2 : ""
if (
process.env.NODE_ENV !== "production" &&
state.maybeComponent(el) &&
el.tag !== "slot" &&
el.tag !== "template" &&
!el.key
) {
state.warn(
"<" +
el.tag +
' v-for="' +
alias +
" in " +
exp +
'">: component lists rendered with ' +
"v-for should have explicit keys. " +
"See https://vuejs.org/guide/list.html#key for more info.",
true /* tip */
)
}
el.forProcessed = true // avoid recursion
return (
(altHelper || "_l") +
"((" +
exp +
")," +
"function(" +
alias +
iterator1 +
iterator2 +
"){" +
"return " +
(altGen || genElement)(el, state) +
"})"
)
}
function genData$2(el, state) {
var data = "{"
// directives first.
// directives may mutate the el's other properties before they are generated.
var dirs = genDirectives(el, state)
if (dirs) {
data += dirs + ","
}
// key
if (el.key) {
data += "key:" + el.key + ","
}
// ref
if (el.ref) {
data += "ref:" + el.ref + ","
}
if (el.refInFor) {
data += "refInFor:true,"
}
// pre
if (el.pre) {
data += "pre:true,"
}
// record original tag name for components using "is" attribute
if (el.component) {
data += 'tag:"' + el.tag + '",'
}
// module data generation functions
for (var i = 0; i < state.dataGenFns.length; i++) {
data += state.dataGenFns[i](el)
}
// attributes
if (el.attrs) {
data += "attrs:{" + genProps(el.attrs) + "},"
}
// DOM props
if (el.props) {
data += "domProps:{" + genProps(el.props) + "},"
}
// event handlers
if (el.events) {
data += genHandlers(el.events, false, state.warn) + ","
}
if (el.nativeEvents) {
data += genHandlers(el.nativeEvents, true, state.warn) + ","
}
// slot target
if (el.slotTarget) {
data += "slot:" + el.slotTarget + ","
}
// scoped slots
if (el.scopedSlots) {
data += genScopedSlots(el.scopedSlots, state) + ","
}
// component v-model
if (el.model) {
data +=
"model:{value:" +
el.model.value +
",callback:" +
el.model.callback +
",expression:" +
el.model.expression +
"},"
}
// inline-template
if (el.inlineTemplate) {
var inlineTemplate = genInlineTemplate(el, state)
if (inlineTemplate) {
data += inlineTemplate + ","
}
}
data = data.replace(/,$/, "") + "}"
// v-bind data wrap
if (el.wrapData) {
data = el.wrapData(data)
}
// v-on data wrap
if (el.wrapListeners) {
data = el.wrapListeners(data)
}
return data
}
function genDirectives(el, state) {
var dirs = el.directives
if (!dirs) {
return
}
var res = "directives:["
var hasRuntime = false
var i, l, dir, needRuntime
for (i = 0, l = dirs.length; i < l; i++) {
dir = dirs[i]
needRuntime = true
var gen = state.directives[dir.name]
if (gen) {
// compile-time directive that manipulates AST.
// returns true if it also needs a runtime counterpart.
needRuntime = !!gen(el, dir, state.warn)
}
if (needRuntime) {
hasRuntime = true
res +=
'{name:"' +
dir.name +
'",rawName:"' +
dir.rawName +
'"' +
(dir.value
? ",value:(" + dir.value + "),expression:" + JSON.stringify(dir.value)
: "") +
(dir.arg ? ',arg:"' + dir.arg + '"' : "") +
(dir.modifiers ? ",modifiers:" + JSON.stringify(dir.modifiers) : "") +
"},"
}
}
if (hasRuntime) {
return res.slice(0, -1) + "]"
}
}
function genInlineTemplate(el, state) {
var ast = el.children[0]
if (process.env.NODE_ENV !== "production" && (el.children.length > 1 || ast.type !== 1)) {
state.warn("Inline-template components must have exactly one child element.")
}
if (ast.type === 1) {
var inlineRenderFns = generate$1(ast, state.options)
return (
"inlineTemplate:{render:function(){" +
inlineRenderFns.render +
"},staticRenderFns:[" +
inlineRenderFns.staticRenderFns
.map(function(code) {
return "function(){" + code + "}"
})
.join(",") +
"]}"
)
}
}
function genScopedSlots(slots, state) {
return (
"scopedSlots:_u([" +
Object.keys(slots)
.map(function(key) {
return genScopedSlot(key, slots[key], state)
})
.join(",") +
"])"
)
}
function genScopedSlot(key, el, state) {
if (el.for && !el.forProcessed) {
return genForScopedSlot(key, el, state)
}
return (
"{key:" +
key +
",fn:function(" +
String(el.attrsMap.scope) +
"){" +
"return " +
(el.tag === "template" ? genChildren(el, state) || "void 0" : genElement(el, state)) +
"}}"
)
}
function genForScopedSlot(key, el, state) {
var exp = el.for
var alias = el.alias
var iterator1 = el.iterator1 ? "," + el.iterator1 : ""
var iterator2 = el.iterator2 ? "," + el.iterator2 : ""
el.forProcessed = true // avoid recursion
return (
"_l((" +
exp +
")," +
"function(" +
alias +
iterator1 +
iterator2 +
"){" +
"return " +
genScopedSlot(key, el, state) +
"})"
)
}
function genChildren(el, state, checkSkip, altGenElement, altGenNode) {
var children = el.children
if (children.length) {
var el$1 = children[0]
// optimize single v-for
if (children.length === 1 && el$1.for && el$1.tag !== "template" && el$1.tag !== "slot") {
return (altGenElement || genElement)(el$1, state)
}
var normalizationType = checkSkip ? getNormalizationType(children, state.maybeComponent) : 0
var gen = altGenNode || genNode
return (
"[" +
children
.map(function(c) {
return gen(c, state)
})
.join(",") +
"]" +
(normalizationType ? "," + normalizationType : "")
)
}
}
// determine the normalization needed for the children array.
// 0: no normalization needed
// 1: simple normalization needed (possible 1-level deep nested array)
// 2: full normalization needed
function getNormalizationType(children, maybeComponent) {
var res = 0
for (var i = 0; i < children.length; i++) {
var el = children[i]
if (el.type !== 1) {
continue
}
if (
needsNormalization(el) ||
(el.ifConditions &&
el.ifConditions.some(function(c) {
return needsNormalization(c.block)
}))
) {
res = 2
break
}
if (
maybeComponent(el) ||
(el.ifConditions &&
el.ifConditions.some(function(c) {
return maybeComponent(c.block)
}))
) {
res = 1
}
}
return res
}
function needsNormalization(el) {
return el.for !== undefined || el.tag === "template" || el.tag === "slot"
}
function genNode(node, state) {
if (node.type === 1) {
return genElement(node, state)
}
if (node.type === 3 && node.isComment) {
return genComment(node)
} else {
return genText(node)
}
}
function genText(text) {
return (
"_v(" +
(text.type === 2
? text.expression // no need for () because already wrapped in _s()
: transformSpecialNewlines(JSON.stringify(text.text))) +
")"
)
}
function genComment(comment) {
return "_e('" + comment.text + "')"
}
function genSlot(el, state) {
var slotName = el.slotName || '"default"'
var children = genChildren(el, state)
var res = "_t(" + slotName + (children ? "," + children : "")
var attrs =
el.attrs &&
"{" +
el.attrs
.map(function(a) {
return camelize(a.name) + ":" + a.value
})
.join(",") +
"}"
var bind$$1 = el.attrsMap["v-bind"]
if ((attrs || bind$$1) && !children) {
res += ",null"
}
if (attrs) {
res += "," + attrs
}
if (bind$$1) {
res += (attrs ? "" : ",null") + "," + bind$$1
}
return res + ")"
}
// componentName is el.component, take it as argument to shun flow's pessimistic refinement
function genComponent(componentName, el, state) {
var children = el.inlineTemplate ? null : genChildren(el, state, true)
return (
"_c(" + componentName + "," + genData$2(el, state) + (children ? "," + children : "") + ")"
)
}
function genProps(props) {
var res = ""
for (var i = 0; i < props.length; i++) {
var prop = props[i]
res += '"' + prop.name + '":' + transformSpecialNewlines(prop.value) + ","
}
return res.slice(0, -1)
}
// #3895, #4268
function transformSpecialNewlines(text) {
return text.replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029")
}
/* */
// these keywords should not appear inside expressions, but operators like
// typeof, instanceof and in are allowed
var prohibitedKeywordRE = new RegExp(
"\\b" +
(
"do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const," +
"super,throw,while,yield,delete,export,import,return,switch,default," +
"extends,finally,continue,debugger,function,arguments"
)
.split(",")
.join("\\b|\\b") +
"\\b"
)
// these unary operators should not be used as property/method names
var unaryOperatorsRE = new RegExp(
"\\b" + "delete,typeof,void".split(",").join("\\s*\\([^\\)]*\\)|\\b") + "\\s*\\([^\\)]*\\)"
)
// check valid identifier for v-for
var identRE = /[A-Za-z_$][\w$]*/
// strip strings in expressions
var stripStringRE = /'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"|`(?:[^`\\]|\\.)*\$\{|\}(?:[^`\\]|\\.)*`|`(?:[^`\\]|\\.)*`/g
// detect problematic expressions in a template
function detectErrors(ast) {
var errors = []
if (ast) {
checkNode(ast, errors)
}
return errors
}
function checkNode(node, errors) {
if (node.type === 1) {
for (var name in node.attrsMap) {
if (dirRE.test(name)) {
var value = node.attrsMap[name]
if (value) {
if (name === "v-for") {
checkFor(node, 'v-for="' + value + '"', errors)
} else if (onRE.test(name)) {
checkEvent(value, name + '="' + value + '"', errors)
} else {
checkExpression(value, name + '="' + value + '"', errors)
}
}
}
}
if (node.children) {
for (var i = 0; i < node.children.length; i++) {
checkNode(node.children[i], errors)
}
}
} else if (node.type === 2) {
checkExpression(node.expression, node.text, errors)
}
}
function checkEvent(exp, text, errors) {
var stipped = exp.replace(stripStringRE, "")
var keywordMatch = stipped.match(unaryOperatorsRE)
if (keywordMatch && stipped.charAt(keywordMatch.index - 1) !== "$") {
errors.push(
"avoid using JavaScript unary operator as property name: " +
'"' +
keywordMatch[0] +
'" in expression ' +
text.trim()
)
}
checkExpression(exp, text, errors)
}
function checkFor(node, text, errors) {
checkExpression(node.for || "", text, errors)
checkIdentifier(node.alias, "v-for alias", text, errors)
checkIdentifier(node.iterator1, "v-for iterator", text, errors)
checkIdentifier(node.iterator2, "v-for iterator", text, errors)
}
function checkIdentifier(ident, type, text, errors) {
if (typeof ident === "string" && !identRE.test(ident)) {
errors.push("invalid " + type + ' "' + ident + '" in expression: ' + text.trim())
}
}
function checkExpression(exp, text, errors) {
try {
new Function("return " + exp)
} catch (e) {
var keywordMatch = exp.replace(stripStringRE, "").match(prohibitedKeywordRE)
if (keywordMatch) {
errors.push(
"avoid using JavaScript keyword as property name: " +
'"' +
keywordMatch[0] +
'" in expression ' +
text.trim()
)
} else {
errors.push("invalid expression: " + text.trim())
}
}
}
/* */
function createFunction(code, errors) {
try {
return new Function(code)
} catch (err) {
errors.push({ err: err, code: code })
return noop
}
}
function createCompileToFunctionFn(compile) {
var cache = Object.create(null)
return function compileToFunctions(template$$1, options, vm) {
options = options || {}
/* istanbul ignore if */
if (process.env.NODE_ENV !== "production") {
// detect possible CSP restriction
try {
new Function("return 1")
} catch (e) {
if (e.toString().match(/unsafe-eval|CSP/)) {
warn$2(
"It seems you are using the standalone build of Vue.js in an " +
"environment with Content Security Policy that prohibits unsafe-eval. " +
"The template compiler cannot work in this environment. Consider " +
"relaxing the policy to allow unsafe-eval or pre-compiling your " +
"templates into render functions."
)
}
}
}
// check cache
var key = options.delimiters ? String(options.delimiters) + template$$1 : template$$1
if (cache[key]) {
return cache[key]
}
// compile
var compiled = compile(template$$1, options)
// check compilation errors/tips
if (process.env.NODE_ENV !== "production") {
if (compiled.errors && compiled.errors.length) {
warn$2(
"Error compiling template:\n\n" +
template$$1 +
"\n\n" +
compiled.errors
.map(function(e) {
return "- " + e
})
.join("\n") +
"\n",
vm
)
}
if (compiled.tips && compiled.tips.length) {
compiled.tips.forEach(function(msg) {
return tip(msg, vm)
})
}
}
// turn code into functions
var res = {}
var fnGenErrors = []
res.render = createFunction(compiled.render, fnGenErrors)
res.staticRenderFns = compiled.staticRenderFns.map(function(code) {
return createFunction(code, fnGenErrors)
})
// check function generation errors.
// this should only happen if there is a bug in the compiler itself.
// mostly for codegen development use
/* istanbul ignore if */
if (process.env.NODE_ENV !== "production") {
if ((!compiled.errors || !compiled.errors.length) && fnGenErrors.length) {
warn$2(
"Failed to generate render function:\n\n" +
fnGenErrors
.map(function(ref) {
var err = ref.err
var code = ref.code
return err.toString() + " in\n\n" + code + "\n"
})
.join("\n"),
vm
)
}
}
return (cache[key] = res)
}
}
/* */
function createCompilerCreator(baseCompile) {
return function createCompiler(baseOptions) {
//fixed by xxxxxx 共享 compiled。
const {hashify} = require('@dcloudio/uni-cli-shared')
const {cacheCompilerOptions} = require('@dcloudio/webpack-uni-mp-loader/lib/shared')
function compile(template$$1, options) {
var finalOptions = Object.create(baseOptions)
var errors = []
var tips = []
finalOptions.warn = function(msg, tip) {
;(tip ? tips : errors).push(msg)
}
if (options) {
// merge custom modules
if (options.modules) {
finalOptions.modules = (baseOptions.modules || []).concat(options.modules)
}
// merge custom directives
if (options.directives) {
finalOptions.directives = extend(
Object.create(baseOptions.directives),
options.directives
)
}
// copy other options
for (var key in options) {
if (key !== "modules" && key !== "directives") {
finalOptions[key] = options[key]
}
}
}
finalOptions.hashId = hashify(finalOptions.realResourcePath)//fixed by xxxxxx 增加hashId
var compiled = baseCompile(template$$1, finalOptions)
if (process.env.NODE_ENV !== "production") {
errors.push.apply(errors, detectErrors(compiled.ast))
}
compiled.errors = errors
compiled.tips = tips
//fixed by xxxxxx
cacheCompilerOptions(finalOptions.realResourcePath,{compiled:{ast:compiled.ast}})
return compiled
}
return {
compile: compile,
compileToFunctions: createCompileToFunctionFn(compile)
}
}
}
var tagMap = {
br: "view",
hr: "view",
p: "view",
h1: "view",
h2: "view",
h3: "view",
h4: "view",
h5: "view",
h6: "view",
abbr: "view",
address: "view",
b: "view",
bdi: "view",
bdo: "view",
blockquote: "view",
cite: "view",
code: "view",
del: "view",
ins: "view",
dfn: "view",
em: "view",
strong: "view",
samp: "view",
kbd: "view",
var: "view",
i: "view",
mark: "view",
pre: "view",
q: "view",
ruby: "view",
rp: "view",
rt: "view",
s: "view",
small: "view",
sub: "view",
sup: "view",
time: "view",
u: "view",
wbr: "view",
// 表单元素
form: "form",
input: "input",
textarea: "textarea",
button: "button",
select: "picker",
option: "view",
optgroup: "view",
label: "label",
fieldset: "view",
datalist: "picker",
legend: "view",
output: "view",
// 框架
iframe: "view",
// 图像
img: "image",
canvas: "canvas",
figure: "view",
figcaption: "view",
// 音视频
audio: "audio",
source: "audio",
video: "video",
track: "video",
// 链接
a: "navigator",
nav: "view",
link: "navigator",
// 列表
ul: "view",
ol: "view",
li: "view",
dl: "view",
dt: "view",
dd: "view",
menu: "view",
command: "view",
// 表格table
table: "view",
caption: "view",
th: "view",
td: "view",
tr: "view",
thead: "view",
tbody: "view",
tfoot: "view",
col: "view",
colgroup: "view",
// 样式 节
div: "view",
main: "view",
span: "label",
header: "view",
footer: "view",
section: "view",
article: "view",
aside: "view",
details: "view",
dialog: "view",
summary: "view",
progress: "progress",
meter: "progress", // todo
head: "view", // todo
meta: "view", // todo
base: "text", // todo
// 'map': 'image', // TODO不是很恰当
area: "navigator", // j结合map使用
script: "view",
noscript: "view",
embed: "view",
object: "view",
param: "view",
// https://mp.weixin.qq.com/debug/wxadoc/dev/component/
// [...document.querySelectorAll('.markdown-section tbody td:first-child')].map(v => v.textContent).join(',\n')
view: "view",
"scroll-view": "scroll-view",
swiper: "swiper",
icon: "icon",
text: "text",
// 'progress': 'progress',
// 'button': 'button',
// 'form': 'form',
// 'input': 'input',
checkbox: "checkbox",
radio: "radio",
picker: "picker",
"picker-view": "picker-view",
slider: "slider",
switch: "switch",
// 'label': 'label',
navigator: "navigator",
// 'audio': 'audio',
image: "image",
// 'video': 'video',
map: "map",
// 'canvas': 'canvas',
"contact-button": "contact-button",
block: "block"
}
function maybeTag(tagName) {
return tagMap[tagName]
}
// 目前分两次编译 source,导致无法使用随机数
function getWxEleId(index, arr, hashId) {//fixed by xxxxxx(临时使用hashId解决 slot 内引用组件导致 comid,eventid 冲突问题)
hashId = hashId || 'E'
if (!arr || !arr.length) {
return "'" + hashId + '-' + index + "'"
}
var str = arr.join("+'-'+")
return "'" + hashId + '-' + index + "-'+" + str
}
// 检查不允许在 v-for 的时候出现2个及其以上相同 iterator1
function checkRepeatIterator(arr, options) {
var len = arr.length
if (len > 1 && len !== new Set(arr).size) {
options.warn("同一组件内嵌套的 v-for 不能连续使用相同的索引,目前为: " + arr, false)
}
}
function fixDefaultIterator(path,options) {
var forText = path.for
var iterator1 = path.iterator1
if (forText && !iterator1) {
if(!options.hasOwnProperty('__iterator__')){
options.__iterator__ = 0
}
path.iterator1 = "index" + (options.__iterator__++)
}
}
function addAttr$1(path, key, value, inVdom) {
path[key] = value
path.plain = false
// path.attrsMap[key] = value
if (!inVdom) {
path.attrsMap["data-" + key] = "{{" + value + "}}"
}
// if (!path.attrsList) {
// path.attrsList = []
// }
// path.attrsList.push({ name: `':${key}'`, value })
if (!path.attrs) {
path.attrs = []
}
path.attrs.push({ name: key, value: value })
}
function mark(path, options, deps, iteratorArr) {
if (iteratorArr === void 0) iteratorArr = []
fixDefaultIterator(path,options)
var tag = path.tag
var children = path.children
var iterator1 = path.iterator1
var events = path.events
var directives = path.directives
var ifConditions = path.ifConditions
var currentArr = Object.assign([], iteratorArr)
if (iterator1) {
currentArr.push(iterator1)
}
checkRepeatIterator(currentArr, options)
// 递归子节点
if (children && children.length) {
children.forEach(function(v, i) {
// const counterIterator = children.slice(0, i).filter(v => v.for).map(v => v.for + '.length').join(`+'-'+`)
mark(v, options, deps, currentArr)
})
}
// fix: v-else events
if (ifConditions && ifConditions.length > 1) {
ifConditions.slice(1).forEach(function(v, i) {
mark(v.block, options, deps, currentArr)
})
}
// for mpvue-template-compiler
// events || v-model
var hasModel =
directives &&
directives.find(function(v) {
return v.name === "model"
})
var needEventsID = events || hasModel
if (needEventsID) {
var eventId = getWxEleId(deps.eventIndex, currentArr, options.hashId)
// const eventId = getWxEleId(eIndex, currentArr)
addAttr$1(path, "eventid", eventId)
path.attrsMap["data-comkey"] = "{{$k}}"
deps.eventIndex += 1
// eIndex += 1
}
// 子组件
if (!tag || maybeTag(tag)) {
return
}
// eg. '1-'+i+'-'+j
var value = getWxEleId(deps.comIndex, currentArr, options.hashId)
addAttr$1(path, "mpcomid", value, true)
path["mpcomid"] = value
deps.comIndex += 1
}
// 全局的事件触发器 ID
// let eIndex = 0
function markComponent(ast, options) {
var deps = { comIndex: 0, eventIndex: 0 }
mark(ast, options, deps)
return ast
}
/* */
// for mp
// `createCompilerCreator` allows creating compilers that use alternative
// parser/optimizer/codegen, e.g the SSR optimizing compiler.
// Here we just export a default compiler using the default parts.
var createCompiler = createCompilerCreator(function baseCompile(template$$1, options) {
var originAst = parse(template$$1.trim(), options)
var ast = markComponent(originAst, options)
optimize(ast, options)
var code = generate$1(ast, options)
return {
ast: ast,
render: code.render,
staticRenderFns: code.staticRenderFns
}
})
// type:
// 0, 默认值, 拼接 ${name}={{ ${content} }}
// 1, 拼接 ${name}
// 2, 拼接 ${map[key]}={{ '${content}' }}
// 3, 拼接 {{ ${content} }}
// 4, 拼接为空字符串
// 5, 不需要在wxml上表现出来,可直接清除
var noSupport = {
type: 4,
check: function(k, v, errors) {
errors("不支持此指令: " + k + '="' + v + '"')
return false
}
}
var wxmlDirectiveMap = {
"v-if": {
name: "wx:if",
type: 0
},
"v-else-if": {
name: "wx:elif",
type: 0
},
"v-else": {
name: "wx:else",
type: 1
},
"v-text": {
name: "",
type: 1
},
"v-html": {
name: "",
type: 1
},
"v-on": {
name: "",
map: {
click: "tap",
touchstart: "touchstart",
touchmove: "touchmove",
touchcancel: "touchcancel",
touchend: "touchend",
tap: "tap",
longtap: "longtap",
input: "input",
change: "change",
submit: "submit",
blur: "blur",
focus: "focus",
reset: "reset",
confirm: "confirm",
columnchange: "columnchange",
linechange: "linechange",
error: "error",
scrolltoupper: "scrolltoupper",
scrolltolower: "scrolltolower",
scroll: "scroll",
load: "load"
},
type: 2
},
"v-bind": {
name: "",
map: {
href: "url"
},
type: 3
},
href: {
name: "url",
type: 2
},
"v-pre": noSupport,
"v-cloak": noSupport,
"v-once": {
name: "",
type: 5
}
}
var tagConfig = {
virtualTag: ["slot", "template", "block"]
}
// babel-plugin-transform-object-to-ternary-operator.js
function getStrByNode(node, onlyStr) {
if (onlyStr === void 0) onlyStr = false
if (onlyStr) {
return node.value || node.name || ""
}
return node.type === "StringLiteral" ? node : t.stringLiteral(node.name || "")
}
// 把 { key: value } 转换成 [ value ? 'key' : '' ]
var objectVisitor = {
ObjectExpression: function(path) {
var elements = path.node.properties.map(function(propertyItem) {
return t.conditionalExpression(
propertyItem.value,
getStrByNode(propertyItem.key),
t.stringLiteral("")
)
})
path.replaceWith(t.arrayExpression(elements))
}
}
function transformObjectToTernaryOperator(babel$$1) {
return { visitor: objectVisitor }
}
// 把 { key: value } 转换成 'key:' + value + ';'
var objectToStringVisitor = {
ObjectExpression: function(path) {
var expression = path.node.properties
.map(function(propertyItem) {
var keyStr = getStrByNode(propertyItem.key, true)
var key = keyStr ? hyphenate(keyStr) : keyStr
var ref = generate(t.ExpressionStatement(propertyItem.value))
var val = ref.code
return "'" + key + ":' + (" + val.slice(0, -1) + ") + ';'"
})
.join("+")
var p = template(expression,{placeholderPattern:false})({})//fixed by xxxxxx
path.replaceWith(p.expression)
}
}
function transformObjectToString(babel$$1) {
return { visitor: objectToStringVisitor }
}
function transformDynamicClass(staticClass, clsBinding) {
if (staticClass === void 0) staticClass = ""
var result = babel.transform("!" + clsBinding, { plugins: [transformObjectToTernaryOperator] })
// 先实现功能,再优化代码
// https://github.com/babel/babel/issues/7138
var cls = prettier
.format(result.code.replace("use strict'!",'').replace('"use strict";',''), { semi: false, singleQuote: true, parser:'babel' })//fixed by xxxxxx
.slice(1)
.slice(0, -1)
.replace(/\n|\r/g, "")
return staticClass + " {{" + cls + "}}"
}
function transformDynamicStyle(staticStyle, styleBinding) {
if (staticStyle === void 0) staticStyle = ""
var result = babel.transform("!" + styleBinding, { plugins: [transformObjectToString] })//fixed by xxxxxx
var cls = prettier
.format(result.code.replace("use strict'!",'').replace('"use strict";',''), { semi: false, singleQuote: true, parser:'babel' })//fixed by xxxxxx
.slice(1)
.slice(0, -1)
.replace(/\n|\r/g, "")
return staticStyle + " {{" + cls + "}}"
}
var attrs = {
format: function format(attrs) {
if (attrs === void 0) attrs = {}
var obj = {}
Object.keys(attrs).map(function(key) {
var val = attrs[key]
obj[key.replace("@", "v-on:").replace(/^:/, "v-bind:")] = val
})
return obj
},
convertAttr: function convertAttr(ast, log) {
var this$1 = this
var attrsMap = ast.attrsMap
if (attrsMap === void 0) attrsMap = {}
var tag = ast.tag
var staticClass = ast.staticClass
var attrs = {}
var wxClass = this.classObj(attrsMap["v-bind:class"], staticClass)
wxClass.length ? (attrsMap["class"] = wxClass) : ""
var wxStyle = this.styleObj(attrsMap["v-bind:style"], attrsMap["style"])
wxStyle.length ? (attrsMap["style"] = wxStyle) : ""
Object.keys(attrsMap).map(function(key) {
var val = attrsMap[key]
if (key === "v-bind:class" || key === "v-bind:style") {
return
}
if (key === "v-text") {
ast.children.unshift({
text: "{{" + val + "}}",
type: 3
})
} else if (key === "v-html") {
ast.tag = "rich-text"
attrs["nodes"] = "{{" + val + "}}"
} else if (key === "v-show") {
attrs["hidden"] = "{{!(" + val + ")}}"
} else if (/^v\-on\:/i.test(key)) {
attrs = this$1.event(key, val, attrs, tag)
} else if (/^v\-bind\:/i.test(key)) {
attrs = this$1.bind(key, val, attrs, tag, attrsMap["wx:key"])
} else if (/^v\-model/.test(key)) {
attrs = this$1.model(key, val, attrs, tag, log)
} else if (wxmlDirectiveMap[key]) {
var ref = wxmlDirectiveMap[key] || {}
var name = ref.name
if (name === void 0) name = ""
var type = ref.type
var map = ref.map
if (map === void 0) map = {}
var check = ref.check
if (!(check && !check(key, val, log)) && !(!name || typeof type !== "number")) {
// 见 ./wxmlDirectiveMap.js 注释
if (type === 0) {
attrs[name] = "{{" + val + "}}"
}
if (type === 1) {
attrs[name] = undefined
}
if (type === 2) {
attrs[name] = val
}
if (type === 3) {
attrs[map[name] || name] = "{{" + val + "}}"
return
}
}
} else if (/^v\-/.test(key)) {
log("不支持此属性-> " + key + '="' + val + '"', "waring")
} else {
if (
tagConfig.virtualTag.indexOf(tag) > -1 &&
(key === "class" || key === "style" || key === "data-mpcomid")
) {
if (key !== "data-mpcomid") {
log("template 不支持此属性-> " + key + '="' + val + '"', "waring")
}
} else {
attrs[key] = val
}
}
})
ast.attrsMap = attrs
return ast
},
event: function event(key, val, attrs, tag) {
// 小程序能力所致,bind 和 catch 事件同时绑定时候,只会触发 bind ,catch 不会被触发。
// .stop 的使用会阻止冒泡,但是同时绑定了一个非冒泡事件,会导致该元素上的 catchEventName 失效!
// .prevent 可以直接干掉,因为小程序里没有什么默认事件,比如submit并不会跳转页面
// .capture 不能做,因为小程序没有捕获类型的事件
// .self 没有可以判断的标识
// .once 也不能做,因为小程序没有 removeEventListener, 虽然可以直接在 handleProxy 中处理,但非常的不优雅,违背了原意,暂不考虑
var name = key.replace(/^v\-on\:/i, "").replace(/\.prevent/i, "")
var ref = name.split(".")
var eventName = ref[0]
var eventNameMap = ref.slice(1)
var eventMap = wxmlDirectiveMap["v-on"]
var check = wxmlDirectiveMap.check
if (check) {
check(key, val)
}
var wxmlEventName = ""
if (eventName === "change" && (tag === "input" || tag === "textarea")) {
wxmlEventName = "blur"
} else {
wxmlEventName = eventMap.map[eventName]
}
var eventType = "bind"
var isStop = eventNameMap.includes("stop")
if (eventNameMap.includes("capture")) {
eventType = isStop ? "capture-catch:" : "capture-bind:"
} else if (isStop) {
eventType = "catch"
}
wxmlEventName = eventType + (wxmlEventName || eventName)
attrs[wxmlEventName] = "handleProxy"
return attrs
},
bind: function bind(key, val, attrs, tag, isIf) {
var name = key.replace(/^v\-bind\:/i, "")
if (isIf && name === "key") {
attrs["wx:key"] = val
}
if (tag === "template") {
return attrs
}
if (name === "href") {
attrs["url"] = "{{" + val + "}}"
} else {
attrs[name] = "{{" + val + "}}"
}
return attrs
},
classObj: function classObj(clsBinding, staticCls) {
if (clsBinding === void 0) clsBinding = ""
if (!clsBinding && !staticCls) {
return ""
}
if (!clsBinding && staticCls) {
return staticCls
}
return transformDynamicClass(staticCls, clsBinding)
},
styleObj: function styleObj(styleBinding, staticStyle) {
if (styleBinding === void 0) styleBinding = ""
if (!styleBinding && !staticStyle) {
return ""
}
if (!styleBinding && staticStyle) {
return staticStyle
}
return transformDynamicStyle(staticStyle, styleBinding)
},
model: function model(key, val, attrs, tag) {
var isFormInput = tag === "input" || tag === "textarea"
attrs["value"] = "{{" + val + "}}"
if (key === "v-model.lazy") {
if (isFormInput) {
attrs["bindblur"] = "handleProxy"
} else {
attrs["bindchange"] = "handleProxy"
}
} else {
if (isFormInput) {
attrs["bindinput"] = "handleProxy"
} else {
attrs["bindchange"] = "handleProxy"
}
}
return attrs
}
}
function getSlotsName(obj) {
if (!obj) {
return ""
}
return Object.keys(obj)
.map(function(k) {
return "$slot" + k + ":'" + obj[k] + "'"
})
.join(",")
}
var component = {
isComponent: function isComponent(tagName, components) {
if (components === void 0) components = {}
return !!components[tagName]
},
convertComponent: function convertComponent(ast, components, slotName) {//fixed by xxxxxx(将根节点数据传递给 slot)
var attrsMap = ast.attrsMap
var tag = ast.tag
var mpcomid = ast.mpcomid
var slots = ast.slots
if (slotName) {
attrsMap["data"] = "{{...$root['0'], ...$root[$k], $root}}"
attrsMap["is"] = "{{" + slotName + "}}"
} else {
var slotsName = getSlotsName(slots)
var restSlotsName = slotsName ? ", " + slotsName : ""
attrsMap["data"] = "{{...$root['0'], ...$root[$kk+" + mpcomid + "],$root" + restSlotsName + "}}"
attrsMap["is"] = components[tag].name
}
return ast
}
}
var tag = function(ast, options) {
var tag = ast.tag
var elseif = ast.elseif
var elseText = ast.else
var forText = ast.for
var staticClass = ast.staticClass
if (staticClass === void 0) staticClass = ""
var attrsMap = ast.attrsMap
if (attrsMap === void 0) attrsMap = {}
var components = options.components
var ifText = attrsMap["v-if"]
var href = attrsMap.href
var bindHref = attrsMap["v-bind:href"]
var name = attrsMap.name
if (!tag) {
return ast
}
var isComponent = component.isComponent(tag, components)
if (tag !== "template" && tag !== "block" && tag !== "slot" && !isComponent) {
ast.staticClass = staticClass ? "_" + tag + " " + staticClass : "_" + tag
}
ast.tag = tagMap[tag] || tag
var isSlot = tag === "slot"
if ((ifText || elseif || elseText || forText) && tag === "template") {
ast.tag = "block"
} else if (isComponent || isSlot) {
var originSlotName = name || "default"
var slotName = isSlot
? "$slot" + originSlotName + " || '" + originSlotName + "'"
: undefined
// 用完必须删除,不然会被编译成 <template name="xxx"> 在小程序中就会表示这是一个模版申明而不是使用,小程序中不能同时申明和使用模版
delete ast.attrsMap.name
ast = component.convertComponent(ast, components, slotName)
ast.tag = "template"
} else if (tag === "a" && !(href || bindHref)) {
ast.tag = "view"
} else if (ast.events && ast.events.scroll) {
ast.tag = "scroll-view"
} else if (tag === "input") {
var type = attrsMap.type
if (type && ["button", "checkbox", "radio"].indexOf(type) > -1) {
delete ast.attrsMap.type
ast.tag = type
}
if (type === "button") {
ast.children.push({
text: attrsMap.value || "",
type: 3
})
delete ast.attrsMap.value
}
}
return ast
}
var astMap = {
if: "wx:if",
iterator1: "wx:for-index",
key: "wx:key",
alias: "wx:for-item",
"v-for": "wx:for"
}
var convertFor = function(ast) {
var iterator1 = ast.iterator1
var forText = ast.for
var key = ast.key
var alias = ast.alias
var attrsMap = ast.attrsMap
if (forText) {
attrsMap[astMap["v-for"]] = "{{" + forText + "}}"
if (iterator1) {
attrsMap[astMap["iterator1"]] = iterator1
}
if (key) {
attrsMap[astMap["key"]] = key
}
if (alias) {
attrsMap[astMap["alias"]] = alias
}
delete attrsMap["v-for"]
}
return ast
}
function convertAst(node, options, util) {
if (options === void 0) options = {}
var children = node.children
var ifConditions = node.ifConditions
var staticClass = node.staticClass
if (staticClass === void 0) staticClass = ""
var mpcomid = node.mpcomid
var tagName = node.tag
var log = util.log
var deps = util.deps
var slots = util.slots
var slotTemplates = util.slotTemplates
var wxmlAst = Object.assign({}, node)
var moduleId = options.moduleId
var components = options.components
wxmlAst.tag = tagName = tagName ? hyphenate(tagName) : tagName
// 引入 import, isSlot 是使用 slot 的编译地方,意即 <slot></slot> 的地方
var isSlot = tagName === "slot"
if (isSlot) {
deps.slots = "slots"
// 把当前 slot 节点包裹 template
var defSlot = Object.assign({}, wxmlAst)
defSlot.tag = "template"
var templateName = "" + (defSlot.attrsMap.name || "default")
defSlot.attrsMap.name = templateName
wxmlAst.children = []
defSlot.parent = node.parent.parent
slotTemplates[templateName] = defSlot
}
var currentIsComponent = component.isComponent(tagName, components)
if (currentIsComponent) {
deps[tagName] = tagName
}
if (moduleId && !currentIsComponent && tagConfig.virtualTag.indexOf(tagName) < 0) {
wxmlAst.staticClass = staticClass
? (moduleId + " " + staticClass).replace(/\"/g, "")
: moduleId
} else {
wxmlAst.staticClass = staticClass.replace(/\"/g, "")
}
// 组件内部的node节点全部是 slot
wxmlAst.slots = {}
if (currentIsComponent && children && children.length) {
// 只检查组件下的子节点(不检查孙子节点)是不是具名 slot,不然就是 default slot
children
.reduce(
function(res, n) {
var ref = n.attrsMap || {}
var slot = ref.slot
// 不是具名的,全部放在第一个数组元素中
var arr = slot ? res : res[0]
arr.push(n)
return res
},
[[]]
)
.forEach(function(n) {
var isDefault = Array.isArray(n)
var slotName = isDefault ? "default" : n.attrsMap.slot
var slotId = moduleId + "-" + slotName + "-" + mpcomid.replace(/\'/g, "")
var node = isDefault ? { tag: "slot", attrsMap: {}, children: n } : n
node.tag = "template"
node.attrsMap.name = slotId
delete node.attrsMap.slot
// 缓存,会集中生成一个 slots 文件
slots[slotId] = {
node: convertAst(node, options, util),
name: slotName,
slotId: slotId
}
wxmlAst.slots[slotName] = slotId
})
// 清理当前组件下的节点信息,因为 slot 都被转移了
children.length = 0
wxmlAst.children.length = 0
}
wxmlAst.attrsMap = attrs.format(wxmlAst.attrsMap)
wxmlAst = tag(wxmlAst, options)
wxmlAst = convertFor(wxmlAst, options)
wxmlAst = attrs.convertAttr(wxmlAst, log)
if (children && !isSlot) {
wxmlAst.children = children.map(function(k) {
return convertAst(k, options, util)
})
}
if (ifConditions) {
var length = ifConditions.length
for (var i = 1; i < length; i++) {
wxmlAst.ifConditions[i].block = convertAst(ifConditions[i].block, options, util)
}
}
return wxmlAst
}
function wxmlAst(compiled, options, log) {
if (options === void 0) options = {}
var ast = compiled.ast
var deps = {
// slots: 'slots'
}
var slots = {
// slotId: nodeAst
}
var slotTemplates = {}
var wxast = convertAst(ast, options, {
log: log,
deps: deps,
slots: slots,
slotTemplates: slotTemplates
})
var children = Object.keys(slotTemplates).map(function(k) {
return convertAst(slotTemplates[k], options, {
log: log,
deps: deps,
slots: slots,
slotTemplates: slotTemplates
})
})
wxast.children = children.concat(wxast.children)
return {
wxast: wxast,
deps: deps,
slots: slots
}
}
function generate$2(obj, options) {
if (options === void 0) options = {}
var tag = obj.tag
var attrsMap = obj.attrsMap
if (attrsMap === void 0) attrsMap = {}
var children = obj.children
var text = obj.text
var ifConditions = obj.ifConditions
if (!tag) {
return text
}
var child = ""
if (children && children.length) {
// 递归子节点
child = children
.map(function(v) {
return generate$2(v, options)
})
.join("")
}
// v-if 指令
var ifConditionsArr = []
if (ifConditions) {
var length = ifConditions.length
for (var i = 1; i < length; i++) {
ifConditionsArr.push(generate$2(ifConditions[i].block, options))
}
}
var attrs = Object.keys(attrsMap)
.map(function(k) {
return convertAttr(k, attrsMap[k])
})
.join(" ")
//fixed by xxxxxx
var tags = ['progress', 'switch', 'input', 'radio', 'slider', 'textarea'];
// var tags = ['progress', 'checkbox', 'switch', 'input', 'radio', 'slider', 'textarea'];
if (tags.indexOf(tag) > -1 && !(children && children.length)) {
return "<" + tag + (attrs ? " " + attrs : "") + " />" + ifConditionsArr.join("")
}
return (
"<" +
tag +
(attrs ? " " + attrs : "") +
">" +
(child || "") +
"</" +
tag +
">" +
ifConditionsArr.join("")
)
}
function convertAttr(key, val) {
//fixed by xxxxxx
if (key === 'value') {
return (key + "=\"" + (val || '') + "\"")
}
return val === "" || typeof val === "undefined" ? key : key + '="' + val + '"'
}
var utils = {
toLowerCase: function toLowerCase(str) {
return str
.replace(/([A-Z])/g, "-$1")
.toLowerCase()
.trim()
},
getChar: function getChar(index) {
return String.fromCharCode(0x61 + index)
},
log: function log(compiled) {
compiled.mpErrors = []
compiled.mpTips = []
return function(str, type) {
if (type === "waring") {
compiled.mpTips.push(str)
} else {
compiled.mpErrors.push(str)
}
}
}
}
function compileToWxml(compiled, options) {
if (options === void 0) options = {}
// TODO, compiled is undefined
var components = options.components
if (components === void 0) components = {}
var log = utils.log(compiled)
var ref = wxmlAst(compiled, options, log)
var wxast = ref.wxast
var deps = ref.deps
if (deps === void 0) deps = {}
var slots = ref.slots
if (slots === void 0) slots = {}
var code = generate$2(wxast, options)
// 引用子模版
var importCode = Object.keys(deps)
.map(function(k) {
return components[k] ? '<import src="' + components[k].src + '" />' : ""
})
.join("")
code = importCode + '<template name="' + options.name + '">' + code + "</template>"
// 生成 slots code
Object.keys(slots).forEach(function(k) {
var slot = slots[k]
slot.code = generate$2(slot.node, options)
})
// TODO: 后期优化掉这种暴力全部 import,虽然对性能没啥大影响
return { code: code, compiled: compiled, slots: slots, importCode: importCode }
}
/* */
var ref = createCompiler(baseOptions)
var compile = ref.compile
var compileToFunctions = ref.compileToFunctions
/* */
exports.parseComponent = parseComponent
exports.compile = compile
exports.compileToFunctions = compileToFunctions
exports.compileToWxml = compileToWxml