import fs from 'fs' import path from 'path' const rawVersion = String(process.argv[2] || '') .trim() .replace(/^v/i, '') if (!rawVersion) { process.stderr.write('缺少版本号参数,例如:node scripts/ci/apply-version.mjs 1.2.3\n') process.exit(1) } const semverRe = /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+([0-9A-Za-z.-]+))?$/ function toSemver(version) { if (semverRe.test(version)) { return version } const parts = version.split(/[._-]/) const nums = parts.filter((p) => /^\d+$/.test(p)) const nonNums = parts.filter((p) => !/^\d+$/.test(p) && p.length > 0) let major = '0', minor = '0', patch = '0' let prerelease = '' let buildMeta = '' if (nums.length >= 3) { major = nums[0] minor = nums[1] patch = nums[2] if (nums.length > 3) { buildMeta = nums.slice(3).join('.') } } else if (nums.length === 2) { major = nums[0] minor = nums[1] patch = '0' } else if (nums.length === 1) { major = nums[0] minor = '0' patch = '0' } if (nonNums.length > 0) { if (prerelease) { prerelease += '.' + nonNums.join('.') } else { prerelease = nonNums.join('.') } } let result = `${major}.${minor}.${patch}` if (prerelease) { result += `-${prerelease}` } if (buildMeta) { result += `+${buildMeta}` } return result } const version = toSemver(rawVersion) process.stdout.write(`版本号转换: "${rawVersion}" -> "${version}"\n`) const pkgPath = path.join(process.cwd(), 'package.json') const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) pkg.version = version fs.writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`, 'utf-8')