5168 lines
145 KiB
JavaScript
5168 lines
145 KiB
JavaScript
"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 = {
|
||
"<": "<",
|
||
">": ">",
|
||
""": '"',
|
||
"&": "&",
|
||
" ": "\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
|