#!/usr/bin/env node
|
import { readFileSync, writeFileSync, readdirSync, statSync } from 'node:fs';
|
import { join, relative, dirname } from 'node:path';
|
|
const projectRoot = 'D:/beforeProject/yudao-ui-admin-vben/web-antd-standalone';
|
|
// 递归获取所有 .ts, .tsx, .vue, .js 文件
|
function getAllFiles(dir, files = []) {
|
const entries = readdirSync(dir);
|
for (const entry of entries) {
|
const fullPath = join(dir, entry);
|
if (statSync(fullPath).isDirectory()) {
|
if (!['node_modules', 'dist', '.git'].includes(entry)) {
|
getAllFiles(fullPath, files);
|
}
|
} else if (/\.(ts|tsx|vue|js|mjs|cjs)$/.test(entry)) {
|
files.push(fullPath);
|
}
|
}
|
return files;
|
}
|
|
// 计算从源文件到目标包的相对路径
|
function getRelativePath(fromFile, packageName) {
|
const fromDir = dirname(fromFile);
|
|
// 映射包名到目录路径
|
const packagePaths = {
|
'@vben/access': 'src/packages/effects/access/src',
|
'@vben/common-ui': 'src/packages/effects/common-ui/src',
|
'@vben/hooks': 'src/packages/effects/hooks/src',
|
'@vben/layouts': 'src/packages/effects/layouts/src',
|
'@vben/plugins': 'src/packages/effects/plugins/src',
|
'@vben/request': 'src/packages/effects/request/src',
|
'@vben/constants': 'src/packages/constants/src',
|
'@vben/icons': 'src/packages/icons/src',
|
'@vben/locales': 'src/packages/locales/src',
|
'@vben/preferences': 'src/packages/preferences/src',
|
'@vben/stores': 'src/packages/stores/src',
|
'@vben/styles': 'src/packages/styles/src',
|
'@vben/types': 'src/packages/types/src',
|
'@vben/utils': 'src/packages/utils/src',
|
'@vben-core/composables': 'src/packages/@core/composables/src',
|
'@vben-core/design': 'src/packages/@core/base/design/src',
|
'@vben-core/form-ui': 'src/packages/@core/ui-kit/form-ui/src',
|
'@vben-core/icons': 'src/packages/@core/base/icons/src',
|
'@vben-core/layout-ui': 'src/packages/@core/ui-kit/layout-ui/src',
|
'@vben-core/menu-ui': 'src/packages/@core/ui-kit/menu-ui/src',
|
'@vben-core/popup-ui': 'src/packages/@core/ui-kit/popup-ui/src',
|
'@vben-core/preferences': 'src/packages/@core/preferences/src',
|
'@vben-core/shadcn-ui': 'src/packages/@core/ui-kit/shadcn-ui/src',
|
'@vben-core/shared': 'src/packages/@core/base/shared/src',
|
'@vben-core/tabs-ui': 'src/packages/@core/ui-kit/tabs-ui/src',
|
'@vben-core/typings': 'src/packages/@core/base/typings/src',
|
'@vben/vite-config': 'src/internal/vite-config/src',
|
'@vben/node-utils': 'src/internal/node-utils/src',
|
'@vben/tailwind-config': 'src/internal/tailwind-config/src',
|
'@vben/tsconfig': 'src/internal/tsconfig',
|
};
|
|
const targetPath = packagePaths[packageName];
|
if (!targetPath) return null;
|
|
const relPath = relative(fromDir, join(projectRoot, targetPath));
|
return relPath.startsWith('.') ? relPath : './' + relPath;
|
}
|
|
// 处理单个文件
|
function processFile(filePath) {
|
let content = readFileSync(filePath, 'utf-8');
|
let modified = false;
|
|
// 替换 @vben/* 和 @vben-core/* 导入
|
const importRegex = /from\s+['"](@vben(?:-core)?\/[^'"]+)['"]/g;
|
const importRegex2 = /import\s*\(\s*['"](@vben(?:-core)?\/[^'"]+)['"]\s*\)/g;
|
|
content = content.replace(importRegex, (match, packageName) => {
|
const relativePath = getRelativePath(filePath, packageName);
|
if (relativePath) {
|
modified = true;
|
return `from '${relativePath}'`;
|
}
|
return match;
|
});
|
|
content = content.replace(importRegex2, (match, packageName) => {
|
const relativePath = getRelativePath(filePath, packageName);
|
if (relativePath) {
|
modified = true;
|
return `import('${relativePath}')`;
|
}
|
return match;
|
});
|
|
if (modified) {
|
writeFileSync(filePath, content);
|
console.log(`Updated: ${filePath}`);
|
}
|
|
return modified;
|
}
|
|
// 主函数
|
const srcDir = join(projectRoot, 'src');
|
const files = getAllFiles(srcDir);
|
|
let updatedCount = 0;
|
for (const file of files) {
|
if (processFile(file)) {
|
updatedCount++;
|
}
|
}
|
|
console.log(`\nTotal files updated: ${updatedCount}`);
|