'use strict'
|
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
|