compiler-options.js 3.2 KB
Newer Older
fxy060608's avatar
fxy060608 已提交
1 2 3 4 5 6
const {
  tags
} = require('@dcloudio/uni-cli-shared')

const simplePathRE = /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/

fxy060608's avatar
fxy060608 已提交
7
function processEvent (expr, filterModules) {
fxy060608's avatar
fxy060608 已提交
8 9
  const isMethodPath = simplePathRE.test(expr)
  if (isMethodPath) {
fxy060608's avatar
fxy060608 已提交
10 11 12 13 14 15
    if (filterModules.find(name => expr.indexOf(name + '.') === 0)) {
      return `
$event = $handleWxsEvent($event);
${expr}($event, $getComponentDescriptor())
`
    } else {
fxy060608's avatar
fxy060608 已提交
16
      expr = expr + '(...arguments)'
fxy060608's avatar
fxy060608 已提交
17
    }
fxy060608's avatar
fxy060608 已提交
18 19
  }
  return `
fxy060608's avatar
fxy060608 已提交
20
arguments[0] = $event = $handleEvent($event);
fxy060608's avatar
fxy060608 已提交
21 22 23 24
${expr}
`
}

fxy060608's avatar
fxy060608 已提交
25
function hasOwn (obj, key) {
fxy060608's avatar
fxy060608 已提交
26 27 28 29 30 31 32 33 34 35
  return hasOwnProperty.call(obj, key)
}

const deprecated = {
  events: {
    'tap': 'click',
    'longtap': 'longpress'
  }
}

fxy060608's avatar
fxy060608 已提交
36
function addTag (tag) {
fxy060608's avatar
fxy060608 已提交
37 38 39 40 41 42
  if (!process.UNI_TAGS) {
    process.UNI_TAGS = new Set()
  }
  process.UNI_TAGS.add(tag)
}

fxy060608's avatar
fxy060608 已提交
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
const dirRE = /^v-|^@|^:/
/**
 * 兼容小程序Boolean属性的怪异行为(<custom loading/>为true,<custom loading=""/>为false)
 * @param {Object} el
 */
function fixBooleanAttribute (el) {
  if (!el.attrsList) {
    return
  }
  el.attrsList.forEach(attr => {
    if (attr.bool) { // <custom loading/> => <custom :loading="true"/>
      if (!dirRE.test(attr.name) && attr.name !== 'inline-template') {
        delete el.attrsMap[attr.name]
        attr.name = ':' + attr.name
        attr.value = 'true'
        el.attrsMap[attr.name] = attr.value
      }
    }
  })
}

fxy060608's avatar
fxy060608 已提交
64
module.exports = {
65
  h5: true,
fxy060608's avatar
fxy060608 已提交
66
  modules: [require('../format-text'), {
fxy060608's avatar
fxy060608 已提交
67
    preTransformNode (el, options) {
fxy060608's avatar
fxy060608 已提交
68
      fixBooleanAttribute(el)
fxy060608's avatar
fxy060608 已提交
69 70 71 72 73 74 75
      if (el.tag.indexOf('v-uni-') === 0) {
        addTag(el.tag.replace('v-uni-', ''))
      } else if (hasOwn(tags, el.tag)) {
        addTag(el.tag)
        el.tag = 'v-uni-' + el.tag
      }
    },
fxy060608's avatar
fxy060608 已提交
76
    postTransformNode (el, {
fxy060608's avatar
fxy060608 已提交
77 78
      warn,
      filterModules
fxy060608's avatar
fxy060608 已提交
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
    }) {
      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}'`
            }
          })
        }
      }
      if (el.events) {
fxy060608's avatar
fxy060608 已提交
96
        filterModules = filterModules || []
fxy060608's avatar
fxy060608 已提交
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
        const {
          events: eventsMap
        } = deprecated
        // const warnLogs = new Set()
        Object.keys(el.events).forEach(name => {
          // 过时事件类型转换
          if (eventsMap[name]) {
            el.events[eventsMap[name]] = el.events[name]
            delete el.events[name]
            // warnLogs.add(`警告:事件${name}已过时,推荐使用${eventsMap[name]}代替`)
            name = eventsMap[name]
          }

          const handlers = el.events[name]
          if (Array.isArray(handlers)) {
            handlers.forEach(handler => {
fxy060608's avatar
fxy060608 已提交
113
              handler.value = processEvent(handler.value, filterModules)
fxy060608's avatar
fxy060608 已提交
114 115
            })
          } else {
fxy060608's avatar
fxy060608 已提交
116
            handlers.value = processEvent(handlers.value, filterModules)
fxy060608's avatar
fxy060608 已提交
117 118 119 120 121 122
          }
        })
      }
    }
  }]
}