import { readFile, writeFile } from 'node:fs/promises' import { join } from 'node:path' import { fileURLToPath } from 'node:url' import { XMLParser, XMLBuilder } from 'fast-xml-parser' import consola from 'consola' // 获取当前文件的目录路径 const __dirname = fileURLToPath(new URL('.', import.meta.url)) // 获取项目根目录路径 const root = join(__dirname, '..') // 定义配置文件的类型接口 interface AppConfig { name: string // 应用名称 version: string // 应用版本号 description: string // 应用描述 author: { // 作者信息 name: string // 作者名称 email: string // 作者邮箱 } homeUrl: string // 应用主页 URL appId: string // 应用 ID packType: 'debug' | 'release' // 打包类型 } /** * 更新 config.xml 文件的配置 * @param config 应用配置对象 */ async function updateConfigXml(config: AppConfig) { // 构建 config.xml 的完整路径 const xmlPath = join(root, 'config.xml') try { // 读取现有的 config.xml 文件内容 const xmlContent = await readFile(xmlPath, 'utf-8') // 创建 XML 解析器实例,配置属性处理选项 const parser = new XMLParser({ ignoreAttributes: false, // 不忽略 XML 属性 attributeNamePrefix: '@_' // 属性名称前缀 }) // 解析 XML 内容为 JavaScript 对象 const xmlObj = parser.parse(xmlContent) // 更新配置信息 xmlObj.widget['@_version'] = config.version // 更新版本号 xmlObj.widget['@_id'] = config.appId // 更新应用 ID xmlObj.widget.name = config.name // 更新应用名称 xmlObj.widget.description = config.description // 更新应用描述 xmlObj.widget.author = { '#text': config.author.name, // 作者名称作为节点文本 '@_email': config.author.email // 邮箱作为属性 } // 更新或添加 content 标签的 src 属性 if (!xmlObj.widget.content) { xmlObj.widget.content = { '@_src': config.homeUrl } } else { xmlObj.widget.content['@_src'] = config.homeUrl } // 创建 XML 构建器实例 const builder = new XMLBuilder({ ignoreAttributes: false, attributeNamePrefix: '@_', format: true // 启用格式化输出 }) // 将对象转换回 XML 字符串 const newXmlContent = builder.build(xmlObj) // 将更新后的内容写回文件 await writeFile(xmlPath, newXmlContent, 'utf-8') consola.success('config.xml has been updated') } catch (err) { consola.error('Failed to update config.xml:', err) process.exit(1) } } /** * 主函数:读取配置并执行更新 */ async function main() { try { // 读取 config.json 配置文件 const configPath = join(root, 'config.json') const configContent = await readFile(configPath, 'utf-8') const config: AppConfig = JSON.parse(configContent) // 使用配置更新 config.xml await updateConfigXml(config) // TODO: 这里可以添加其他构建步骤 consola.success('Build completed successfully') } catch (err) { consola.error('Build failed:', err) process.exit(1) } } // 执行主函数 main()