155 lines
3.6 KiB
JavaScript
155 lines
3.6 KiB
JavaScript
// UTS Android 兼容性修复脚本
|
|
// 该脚本用于批量修复 pages/ec/ 下所有 .uvue 文件的 UTS Android 兼容性问题
|
|
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
// 定义修复规则
|
|
const fixRules = [
|
|
// 1. 数组类型从 Type[] 改为 Array<Type>
|
|
{
|
|
pattern: /ref<(\w+)\[\]>/g,
|
|
replacement: 'ref<Array<$1>>'
|
|
},
|
|
{
|
|
pattern: /computed<(\w+)\[\]>/g,
|
|
replacement: 'computed<Array<$1>>'
|
|
},
|
|
{
|
|
pattern: /: (\w+)\[\]/g,
|
|
replacement: ': Array<$1>'
|
|
},
|
|
|
|
// 2. 可选属性从 ? 改为 | null
|
|
{
|
|
pattern: /(\w+)\?:\s*(\w+)/g,
|
|
replacement: '$1: $2 | null'
|
|
},
|
|
|
|
// 3. 空值判断从 == null 改为 === null
|
|
{
|
|
pattern: /== null/g,
|
|
replacement: '=== null'
|
|
},
|
|
{
|
|
pattern: /!= null/g,
|
|
replacement: '!== null'
|
|
},
|
|
|
|
// 4. 逻辑判断从 if (variable) 改为 if (variable !== null)
|
|
{
|
|
pattern: /if\s*\(\s*(\w+)\s*\)/g,
|
|
replacement: 'if ($1 !== null)'
|
|
},
|
|
|
|
// 5. for 循环的 i 添加类型
|
|
{
|
|
pattern: /for\s*\(\s*let\s+i\s*=/g,
|
|
replacement: 'for (let i: Int ='
|
|
},
|
|
|
|
// 6. CSS 中的 vh 单位替换为固定像素
|
|
{
|
|
pattern: /min-height:\s*100vh/g,
|
|
replacement: 'min-height: 600px'
|
|
},
|
|
{
|
|
pattern: /height:\s*100vh/g,
|
|
replacement: 'height: 600px'
|
|
},
|
|
|
|
// 7. 删除不支持的 CSS 属性
|
|
{
|
|
pattern: /gap:\s*[^;]+;/g,
|
|
replacement: ''
|
|
},
|
|
{
|
|
pattern: /display:\s*grid[^;]*;/g,
|
|
replacement: 'display: flex;'
|
|
}
|
|
];
|
|
|
|
// 处理单个文件
|
|
function processFile(filePath) {
|
|
try {
|
|
let content = fs.readFileSync(filePath, 'utf8');
|
|
let modified = false;
|
|
|
|
// 应用所有修复规则
|
|
fixRules.forEach(rule => {
|
|
const newContent = content.replace(rule.pattern, rule.replacement);
|
|
if (newContent !== content) {
|
|
content = newContent;
|
|
modified = true;
|
|
}
|
|
});
|
|
|
|
// 如果文件被修改,写回文件
|
|
if (modified) {
|
|
fs.writeFileSync(filePath, content, 'utf8');
|
|
console.log(`✅ 已修复: ${filePath}`);
|
|
return true;
|
|
} else {
|
|
console.log(`⏭️ 无需修改: ${filePath}`);
|
|
return false;
|
|
}
|
|
} catch (error) {
|
|
console.error(`❌ 处理文件失败 ${filePath}:`, error.message);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// 递归处理目录
|
|
function processDirectory(dirPath) {
|
|
const items = fs.readdirSync(dirPath);
|
|
let totalFiles = 0;
|
|
let modifiedFiles = 0;
|
|
|
|
items.forEach(item => {
|
|
const fullPath = path.join(dirPath, item);
|
|
const stat = fs.statSync(fullPath);
|
|
|
|
if (stat.isDirectory()) {
|
|
const [subTotal, subModified] = processDirectory(fullPath);
|
|
totalFiles += subTotal;
|
|
modifiedFiles += subModified;
|
|
} else if (item.endsWith('.uvue')) {
|
|
totalFiles++;
|
|
if (processFile(fullPath)) {
|
|
modifiedFiles++;
|
|
}
|
|
}
|
|
});
|
|
|
|
return [totalFiles, modifiedFiles];
|
|
}
|
|
|
|
// 主函数
|
|
function main() {
|
|
const targetDir = path.join(__dirname, 'pages', 'ec');
|
|
|
|
if (!fs.existsSync(targetDir)) {
|
|
console.error('❌ pages/ec 目录不存在');
|
|
return;
|
|
}
|
|
|
|
console.log('🚀 开始修复 UTS Android 兼容性问题...');
|
|
console.log(`📂 目标目录: ${targetDir}`);
|
|
|
|
const [totalFiles, modifiedFiles] = processDirectory(targetDir);
|
|
|
|
console.log('\n📊 修复完成统计:');
|
|
console.log(`📄 总文件数: ${totalFiles}`);
|
|
console.log(`✅ 修改文件数: ${modifiedFiles}`);
|
|
console.log(`⏭️ 无需修改: ${totalFiles - modifiedFiles}`);
|
|
|
|
if (modifiedFiles > 0) {
|
|
console.log('\n🎉 UTS Android 兼容性修复完成!');
|
|
} else {
|
|
console.log('\n✨ 所有文件已符合 UTS Android 标准');
|
|
}
|
|
}
|
|
|
|
// 运行脚本
|
|
main();
|