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, targetFile]); // Remove duplicates } function getUniques(array) { return Array.from(new Set(array)); }