Skip to content

Instantly share code, notes, and snippets.

@rjdestigter
Created May 3, 2018 19:16
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rjdestigter/e673ccfcfff921d40d26246bfbb4ca60 to your computer and use it in GitHub Desktop.
Save rjdestigter/e673ccfcfff921d40d26246bfbb4ca60 to your computer and use it in GitHub Desktop.
Double check if lerna managed packages are up-to-date with versions and don't conflict with npm
const util = require('util')
const exec = util.promisify(require('child_process').exec)
const fs = require('fs')
const figures = require('figures')
const ansi = require('ansicolor').nice
const cmdList = 'find ./packages -type f -name package.json'
async function getPathOfPackageJsons() {
const { stdout, stderr } = await exec(cmdList)
if (stdout) {
const list = stdout.split('\n').filter(path => path && !path.match(/node_modules/))
return list
}
throw Error('Unable to collection package.json file paths.')
}
const getPackageJsons = async () => {
const list = await getPathOfPackageJsons()
return list.reduce((acc, fileName) => {
const file = fs.readFileSync(fileName, 'utf8')
const json = JSON.parse(file)
acc[json.name] = json
return acc
}, {})
}
async function main() {
const packages = await getPackageJsons()
// Check dependencies
Object.keys(packages).forEach(name => {
const pckg = packages[name]
const deps = pckg.dependencies
// console.log(pckg)
if (deps) {
console.log(ansi.lightCyan(`${pckg.name}`))
Object.keys(deps)
.filter(dep => dep.match(/@NAMEOFYOURORGINISATION/))
.forEach(dep => {
const used = deps[dep]
const av = packages[dep].version
const match = used.match(new RegExp(av))
if (!match) {
console.log(`${pckg.name} depends on ${dep} and is using ${used} but ${av} is available.`)
} else {
console.log(`${dep} ` + ansi.green(figures.tick))
}
})
console.log('\n')
}
})
console.log('\n\n')
const npmChecks = Object.keys(packages).map(name => {
const pckg = packages[name]
const version = pckg.version
return new Promise(async resolve => {
const { stdout, stderr } = exec(`npm view ${name} version`)
if (stdout && stdout !== version) {
resolve(
ansi.red('!!') +
`${pckg.name} has version ${version} but the published version is ${stdout}.` +
ansi.red(figures.cross)
)
} else {
resolve(`${pckg.name} ` + ansi.green(figures.tick))
}
resolve('')
})
})
const checks = await Promise.all(npmChecks)
const list = checks.filter(c => !!c).forEach(logItem => console.log(logItem))
}
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment