Description
It would be wonderful for the repo-visualizer to have a CLI version, so that it can used locally or in other environments.
Simply put, all the code is already written in https://github.com/githubocto/repo-visualizer/blob/main/src/index.jsx
Just make another version without the actions code, bundle, and publish. It is fairly straightforward with https://www.npmjs.com/package/tsup and https://www.npmjs.com/package/commander
For example:
import fs from "fs-extra";
import React from "react";
import ReactDOMServer from "react-dom/server.js";
import { Tree } from "../vendor/repo-visualizer/src/Tree";
import { processDir } from "../vendor/repo-visualizer/src/process-dir.js";
export const main = async () => {
const rootPath = ""; // Micro and minimatch do not support paths starting with ./
const maxDepth = 9;
const colorEncoding = "type";
const excludedPathsString =
"node_modules,bower_components,dist,out,build,eject,.next,.netlify,.yarn,.git,.vscode,package-lock.json,yarn.lock";
const excludedPaths = excludedPathsString.split(",").map((str) => str.trim());
// Split on semicolons instead of commas since ',' are allowed in globs, but ';' are not + are not permitted in file/folder names.
// const excludedGlobsString =
// ""
// "frontend/*.spec.js;**/*.{png,jpg};**/!(*.module).ts";
// const excludedGlobs = excludedGlobsString.split(";");
const excludedGlobs = [
"**/node_modules/**",
"**/dist/**",
"**/out/**",
"**/build/**",
"**/.cache/**",
"**/.next/**",
"**/.keystone/**",
"**/.vercel/**",
"**/package-lock.json",
"**/*.bundled_*.mjs",
"**/tmp/**",
"**/vendor/**",
"**/.DS_Store/**",
];
const data = await processDir(rootPath, excludedPaths, excludedGlobs);
const componentCodeString = ReactDOMServer.renderToStaticMarkup(
// @ts-ignore
<Tree data={data} maxDepth={+maxDepth} colorEncoding={colorEncoding} />,
);
const outputFile = "./repo-visualization.svg";
await fs.outputFile(outputFile, componentCodeString);
};
and
import { Command } from "commander";
import { readPackageUpSync } from "read-pkg-up";
import { main } from "../core";
const pkg = readPackageUpSync({ cwd: __dirname })!.packageJson;
export const program = new Command()
.name(pkg.name)
.description(pkg.description || pkg.name)
.version(pkg.version, "-v, --version")
.action((options: { version?: boolean }) => {
if (options.version) {
console.log(pkg.version);
} else {
main();
}
});
You may need to debug the react bundling following tips from egoist/tsup#579 and egoist/tsup#589 and replace lodash
with lodash-es
I didn’t link together the options, but commanderjs can support them
Anyway, my rough proof of concept works, but I would much rather see the cli live here in the original, than in a fork.