@mpxjs/webpack-plugin
Version:
mpx compile core
66 lines (64 loc) • 2.4 kB
JavaScript
const runRules = require('../run-rules')
/**
* @desc 针对每一个组件(属性,event,指令等)执行规则判断
* @params cfgs [{test: 'camera', props:[], event: []}] 组件配置列表
* @params spec ../index.js中公共的spec
*/
module.exports = function normalizeComponentRules (cfgs, spec) {
return cfgs.map((cfg) => {
const result = {}
if (cfg.test) result.test = cfg.test
if (cfg.waterfall) result.waterfall = cfg.waterfall
const supportedModes = cfg.supportedModes || spec.supportedModes
// 合并component-config中组件的event 与index中公共的event规则
const eventRules = (cfg.event || []).concat(spec.event.rules)
supportedModes.forEach((mode) => {
result[mode] = cfg.skipNormalize
? cfg[mode]
: function (el, data) {
data = Object.assign({}, data, { el, eventRules })
const testKey = 'name'
let rAttrsList = []
const options = {
mode,
testKey,
data
}
el.attrsList.forEach((attr) => {
const meta = {}
let rAttr = runRules(spec.directive, attr, {
...options,
meta
})
// 指令未匹配到时说明为props,因为目前所有的指令都需要转换
if (!meta.processed) {
rAttr = runRules(spec.preProps, rAttr, options)
rAttr = runRules(cfg.props, rAttr, options)
if (Array.isArray(rAttr)) {
rAttr = rAttr.map((attr) => {
return runRules(spec.postProps, attr, options)
})
} else if (rAttr !== false) {
rAttr = runRules(spec.postProps, rAttr, options)
}
}
// 生成目标attrsList
if (Array.isArray(rAttr)) {
rAttrsList = rAttrsList.concat(rAttr)
} else if (rAttr !== false) {
rAttrsList.push(rAttr)
}
})
el.attrsList = rAttrsList
el.attrsMap = require('../../template-compiler/compiler').makeAttrsMap(rAttrsList)
// 前置处理attrs,便于携带信息用于tag的处理
const rTag = cfg[mode] && cfg[mode].call(this, el.tag, data)
if (rTag) {
el.tag = rTag
}
return el
}
})
return result
})
}