diff --git a/__tests__/commands/add.js b/__tests__/commands/add.js index bb177664ef..a1e054e622 100644 --- a/__tests__/commands/add.js +++ b/__tests__/commands/add.js @@ -630,9 +630,38 @@ test.skip('add asks for correct package version if user passes an incorrect one' test.concurrent('install with latest tag', (): Promise => { return runAdd(['left-pad@latest'], {}, 'latest-version-in-package', async (config) => { + const lockfile = explodeLockfile(await fs.readFile(path.join(config.cwd, 'yarn.lock'))); + const pkg = await fs.readJson(path.join(config.cwd, 'package.json')); + const version = await getPackageVersion(config, 'left-pad'); + + assert.deepEqual(pkg.dependencies, {'left-pad': `^${version}`}); + assert(lockfile.indexOf(`left-pad@^${version}:`) === 0); + }); +}); + +test.concurrent('install with latest tag and --offline flag', (): Promise => { + return runAdd(['left-pad@latest'], {}, 'latest-version-in-package', async (config, reporter, previousAdd) => { + config.offline = true; + const add = new Add(['left-pad@latest'], {}, config, reporter, previousAdd.lockfile); + await add.init(); + + const pkg = await fs.readJson(path.join(config.cwd, 'package.json')); + const version = await getPackageVersion(config, 'left-pad'); + + assert.deepEqual(pkg.dependencies, {'left-pad': `^${version}`}); + }); +}); + +test.concurrent('install with latest tag and --prefer-offline flag', (): Promise => { + return runAdd(['left-pad@1.1.0'], {}, 'latest-version-in-package', async (config, reporter, previousAdd) => { + config.preferOffline = true; + const add = new Add(['left-pad@latest'], {}, config, reporter, previousAdd.lockfile); + await add.init(); + const pkg = await fs.readJson(path.join(config.cwd, 'package.json')); const version = await getPackageVersion(config, 'left-pad'); assert.deepEqual(pkg.dependencies, {'left-pad': `^${version}`}); + assert.notEqual(version, '1.1.0'); }); }); diff --git a/src/package-constraint-resolver.js b/src/package-constraint-resolver.js index bf1d3fafea..ad601c140e 100644 --- a/src/package-constraint-resolver.js +++ b/src/package-constraint-resolver.js @@ -19,6 +19,11 @@ export default class PackageConstraintResolver { config: Config; reduce(versions: Array, range: string): Promise { - return Promise.resolve(semver.maxSatisfying(versions, range, this.config.looseSemver)); + if (range === 'latest') { + // Usually versions are already ordered and the last one is the latest + return Promise.resolve(versions[versions.length - 1]); + } else { + return Promise.resolve(semver.maxSatisfying(versions, range, this.config.looseSemver)); + } } }