Skip to content

Commit 2c1064c

Browse files
authored
Merge pull request #49 from mydea/fn/no-caret-tilde-exact
Drop `--caret`/`--tilde`/`--exact` options and keep current instead
2 parents 1fc6a81 + f6bb0e3 commit 2c1064c

File tree

1 file changed

+58
-47
lines changed

1 file changed

+58
-47
lines changed

lib/update-dep.js

Lines changed: 58 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -24,54 +24,63 @@ async function yarnUpdateDependency() {
2424
})
2525
.option('-v, --target-version <value>', 'The version to update to')
2626
.option('-p, --package <value>', 'The package to update')
27-
.option('-c, --caret', 'Update the version to ^X.X.X')
28-
.option('-t, --tilde', 'Update the version to ~X.X.X')
29-
.option('-e, --exact', 'Update the version to X.X.X')
3027
.option('-ny, --no-yarn', 'Do not auto-run "yarn install"')
3128
.parse(process.argv);
3229

33-
let { targetVersion, package, caret, exact, yarn: runYarn } = program.opts();
30+
let { targetVersion, package, yarn: runYarn } = program.opts();
3431

3532
package = package || posPackage;
3633
let version = targetVersion || posVersion;
3734

38-
if (typeof version === 'undefined') {
39-
let out = await exec(`npm show ${package} version`);
40-
version = out.stdout.trim();
41-
log(`Fetching latest version: ${version}`);
35+
if (!package) {
36+
throw new Error('You have to specify a package.');
4237
}
4338

44-
if (!version.startsWith('~') && !version.startsWith('^')) {
45-
let versionRangeChar = '~';
46-
if (exact) {
47-
versionRangeChar = '';
48-
} else if (caret) {
49-
versionRangeChar = '^';
50-
}
39+
await updateDependency(package, version);
5140

52-
version = `${versionRangeChar}${version}`;
41+
if (!runYarn) {
42+
log('');
43+
log(chalk.green('Done! Please run `yarn` to update your dependencies.'));
44+
return;
5345
}
5446

55-
if (!package || !version) {
56-
throw new Error(
57-
'You have to specify a package & version to update, e.g. "yu my-package 0.2.0"'
58-
);
47+
log('');
48+
log('Now running `yarn` to install new dependency...');
49+
50+
await exec('yarn install');
51+
52+
log('');
53+
log(chalk.green('Done!'));
54+
}
55+
56+
function updateVersion(deps, package, version) {
57+
// If not specifying a full version with ~ or ^, we want to keep the current symbol
58+
if (!version.startsWith('~') && !version.startsWith('^')) {
59+
let currentVersion = deps[package];
60+
let currentSymbol = currentVersion[0];
61+
62+
if (currentSymbol === '~' || currentSymbol === '^') {
63+
version = `${currentSymbol}${version}`;
64+
}
5965
}
6066

61-
log(`Updating ${package} to version ${version}...`);
67+
deps[package] = version;
68+
}
6269

63-
let packageJson = readPackageJson('package.json');
64-
let isWorkspace = !!packageJson.workspaces;
70+
async function updateDependency(package, version) {
71+
if (typeof version === 'undefined') {
72+
let out = await exec(`npm show ${package} version`);
73+
version = out.stdout.trim();
74+
log(`Fetching latest version: ${version}`);
75+
}
6576

66-
let packageJsonFilePaths = ['package.json'];
67-
if (isWorkspace) {
68-
packageJson.workspaces.forEach((workspacePattern) => {
69-
let pattern = `${workspacePattern}/package.json`;
70-
let workspacePackageJsonFiles = glob.sync(pattern);
71-
packageJsonFilePaths.push(...workspacePackageJsonFiles);
72-
});
77+
if (!version) {
78+
throw new Error(`No version found to update to for package ${package}`);
7379
}
7480

81+
log(`Updating ${package} to version ${version}...`);
82+
83+
let packageJsonFilePaths = getPackageJsonFiles();
7584
let hasAnyChange = false;
7685

7786
// Update package.json files...
@@ -85,17 +94,17 @@ async function yarnUpdateDependency() {
8594
let hasChanged = false;
8695

8796
if (dependencies[package]) {
88-
dependencies[package] = version;
97+
updateVersion(dependencies, package, version);
8998
hasChanged = true;
9099
}
91100

92101
if (devDependencies[package]) {
93-
devDependencies[package] = version;
102+
updateVersion(devDependencies, package, version);
94103
hasChanged = true;
95104
}
96105

97106
if (peerDependencies[package]) {
98-
peerDependencies[package] = version;
107+
updateVersion(peerDependencies, package, version);
99108
hasChanged = true;
100109
}
101110

@@ -138,20 +147,6 @@ async function yarnUpdateDependency() {
138147
);
139148
return;
140149
}
141-
142-
if (!runYarn) {
143-
log('');
144-
log(chalk.green('Done! Please run `yarn` to update your dependencies.'));
145-
return;
146-
}
147-
148-
log('');
149-
log('Now running `yarn` to install new dependency...');
150-
151-
await exec('yarn install');
152-
153-
log('');
154-
log(chalk.green('Done!'));
155150
}
156151

157152
module.exports = async function () {
@@ -166,3 +161,19 @@ function log(str) {
166161
// eslint-disable-next-line no-console
167162
console.log(str);
168163
}
164+
165+
function getPackageJsonFiles() {
166+
let packageJson = readPackageJson('package.json');
167+
let isWorkspace = !!packageJson.workspaces;
168+
169+
let packageJsonFilePaths = ['package.json'];
170+
if (isWorkspace) {
171+
packageJson.workspaces.forEach((workspacePattern) => {
172+
let pattern = `${workspacePattern}/package.json`;
173+
let workspacePackageJsonFiles = glob.sync(pattern);
174+
packageJsonFilePaths.push(...workspacePackageJsonFiles);
175+
});
176+
}
177+
178+
return packageJsonFilePaths;
179+
}

0 commit comments

Comments
 (0)