diff --git a/lib/config/definitions.js b/lib/config/definitions.js index eb416efdfb4d5fbdcce4c8a2e1b6334c239214dc..f26e0bca18ee6ce4d14ac4f3faf74bee4c920918 100644 --- a/lib/config/definitions.js +++ b/lib/config/definitions.js @@ -412,6 +412,11 @@ const options = [ type: 'string', default: 'renovate/', }, + { + name: 'bumpVersion', + description: 'Bump the version in the package.json being updated', + type: 'string', + }, // Major/Minor/Patch { name: 'major', diff --git a/lib/manager/index.js b/lib/manager/index.js index e9672c8d79157f00285ca4d756df906e2c4f5fa9..e2e8726cec46c3dce3975a2dd2115890cf4c51e1 100644 --- a/lib/manager/index.js +++ b/lib/manager/index.js @@ -93,6 +93,11 @@ async function getUpdatedPackageFiles(config) { upgrade.depName, upgrade.newVersion ); + newContent = npmUpdater.bumpPackageVersion( + newContent, + upgrade.currentPackageJsonVersion, + upgrade.bumpVersion + ); } else if (upgrade.packageFile.endsWith('package.js')) { newContent = meteorUpdater.setNewValue( existingContent, diff --git a/lib/manager/npm/update.js b/lib/manager/npm/update.js index 61e6212e2e258cf1d05bdce5cfb1446549c74cfc..1c2c3a3f7c95afbda9262bc69eef89fa93e4d049 100644 --- a/lib/manager/npm/update.js +++ b/lib/manager/npm/update.js @@ -1,7 +1,9 @@ const _ = require('lodash'); +const semver = require('semver'); module.exports = { setNewValue, + bumpPackageVersion, }; function setNewValue(currentFileContent, depType, depName, newVersion) { @@ -113,3 +115,37 @@ function replaceAt(content, index, oldString, newString) { content.substr(index + oldString.length) ); } + +function bumpPackageVersion(content, currentVersion, bumpVersion) { + logger.debug('bumpVersion()'); + if (!bumpVersion) { + return content; + } + logger.debug( + { bumpVersion }, + 'Checking if we should bump package.json version' + ); + try { + const newPjVersion = semver.inc(currentVersion, bumpVersion); + const bumpedContent = content.replace( + /("version":\s*")[^"]*/, + `$1${newPjVersion}` + ); + if (bumpedContent === content) { + logger.debug('Version was already bumped'); + } else { + logger.info('Bumped package.json version'); + } + return bumpedContent; + } catch (err) { + logger.warn( + { + content, + currentVersion, + bumpVersion, + }, + 'Failed to bumpVersion' + ); + return content; + } +} diff --git a/lib/manager/resolve.js b/lib/manager/resolve.js index 22be5b70386db436e69961b60aedeab8444a3832..ea87f089505354723265d83f7809a7997a06e4ca 100644 --- a/lib/manager/resolve.js +++ b/lib/manager/resolve.js @@ -157,6 +157,7 @@ async function resolvePackageFiles(config) { ); packageFile.shrinkwrapYaml = shrinkwrapFileName; } + packageFile.currentPackageJsonVersion = packageFile.content.version; return packageFile; } else if (packageFile.packageFile.endsWith('package.js')) { // meteor diff --git a/test/manager/__snapshots__/resolve.spec.js.snap b/test/manager/__snapshots__/resolve.spec.js.snap index 5e0d3a2296d5381defd2c29d16022c514bbb2825..e53651306b654e6ea08af829e0ded1b22ec8e28d 100644 --- a/test/manager/__snapshots__/resolve.spec.js.snap +++ b/test/manager/__snapshots__/resolve.spec.js.snap @@ -9,7 +9,9 @@ Array [ Object { "content": Object { "name": "package.json", + "version": "0.0.1", }, + "currentPackageJsonVersion": "0.0.1", "enabled": true, "npmrc": "npmrc", "packageFile": "package.json", @@ -299,7 +301,11 @@ exports[`manager/resolve resolvePackageFiles() detects package.json and parses j Array [ Object { "automerge": true, - "content": Object {}, + "content": Object { + "name": "something", + "version": "1.0.0", + }, + "currentPackageJsonVersion": "1.0.0", "enabled": true, "errors": Array [], "packageFile": "package.json", diff --git a/test/manager/npm/__snapshots__/update.spec.js.snap b/test/manager/npm/__snapshots__/update.spec.js.snap new file mode 100644 index 0000000000000000000000000000000000000000..2384ab0f656514ae1d3ab1aa08033abbaf2fbaf9 --- /dev/null +++ b/test/manager/npm/__snapshots__/update.spec.js.snap @@ -0,0 +1,5 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`workers/branch/package-json .bumpPackageVersion() increments 1`] = `"{\\"name\\":\\"some-package\\",\\"version\\":\\"0.0.3\\"}"`; + +exports[`workers/branch/package-json .bumpPackageVersion() updates 1`] = `"{\\"name\\":\\"some-package\\",\\"version\\":\\"0.1.0\\"}"`; diff --git a/test/manager/npm/update.spec.js b/test/manager/npm/update.spec.js index 775248d0dcbb5e90805ff9fe5055646b8bd53fe3..46d6516c9e1a2bce6a4f75368ef58f69963a8ce0 100644 --- a/test/manager/npm/update.spec.js +++ b/test/manager/npm/update.spec.js @@ -1,6 +1,7 @@ const fs = require('fs'); const path = require('path'); const npmUpdater = require('../../../lib/manager/npm/update'); +const semver = require('semver'); function readFixture(fixture) { return fs.readFileSync( @@ -72,4 +73,28 @@ describe('workers/branch/package-json', () => { expect(testContent).toBe(null); }); }); + describe('.bumpPackageVersion()', () => { + const content = JSON.stringify({ name: 'some-package', version: '0.0.2' }); + it('increments', () => { + const res = npmUpdater.bumpPackageVersion(content, '0.0.2', 'patch'); + expect(res).toMatchSnapshot(); + expect(res).not.toEqual(content); + }); + it('no ops', () => { + const res = npmUpdater.bumpPackageVersion(content, '0.0.1', 'patch'); + expect(res).toEqual(content); + }); + it('updates', () => { + const res = npmUpdater.bumpPackageVersion(content, '0.0.1', 'minor'); + expect(res).toMatchSnapshot(); + expect(res).not.toEqual(content); + }); + it('returns content if bumping errors', () => { + semver.inc = jest.fn(() => { + throw new Error('semver inc'); + }); + const res = npmUpdater.bumpPackageVersion(content, '0.0.2', true); + expect(res).toEqual(content); + }); + }); }); diff --git a/test/manager/resolve.spec.js b/test/manager/resolve.spec.js index ba1cb40c40e1977151b09890045021a60372fc29..e39131cc72f1b6cd45f230a25aecd95f9c8e84d6 100644 --- a/test/manager/resolve.spec.js +++ b/test/manager/resolve.spec.js @@ -54,6 +54,8 @@ describe('manager/resolve', () => { { packageFile: 'package.json' }, ]); const pJson = { + name: 'something', + version: '1.0.0', renovate: { automerge: true, }, @@ -73,7 +75,9 @@ describe('manager/resolve', () => { 'package-lock.json', 'shrinkwrap.yaml', ]); - platform.getFile.mockReturnValueOnce('{"name": "package.json"}'); + platform.getFile.mockReturnValueOnce( + '{"name": "package.json", "version": "0.0.1"}' + ); platform.getFile.mockReturnValueOnce('npmrc'); platform.getFile.mockReturnValueOnce('yarnrc'); const res = await resolvePackageFiles(config); diff --git a/website/docs/_posts/2017-10-05-configuration-options.md b/website/docs/_posts/2017-10-05-configuration-options.md index 19f2364ea8a0a0f7b6c9ba761f3542896cbbcb4e..3abd6bf4ceb4b667bd5df2f690f09fbe0c32ce00 100644 --- a/website/docs/_posts/2017-10-05-configuration-options.md +++ b/website/docs/_posts/2017-10-05-configuration-options.md @@ -121,6 +121,16 @@ Prefix to be used for all branch names You can modify this field if you want to change the prefix used. For example if you want branches to be like `deps/eslint-4.x` instead of `renovate/eslint-4.x` then you set `branchPrefix` = `deps/`. Or if you wish to avoid forward slashes in branch names then you could use `renovate_` instead, for example. +## bumpVersion + +Bump the version in the package.json being updated + +| name | value | +| ---- | ------ | +| type | string | + +Set this value to 'patch', 'minor' or 'major' to have Renovate update the version in your edited `package.json`. e.g. if you wish Renovate to always increase the target `package.json` version with a patch update, set this to `patch`. + ## commitBody Commit body template