create-bfe-cttq
Version:
CTTQ大前端脚手架项目
90 lines (78 loc) • 3.16 kB
JavaScript
const { red, green, bold } = require("kolorist");
const semver = require("semver")
const tryGetNewerRange = require('./tryGetNewerRange')
const extractSemver = r => r.replace(/^.+#semver:/, '')
const injectSemver = (r, v) => semver.validRange(r) ? v : r.replace(/#semver:.+$/, `#semver:${v}`)
const isValidRange = range => {
if (typeof range !== 'string') {
return false
}
const isValidSemver = !!semver.validRange(range)
const isValidGitHub = range.match(/^[^/]+\/[^/]+/) != null
const isValidURI =
range.match(
/^(?:file|git|npm|git\+ssh|git\+http|git\+https|git\+file|https?):/
) != null
return isValidSemver || isValidGitHub || isValidURI
}
module.exports = function mergeDeps(generatorId, sourceDeps, depsToInject, conflictDepSources,
{
prune,
warnIncompatibleVersions,
forceOverwrite
}
) {
const result = Object.assign({}, sourceDeps)
for (const depName in depsToInject) {
const sourceRange = sourceDeps[depName]
const injectingRange = depsToInject[depName]
if (sourceRange === injectingRange) continue
if (prune && injectingRange == null) {
delete result[depName]
continue
}
if (!isValidRange(injectingRange)) {
console.warn(
`无效的版本依赖 "${depName}":\n\n` +
`- 通过 "${name}" 生成的版本信息 ${injectingRange} 无效`
)
continue
}
const sourceGeneratorId = conflictDepSources[depName]
if (!sourceRange) {
result[depName] = injectingRange
conflictDepSources[depName] = generatorId
} else {
const sourceRangeSemver = extractSemver(sourceRange)
const injectingRangeSemver = extractSemver(injectingRange)
const r = tryGetNewerRange(sourceRangeSemver, injectingRangeSemver)
const didGetNewer = !!r
if (forceOverwrite) {
result[depName] = injectingRange
} else if (didGetNewer) {
result[depName] = injectSemver(injectingRange, r)
} else {
result[depName] = sourceRange
}
if (result[depName] === injectingRange) {
conflictDepSources[depName] = generatorId
}
if (
warnIncompatibleVersions &&
(!semver.validRange(sourceRangeSemver) ||
!semver.validRange(injectingRangeSemver) ||
!semver.intersects(sourceRangeSemver, injectingRangeSemver))
) {
console.warn(
`存在冲突的依赖 "${depName}":\n\n` +
`- ${sourceRange} 通过插件 "${bold(sourceGeneratorId)}" 生成\n` +
`- ${injectingRange} 通过插件 "${bold(generatorId)} 生成"\n\n` +
`使用${(!forceOverwrite && didGetNewer) ? `更新的` : ``}版本:(${
result[depName]
}), 但是可能存在问题。`
)
}
}
}
return result
}