wangzhibo
2026-07-16 b57020623cf0c946706573bf102e548c3a544423
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
import fs from "fs";
import { join } from "path";
import { config } from "../config";
import prettier from "prettier";
 
// 根目录
export function rootDir(path: string) {
    switch (config.type) {
        case "app":
        case "uniapp-x":
            return join(process.env.UNI_INPUT_DIR!, path);
 
        default:
            return join(process.cwd(), path);
    }
}
 
// 首字母大写
export function firstUpperCase(value: string): string {
    return value.replace(/\b(\w)(\w*)/g, function ($0, $1, $2) {
        return $1.toUpperCase() + $2;
    });
}
 
// 横杠转驼峰
export function toCamel(str: string): string {
    return str.replace(/([^-])(?:-+([^-]))/g, function ($0, $1, $2) {
        return $1 + $2.toUpperCase();
    });
}
 
// 创建目录
export function createDir(path: string, recursive?: boolean) {
    try {
        if (!fs.existsSync(path)) fs.mkdirSync(path, { recursive });
    } catch (err) {}
}
 
// 读取文件
export function readFile(path: string, json?: boolean) {
    try {
        const content = fs.readFileSync(path, "utf8");
        return json ? JSON.parse(removeJsonComments(content)) : 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 writeFile(path: string, data: any) {
    try {
        return fs.writeFileSync(path, data);
    } catch (err) {}
 
    return "";
}
 
// 解析body
export function parseJson(req: any): Promise<any> {
    return new Promise((resolve) => {
        let d = "";
        req.on("data", function (chunk: any) {
            d += chunk;
        });
        req.on("end", function () {
            try {
                resolve(JSON.parse(d));
            } catch {
                resolve({});
            }
        });
    });
}
 
// 格式化内容
export function formatContent(content: string, options?: prettier.Options) {
    return prettier.format(content, {
        parser: "typescript",
        useTabs: true,
        tabWidth: 4,
        endOfLine: "lf",
        semi: true,
        ...options,
    });
}
 
export function error(message: string) {
    console.log("\x1B[31m%s\x1B[0m", message);
}
 
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;
}