mirror of
https://github.com/Jerryplusy/crystelf-plugin.git
synced 2025-10-14 05:39:18 +00:00
115 lines
2.7 KiB
JavaScript
115 lines
2.7 KiB
JavaScript
import fs from 'fs';
|
|
import path from 'path';
|
|
import Version from '../lib/system/version.js';
|
|
|
|
const fsp = fs.promises;
|
|
const Plugin_Name = Version.name;
|
|
|
|
const _path = process.cwd();
|
|
const getRoot = (root = '') => {
|
|
if (root === 'root' || root === 'yunzai') {
|
|
root = `${_path}/`;
|
|
} else if (!root || root === '') {
|
|
root = `${_path}/plugins/${Plugin_Name}/`;
|
|
}
|
|
return root;
|
|
};
|
|
|
|
let fc = {
|
|
/**
|
|
* 递归创建目录结构
|
|
*/
|
|
async createDir(p = '', root = '', includeFile = false) {
|
|
root = getRoot(root);
|
|
const pathList = p.split('/');
|
|
let nowPath = root;
|
|
|
|
for (let idx = 0; idx < pathList.length; idx++) {
|
|
const name = pathList[idx].trim();
|
|
if (!includeFile && idx <= pathList.length - 1) {
|
|
nowPath += name + '/';
|
|
if (name) {
|
|
try {
|
|
await fsp.access(nowPath);
|
|
} catch {
|
|
await fsp.mkdir(nowPath);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 读取json文件
|
|
* @param filePath 绝对路径
|
|
* @returns {Promise<{}|any>}
|
|
*/
|
|
async readJSON(filePath) {
|
|
try {
|
|
const data = await fsp.readFile(filePath, 'utf8');
|
|
return JSON.parse(data);
|
|
} catch (e) {
|
|
return {};
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 写入
|
|
* @param filePath 绝对路径
|
|
* @param data
|
|
* @returns {Promise<void>}
|
|
*/
|
|
async writeJSON(filePath, data) {
|
|
await fsp.writeFile(filePath, JSON.stringify(data, null, 4), 'utf8');
|
|
},
|
|
|
|
/**
|
|
* 合并配置
|
|
* @param base 基准配置
|
|
* @param addon 额外配置
|
|
* @returns {*}
|
|
*/
|
|
mergeConfig(base, addon) {
|
|
const result = { ...base };
|
|
for (const [key, value] of Object.entries(addon)) {
|
|
if (!(key in result)) {
|
|
result[key] = value;
|
|
} else if (
|
|
typeof result[key] === 'object' &&
|
|
typeof value === 'object' &&
|
|
!Array.isArray(result[key]) &&
|
|
!Array.isArray(value)
|
|
) {
|
|
result[key] = this.mergeConfig(result[key], value);
|
|
}
|
|
}
|
|
return result;
|
|
},
|
|
|
|
/**
|
|
* 异步递归读取目录中的特定扩展名文件
|
|
*/
|
|
async readDirRecursive(directory, extension, excludeDir) {
|
|
const entries = await fsp.readdir(directory, { withFileTypes: true });
|
|
let files = [];
|
|
|
|
for (const entry of entries) {
|
|
if (entry.isFile()) {
|
|
if (path.extname(entry.name) === `.${extension}` && !entry.name.startsWith('_')) {
|
|
files.push(entry.name);
|
|
}
|
|
} else if (entry.isDirectory()) {
|
|
if (entry.name === excludeDir) continue;
|
|
const subFiles = await this.readDirRecursive(
|
|
path.join(directory, entry.name),
|
|
extension,
|
|
excludeDir
|
|
);
|
|
files.push(...subFiles.map((fileName) => path.join(entry.name, fileName)));
|
|
}
|
|
}
|
|
return files;
|
|
},
|
|
};
|
|
export default fc;
|