Skip to content

Instantly share code, notes, and snippets.

@lund0n
Created August 16, 2024 03:07
Show Gist options
  • Select an option

  • Save lund0n/bd68461b14bee20c0a2570b9f8f04416 to your computer and use it in GitHub Desktop.

Select an option

Save lund0n/bd68461b14bee20c0a2570b9f8f04416 to your computer and use it in GitHub Desktop.
Follow the peer deps down each package in a monorepo
#!/usr/bin/env node
// NOTE: I forgot to have it traverse dependencies as well as dev dependencies.
// Really, it should check both if we're going to have a clean set of peer dependencies for a published package.
const { getPackages } = require('@manypkg/get-packages')
const process = require('node:process')
const path = require('node:path')
const ROOT_DIR = process.cwd()
function getPeerDependencies(depName, dir, accumPeerDeps, indent = '') {
const location = require.resolve(`${depName}/package.json`, {
paths: [dir],
})
const { name, peerDependencies = {} } = require(location)
const peerDeps = Object.entries(peerDependencies)
for (const [dep, version] of peerDeps) {
accumPeerDeps.add(`${dep}:${version}`)
console.log(`${indent} - ${dep}:${version}`)
getPeerDependencies(
dep,
path.dirname(location),
accumPeerDeps,
indent + ' '
)
}
}
async function run() {
const { packages } = await getPackages(ROOT_DIR)
for (const pkg of packages) {
const { dir, packageJson } = pkg
const { name, peerDependencies = {} } = packageJson
console.log(`-- ${name} --`)
const peerDeps = Object.entries(peerDependencies)
const accumPeerDeps = new Set()
const indent = ''
for (const [dep, version] of peerDeps) {
accumPeerDeps.add(`${dep}:${version}`)
console.log(`${indent} - ${dep}:${version}`)
getPeerDependencies(dep, dir, accumPeerDeps, indent + ' ')
}
console.log(`** ACCUMULATED PEER DEPS **`)
for (const accumDep of accumPeerDeps) {
console.log(` * ${accumDep}`)
}
}
}
run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment