Skip to content

Commit f80cbb5

Browse files
rally25rsarcanis
authored andcommitted
fix(upgrade): No longer warn when upgrading a devDependency (#5606)
* fix(upgrade): No longer warn when upgrading a devDependency fixes #4840 **Summary** Previously the upgrade command would call add with the list of packages to upgrade to. No "--dev" flag would be carried over and this list would contain all dependencies. As a result, Add would report a warning `{package} is already in "devDependencies". Please remove existing entry first before adding it to "dependencies".` I am using the existing `config.commandName` to decide whether or not to display the warning. I also updated the jest snapshots, because I was tired of the warning about 40-some obsolete snapshots, so the snapshot changes here aren't relevant to the functionality, just cleaning up. **Test plan** Added regression test in `__tests__/commands/upgrade.js`. Upgrade tests now set `config.commandName` which is an existing property, but is not normally set by tests. I wanted to set it for all tests in `_helpers.js` but we don't actually specify the command we are going to test when we build a test runner. * refactor code based on PR feedback
1 parent 9afb76f commit f80cbb5

File tree

5 files changed

+53
-2
lines changed

5 files changed

+53
-2
lines changed

__tests__/commands/upgrade-interactive.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const path = require('path');
1111

1212
const fixturesLoc = path.join(__dirname, '..', 'fixtures', 'upgrade-interactive');
1313
const runUpgrade = buildRun.bind(null, ConsoleReporter, fixturesLoc, (args, flags, config, reporter): Promise<void> => {
14+
config.commandName = 'upgrade-interactive';
1415
return upgradeInteractive(config, reporter, flags, args);
1516
});
1617

__tests__/commands/upgrade.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const path = require('path');
1212

1313
const fixturesLoc = path.join(__dirname, '..', 'fixtures', 'upgrade');
1414
const runUpgrade = buildRun.bind(null, ConsoleReporter, fixturesLoc, (args, flags, config, reporter): Promise<void> => {
15+
config.commandName = 'upgrade';
1516
return upgrade(config, reporter, flags, args);
1617
});
1718

@@ -281,6 +282,7 @@ test.concurrent('informs the type of dependency after upgrade', (): Promise<void
281282
reporters.BufferReporter,
282283
fixturesLoc,
283284
async (args, flags, config, reporter): Promise<void> => {
285+
config.commandName = 'upgrade';
284286
await upgrade(config, reporter, flags, args);
285287

286288
const output = reporter.getBuffer();
@@ -309,6 +311,8 @@ test.concurrent('warns when peer dependency is not met after upgrade', (): Promi
309311
reporters.BufferReporter,
310312
fixturesLoc,
311313
async (args, flags, config, reporter): Promise<void> => {
314+
config.commandName = 'upgrade';
315+
312316
await upgrade(config, reporter, flags, args);
313317

314318
const output = reporter.getBuffer();
@@ -331,6 +335,8 @@ test.concurrent("doesn't warn when peer dependency is still met after upgrade",
331335
reporters.BufferReporter,
332336
fixturesLoc,
333337
async (args, flags, config, reporter): Promise<void> => {
338+
config.commandName = 'upgrade';
339+
334340
await upgrade(config, reporter, flags, args);
335341

336342
const output = reporter.getBuffer();
@@ -348,6 +354,31 @@ test.concurrent("doesn't warn when peer dependency is still met after upgrade",
348354
);
349355
});
350356

357+
// Regression test for #4840
358+
test.concurrent("doesn't warn when upgrading a devDependency", (): Promise<void> => {
359+
return buildRun(
360+
reporters.BufferReporter,
361+
fixturesLoc,
362+
async (args, flags, config, reporter): Promise<void> => {
363+
config.commandName = 'upgrade';
364+
365+
await upgrade(config, reporter, flags, args);
366+
367+
const output = reporter.getBuffer();
368+
const warnings = output.filter(entry => entry.type === 'warning');
369+
370+
expect(
371+
warnings.some(warning => {
372+
return warning.data.toString().toLowerCase().indexOf('is already in') > -1;
373+
}),
374+
).toEqual(false);
375+
},
376+
['left-pad'],
377+
{},
378+
'dev-dependency-no-warn',
379+
);
380+
});
381+
351382
test.concurrent('can prune the offline mirror', (): Promise<void> => {
352383
return runUpgrade(['left-pad@1.1.2'], {}, 'prune-offline-mirror', async (config): ?Promise<void> => {
353384
await expectInstalledDependency(config, 'left-pad', '1.1.2', '1.1.2');
@@ -386,6 +417,8 @@ test.concurrent('--latest works if there is an install script on a hoisted depen
386417
reporters.BufferReporter,
387418
fixturesLoc,
388419
async (args, flags, config, reporter): Promise<void> => {
420+
config.commandName = 'upgrade';
421+
389422
await upgrade(config, reporter, flags, args);
390423

391424
const output = reporter.getBuffer();
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"private": "true",
3+
"devDependencies": {
4+
"left-pad": "^1.1.0"
5+
}
6+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2+
# yarn lockfile v1
3+
4+
5+
left-pad@^1.1.0:
6+
version "1.1.1"
7+
resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.1.1.tgz#ca566bbdd84b90cc5969ac1726fda51f9d936a3c"

src/cli/commands/add.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import invariant from 'invariant';
1919
import path from 'path';
2020
import semver from 'semver';
2121

22+
const SILENCE_DEPENDENCY_TYPE_WARNINGS = ['upgrade', 'upgrade-interactive'];
23+
2224
export class Add extends Install {
2325
constructor(args: Array<string>, flags: Object, config: Config, reporter: Reporter, lockfile: Lockfile) {
2426
const workspaceRootIsCwd = config.cwd === config.lockfileFolder;
@@ -244,8 +246,10 @@ export class Add extends Install {
244246

245247
object[dependencyType] = object[dependencyType] || {};
246248
object[dependencyType][pkgName] = version;
247-
248-
if (dependencyType !== this.flagToOrigin) {
249+
if (
250+
SILENCE_DEPENDENCY_TYPE_WARNINGS.indexOf(this.config.commandName) === -1 &&
251+
dependencyType !== this.flagToOrigin
252+
) {
249253
this.reporter.warn(this.reporter.lang('moduleAlreadyInManifest', pkgName, dependencyType, this.flagToOrigin));
250254
}
251255
});

0 commit comments

Comments
 (0)