Skip to content
This repository has been archived by the owner on Apr 9, 2022. It is now read-only.

Commit

Permalink
fix(@schematics/update): respect caret and tilde ranges
Browse files Browse the repository at this point in the history
  • Loading branch information
filipesilva committed May 10, 2018
1 parent e335e5d commit f61b2be
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 4 deletions.
15 changes: 11 additions & 4 deletions packages/schematics/update/update/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import { map, mergeMap, reduce, switchMap } from 'rxjs/operators';
import * as semver from 'semver';
import { getNpmPackageJson } from './npm';
import { NpmRepositoryPackageJson } from './npm-package-json';
import { JsonSchemaForNpmPackageJsonFiles } from './package-json';
import { Dependency, JsonSchemaForNpmPackageJsonFiles } from './package-json';
import { UpdateSchema } from './schema';

type VersionRange = string & { __VERSION_RANGE: void; };
Expand Down Expand Up @@ -220,6 +220,13 @@ function _performUpdate(
throw new SchematicsException('package.json could not be parsed: ' + e.message);
}

const updateDependency = (deps: Dependency, name: string, newVersion: string) => {
const oldVersion = deps[name];
// We only respect caret and tilde ranges on update.
const execResult = /^[\^~]/.exec(oldVersion);
deps[name] = `${execResult ? execResult[0] : ''}${newVersion}`;
};

const toInstall = [...infoMap.values()]
.map(x => [x.name, x.target, x.installed])
// tslint:disable-next-line:non-null-operator
Expand All @@ -234,7 +241,7 @@ function _performUpdate(
);

if (packageJson.dependencies && packageJson.dependencies[name]) {
packageJson.dependencies[name] = target.version;
updateDependency(packageJson.dependencies, name, target.version);

if (packageJson.devDependencies && packageJson.devDependencies[name]) {
delete packageJson.devDependencies[name];
Expand All @@ -243,13 +250,13 @@ function _performUpdate(
delete packageJson.peerDependencies[name];
}
} else if (packageJson.devDependencies && packageJson.devDependencies[name]) {
packageJson.devDependencies[name] = target.version;
updateDependency(packageJson.devDependencies, name, target.version);

if (packageJson.peerDependencies && packageJson.peerDependencies[name]) {
delete packageJson.peerDependencies[name];
}
} else if (packageJson.peerDependencies && packageJson.peerDependencies[name]) {
packageJson.peerDependencies[name] = target.version;
updateDependency(packageJson.peerDependencies, name, target.version);
} else {
logger.warn(`Package ${name} was not found in dependencies.`);
}
Expand Down
22 changes: 22 additions & 0 deletions packages/schematics/update/update/index_spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,28 @@ describe('@schematics/update', () => {
).subscribe(undefined, done.fail, done);
}, 45000);

it('respects existing tilde and caret ranges', done => {
// Add ranges.
const content = virtualFs.fileBufferToString(host.sync.read(normalize('/package.json')));
const packageJson = JSON.parse(content);
packageJson['dependencies']['@angular-devkit-tests/update-base'] = '^1.0.0';
packageJson['dependencies']['@angular-devkit-tests/update-migrations'] = '~1.0.0';
host.sync.write(
normalize('/package.json'),
virtualFs.stringToFileBuffer(JSON.stringify(packageJson)),
);

schematicRunner.runSchematicAsync('update', { all: true }, appTree).pipe(
map(tree => {
const packageJson = JSON.parse(tree.readContent('/package.json'));
// This one should not change because 1.1.0 was already satisfied by ^1.0.0.
expect(packageJson['dependencies']['@angular-devkit-tests/update-base']).toBe('^1.0.0');
expect(packageJson['dependencies']['@angular-devkit-tests/update-migrations'])
.toBe('~1.6.0');
}),
).subscribe(undefined, done.fail, done);
}, 45000);

it('calls migration tasks', done => {
// Add the basic migration package.
const content = virtualFs.fileBufferToString(host.sync.read(normalize('/package.json')));
Expand Down

0 comments on commit f61b2be

Please sign in to comment.