53 lines
1.7 KiB
JavaScript
53 lines
1.7 KiB
JavaScript
import fs from 'fs';
|
|
import { parse } from 'es-module-lexer';
|
|
import { parse as vueParse } from '@vue/compiler-sfc';
|
|
import glob from 'fast-glob';
|
|
import { resolveImportPath, toRelative } from './resolve-import-path.js';
|
|
|
|
const ROUTER_MODULES = 'src/router/modules/';
|
|
const files = await glob(['src/**/*.{vue,js,ts}'], { absolute: true });
|
|
const vueFiles = new Map();
|
|
|
|
export async function findImports(targetFile, visited = new Set(), identation = '') {
|
|
if (visited.has(targetFile)) return []; // Avoid infinite loops
|
|
visited.add(targetFile);
|
|
|
|
const usageFiles = files
|
|
.filter((file) => {
|
|
let content = fs.readFileSync(file, 'utf8');
|
|
if (file.endsWith('.vue')) {
|
|
if (vueFiles.has(file)) {
|
|
content = vueFiles.get(file);
|
|
} else {
|
|
const { descriptor } = vueParse(content);
|
|
content = descriptor?.scriptSetup?.content ?? '';
|
|
vueFiles.set(file, content);
|
|
}
|
|
}
|
|
if (!content.trim()) return false;
|
|
|
|
return parse(content)[0].some((imp) => {
|
|
if (!imp?.n) return false;
|
|
return resolveImportPath(imp.n, targetFile) === targetFile;
|
|
});
|
|
})
|
|
.map((file) => toRelative(file));
|
|
|
|
let fullTree = [...usageFiles];
|
|
for (const file of usageFiles) {
|
|
if (file.startsWith(ROUTER_MODULES)) {
|
|
continue;
|
|
}
|
|
fullTree = [
|
|
...fullTree,
|
|
...(await findImports(file, visited, identation + ' ')),
|
|
];
|
|
}
|
|
|
|
return getUniques(fullTree); // Remove duplicates
|
|
}
|
|
|
|
function getUniques(array) {
|
|
return Array.from(new Set(array));
|
|
}
|