vite-plugin-structure-graph
Version:
A vite plugin to generate project structure graph
115 lines (112 loc) • 3.04 kB
JavaScript
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 };