chore: init frontend with knowledge module
This commit is contained in:
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user