Use npm show <pkg> version instead of outdated

npm outdated would error out for defined local packages such as
@rondo.dev/*
This commit is contained in:
Jerko Steiner 2019-10-31 18:39:46 -04:00
parent a39833eece
commit 11a29985eb

View File

@ -15,74 +15,56 @@ export interface Package {
devDependencies?: Record<string, string>
}
function findOutdated(cwd: string): Record<string, Outdated> {
try {
const result = cp.execFileSync('npm', ['outdated', '--json'], {
cwd,
encoding: 'utf8',
})
return result === '' ? {} : JSON.parse(result)
} catch (err) {
// npm outdated will exit with code 1 if there are outdated dependencies
return JSON.parse(err.stdout)
}
function readPackage(dir: string): Package {
const pkgFile = path.join(dir, 'package.json')
return JSON.parse(fs.readFileSync(pkgFile, 'utf8'))
}
function updateDependency(
pkg: Package,
key: 'dependencies' | 'devDependencies',
name: string,
function writePackage(dir: string, contents: Package) {
const pkgFile = path.join(dir, 'package.json')
fs.writeFileSync(pkgFile, JSON.stringify(contents, null, ' '))
}
function findLatestVersions(
deps: Record<string, string>,
prefix: string,
version: Outdated,
): Package {
const deps = pkg[key]
if (!deps || !deps[name] || version.wanted === version.latest) {
return pkg
}
info(' [%s] %s %s ==> %s', key, name, version.wanted, version.latest)
return {
...pkg,
[key]: {
...deps,
[name]: prefix + version.latest,
},
}
): Record<string, string> {
const latestVersions = Object.keys(deps)
.filter(depName => !depName.startsWith('@rondo.dev'))
.reduce((latestVersions, depName) => {
const version = prefix +
cp.execFileSync('npm', ['info', depName, 'version']).toString().trim()
info(' %s (current: %s, latest: %s)', depName, deps[depName], version)
latestVersions[depName] = version
return latestVersions
}, deps)
return latestVersions
}
export async function update(...argv: string[]) {
const {parse} = argparse({
dirs: arg('string[]', {positional: true, default: ['.'], n: '+'}),
dryRun: arg('boolean', {alias: 'd', default: false}),
prefix: arg('string', {default: '^'}),
})
const {dirs, prefix} = parse(argv)
const {dirs, dryRun, prefix} = parse(argv)
let updates = 0
for (const dir of dirs) {
info(dir)
const outdatedByName = findOutdated(dir)
const pkgFile = path.join(dir, 'package.json')
const pkg: Package = JSON.parse(fs.readFileSync(pkgFile, 'utf8'))
let pkgUpdate: Package = pkg
// tslint:disable-next-line
for (const name in outdatedByName) {
const outdated = outdatedByName[name]
pkgUpdate = updateDependency(
pkgUpdate, 'dependencies', name, prefix, outdated)
pkgUpdate = updateDependency(
pkgUpdate, 'devDependencies', name, prefix, outdated)
const pkg = readPackage(dir)
if (pkg.dependencies) {
pkg.dependencies = findLatestVersions(pkg.dependencies, prefix)
}
if (pkgUpdate !== pkg) {
updates += 1
if (pkg.devDependencies) {
pkg.devDependencies = findLatestVersions(pkg.devDependencies, prefix)
}
if (!dryRun) {
info('Writing updates...')
fs.writeFileSync(pkgFile, JSON.stringify(pkgUpdate, null, ' '))
writePackage(dir , pkg)
}
}
if (updates) {
info('Done! Do not forget to run npm install!')
}
info('Done! Do not forget to run npm install!')
}
update.help = 'Update all dependencies to the latest versions'