chore: init frontend with knowledge module

This commit is contained in:
2026-07-02 18:20:38 +08:00
parent fe67114be2
commit ad2e91ef30
649 changed files with 86676 additions and 1 deletions
+174
View File
@@ -0,0 +1,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;
}