From 196847d6d5c6b63acd0773595f9623e346af141b Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Tue, 30 Nov 2021 17:24:42 +0100 Subject: [PATCH 1/2] feat: Add `--all-dependencies` and `--all-dev-dependencies` --- bin/yarn-update | 4 +-- lib/update-dep.js | 70 ++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 68 insertions(+), 6 deletions(-) diff --git a/bin/yarn-update b/bin/yarn-update index cef94c9..7dcf630 100644 --- a/bin/yarn-update +++ b/bin/yarn-update @@ -1,3 +1,3 @@ -#! /usr/bin/env node +#!/usr/bin/env node -require('../lib/update-dep')(); \ No newline at end of file +require('../lib/update-dep')(); diff --git a/lib/update-dep.js b/lib/update-dep.js index 9fa169e..ca13436 100644 --- a/lib/update-dep.js +++ b/lib/update-dep.js @@ -25,18 +25,48 @@ async function yarnUpdateDependency() { .option('-v, --target-version ', 'The version to update to') .option('-p, --package ', 'The package to update') .option('-ny, --no-yarn', 'Do not auto-run "yarn install"') + .option('-ad, --all-dependencies', 'Update all dependencies') + .option('-adev, --all-dev-dependencies', 'Update all devDependencies') .parse(process.argv); - let { targetVersion, package, yarn: runYarn } = program.opts(); + let { + targetVersion, + package, + yarn: runYarn, + allDependencies, + allDevDependencies, + } = program.opts(); package = package || posPackage; let version = targetVersion || posVersion; - if (!package) { - throw new Error('You have to specify a package.'); + if (!package && !allDependencies && !allDevDependencies) { + throw new Error( + 'You have to specify a package, --all-dependencies or --all-dev-dependencies' + ); + } + + if (package) { + await updateDependency(package, version); } - await updateDependency(package, version); + if (allDependencies) { + let packages = getDependencies(); + for (let package of packages) { + log(''); + log(`Trying to update ${package}...`); + await updateDependency(package, version, {}); + } + } + + if (allDevDependencies) { + let packages = getDevDependencies(); + for (let package of packages) { + log(''); + log(`Trying to update ${package}...`); + await updateDependency(package, version, {}); + } + } if (!runYarn) { log(''); @@ -53,6 +83,38 @@ async function yarnUpdateDependency() { log(chalk.green('Done!')); } +function getDependencies() { + let packageJsonFilePaths = getPackageJsonFiles(); + + let dependencies = new Set(); + packageJsonFilePaths.forEach((filePath) => { + let packageJsonFile = readPackageJson(filePath); + + let deps = packageJsonFile.dependencies || {}; + Object.keys(deps).forEach((dep) => { + dependencies.add(dep); + }); + }); + + return Array.from(dependencies); +} + +function getDevDependencies() { + let packageJsonFilePaths = getPackageJsonFiles(); + + let dependencies = new Set(); + packageJsonFilePaths.forEach((filePath) => { + let packageJsonFile = readPackageJson(filePath); + + let deps = packageJsonFile.devDependencies || {}; + Object.keys(deps).forEach((dep) => { + dependencies.add(dep); + }); + }); + + return Array.from(dependencies); +} + function updateVersion(deps, package, version) { // If not specifying a full version with ~ or ^, we want to keep the current symbol if (!version.startsWith('~') && !version.startsWith('^')) { From 5642f8b825926b2accb0ce4b8f83ddd6c7d4956d Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Tue, 30 Nov 2021 17:26:34 +0100 Subject: [PATCH 2/2] chore: Update readme --- README.md | 56 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index fc7f5c0..6132d4b 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,11 @@ Update a yarn dependency across a project/workspace & sub-dependencies. ```bash yu my-dependency 0.5.1 # my-dependency@~0.5.1 -yu my-dependency 0.5.1 --exact # my-dependency@0.5.1 -yu my-dependency 0.5.1 --caret # my-dependency@^0.5.1 +yu my-dependency ^0.5.1 # my-dependency@^0.5.1 (no matter if it used to be caret or tilde) +yu my-dependency ~0.5.1 # my-dependency@^0.5.1 (no matter if it used to be caret or tilde) yu my-dependency # update to current latest version +yu --all-dependencies # update all `dependencies` to the latest version +yu --all-dev-dependencies # update all `devDependencies` to the latest version yu -h # Output all available options ``` @@ -22,14 +24,14 @@ yarn global add yarn-update-dependency Running this command will: -* Update the specified package to the specified version in the `package.json` -* If run inside of a Yarn Workspace, it will also update all `package.json` in all workspace packages to the same version. -* It will then remove all entries for this package from the `yarn.lock` file -* Finally, it will run `yarn install` to update the dependencies +- Update the specified package to the specified version in the `package.json` +- If run inside of a Yarn Workspace, it will also update all `package.json` in all workspace packages to the same version. +- It will then remove all entries for this package from the `yarn.lock` file +- Finally, it will run `yarn install` to update the dependencies ## Why do I need this? -This package solves two problems. +This package solves two problems. First, it can be annoying to keep a dependency in sync in a Yarn Workspace. You'll often want to have the same dependency of a package in all workspace packages, which requires you to manually keep this in sync everywhere. With the help of `yu`, the version will be the same in all workspace packages. @@ -37,29 +39,29 @@ Second, it can be tricky to actually update a specific version in Yarn. Just upd Take this structure: -* my-app - * my-dependency-a@1.0.0 - * my-dependency-b@^2.0.0 - * my-dependency-b@~2.0.1 - +- my-app + - my-dependency-a@1.0.0 + - my-dependency-b@^2.0.0 + - my-dependency-b@~2.0.1 + Now you might end up with these packages installed: -* my-app - * my-dependency-a@1.0.0 - * my-dependency-b@2.0.1 - +- my-app + - my-dependency-a@1.0.0 + - my-dependency-b@2.0.1 + Now, you want to update `my-dependency-b` to 2.1.0. The version range specified in `my-dependency-a` allows for that, so you might just update this like this: -* my-app - * my-dependency-a@1.0.0 - * my-dependency-b@^2.0.0 - * my-dependency-b@~2.1.0 - +- my-app + - my-dependency-a@1.0.0 + - my-dependency-b@^2.0.0 + - my-dependency-b@~2.1.0 + And run `yarn` again. However, this will NOT replace the previously installed version, but actually result in this: -* my-app - * my-dependency-a@1.0.0 - * my-dependency-b@2.0.1 - * my-dependency-b@2.1.0 - -Which is usually not what you want. The only way to really ensure that all sub-dependencies are also updated (as far as their version ranges allow), is to remove the entry from the `yarn.lock` file first - which is what this package does for you. \ No newline at end of file +- my-app + - my-dependency-a@1.0.0 + - my-dependency-b@2.0.1 + - my-dependency-b@2.1.0 + +Which is usually not what you want. The only way to really ensure that all sub-dependencies are also updated (as far as their version ranges allow), is to remove the entry from the `yarn.lock` file first - which is what this package does for you.