| | |
| | | export function rootDir(path: string) { |
| | | switch (config.type) { |
| | | case "app": |
| | | case "uniapp-x": |
| | | return join(process.env.UNI_INPUT_DIR!, path); |
| | | |
| | | default: |
| | |
| | | export function readFile(path: string, json?: boolean) { |
| | | try { |
| | | const content = fs.readFileSync(path, "utf8"); |
| | | return json ? JSON.parse(removeJsonComments(content)) : content; |
| | | return json |
| | | ? JSON.parse(content.replace(/\/\/.*$/gm, "").replace(/\/\*[\s\S]*?\*\//g, "")) |
| | | : content; |
| | | } catch (err) {} |
| | | |
| | | return ""; |
| | | } |
| | | |
| | | // 安全地移除JSON中的注释 |
| | | function removeJsonComments(content: string): string { |
| | | let result = ""; |
| | | let inString = false; |
| | | let stringChar = ""; |
| | | let escaped = false; |
| | | let i = 0; |
| | | |
| | | while (i < content.length) { |
| | | const char = content[i]; |
| | | const nextChar = content[i + 1]; |
| | | |
| | | // 处理字符串状态 |
| | | if (!inString && (char === '"' || char === "'")) { |
| | | inString = true; |
| | | stringChar = char; |
| | | result += char; |
| | | } else if (inString && char === stringChar && !escaped) { |
| | | inString = false; |
| | | stringChar = ""; |
| | | result += char; |
| | | } else if (inString) { |
| | | // 在字符串内,直接添加字符 |
| | | result += char; |
| | | escaped = char === "\\" && !escaped; |
| | | } else { |
| | | // 不在字符串内,检查注释 |
| | | if (char === "/" && nextChar === "/") { |
| | | // 单行注释,跳过到行尾 |
| | | while (i < content.length && content[i] !== "\n") { |
| | | i++; |
| | | } |
| | | if (i < content.length) { |
| | | result += content[i]; // 保留换行符 |
| | | } |
| | | } else if (char === "/" && nextChar === "*") { |
| | | // 多行注释,跳过到 */ |
| | | i += 2; |
| | | while (i < content.length - 1) { |
| | | if (content[i] === "*" && content[i + 1] === "/") { |
| | | i += 2; |
| | | break; |
| | | } |
| | | i++; |
| | | } |
| | | continue; |
| | | } else { |
| | | result += char; |
| | | escaped = false; |
| | | } |
| | | } |
| | | |
| | | i++; |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | |
| | | // 写入文件 |
| | |
| | | |
| | | export function success(message: string) { |
| | | console.log("\x1B[32m%s\x1B[0m", message); |
| | | } |
| | | |
| | | /** |
| | | * 比较两个版本号 |
| | | * @param version1 版本号1 (如: "1.2.3") |
| | | * @param version2 版本号2 (如: "1.2.4") |
| | | * @returns 1: version1 > version2, 0: 相等, -1: version1 < version2 |
| | | */ |
| | | export function compareVersion(version1: string, version2: string): number { |
| | | const v1Parts = version1.split(".").map(Number); |
| | | const v2Parts = version2.split(".").map(Number); |
| | | |
| | | const maxLength = Math.max(v1Parts.length, v2Parts.length); |
| | | |
| | | for (let i = 0; i < maxLength; i++) { |
| | | const v1Part = v1Parts[i] || 0; |
| | | const v2Part = v2Parts[i] || 0; |
| | | |
| | | if (v1Part > v2Part) return 1; |
| | | if (v1Part < v2Part) return -1; |
| | | } |
| | | |
| | | return 0; |
| | | } |