Files
gva/web/vitePlugin/componentName/index.js
PiexlMax(奇淼 c20ea7e030 publish: 发布2.7.4版本Beta (#1880)
* 媒体库增加批量导入URL

* fix 描述错误

* feature: 自动化代码方法支持增加方法描述

* update: 更新依赖,升级为最新版本

* feature: 自动化代码预览部分支持黑夜模式

* fixed: 修复keepalive上线后失效的bug

* feature: 增加自动化基础模板功能

* feature: 增加自动化基础模板功能

* 将用户配置保存到数据库,刷新或者异地登录配置不丢失

* update: 清除无用的userinfo配置信息

* fixed: 清理开发阶段页面无端进入404的bug

* feature: 前端主题配置跟随用户,不再单独设置json编译生效。

* feature: 增加个人中心配置兼容性

* fix(package): 包名设置为中文会导致无法自动生成代码,禁止包名设置为中文

* feature: 格式化代码

* feature: 对严格模式新建根角色进行调整。

* feature: 版本变更为2.7.4

---------

Co-authored-by: sliboy <34034053+sliboy@users.noreply.github.com>
Co-authored-by: ba0ch3ng <ba0ch3ng@foxmail.com>
Co-authored-by: task <121913992@qq.com>
Co-authored-by: task <ms.yangdan@gmail.com>
Co-authored-by: 爱丽-黑子 <62006632+ailiheizi@users.noreply.github.com>
Co-authored-by: sliboy <sliboy@hotmail.com>
2024-09-12 20:48:03 +08:00

75 lines
2.3 KiB
JavaScript

import fs from 'fs';
import path from 'path';
// 递归获取目录下所有的 .vue 文件
const getAllVueFiles = (dir, fileList = []) => {
const files = fs.readdirSync(dir);
files.forEach(file => {
const filePath = path.join(dir, file);
if (fs.statSync(filePath).isDirectory()) {
getAllVueFiles(filePath, fileList);
} else if (filePath.endsWith('.vue')) {
fileList.push(filePath);
}
});
return fileList;
}
// 从 .vue 文件内容中提取组件名称
const extractComponentName = (fileContent) => {
const regex = /defineOptions\(\s*{\s*name:\s*["']([^"']+)["']/;
const match = fileContent.match(regex);
return match ? match[1] : null;
}
// Vite 插件定义
const vueFilePathPlugin = (outputFilePath) => {
let root;
const generatePathNameMap = () => {
const vueFiles = [
...getAllVueFiles(path.join(root, 'src/view')),
...getAllVueFiles(path.join(root, 'src/plugin'))
];
const pathNameMap = vueFiles.reduce((acc, filePath) => {
const content = fs.readFileSync(filePath, 'utf-8');
const componentName = extractComponentName(content);
if (componentName) {
let relativePath ="/" + path.relative(root, filePath).replace(/\\/g, '/');
acc[relativePath] = componentName;
}
return acc;
}, {});
const outputContent = JSON.stringify(pathNameMap, null, 2);
fs.writeFileSync(outputFilePath, outputContent);
};
const watchDirectoryChanges = () => {
const watchDirectories = [path.join(root, 'src/view'), path.join(root, 'src/plugin')];
watchDirectories.forEach(dir => {
fs.watch(dir, { recursive: true }, (eventType, filename) => {
if (filename) {
generatePathNameMap();
}
});
});
};
return {
name: 'vue-file-path-plugin',
configResolved(resolvedConfig) {
root = resolvedConfig.root;
},
buildEnd() {
generatePathNameMap();
if (process.env.NODE_ENV === 'development') {
watchDirectoryChanges();
}
},
};
}
export default vueFilePathPlugin