UNPKG

create-bfe-cttq

Version:

CTTQ大前端脚手架项目

90 lines (78 loc) 3.16 kB
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 }