first commit

This commit is contained in:
2026-09-08 20:28:54 +08:00
commit 2ada8d3d5a
37380 changed files with 4886169 additions and 0 deletions
@@ -0,0 +1,124 @@
const {
ID,
C_IS,
C_REF,
C_NAME,
V_IF,
V_FOR,
V_ELSE_IF,
isVar
} = require('../util')
const parseTextExpr = require('./text-parser')
function parseRef (el, genVar) {
if (el.ref && isVar(el.ref)) {
el.ref = genVar(C_REF, el.ref)
}
}
function parseSlotName (el, genVar) {
if (el.slotName && isVar(el.slotName)) {
el.slotName = genVar(C_NAME, el.slotName)
}
}
function parseIs (el, genVar) {
if (!el.component) {
return
}
if (isVar(el.component)) {
el.component = genVar(C_IS, el.component)
}
}
function isProcessed (exp) {
return String(exp).indexOf('_$') === 0
}
// 当根节点是由if,elseif,else组成,会调用多次parseIf来解析root
function parseIf (el, createGenVar, isScopedSlot) {
if (!el.if) {
return
}
if (el.slotTarget && el.tag === 'template') { // new v-slot
isScopedSlot = false
}
el.ifConditions.forEach(con => {
if (!isProcessed(con.exp) && isVar(con.exp)) {
con.exp = createGenVar(con.block.attrsMap[ID], isScopedSlot)(con.block.elseif ? V_ELSE_IF : V_IF, con.exp)
}
})
if (!isProcessed(el.if)) {
el.if = createGenVar(el.attrsMap[ID], isScopedSlot)(V_IF, el.if)
}
}
function parseFor (el, createGenVar, isScopedSlot, fill = false) {
if (el.for && isVar(el.for)) {
el.for = createGenVar(el.forId, isScopedSlot)(
V_FOR,
fill
? `{forItems:${el.for},fill:true}`
: `{forItems:${el.for}}`
)
return true
}
}
function parseBinding (el, genVar) {
el.staticClass && (el.staticClass = genVar('sc', el.staticClass))
el.classBinding && (el.classBinding = genVar('c', el.classBinding))
el.styleBinding && (el.styleBinding = genVar('s', el.styleBinding))
}
function parseDirs (el, genVar, ignoreDirs = []) {
el.directives && el.directives.forEach(dir => {
if (ignoreDirs.indexOf(dir.name) === -1) {
dir.value && (dir.value = genVar('v-' + dir.name, dir.value))
dir.isDynamicArg && (dir.arg = genVar('v-' + dir.name + '-arg', dir.arg))
}
})
}
function parseAttrs (el, genVar) {
el.attrs && el.attrs.forEach(attr => {
const {
name,
value
} = attr
if (
name !== ID &&
// name.indexOf('data-') !== 0 && // TODO dataset 保留
name.indexOf('change:') !== 0 && // wxs change:prop
isVar(value) &&
value.indexOf('_$') !== 0 // 已被提前处理过了,如 wxs prop:_$gc(2,'change:prop')
) {
attr.value = genVar('a-' + name, value)
}
})
}
function parseProps (el, genVar) {
el.props && el.props.forEach(prop => {
isVar(prop.value) && (prop.value = genVar('a-' + prop.name, prop.value))
})
}
function parseText (el, parent, state) {
// fixed by xxxxxx 注意:保持平台一致性,trim 一下
el.parent && (el.parent = parent)
el.expression = parseTextExpr(el.text.trim(), false, state).expression
}
module.exports = {
parseIs,
parseRef,
parseSlotName,
parseIf,
parseFor,
parseText,
parseDirs,
parseAttrs,
parseProps,
parseBinding
}
@@ -0,0 +1,30 @@
const {
ID,
hasOwn,
addRawAttr
} = require('../util')
module.exports = function parseBlock (el, parent) {
if (el.tag === 'template' && !hasOwn(el.attrsMap, ID)) {
/**
* <current-user v-slot="{ user }">
* {{ user.firstName }}
* </current-user>
*/
addRawAttr(el, ID, parent.attrsMap[ID])
} else if (el.tag === 'block') {
el.tag = 'template'
const vForKey = el.key
if (vForKey) {
delete el.key
el.children.forEach((childEl, index) => {
const childVForKey = childEl.key
if (childVForKey) {
childEl.key = `${childVForKey}+'_'+${vForKey}+'_${index}'`
} else {
childEl.key = `${vForKey}+'_${index}'`
}
})
}
}
}
@@ -0,0 +1,20 @@
const {
ID,
elements
} = require('../util')
const {
isComponent
} = require('../../util')
// 仅限 view 层
module.exports = function parseComponent (el) {
// 需要把自定义组件的 attrs, props 全干掉
if (el.tag && !elements.includes(el.tag) && isComponent(el.tag)) {
// 仅保留 id、ID、data
el.attrs && (el.attrs = el.attrs.filter(attr => {
const name = attr.name
return name === 'id' || name === ID || name.indexOf('data-') === 0
}))
}
}
@@ -0,0 +1,29 @@
const deprecated = {
events: {
tap: 'click',
longtap: 'longpress'
}
}
module.exports = function parseEvent (el) {
if (el.events || el.nativeEvents) {
const {
events: eventsMap
} = deprecated
normalizeEvent(el.events, eventsMap)
normalizeEvent(el.nativeEvents, eventsMap)
}
}
function normalizeEvent (events, eventsMap) {
if (!events) {
return
}
Object.keys(events).forEach(name => {
// 过时事件类型转换
if (eventsMap[name]) {
events[eventsMap[name]] = events[name]
delete events[name]
// warnLogs.add(`警告:事件${name}已过时,推荐使用${eventsMap[name]}代替`)
}
})
}
@@ -0,0 +1,115 @@
/* @flow */
const validDivisionCharRE = /[\w).+\-_$\]]/
module.exports = function parseFilters (exp) {
let inSingle = false
let inDouble = false
let inTemplateString = false
let inRegex = false
let curly = 0
let square = 0
let paren = 0
let lastFilterIndex = 0
let 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) { // /
let j = i - 1
let p
// 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) {
const i = filter.indexOf('(')
if (i < 0) {
// _f: resolveFilter
return `_f("${filter}")(${exp})`
} else {
const name = filter.slice(0, i)
const args = filter.slice(i + 1)
return `_f("${name}")(${exp}${args !== ')' ? ',' + args : args}`
}
}
@@ -0,0 +1,19 @@
const {
hasOwn,
elements
} = require('../util')
const tags = require('@dcloudio/uni-cli-shared/lib/tags')
// 仅限 view 层
module.exports = function parseTag (el) {
const tag = el.tag
const element = elements.find(element => tag === element || 'uni-' + tag === element)
if (element) {
el.tag = element
return
}
if (el.tag.indexOf('v-uni-') !== 0 && hasOwn(tags, el.tag)) {
el.tag = 'v-uni-' + el.tag
}
}
@@ -0,0 +1,62 @@
/* @flow */
const parseFilters = require('./filter-parser')
function cached (fn) {
const cache = Object.create(null)
return function cachedFn (str) {
const hit = cache[str]
return hit || (cache[str] = fn(str))
}
}
const defaultTagRE = /\{\{((?:.|\r?\n)+?)\}\}/g
const regexEscapeRE = /[-.*+?^${}()|[\]/\\]/g
const buildRegex = cached(delimiters => {
const open = delimiters[0].replace(regexEscapeRE, '\\$&')
const close = delimiters[1].replace(regexEscapeRE, '\\$&')
return new RegExp(open + '((?:.|\\n)+?)' + close, 'g')
})
module.exports = function parseText (
text,
delimiters,
state
) {
const tagRE = delimiters ? buildRegex(delimiters) : defaultTagRE
if (!tagRE.test(text)) {
return
}
const tokens = []
const rawTokens = []
let lastIndex = tagRE.lastIndex = 0
let match, index, tokenValue
while ((match = tagRE.exec(text))) {
index = match.index
// push text token
if (index > lastIndex) {
rawTokens.push(tokenValue = text.slice(lastIndex, index))
if (!state.service) {
tokens.push(JSON.stringify(tokenValue))
}
}
// tag token
const exp = parseFilters(match[1].trim())
tokens.push(`(${state.genVar('t' + (state.childIndex) + '-' + (state.index++), '_s(' + exp + ')')})`)
rawTokens.push({
'@binding': exp
})
lastIndex = index + match[0].length
}
if (lastIndex < text.length) {
rawTokens.push(tokenValue = text.slice(lastIndex))
if (!state.service) {
tokens.push(JSON.stringify(tokenValue))
}
}
return {
expression: tokens.join('+'),
tokens: rawTokens
}
}
@@ -0,0 +1,56 @@
const simplePathRE = /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/
function isWxsEvent (expr, filterModules) {
return !!filterModules.find(name => expr.indexOf(name + '.') === 0)
}
function parseWxsViewEvent (expr, filterModules) {
if (!simplePathRE.test(expr)) {
return expr
}
if (isWxsEvent(expr, filterModules)) {
return `$event = $handleWxsEvent($event);${expr}($event, $getComponentDescriptor())`
}
return expr
}
module.exports = function parseWxsEvents (el, {
filterModules,
isAppService,
isAppView
}) {
if (!filterModules || !filterModules.length) {
return
}
if (!el.events) {
return
}
if (isAppService) {
Object.keys(el.events).forEach(name => {
const handlers = el.events[name]
if (Array.isArray(handlers)) {
el.events[name] = handlers.filter(handler => {
return !isWxsEvent(handler.value, filterModules)
})
if (!el.events[name].length) {
delete el.events[name]
}
} else {
if (isWxsEvent(handlers.value, filterModules)) {
delete el.events[name]
}
}
})
} else if (isAppView) {
Object.keys(el.events).forEach(name => {
const handlers = el.events[name]
if (Array.isArray(handlers)) {
handlers.forEach(handler => {
handler.value = parseWxsViewEvent(handler.value, filterModules)
})
} else {
handlers.value = parseWxsViewEvent(handlers.value, filterModules)
}
})
}
}
@@ -0,0 +1,56 @@
const {
ID,
SET_DATA,
GET_CHANGE_DATA
} = require('../util')
function isWxsChangeProp (attr) {
return attr.name.indexOf('change:') === 0
}
function createSetDataGenVar (id) {
return function genVar (name, value) {
return `${SET_DATA}(${id},'${name}',${value})`
}
}
function createGetChangeDataGenVar (id) {
return function genVar (name) {
return `${GET_CHANGE_DATA}(${id},'${name}')`
}
}
module.exports = function parseWxsProps (el, {
isAppService,
isAppView
}) {
if (!el.attrs) {
return
}
const wxsChangeProps = []
el.attrs = el.attrs.filter(attr => {
if (isWxsChangeProp(attr)) {
wxsChangeProps.push(attr.name.replace('change:', ''))
if (isAppService) { // service 层移除 change:prop
return false
}
}
return true
})
if (!wxsChangeProps.length) {
return
}
const genSetVar = createSetDataGenVar(el.attrsMap[ID])
const genGetVar = createGetChangeDataGenVar(el.attrsMap[ID])
el.attrs.forEach(attr => {
if (wxsChangeProps.includes(attr.name)) {
if (isAppService) {
attr.value = genSetVar('change:' + attr.value, attr.value)
} else if (isAppView) {
attr.value = genGetVar('change:' + attr.value)
}
}
})
}