scripts/bump.js (79 lines of code) (raw):

#!/usr/bin/env node const fs = require('fs'); const { resolve } = require('path'); const glob = require('glob'); const { execSync } = require('child_process'); const packageJsonFiles = glob.sync(resolve('**/package.json'), { ignore: '**/node_modules/**' }); function getVersions(packageName) { const versions = execSync(`npm v ${packageName} dist-tags --json`, { encoding: 'utf8' }); return versions ? JSON.parse(versions) : null; } function getTargetVersion(packageAndVersion, moduleName) { const [, targetVersion] = packageAndVersion; let version = targetVersion; if (targetVersion === 'beta' || targetVersion === 'latest') { const versions = getVersions(moduleName); version = versions && versions[targetVersion]; } return version; } function bumpPackages(packages) { for (const file of packageJsonFiles) { let changed = false; let content = JSON.parse(fs.readFileSync(file, 'utf8')); const dependencies = content.dependencies || {}; const devDependencies = content.devDependencies || {}; const peerDependencies = content.peerDependencies || {}; for (const _package of packages) { if (dependencies[_package.name]) { dependencies[_package.name] = `^${_package.version}`; changed = true; } if (devDependencies[_package.name]) { devDependencies[_package.name] = `^${_package.version}`; changed = true; } if (peerDependencies[_package.name]) { peerDependencies[_package.name] = `^${_package.version}`; changed = true; } } if (changed) { content = JSON.stringify(content, null, 2); fs.writeFileSync(file, `${content}\n`); } } } function main() { let packages = []; const args = process.argv; if (!args || args.length < 3) { console.error('Should use format "bump package" or "bump package=target_version".'); return; } const argLen = args.length; for (let i = 2; i < argLen; i++) { const packageAndVersion = args[i].split('='); if (!packageAndVersion) { console.error('Should use format "bump package" or "bump package=target_version".'); return; } // default to latest version if (packageAndVersion.length === 1) { packageAndVersion.push('latest'); } const [packageName] = packageAndVersion; const modules = JSON.parse(execSync(`npm search ${packageName} --json`, { encoding: 'utf8' })); if (modules) { packages = packages.concat( modules.map(module => ({ name: module.name, version: getTargetVersion(packageAndVersion, module.name) })) ); } } if (packages.length) { console.log('Files to be updated:'); console.log(packageJsonFiles); console.log('Packages:'); console.log(packages); bumpPackages(packages); } } main();