create-bfe-cttq
Version:
CTTQ大前端脚手架项目
60 lines (57 loc) • 1.89 kB
JavaScript
const { isFunction, isObject, isString} = require("./shared");
const mergeDeps = require("./mergeDeps")
const deepmerge = require("./deepMerge")
const { mergeArrayWithDedupe } = require("./deepMerge");
function pruneObject (obj) {
if (typeof obj === 'object') {
for (const k in obj) {
if (!Object.prototype.hasOwnProperty.call(obj, k)) {
continue
}
if (obj[k] == null) {
delete obj[k]
} else {
obj[k] = pruneObject(obj[k])
}
}
}
return obj
}
module.exports = (flag, pkg, toMerge, conflictDepSources, options = {}) => {
const extendOptions = {
prune: false,
merge: true,
warnIncompatibleVersions: true,
forceOverwrite: false
}
if (typeof options === 'boolean') {
extendOptions.warnIncompatibleVersions = !options
} else {
Object.assign(extendOptions, options)
}
for (const key in toMerge) {
const value = toMerge[key]
const existing = pkg[key]
if (isObject(value) && (key === 'dependencies' || key === 'devDependencies')) {
// use special version resolution merge
pkg[key] = mergeDeps(
flag,
existing || {},
value,
conflictDepSources,
extendOptions
)
} else if (!extendOptions.merge || !(key in pkg)) {
pkg[key] = value
} else if (Array.isArray(value) && Array.isArray(existing)) {
pkg[key] = mergeArrayWithDedupe(existing, value)
} else if (isObject(value) && isObject(existing)) {
pkg[key] = deepmerge(existing, value, { arrayMerge: mergeArrayWithDedupe })
} else {
pkg[key] = value
}
}
if (extendOptions.prune) {
pruneObject(pkg)
}
}