@dcloudio/uni-cli-shared
Version:
uni-cli-shared
84 lines (75 loc) • 1.96 kB
JavaScript
Object.defineProperty(exports, '__esModule', {
value: true
})
const isArray = Array.isArray
function isPlainObject (a) {
if (a === null) {
return false
}
return typeof a === 'object'
}
function mergeWith (objects, customizer) {
const [first, ...rest] = objects
let ret = first
rest.forEach(a => {
ret = mergeTo(ret, a, customizer)
})
return ret
}
function mergeTo (a, b, customizer) {
const ret = {}
Object.keys(a)
.concat(Object.keys(b))
.forEach(k => {
const v = customizer(a[k], b[k], k)
ret[k] = typeof v === 'undefined' ? a[k] : v
})
return ret
}
function mergeWithRule (a, b, k, matchField) {
if (!isArray(a)) {
return a
}
const bMatchItems = []
const ret = a.map(aItem => {
if (!matchField) {
return aItem
}
// 暂不考虑重复
const bMatchItem = b.find(bItem => aItem[matchField] === bItem[matchField])
if (bMatchItem) {
bMatchItems.push(bMatchItem)
return mergeWith([aItem, bMatchItem], createCustomizer(k))
}
return aItem
})
return ret.concat(b.filter(bItem => !bMatchItems.includes(bItem)))
}
function customizeArray (a, b, k) {
if (k === 'pages' || k === 'subPackages.pages') {
return mergeWithRule(a, b, k, 'path')
} else if (k === 'subPackages') {
return mergeWithRule(a, b, k, 'root')
}
return b
}
function customizeObject (a, b, k) {
return mergeWith([a, b], createCustomizer(k))
}
function createCustomizer (key) {
return function customizer (a, b, k) {
const newKey = key ? `${key}.${k}` : k
if (isArray(a) && isArray(b)) {
return customizeArray(a, b, newKey)
}
if (isPlainObject(a) && isPlainObject(b)) {
return customizeObject(a, b, newKey)
}
return b
}
}
function merge (pagesJsons) {
return mergeWith(pagesJsons, createCustomizer())
}
exports.default = merge