diff --git a/README.md b/README.md index ce8828e1..beee8864 100644 --- a/README.md +++ b/README.md @@ -143,6 +143,14 @@ module.exports = async function() { devDependencies: { 'ember-source': '2.11.0' }, + /* + You can optionally define npm overrides to enforce a specific dependency version + to be installed. This is useful if other libraries you depend on include different + versions of a package. This does nothing if `useYarn` is true; + */ + overrides: { + 'lodash': '5.0.0' + } /* When `useYarn` is true, you can optionally define yarn resolutions to enforce a specific dependency version to be installed. This is useful if other libraries diff --git a/lib/dependency-manager-adapters/npm.js b/lib/dependency-manager-adapters/npm.js index 3f5dee8f..cc730553 100644 --- a/lib/dependency-manager-adapters/npm.js +++ b/lib/dependency-manager-adapters/npm.js @@ -178,6 +178,8 @@ module.exports = CoreObject.extend({ if (this.useYarnCommand) { this._overridePackageJSONDependencies(packageJSON, depSet, 'resolutions'); + } else { + this._overridePackageJSONDependencies(packageJSON, depSet, 'overrides'); } return packageJSON; diff --git a/test/dependency-manager-adapters/npm-adapter-test.js b/test/dependency-manager-adapters/npm-adapter-test.js index 1443ba62..c4065705 100644 --- a/test/dependency-manager-adapters/npm-adapter-test.js +++ b/test/dependency-manager-adapters/npm-adapter-test.js @@ -536,6 +536,75 @@ describe('npmAdapter', () => { expect(resultJSON.resolutions).to.be.undefined; }); + it('adds a override for the specified dependency version', () => { + let npmAdapter = new NpmAdapter({ + cwd: tmpdir, + }); + let packageJSON = { + dependencies: { 'ember-cli-babel': '5.0.0' }, + }; + let depSet = { + dependencies: { 'ember-cli-babel': '6.0.0' }, + overrides: { 'ember-cli-babel': '6.0.0' }, + }; + + let resultJSON = npmAdapter._packageJSONForDependencySet(packageJSON, depSet); + + expect(resultJSON.overrides['ember-cli-babel']).to.equal('6.0.0'); + }); + + it('removes a dependency from overrides if its version is null', () => { + let npmAdapter = new NpmAdapter({ + cwd: tmpdir, + }); + let packageJSON = { + dependencies: { 'ember-cli-babel': '5.0.0' }, + overrides: { 'ember-cli-babel': '5.0.0' }, + }; + let depSet = { + dependencies: { 'ember-cli-babel': '6.0.0' }, + overrides: { 'ember-cli-babel': null }, + }; + + let resultJSON = npmAdapter._packageJSONForDependencySet(packageJSON, depSet); + + expect(resultJSON.overrides['ember-cli-babel']).to.be.undefined; + }); + + it('doesnt add overrides if there are none specified', () => { + let npmAdapter = new NpmAdapter({ + cwd: tmpdir, + }); + let packageJSON = { + dependencies: { 'ember-cli-babel': '5.0.0' }, + }; + let depSet = { + dependencies: { 'ember-cli-babel': '6.0.0' }, + }; + + let resultJSON = npmAdapter._packageJSONForDependencySet(packageJSON, depSet); + + expect(resultJSON.resolutions).to.be.undefined; + }); + + it('doesnt add overrides when using yarn', () => { + let npmAdapter = new NpmAdapter({ + cwd: tmpdir, + useYarnCommand: true, + }); + let packageJSON = { + dependencies: { 'ember-cli-babel': '5.0.0' }, + }; + let depSet = { + dependencies: { 'ember-cli-babel': '6.0.0' }, + overrides: { 'ember-cli-babel': '6.0.0' }, + }; + + let resultJSON = npmAdapter._packageJSONForDependencySet(packageJSON, depSet); + + expect(resultJSON.overrides).to.be.undefined; + }); + it('changes specified npm dev dependency versions', () => { let npmAdapter = new NpmAdapter({ cwd: tmpdir }); let packageJSON = {