实现示例type Engines = { node?: string; npm?: string }
function semverRangeValid(r?: string): boolean { return !!r && /^(\^|~)?\d+\.\d+\.\d+$/.test(r) }
function matchRange(range: string, v: string): boolean {
const m = /^(\^|~)?(\d+)\.(\d+)\.(\d+)$/.exec(range)
if (!m) return false
const op = m[1] || ''
const R = { M: parseInt(m[2],10), m: parseInt(m[3],10), p: parseInt(m[4],10) }
const V = v.split('.').map(x => parseInt(x,10))
if (op === '^') return V[0] === R.M && (V[1] > R.m || (V[1] === R.m && V[2] >= R.p))
if (op === '~') return V[0] === R.M && V[1] === R.m && V[2] >= R.p
return V[0] === R.M && V[1] === R.m && V[2] === R.p
}
function evaluate(eng: Engines, env: { node: string; npm: string }): { ok: boolean; errors: string[] } {
const errors: string[] = []
if (eng.node && (!semverRangeValid(eng.node) || !matchRange(eng.node, env.node))) errors.push('node')
if (eng.npm && (!semverRangeValid(eng.npm) || !matchRange(eng.npm, env.npm))) errors.push('npm')
return { ok: errors.length === 0, errors }
}
审计与CI门禁记录 `engines` 与环境版本;不匹配阻断并输出修复建议。生产环境仅在受控版本窗口内运行。

发表评论 取消回复