UNPKG

vite-plugin-structure-graph

Version:
115 lines (112 loc) 3.04 kB
import fs from 'fs'; import { resolve } from 'path'; let options = {}; function parser(file, pathStr) { const { ignoreDirectorys, ignoreFiles } = options; pathStr = resolve(pathStr, file); const stat = fs.lstatSync(pathStr); let children = []; if (stat.isDirectory() && !ignoreDirectorys.includes(file)) { const files = fs.readdirSync(pathStr, "utf8"); children = files.filter((item) => !ignoreFiles.includes(item)).map((item) => { return parser(item, pathStr); }); } return { name: file, type: stat.isDirectory() ? "directory" : "file", children }; } function transfer(arr, projectName) { const { ignoreDirectorys, ignoreFiles } = options; const ignoreList = ignoreDirectorys.concat(ignoreFiles); return (pathStr) => { const data = [ { name: projectName, children: [] } ]; data[0].children = arr.filter((item) => !ignoreList.includes(item)).map((item) => { const file = parser(item, pathStr); return file; }); return data; }; } function generate(arr, level = -1) { let str = ""; let mid = " "; level++; for (let i = 0, len = arr.length; i < len; i++) { let item = arr[i]; if (!level) { str += `+-- ${item.name} `; } else { str += `\xA6${mid.repeat(level)}+-- ${item.name} `; } if (item.children) { str += generate(item.children, level); } } return str; } function generateSolid(arr, level = -1) { let str = ""; let mid = "\u2502 "; let majorFlag = "\u251C\u2500"; let minorFlag = "\u2514\u2500"; level++; arr.sort((prev, next) => prev.children > next.children ? -1 : 1); for (let i = 0, len = arr.length; i < len; i++) { let item = arr[i]; if (!level) { str += `${minorFlag} ${item.name} `; } else { if (i === len - 1) { str += ` ${mid.repeat(level - 1)}${minorFlag} ${item.name} `; } else { str += ` ${mid.repeat(level - 1)}${majorFlag} ${item.name} `; } } if (item.children) { str += generateSolid(item.children, level); } } return str; } const structureGraphPlugin = (_opt) => { options = Object.assign({ targetName: "structure.txt", ignoreDirectorys: [".git", "node_modules"], ignoreFiles: [], dress: "dashed" }, _opt); return { name: "vite-plugin-structure-graph", enforce: "pre", apply: "build", buildStart: (config) => { const { targetName, dress } = options; const rootDirectory = process.cwd(); const files = fs.readdirSync(rootDirectory, "utf8"); const prjName = rootDirectory.split("/").slice(-1)[0]; const file = resolve(rootDirectory, targetName); const structData = transfer(files, prjName)(resolve(rootDirectory)); let outputStr = ""; if (dress === "dashed") { outputStr = generate(structData); } else { outputStr = generateSolid(structData); } fs.writeFileSync(file, outputStr); } }; }; export { structureGraphPlugin as default };