graph-dependencies.ts•1.45 kB
import { readdirSync, statSync } from 'fs'
import { digraph } from 'graphviz-mit'
import { join } from 'path'
const getDirectories = (path: string) => {
const packages = readdirSync(path).filter((any) => statSync(join(path, any)).isDirectory())
const result = packages.map((pkg) => ({
dirName: pkg,
path: join('..', path, pkg),
jsonPath: join('..', path, pkg, './package.json'),
}))
return result
}
const getKeys = (obj: any, name) => {
if (obj && obj[name]) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
return Object.keys(obj[name]).filter((name) => name.includes('prisma'))
}
return []
}
function generateGraph(
packages: {
dirName: string
path: string
jsonPath: string
}[],
type: 'dependencies' | 'devDependencies' | 'peerDependencies',
) {
const g = digraph('G')
g.set('splines', 'ortho')
packages?.forEach((pkg) => {
try {
const json = require(pkg.jsonPath)
g.addNode(json.name, { shape: 'box' })
const keys = getKeys(json, type)
keys.forEach((key) => {
g.addEdge(json.name, key, {})
})
} catch {}
})
g.output('png', `./graphs/${type}.png`, (err, stdout, stderr) => {
console.log(stderr)
})
}
function main() {
const packages = getDirectories('./packages')
generateGraph(packages, 'dependencies')
generateGraph(packages, 'devDependencies')
generateGraph(packages, 'peerDependencies')
}
void main()