diff --git a/lib/datasource/docker/index.ts b/lib/datasource/docker/index.ts index d8d9e22fbfcac62985268677ffd2ce1963cc81d8..9af8dec5203cd807df27ac2f903d8ee535fe23f6 100644 --- a/lib/datasource/docker/index.ts +++ b/lib/datasource/docker/index.ts @@ -43,6 +43,8 @@ export const defaultConfig = { group: { commitMessageTopic: '{{{groupName}}} Docker tags', }, + autoReplaceStringTemplate: + '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}', }; const http = new Http(id); diff --git a/lib/manager/ansible/__snapshots__/extract.spec.ts.snap b/lib/manager/ansible/__snapshots__/extract.spec.ts.snap index debebba8a84c5b1f380f42228b7dec5c3980c827..9de39fc4c968c62a696de4291c76ecb14d349c37 100644 --- a/lib/manager/ansible/__snapshots__/extract.spec.ts.snap +++ b/lib/manager/ansible/__snapshots__/extract.spec.ts.snap @@ -7,9 +7,7 @@ Array [ "currentValue": undefined, "datasource": "docker", "depName": "busybox", - "managerData": Object { - "lineNumber": 4, - }, + "replaceString": "busybox", "versioning": "docker", }, Object { @@ -17,9 +15,7 @@ Array [ "currentValue": undefined, "datasource": "docker", "depName": "redis", - "managerData": Object { - "lineNumber": 11, - }, + "replaceString": "redis", "versioning": "docker", }, Object { @@ -27,9 +23,7 @@ Array [ "currentValue": undefined, "datasource": "docker", "depName": "someuser/appimage", - "managerData": Object { - "lineNumber": 23, - }, + "replaceString": "someuser/appimage", "versioning": "docker", }, Object { @@ -37,9 +31,7 @@ Array [ "currentValue": "14.04", "datasource": "docker", "depName": "ubuntu", - "managerData": Object { - "lineNumber": 40, - }, + "replaceString": "ubuntu:14.04", "versioning": "docker", }, Object { @@ -47,9 +39,7 @@ Array [ "currentValue": undefined, "datasource": "docker", "depName": "someuser/anotherappimage", - "managerData": Object { - "lineNumber": 52, - }, + "replaceString": "someuser/anotherappimage", "versioning": "docker", }, Object { @@ -57,9 +47,7 @@ Array [ "currentValue": undefined, "datasource": "docker", "depName": "busybox", - "managerData": Object { - "lineNumber": 64, - }, + "replaceString": "busybox", "versioning": "docker", }, Object { @@ -67,9 +55,7 @@ Array [ "currentValue": "latest", "datasource": "docker", "depName": "postgres", - "managerData": Object { - "lineNumber": 76, - }, + "replaceString": "postgres:latest", "versioning": "docker", }, Object { @@ -77,9 +63,7 @@ Array [ "currentValue": "14.04", "datasource": "docker", "depName": "ubuntu", - "managerData": Object { - "lineNumber": 83, - }, + "replaceString": "ubuntu:14.04", "versioning": "docker", }, Object { @@ -87,9 +71,7 @@ Array [ "currentValue": "14.04", "datasource": "docker", "depName": "ubuntu", - "managerData": Object { - "lineNumber": 96, - }, + "replaceString": "ubuntu:14.04", "versioning": "docker", }, ] @@ -102,9 +84,7 @@ Array [ "currentValue": "11.5.1", "datasource": "docker", "depName": "sameersbn/gitlab", - "managerData": Object { - "lineNumber": 8, - }, + "replaceString": "sameersbn/gitlab:11.5.1", "versioning": "docker", }, Object { @@ -112,9 +92,7 @@ Array [ "currentValue": "10", "datasource": "docker", "depName": "sameersbn/postgresql", - "managerData": Object { - "lineNumber": 30, - }, + "replaceString": "sameersbn/postgresql:10", "versioning": "docker", }, Object { @@ -122,9 +100,7 @@ Array [ "currentValue": "4.0.9-1", "datasource": "docker", "depName": "sameersbn/redis", - "managerData": Object { - "lineNumber": 38, - }, + "replaceString": "sameersbn/redis:4.0.9-1", "versioning": "docker", }, Object { @@ -132,9 +108,7 @@ Array [ "currentValue": "2.6.2", "datasource": "docker", "depName": "registry", - "managerData": Object { - "lineNumber": 43, - }, + "replaceString": "registry:2.6.2", "versioning": "docker", }, ] diff --git a/lib/manager/ansible/extract.ts b/lib/manager/ansible/extract.ts index 48dd675979e0f969228656d8ab04b3596ad6d3b2..5493326a86b59d442c21fb55a3868d4b4fd3f1c9 100644 --- a/lib/manager/ansible/extract.ts +++ b/lib/manager/ansible/extract.ts @@ -8,7 +8,6 @@ export default function extractPackageFile( ): PackageFile | null { logger.trace('ansible.extractPackageFile()'); let deps: PackageDependency[] = []; - let lineNumber = 0; const re = /^\s*image:\s*'?"?([^\s'"]+)'?"?\s*$/; for (const line of content.split('\n')) { const match = re.exec(line); @@ -23,11 +22,9 @@ export default function extractPackageFile( }, 'Docker image inside ansible' ); - dep.managerData = { lineNumber }; dep.versioning = dockerVersioning.id; deps.push(dep); } - lineNumber += 1; } deps = deps.filter( (dep) => !(dep.currentValue && dep.currentValue.includes('${')) diff --git a/lib/manager/ansible/index.ts b/lib/manager/ansible/index.ts index d917798c5220a261a46920e8bca081e34c2ce68c..fd10faf714fc1530a6c1e53de6d5e3e71ade5566 100644 --- a/lib/manager/ansible/index.ts +++ b/lib/manager/ansible/index.ts @@ -1,10 +1,9 @@ import extractPackageFile from './extract'; -import updateDependency from './update'; import { LANGUAGE_DOCKER } from '../../constants/languages'; const language = LANGUAGE_DOCKER; -export { extractPackageFile, language, updateDependency }; +export { extractPackageFile, language }; export const defaultConfig = { fileMatch: ['(^|/)tasks/[^/]+\\.ya?ml$'], diff --git a/lib/manager/ansible/update.spec.ts b/lib/manager/ansible/update.spec.ts deleted file mode 100644 index 8299bbf6fa1296e307371f2f59894366a1815dbe..0000000000000000000000000000000000000000 --- a/lib/manager/ansible/update.spec.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { readFileSync } from 'fs'; -import updateDependency from './update'; - -const yamlFile1 = readFileSync( - 'lib/manager/ansible/__fixtures__/main1.yaml', - 'utf8' -); -const yamlFile2 = readFileSync( - 'lib/manager/ansible/__fixtures__/main2.yaml', - 'utf8' -); - -describe('manager/ansible/update', () => { - describe('updateDependency', () => { - it('replaces existing value from docker_container', () => { - const upgrade = { - managerData: { lineNumber: 4 }, - depName: 'busybox', - newValue: '1.29.3', - newDigest: 'sha256:abcdefghijklmnop', - }; - const res = updateDependency({ fileContent: yamlFile1, upgrade }); - expect(res).not.toEqual(yamlFile1); - expect(res.includes(upgrade.newDigest)).toBe(true); - }); - it('replaces existing value from docker_service', () => { - const upgrade = { - managerData: { lineNumber: 8 }, - depName: 'sameersbn/gitlab', - newValue: '11.5.1', - newDigest: 'sha256:abcdefghijklmnop', - }; - const res = updateDependency({ fileContent: yamlFile2, upgrade }); - expect(res).not.toEqual(yamlFile2); - expect(res.includes(upgrade.newDigest)).toBe(true); - }); - it('returns same', () => { - const upgrade = { - managerData: { lineNumber: 38 }, - depName: 'sameersbn/redis', - newValue: '4.0.9-1', - }; - const res = updateDependency({ fileContent: yamlFile2, upgrade }); - expect(res).toEqual(yamlFile2); - }); - it('returns null if mismatch', () => { - const upgrade = { - managerData: { lineNumber: 52 }, - newFrom: 'registry:2.6.2@sha256:abcdefghijklmnop', - }; - const res = updateDependency({ fileContent: yamlFile2, upgrade }); - expect(res).toBeNull(); - }); - it('returns null if error', () => { - const res = updateDependency({ fileContent: null, upgrade: null }); - expect(res).toBeNull(); - }); - }); -}); diff --git a/lib/manager/ansible/update.ts b/lib/manager/ansible/update.ts deleted file mode 100644 index bccacff450f234c35eb6eaccad0ea0aeef78ad58..0000000000000000000000000000000000000000 --- a/lib/manager/ansible/update.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { logger } from '../../logger'; -import { getNewFrom } from '../dockerfile/update'; -import { UpdateDependencyConfig } from '../common'; -import { regEx } from '../../util/regex'; - -export default function updateDependency({ - fileContent, - upgrade, -}: UpdateDependencyConfig): string | null { - try { - const newFrom = getNewFrom(upgrade); - logger.debug(`ansible.updateDependency(): ${newFrom}`); - const lines = fileContent.split('\n'); - const lineToChange = lines[upgrade.managerData.lineNumber]; - const imageLine = regEx(`^(\\s*image:\\s*'?"?)[^\\s'"]+('?"?\\s*)$`); - if (!imageLine.test(lineToChange)) { - logger.debug('No image line found'); - return null; - } - const newLine = lineToChange.replace(imageLine, `$1${newFrom}$2`); - if (newLine === lineToChange) { - logger.debug('No changes necessary'); - return fileContent; - } - lines[upgrade.managerData.lineNumber] = newLine; - return lines.join('\n'); - } catch (err) { - logger.debug({ err }, 'Error setting new Dockerfile value'); - return null; - } -} diff --git a/lib/manager/circleci/__snapshots__/extract.spec.ts.snap b/lib/manager/circleci/__snapshots__/extract.spec.ts.snap index 825af9c96d4ea318b456dd91c65410ee09a9a350..c1658309131572c3950456d5f2cdf9dd11d7890c 100644 --- a/lib/manager/circleci/__snapshots__/extract.spec.ts.snap +++ b/lib/manager/circleci/__snapshots__/extract.spec.ts.snap @@ -9,9 +9,7 @@ Array [ "datasource": "docker", "depName": "node", "depType": "docker", - "managerData": Object { - "lineNumber": 12, - }, + "replaceString": "node", "versioning": "docker", }, Object { @@ -21,9 +19,7 @@ Array [ "datasource": "docker", "depName": "node", "depType": "docker", - "managerData": Object { - "lineNumber": 57, - }, + "replaceString": "node:4", "versioning": "docker", }, Object { @@ -33,9 +29,7 @@ Array [ "datasource": "docker", "depName": "node", "depType": "docker", - "managerData": Object { - "lineNumber": 61, - }, + "replaceString": "node:6", "versioning": "docker", }, Object { @@ -45,9 +39,7 @@ Array [ "datasource": "docker", "depName": "node", "depType": "docker", - "managerData": Object { - "lineNumber": 65, - }, + "replaceString": "node:8.9.0", "versioning": "docker", }, ] @@ -62,9 +54,6 @@ Array [ "depName": "release-workflows", "depType": "orb", "lookupName": "hutson/library-release-workflows", - "managerData": Object { - "lineNumber": 3, - }, "rangeStrategy": "pin", "versioning": "npm", }, @@ -75,9 +64,6 @@ Array [ "depName": "no-version", "depType": "orb", "lookupName": "abc/def", - "managerData": Object { - "lineNumber": 4, - }, "rangeStrategy": "pin", "versioning": "npm", }, @@ -88,9 +74,6 @@ Array [ "depName": "volatile", "depType": "orb", "lookupName": "zzz/zzz", - "managerData": Object { - "lineNumber": 5, - }, "rangeStrategy": "pin", "versioning": "npm", }, @@ -100,9 +83,7 @@ Array [ "datasource": "docker", "depName": "python", "depType": "docker", - "managerData": Object { - "lineNumber": 20, - }, + "replaceString": "python:3.7@sha256:3870d35b962a943df72d948580fc66ceaaee1c4fbd205930f32e0f0760eb1077", "versioning": "docker", }, Object { @@ -111,9 +92,7 @@ Array [ "datasource": "docker", "depName": "python", "depType": "docker", - "managerData": Object { - "lineNumber": 27, - }, + "replaceString": "python:3.7@sha256:3870d35b962a943df72d948580fc66ceaaee1c4fbd205930f32e0f0760eb1077", "versioning": "docker", }, Object { @@ -122,9 +101,7 @@ Array [ "datasource": "docker", "depName": "python", "depType": "docker", - "managerData": Object { - "lineNumber": 34, - }, + "replaceString": "python:3.7@sha256:3870d35b962a943df72d948580fc66ceaaee1c4fbd205930f32e0f0760eb1077", "versioning": "docker", }, Object { @@ -133,9 +110,7 @@ Array [ "datasource": "docker", "depName": "python", "depType": "docker", - "managerData": Object { - "lineNumber": 41, - }, + "replaceString": "python:3.7@sha256:3870d35b962a943df72d948580fc66ceaaee1c4fbd205930f32e0f0760eb1077", "versioning": "docker", }, Object { @@ -144,9 +119,7 @@ Array [ "datasource": "docker", "depName": "pypy", "depType": "docker", - "managerData": Object { - "lineNumber": 50, - }, + "replaceString": "pypy:3-6@sha256:eb6325b75c1c70b4992eaa1bdd29e24e5f14d5324b4714a49f3e67783473214b", "versioning": "docker", }, Object { @@ -155,9 +128,7 @@ Array [ "datasource": "docker", "depName": "python", "depType": "docker", - "managerData": Object { - "lineNumber": 57, - }, + "replaceString": "python:3.7@sha256:3870d35b962a943df72d948580fc66ceaaee1c4fbd205930f32e0f0760eb1077", "versioning": "docker", }, ] diff --git a/lib/manager/circleci/extract.ts b/lib/manager/circleci/extract.ts index 71a0bbd1ab6339bcec52bd0f0320fb8a17533df8..feb890bf68d0471c35d7dedfbe9ea37daad885ca 100644 --- a/lib/manager/circleci/extract.ts +++ b/lib/manager/circleci/extract.ts @@ -29,7 +29,6 @@ export function extractPackageFile(content: string): PackageFile | null { depType: 'orb', depName, currentValue, - managerData: { lineNumber }, datasource: datasourceOrb.id, lookupName: orbName, commitMessageTopic: '{{{depName}}} orb', @@ -54,7 +53,6 @@ export function extractPackageFile(content: string): PackageFile | null { ); dep.depType = 'docker'; dep.versioning = 'docker'; - dep.managerData = { lineNumber }; deps.push(dep); } } diff --git a/lib/manager/circleci/index.ts b/lib/manager/circleci/index.ts index 5695fc3a5323f09437e16e6070de90b43fe1640f..afef6591c1f8ad89291b6c1423f0b831d8c9ce06 100644 --- a/lib/manager/circleci/index.ts +++ b/lib/manager/circleci/index.ts @@ -1,7 +1,6 @@ import { extractPackageFile } from './extract'; -import { updateDependency } from './update'; -export { extractPackageFile, updateDependency }; +export { extractPackageFile }; export const defaultConfig = { fileMatch: ['(^|/).circleci/config.yml$'], diff --git a/lib/manager/circleci/update.spec.ts b/lib/manager/circleci/update.spec.ts deleted file mode 100644 index 53fec3cc4cddda21a570c66f763f6cc0a1163533..0000000000000000000000000000000000000000 --- a/lib/manager/circleci/update.spec.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { readFileSync } from 'fs'; -import * as dcUpdate from './update'; - -const yamlFile = readFileSync( - 'lib/manager/circleci/__fixtures__/config.yml', - 'utf8' -); -const yamlFile2 = readFileSync( - 'lib/manager/circleci/__fixtures__/config2.yml', - 'utf8' -); - -describe('manager/circleci/update', () => { - describe('updateDependency', () => { - it('replaces existing value', () => { - const upgrade = { - managerData: { lineNumber: 65 }, - depType: 'docker', - depName: 'node', - newValue: '8.10.0', - newDigest: 'sha256:abcdefghijklmnop', - }; - const res = dcUpdate.updateDependency({ - fileContent: yamlFile, - upgrade, - }); - expect(res).not.toEqual(yamlFile); - expect(res.includes(upgrade.newDigest)).toBe(true); - }); - it('returns same', () => { - const upgrade = { - managerData: { lineNumber: 12 }, - depType: 'docker', - depName: 'node', - }; - const res = dcUpdate.updateDependency({ - fileContent: yamlFile, - upgrade, - }); - expect(res).toEqual(yamlFile); - }); - it('returns null if mismatch', () => { - const upgrade = { - managerData: { lineNumber: 17 }, - depType: 'docker', - depName: 'postgres', - newValue: '9.6.8', - newDigest: 'sha256:abcdefghijklmnop', - }; - const res = dcUpdate.updateDependency({ - fileContent: yamlFile, - upgrade, - }); - expect(res).toBeNull(); - }); - it('returns null if error', () => { - const res = dcUpdate.updateDependency({ - fileContent: null, - upgrade: null, - }); - expect(res).toBeNull(); - }); - it('replaces orbs', () => { - const upgrade = { - currentValue: '4.1.0', - depName: 'release-workflows', - depType: 'orb', - managerData: { lineNumber: 3 }, - newValue: '4.2.0', - }; - const res = dcUpdate.updateDependency({ - fileContent: yamlFile2, - upgrade, - }); - expect(res).not.toEqual(yamlFile2); - expect(res.includes(upgrade.newValue)).toBe(true); - }); - it('returns same orb', () => { - const upgrade = { - currentValue: '4.0.0', - depName: 'release-workflows', - depType: 'orb', - managerData: { lineNumber: 3 }, - newValue: '4.1.0', - }; - const res = dcUpdate.updateDependency({ - fileContent: yamlFile2, - upgrade, - }); - expect(res).toEqual(yamlFile2); - }); - it('returns null for orb mismatch', () => { - const upgrade = { - currentValue: '4.1.0', - depName: 'release-workflows', - depType: 'orb', - managerData: { lineNumber: 2 }, - newValue: '4.2.0', - }; - const res = dcUpdate.updateDependency({ - fileContent: yamlFile2, - upgrade, - }); - expect(res).toBeNull(); - }); - it('returns null for unknown depType', () => { - const upgrade = { - currentValue: '4.1.0', - depName: 'release-workflows', - managerData: { lineNumber: 3 }, - newValue: '4.2.0', - }; - const res = dcUpdate.updateDependency({ - fileContent: yamlFile2, - upgrade, - }); - expect(res).toBeNull(); - }); - }); -}); diff --git a/lib/manager/circleci/update.ts b/lib/manager/circleci/update.ts deleted file mode 100644 index 3af78159bb35634a780b18513f62e1b4fd7e87f6..0000000000000000000000000000000000000000 --- a/lib/manager/circleci/update.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { logger } from '../../logger'; -import { getNewFrom } from '../dockerfile/update'; -import { UpdateDependencyConfig } from '../common'; - -export function updateDependency({ - fileContent, - upgrade, -}: UpdateDependencyConfig): string | null { - try { - const lines = fileContent.split('\n'); - const lineToChange = lines[upgrade.managerData.lineNumber]; - if (upgrade.depType === 'docker') { - const newFrom = getNewFrom(upgrade); - logger.debug(`circleci.updateDependency(): ${newFrom}`); - const imageLine = new RegExp(/^(\s*- image:\s*'?"?)[^\s'"]+('?"?\s*)$/); - if (!imageLine.test(lineToChange)) { - logger.debug('No image line found'); - return null; - } - const newLine = lineToChange.replace(imageLine, `$1${newFrom}$2`); - if (newLine === lineToChange) { - logger.debug('No changes necessary'); - return fileContent; - } - lines[upgrade.managerData.lineNumber] = newLine; - return lines.join('\n'); - } - if (upgrade.depType === 'orb') { - const orbLine = new RegExp(`^(\\s+${upgrade.depName}:\\s[^@]+@).+$`); - if (!orbLine.test(lineToChange)) { - logger.debug('No image line found'); - return null; - } - const newLine = lineToChange.replace(orbLine, `$1${upgrade.newValue}`); - if (newLine === lineToChange) { - logger.debug('No changes necessary'); - return fileContent; - } - lines[upgrade.managerData.lineNumber] = newLine; - return lines.join('\n'); - } - logger.error('Unknown circleci depType'); - return null; - } catch (err) { - logger.debug({ err }, 'Error setting new CircleCI image value'); - return null; - } -} diff --git a/lib/manager/docker-compose/__snapshots__/extract.spec.ts.snap b/lib/manager/docker-compose/__snapshots__/extract.spec.ts.snap index 9939d59beaf1254977f2f90fc198751bc80fa40c..dcac42c3917bfe0c3043389f9f8e70eca1231762 100644 --- a/lib/manager/docker-compose/__snapshots__/extract.spec.ts.snap +++ b/lib/manager/docker-compose/__snapshots__/extract.spec.ts.snap @@ -7,9 +7,7 @@ Array [ "currentValue": "alpine", "datasource": "docker", "depName": "quay.io/something/redis", - "managerData": Object { - "lineNumber": 4, - }, + "replaceString": "quay.io/something/redis:alpine", }, Object { "commitMessageTopic": "Node.js", @@ -17,60 +15,46 @@ Array [ "currentValue": "10.0.0", "datasource": "docker", "depName": "node", - "managerData": Object { - "lineNumber": 18, - }, + "replaceString": "node:10.0.0", }, Object { "currentDigest": undefined, "currentValue": "9.4.0", "datasource": "docker", "depName": "postgres", - "managerData": Object { - "lineNumber": 21, - }, + "replaceString": "postgres:9.4.0", }, Object { "currentDigest": undefined, "currentValue": "before", "datasource": "docker", "depName": "dockersamples/examplevotingapp_vote", - "managerData": Object { - "lineNumber": 31, - }, + "replaceString": "dockersamples/examplevotingapp_vote:before", }, Object { "currentDigest": undefined, "currentValue": "before", "datasource": "docker", "depName": "dockersamples/examplevotingapp_result", - "managerData": Object { - "lineNumber": 46, - }, + "replaceString": "dockersamples/examplevotingapp_result:before", }, Object { "currentDigest": undefined, "currentValue": undefined, "datasource": "docker", "depName": "dockersamples/examplevotingapp_worker", - "managerData": Object { - "lineNumber": 62, - }, + "replaceString": "dockersamples/examplevotingapp_worker", }, Object { "currentDigest": undefined, "currentValue": "stable", "datasource": "docker", "depName": "dockersamples/visualizer", - "managerData": Object { - "lineNumber": 79, - }, + "replaceString": "dockersamples/visualizer:stable", }, Object { "datasource": "docker", - "managerData": Object { - "lineNumber": 90, - }, + "replaceString": "\${IMAGE:-synkodevelopers/edplugins}:\${TAG:-latest}", "skipReason": "contains-variable", }, ] diff --git a/lib/manager/docker-compose/extract.ts b/lib/manager/docker-compose/extract.ts index 54558acd70f5fcf66f322f623d53cf9c6287bfb7..4f2d0085d6ebe0ad157e6d939877397a451b181c 100644 --- a/lib/manager/docker-compose/extract.ts +++ b/lib/manager/docker-compose/extract.ts @@ -74,7 +74,6 @@ export function extractPackageFile( if (!lineNumber) { return null; } - dep.managerData = { lineNumber }; return dep; }) .filter(Boolean); diff --git a/lib/manager/docker-compose/index.ts b/lib/manager/docker-compose/index.ts index d669d93c623bffa6e9b80a98f17be963ba569729..79796edc360fedad192f3cb8770d980edeaebfcb 100644 --- a/lib/manager/docker-compose/index.ts +++ b/lib/manager/docker-compose/index.ts @@ -1,10 +1,9 @@ import { extractPackageFile } from './extract'; -import { updateDependency } from './update'; import { LANGUAGE_DOCKER } from '../../constants/languages'; const language = LANGUAGE_DOCKER; -export { extractPackageFile, language, updateDependency }; +export { extractPackageFile, language }; export const defaultConfig = { fileMatch: ['(^|/)docker-compose[^/]*\\.ya?ml$'], diff --git a/lib/manager/docker-compose/update.spec.ts b/lib/manager/docker-compose/update.spec.ts deleted file mode 100644 index b1682524cf178475c0358c8737def08795f23379..0000000000000000000000000000000000000000 --- a/lib/manager/docker-compose/update.spec.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { readFileSync } from 'fs'; -import { updateDependency } from './update'; - -const yamlFile = readFileSync( - 'lib/manager/docker-compose/__fixtures__/docker-compose.1.yml', - 'utf8' -); - -describe('manager/docker-compose/update', () => { - describe('updateDependency', () => { - it('replaces existing value', () => { - const upgrade = { - managerData: { lineNumber: 18 }, - depName: 'postgres', - newValue: '9.6.8', - newDigest: 'sha256:abcdefghijklmnop', - }; - const res = updateDependency({ fileContent: yamlFile, upgrade }); - expect(res).not.toEqual(yamlFile); - expect(res.includes(upgrade.newDigest)).toBe(true); - }); - it('returns same', () => { - const upgrade = { - managerData: { lineNumber: 4 }, - depName: 'quay.io/something/redis', - newValue: 'alpine', - }; - const res = updateDependency({ fileContent: yamlFile, upgrade }); - expect(res).toEqual(yamlFile); - }); - it('returns null if mismatch', () => { - const upgrade = { - managerData: { lineNumber: 17 }, - newFrom: 'postgres:9.6.8@sha256:abcdefghijklmnop', - }; - const res = updateDependency({ fileContent: yamlFile, upgrade }); - expect(res).toBeNull(); - }); - it('returns null if error', () => { - const res = updateDependency({ fileContent: null, upgrade: null }); - expect(res).toBeNull(); - }); - }); -}); diff --git a/lib/manager/docker-compose/update.ts b/lib/manager/docker-compose/update.ts deleted file mode 100644 index 1ad3f73e6a3e48600df05e7b0da3848cdedff714..0000000000000000000000000000000000000000 --- a/lib/manager/docker-compose/update.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { logger } from '../../logger'; -import { getNewFrom } from '../dockerfile/update'; -import { UpdateDependencyConfig } from '../common'; - -export function updateDependency({ - fileContent, - upgrade, -}: UpdateDependencyConfig): string { - try { - const newFrom = getNewFrom(upgrade); - logger.debug(`docker-compose.updateDependency(): ${newFrom}`); - const lines = fileContent.split('\n'); - const lineToChange = lines[upgrade.managerData.lineNumber]; - const imageLine = /^(\s*image:\s*'?"?)[^\s'"]+('?"?\s*)/; - if (!imageLine.test(lineToChange)) { - logger.debug('No image line found'); - return null; - } - const newLine = lineToChange.replace(imageLine, `$1${newFrom}$2`); - if (newLine === lineToChange) { - logger.debug('No changes necessary'); - return fileContent; - } - lines[upgrade.managerData.lineNumber] = newLine; - return lines.join('\n'); - } catch (err) { - logger.debug({ err }, 'Error setting new Dockerfile value'); - return null; - } -} diff --git a/lib/manager/dockerfile/__snapshots__/extract.spec.ts.snap b/lib/manager/dockerfile/__snapshots__/extract.spec.ts.snap index 38ba0fa9c41e4783cc5d40df26c9ffc3cb99b35a..4f366f261add16969f60dc206e11c40bebfd03e4 100644 --- a/lib/manager/dockerfile/__snapshots__/extract.spec.ts.snap +++ b/lib/manager/dockerfile/__snapshots__/extract.spec.ts.snap @@ -9,11 +9,7 @@ Array [ "datasource": "docker", "depName": "node", "depType": "stage", - "managerData": Object { - "fromPrefix": "FROM", - "fromSuffix": "as skippedfrom", - "lineNumber": 0, - }, + "replaceString": "node:8.15.1-alpine", }, Object { "currentDigest": undefined, @@ -21,11 +17,7 @@ Array [ "datasource": "docker", "depName": "golang", "depType": "stage", - "managerData": Object { - "fromPrefix": "FROM", - "fromSuffix": "as builder", - "lineNumber": 1, - }, + "replaceString": "golang:1.7.3", }, Object { "currentDigest": undefined, @@ -33,11 +25,7 @@ Array [ "datasource": "docker", "depName": "alpine", "depType": "final", - "managerData": Object { - "fromPrefix": "FROM", - "fromSuffix": "", - "lineNumber": 9, - }, + "replaceString": "alpine:latest", }, ] `; @@ -51,11 +39,7 @@ Array [ "datasource": "docker", "depName": "node", "depType": "stage", - "managerData": Object { - "fromPrefix": "FROM", - "fromSuffix": "AS node", - "lineNumber": 2, - }, + "replaceString": "node:8.11.3-alpine@sha256:d743b4141b02fcfb8beb68f92b4cd164f60ee457bf2d053f36785bf86de16b0d", }, Object { "currentDigest": undefined, @@ -63,11 +47,7 @@ Array [ "datasource": "docker", "depName": "buildkite/puppeteer", "depType": "final", - "managerData": Object { - "fromPrefix": "FROM", - "fromSuffix": "AS puppeteer", - "lineNumber": 3, - }, + "replaceString": "buildkite/puppeteer:1.1.1", }, ] `; @@ -81,11 +61,7 @@ Array [ "datasource": "docker", "depName": "node", "depType": "stage", - "managerData": Object { - "fromPrefix": "FROM", - "fromSuffix": "as frontend", - "lineNumber": 0, - }, + "replaceString": "node:6.12.3", }, Object { "currentDigest": undefined, @@ -93,11 +69,7 @@ Array [ "datasource": "docker", "depName": "python", "depType": "final", - "managerData": Object { - "fromPrefix": "FROM", - "fromSuffix": "", - "lineNumber": 4, - }, + "replaceString": "python:3.6-slim", }, ] `; @@ -110,11 +82,7 @@ Array [ "datasource": "docker", "depName": "gcr.io/k8s-skaffold/skaffold", "depType": "final", - "managerData": Object { - "fromPrefix": "COPY --from=", - "fromSuffix": "/usr/bin/skaffold /usr/bin/skaffold", - "lineNumber": 1, - }, + "replaceString": "gcr.io/k8s-skaffold/skaffold:v0.11.0", }, ] `; @@ -128,11 +96,7 @@ Array [ "datasource": "docker", "depName": "registry.allmine.info:5005/node", "depType": "final", - "managerData": Object { - "fromPrefix": "FROM", - "fromSuffix": "", - "lineNumber": 0, - }, + "replaceString": "registry.allmine.info:5005/node:8.7.0", }, ] `; @@ -145,11 +109,7 @@ Array [ "datasource": "docker", "depName": "calico/node", "depType": "final", - "managerData": Object { - "fromPrefix": "FROM", - "fromSuffix": "", - "lineNumber": 0, - }, + "replaceString": "calico/node", }, ] `; @@ -163,11 +123,7 @@ Array [ "datasource": "docker", "depName": "node", "depType": "final", - "managerData": Object { - "fromPrefix": "FROM", - "fromSuffix": "", - "lineNumber": 3, - }, + "replaceString": "node", }, ] `; @@ -181,11 +137,7 @@ Array [ "datasource": "docker", "depName": "registry2.something.info/node", "depType": "final", - "managerData": Object { - "fromPrefix": "FROM", - "fromSuffix": "", - "lineNumber": 0, - }, + "replaceString": "registry2.something.info/node:8", }, ] `; @@ -199,11 +151,7 @@ Array [ "datasource": "docker", "depName": "registry2.something.info/node", "depType": "final", - "managerData": Object { - "fromPrefix": "FROM", - "fromSuffix": "", - "lineNumber": 0, - }, + "replaceString": "registry2.something.info/node:8-alpine", }, ] `; @@ -217,11 +165,7 @@ Array [ "datasource": "docker", "depName": "registry2.something.info/someaccount/node", "depType": "final", - "managerData": Object { - "fromPrefix": "FROM", - "fromSuffix": "", - "lineNumber": 0, - }, + "replaceString": "registry2.something.info/someaccount/node:8", }, ] `; @@ -235,11 +179,7 @@ Array [ "datasource": "docker", "depName": "registry2.something.info:5005/node", "depType": "final", - "managerData": Object { - "fromPrefix": "FROM", - "fromSuffix": "", - "lineNumber": 0, - }, + "replaceString": "registry2.something.info:5005/node:8", }, ] `; @@ -253,11 +193,7 @@ Array [ "datasource": "docker", "depName": "registry2.something.info:5005/node", "depType": "final", - "managerData": Object { - "fromPrefix": "FROM", - "fromSuffix": "", - "lineNumber": 0, - }, + "replaceString": "registry2.something.info:5005/node", }, ] `; @@ -271,11 +207,7 @@ Array [ "datasource": "docker", "depName": "node", "depType": "final", - "managerData": Object { - "fromPrefix": "FROM", - "fromSuffix": "", - "lineNumber": 0, - }, + "replaceString": "node@sha256:eb85fc5b1198f5e1ec025ea07586bdbbf397e7d82df66c90d7511f533517e063", }, ] `; @@ -289,11 +221,7 @@ Array [ "datasource": "docker", "depName": "node", "depType": "final", - "managerData": Object { - "fromPrefix": "FROM", - "fromSuffix": "as base", - "lineNumber": 0, - }, + "replaceString": "node:8.9.0-alpine", }, ] `; @@ -307,11 +235,7 @@ Array [ "datasource": "docker", "depName": "node", "depType": "final", - "managerData": Object { - "fromPrefix": "FROM", - "fromSuffix": "", - "lineNumber": 0, - }, + "replaceString": "node", }, ] `; @@ -325,11 +249,7 @@ Array [ "datasource": "docker", "depName": "mynamespace/node", "depType": "final", - "managerData": Object { - "fromPrefix": "FROM", - "fromSuffix": "", - "lineNumber": 0, - }, + "replaceString": "mynamespace/node:8", }, ] `; @@ -343,11 +263,7 @@ Array [ "datasource": "docker", "depName": "node", "depType": "final", - "managerData": Object { - "fromPrefix": "FROM", - "fromSuffix": "", - "lineNumber": 0, - }, + "replaceString": "node:8.9.0-alpine", }, ] `; @@ -361,11 +277,7 @@ Array [ "datasource": "docker", "depName": "node", "depType": "final", - "managerData": Object { - "fromPrefix": "FROM", - "fromSuffix": "", - "lineNumber": 0, - }, + "replaceString": "node:8.9.0@sha256:eb85fc5b1198f5e1ec025ea07586bdbbf397e7d82df66c90d7511f533517e063", }, ] `; @@ -379,11 +291,7 @@ Array [ "datasource": "docker", "depName": "node", "depType": "final", - "managerData": Object { - "fromPrefix": "From", - "fromSuffix": "", - "lineNumber": 0, - }, + "replaceString": "node", }, ] `; @@ -397,11 +305,7 @@ Array [ "datasource": "docker", "depName": "node", "depType": "final", - "managerData": Object { - "fromPrefix": "FROM", - "fromSuffix": "as frontend", - "lineNumber": 0, - }, + "replaceString": "node:6.12.3", }, ] `; @@ -415,11 +319,7 @@ Array [ "datasource": "docker", "depName": "node", "depType": "final", - "managerData": Object { - "fromPrefix": "FROM", - "fromSuffix": "as frontend", - "lineNumber": 0, - }, + "replaceString": "node:6.12.3", }, ] `; @@ -433,11 +333,7 @@ Array [ "datasource": "docker", "depName": "node", "depType": "final", - "managerData": Object { - "fromPrefix": "FROM", - "fromSuffix": "as frontend", - "lineNumber": 0, - }, + "replaceString": "node:6.12.3", }, ] `; diff --git a/lib/manager/dockerfile/__snapshots__/update.spec.ts.snap b/lib/manager/dockerfile/__snapshots__/update.spec.ts.snap deleted file mode 100644 index d7467353fe5f3b8a5798387b0d2f2478e024e589..0000000000000000000000000000000000000000 --- a/lib/manager/dockerfile/__snapshots__/update.spec.ts.snap +++ /dev/null @@ -1,35 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`manager/dockerfile/update updateDependency handles similar FROM 1`] = ` -"FROM debian:wheezy@sha256:abcdefghijklmnop as stage-1 -RUN something -FROM debian:wheezy@sha256:abcdefghijklmnop -RUN something else" -`; - -exports[`manager/dockerfile/update updateDependency handles strange whitespace 1`] = ` -"# comment FROM node:8 -FROM node:8@sha256:abcdefghijklmnop as base -RUN something -" -`; - -exports[`manager/dockerfile/update updateDependency replaces COPY --from 1`] = ` -"FROM scratch -COPY --from=gcr.io/k8s-skaffold/skaffold:v0.12.0 /usr/bin/skaffold /usr/bin/skaffold -" -`; - -exports[`manager/dockerfile/update updateDependency replaces existing value 1`] = ` -"# comment FROM node:8 -FROM node:8.1-alpine@sha256:abcdefghijklmnop -RUN something -" -`; - -exports[`manager/dockerfile/update updateDependency replaces existing value with suffix 1`] = ` -"# comment FROM node:8 -FROM node:8@sha256:abcdefghijklmnop as base -RUN something -" -`; diff --git a/lib/manager/dockerfile/extract.spec.ts b/lib/manager/dockerfile/extract.spec.ts index d6639f715086b53584ffa82d155b7e07ce5f3a2d..04b3518c7873c3837ca5fb550a471c6b9e17a2a5 100644 --- a/lib/manager/dockerfile/extract.spec.ts +++ b/lib/manager/dockerfile/extract.spec.ts @@ -134,8 +134,6 @@ describe('lib/manager/dockerfile/extract', () => { res[2].depType === 'final', res[1].depType === 'stage', res[0].depType === 'stage', - res[2].managerData.lineNumber > res[1].managerData.lineNumber, - res[2].managerData.lineNumber > res[0].managerData.lineNumber, ].every(Boolean); expect(passed).toBe(true); }); diff --git a/lib/manager/dockerfile/extract.ts b/lib/manager/dockerfile/extract.ts index d89460e2e322f22f7fccc656495fd81098f55cf1..bff186674358c9c2f15020a7cc7c697a32cc0790 100644 --- a/lib/manager/dockerfile/extract.ts +++ b/lib/manager/dockerfile/extract.ts @@ -32,6 +32,7 @@ export function splitImageParts(currentFrom: string): PackageDependency { export function getDep(currentFrom: string): PackageDependency { const dep = splitImageParts(currentFrom); + dep.replaceString = currentFrom; dep.datasource = datasourceDocker.id; if ( dep.depName && @@ -51,12 +52,11 @@ export function extractPackageFile(content: string): PackageFile | null { const fromMatch = /^FROM /i.test(fromLine); if (fromMatch) { logger.trace({ lineNumber, fromLine }, 'FROM line'); - const [fromPrefix, currentFrom, ...fromRest] = fromLine.match(/\S+/g); + const [, currentFrom, ...fromRest] = fromLine.match(/\S+/g); if (fromRest.length === 2 && fromRest[0].toLowerCase() === 'as') { logger.debug('Found a multistage build stage name'); stageNames.push(fromRest[1]); } - const fromSuffix = fromRest.join(' '); if (currentFrom === 'scratch') { logger.debug('Skipping scratch'); } else if (stageNames.includes(currentFrom)) { @@ -71,18 +71,13 @@ export function extractPackageFile(content: string): PackageFile | null { }, 'Dockerfile FROM' ); - dep.managerData = { - lineNumber, - fromPrefix, - fromSuffix, - }; deps.push(dep); } } const copyFromMatch = /^(COPY --from=)([^\s]+)\s+(.*)$/i.exec(fromLine); if (copyFromMatch) { - const [, fromPrefix, currentFrom, fromSuffix] = copyFromMatch; + const [, , currentFrom] = copyFromMatch; logger.trace({ lineNumber, fromLine }, 'COPY --from line'); if (stageNames.includes(currentFrom)) { logger.debug({ currentFrom }, 'Skipping alias COPY --from'); @@ -98,11 +93,6 @@ export function extractPackageFile(content: string): PackageFile | null { }, 'Dockerfile COPY --from' ); - dep.managerData = { - lineNumber, - fromPrefix, - fromSuffix, - }; deps.push(dep); } } diff --git a/lib/manager/dockerfile/index.ts b/lib/manager/dockerfile/index.ts index 0fd63ab5d019e16de3d8cb7fdca7f556fce1f98d..92ce98f4a7ed19d36d2fd1002d558e8a9091b2ba 100644 --- a/lib/manager/dockerfile/index.ts +++ b/lib/manager/dockerfile/index.ts @@ -1,10 +1,9 @@ import { extractPackageFile } from './extract'; -import { updateDependency } from './update'; import { LANGUAGE_DOCKER } from '../../constants/languages'; const language = LANGUAGE_DOCKER; -export { extractPackageFile, language, updateDependency }; +export { extractPackageFile, language }; export const defaultConfig = { fileMatch: ['(^|/|\\.)Dockerfile$', '(^|/)Dockerfile\\.[^/]*$'], diff --git a/lib/manager/dockerfile/update.spec.ts b/lib/manager/dockerfile/update.spec.ts deleted file mode 100644 index cd4c163abe8631c52b5fc78838eda13785867eb9..0000000000000000000000000000000000000000 --- a/lib/manager/dockerfile/update.spec.ts +++ /dev/null @@ -1,134 +0,0 @@ -import * as dockerfile from './update'; - -describe('manager/dockerfile/update', () => { - describe('updateDependency', () => { - it('replaces existing value', () => { - const fileContent = '# comment FROM node:8\nFROM node:8\nRUN something\n'; - const upgrade = { - managerData: { lineNumber: 1, fromPrefix: 'FROM', fromSuffix: '' }, - depName: 'node', - newValue: '8.1-alpine', - newDigest: 'sha256:abcdefghijklmnop', - }; - const res = dockerfile.updateDependency({ fileContent, upgrade }); - expect(res).toMatchSnapshot(); - }); - it('replaces existing value with suffix', () => { - const fileContent = - '# comment FROM node:8\nFROM node:8 as base\nRUN something\n'; - const upgrade = { - managerData: { - lineNumber: 1, - fromPrefix: 'FROM', - fromSuffix: 'as base', - }, - depName: 'node', - newValue: '8', - newDigest: 'sha256:abcdefghijklmnop', - }; - const res = dockerfile.updateDependency({ fileContent, upgrade }); - expect(res).toMatchSnapshot(); - }); - it('handles strange whitespace', () => { - const fileContent = - '# comment FROM node:8\nFROM node:8 as base\nRUN something\n'; - const upgrade = { - managerData: { - lineNumber: 1, - fromPrefix: 'FROM', - fromSuffix: 'as base', - }, - depName: 'node', - newValue: '8', - - newDigest: 'sha256:abcdefghijklmnop', - }; - const res = dockerfile.updateDependency({ fileContent, upgrade }); - expect(res).toMatchSnapshot(); - }); - it('returns null if mismatch', () => { - const fileContent = - '# comment FROM node:8\nFROM node:8 as base\nRUN something\n'; - const upgrade = { - managerData: { lineNumber: 0, fromPrefix: 'FROM', fromSuffix: '' }, - depName: 'node', - newValue: '8', - newDigest: 'sha256:abcdefghijklmnop', - }; - const res = dockerfile.updateDependency({ fileContent, upgrade }); - expect(res).toBeNull(); - }); - it('returns unchanged', () => { - const fileContent = - '# comment FROM node:8\nFROM node:8 as base\nRUN something\n'; - const upgrade = { - managerData: { - lineNumber: 1, - fromPrefix: 'FROM', - fromSuffix: 'as base', - }, - depName: 'node', - newValue: '8', - }; - const res = dockerfile.updateDependency({ fileContent, upgrade }); - expect(res).toBe(fileContent); - }); - it('returns null on error', () => { - const fileContent = null; - const upgrade = { - managerData: { lineNumber: 1, fromPrefix: 'FROM', fromSuffix: '' }, - depName: 'node', - newValue: '8', - newDigest: 'sha256:abcdefghijklmnop', - }; - const res = dockerfile.updateDependency({ fileContent, upgrade }); - expect(res).toBeNull(); - }); - it('handles similar FROM', () => { - const fileContent = - 'FROM debian:wheezy as stage-1\nRUN something\nFROM debian:wheezy\nRUN something else'; - const upgrade1 = { - managerData: { - lineNumber: 0, - fromPrefix: 'FROM', - fromSuffix: 'as stage-1', - }, - depName: 'debian', - newValue: 'wheezy', - newDigest: 'sha256:abcdefghijklmnop', - }; - const upgrade2 = { - managerData: { lineNumber: 2, fromPrefix: 'FROM', fromSuffix: '' }, - depName: 'debian', - newValue: 'wheezy', - newDigest: 'sha256:abcdefghijklmnop', - }; - let res = dockerfile.updateDependency({ - fileContent, - upgrade: upgrade1, - }); - res = dockerfile.updateDependency({ - fileContent: res, - upgrade: upgrade2, - }); - expect(res).toMatchSnapshot(); - expect(res.includes('as stage-1')).toBe(true); - }); - it('replaces COPY --from', () => { - const fileContent = - 'FROM scratch\nCOPY --from=gcr.io/k8s-skaffold/skaffold:v0.11.0 /usr/bin/skaffold /usr/bin/skaffold\n'; - const upgrade = { - managerData: { - lineNumber: 1, - fromPrefix: 'COPY --from=', - fromSuffix: '/usr/bin/skaffold /usr/bin/skaffold', - }, - depName: 'gcr.io/k8s-skaffold/skaffold', - newValue: 'v0.12.0', - }; - const res = dockerfile.updateDependency({ fileContent, upgrade }); - expect(res).toMatchSnapshot(); - expect(res.includes(upgrade.newValue)).toBe(true); - }); - }); -}); diff --git a/lib/manager/dockerfile/update.ts b/lib/manager/dockerfile/update.ts deleted file mode 100644 index bf3c9c260133d0038dc587184ccf8d4a1023374b..0000000000000000000000000000000000000000 --- a/lib/manager/dockerfile/update.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { logger } from '../../logger'; -import { UpdateDependencyConfig, Upgrade } from '../common'; - -export function getNewFrom(upgrade: Upgrade): string { - const { depName, newValue, newDigest } = upgrade; - let newFrom = depName; - if (newValue) { - newFrom += `:${newValue}`; - } - if (newDigest) { - newFrom += `@${newDigest}`; - } - return newFrom; -} - -export function updateDependency({ - fileContent, - upgrade, -}: UpdateDependencyConfig): string | null { - try { - const { lineNumber, fromSuffix } = upgrade.managerData; - let { fromPrefix } = upgrade.managerData; - const newFrom = getNewFrom(upgrade); - logger.debug(`docker.updateDependency(): ${newFrom}`); - const lines = fileContent.split('\n'); - const lineToChange = lines[lineNumber]; - const imageLine = /^(FROM |COPY --from=)/i; - if (!imageLine.test(lineToChange)) { - logger.debug('No image line found'); - return null; - } - if (!fromPrefix.endsWith('=')) { - fromPrefix += ' '; - } - const newLine = `${fromPrefix}${newFrom} ${fromSuffix}`.trim(); - if (newLine === lineToChange) { - logger.debug('No changes necessary'); - return fileContent; - } - lines[lineNumber] = newLine; - return lines.join('\n'); - } catch (err) { - logger.debug({ err }, 'Error setting new Dockerfile value'); - return null; - } -} diff --git a/lib/manager/droneci/__snapshots__/extract.spec.ts.snap b/lib/manager/droneci/__snapshots__/extract.spec.ts.snap index cb6449d2a874acaa99b90247ea88eadaca64b3eb..a623bc510585708dfa988045e2e0c1b70e670181 100644 --- a/lib/manager/droneci/__snapshots__/extract.spec.ts.snap +++ b/lib/manager/droneci/__snapshots__/extract.spec.ts.snap @@ -8,9 +8,7 @@ Array [ "datasource": "docker", "depName": "elixir", "depType": "docker", - "managerData": Object { - "lineNumber": 5, - }, + "replaceString": "elixir:1.8.1-alpine", }, Object { "commitMessageTopic": "Node.js", @@ -19,9 +17,7 @@ Array [ "datasource": "docker", "depName": "amd64/node", "depType": "docker", - "managerData": Object { - "lineNumber": 16, - }, + "replaceString": "amd64/node:10.0.0@sha256:36adc17e9cceab32179d3314da9cb9c737ffb11f0de4e688f407ad6d9ca32201", }, Object { "currentDigest": undefined, @@ -29,9 +25,7 @@ Array [ "datasource": "docker", "depName": "mysql", "depType": "docker", - "managerData": Object { - "lineNumber": 23, - }, + "replaceString": "mysql:5.7.24", }, Object { "currentDigest": undefined, @@ -39,9 +33,7 @@ Array [ "datasource": "docker", "depName": "redis", "depType": "docker", - "managerData": Object { - "lineNumber": 28, - }, + "replaceString": "redis:alpine", }, ] `; diff --git a/lib/manager/droneci/extract.ts b/lib/manager/droneci/extract.ts index 9c65241b3ecd2089e51195a51f8f0ba6ed85532d..87295ef4725b19428b6295449bf6167e4d96e9d8 100644 --- a/lib/manager/droneci/extract.ts +++ b/lib/manager/droneci/extract.ts @@ -21,7 +21,6 @@ export function extractPackageFile(content: string): PackageFile | null { 'DroneCI docker image' ); dep.depType = 'docker'; - dep.managerData = { lineNumber }; deps.push(dep); } } diff --git a/lib/manager/droneci/index.ts b/lib/manager/droneci/index.ts index 1eebd3de018851b4c7de423c9d41d1af06dc8027..de68df83e44f3f336ebda2a6e1c2a949f5885974 100644 --- a/lib/manager/droneci/index.ts +++ b/lib/manager/droneci/index.ts @@ -1,10 +1,9 @@ import { extractPackageFile } from './extract'; -import { updateDependency } from './update'; import { LANGUAGE_DOCKER } from '../../constants/languages'; const language = LANGUAGE_DOCKER; -export { extractPackageFile, language, updateDependency }; +export { extractPackageFile, language }; export const defaultConfig = { fileMatch: ['(^|/).drone.yml$'], diff --git a/lib/manager/droneci/update.spec.ts b/lib/manager/droneci/update.spec.ts deleted file mode 100644 index 5947dbbee4a5a818e700ad38dfb58c410797fbae..0000000000000000000000000000000000000000 --- a/lib/manager/droneci/update.spec.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { readFileSync } from 'fs'; -import { resolve } from 'path'; - -import { updateDependency } from './update'; - -const droneYAML = readFileSync( - resolve('lib/manager/droneci/__fixtures__/.drone.yml'), - 'utf8' -); - -describe('manager/droneci/update', () => { - describe('updateDependency', () => { - it('replaces existing value', () => { - const upgrade = { - managerData: { lineNumber: 16 }, - depType: 'docker', - depName: 'node', - newValue: '10.16.0', - newDigest: 'sha256:new-node-hash', - }; - const res = updateDependency({ fileContent: droneYAML, upgrade }); - expect(res).not.toEqual(droneYAML); - expect(res.includes(upgrade.newDigest)).toBe(true); - }); - - it('returns same', () => { - const upgrade = { - managerData: { lineNumber: 28 }, - depType: 'docker', - depName: 'redis:alpine', - }; - const res = updateDependency({ fileContent: droneYAML, upgrade }); - expect(res).toEqual(droneYAML); - }); - - it('returns null if mismatch', () => { - const upgrade = { - managerData: { lineNumber: 17 }, - depType: 'docker', - depName: 'postgres', - newValue: '9.6.8', - newDigest: 'sha256:abcdefghijklmnop', - }; - const res = updateDependency({ fileContent: droneYAML, upgrade }); - expect(res).toBeNull(); - }); - - it('returns null if error', () => { - const res = updateDependency({ fileContent: null, upgrade: null }); - expect(res).toBeNull(); - }); - - it('returns null for unknown depType', () => { - const upgrade = { - currentValue: '4.1.0', - depName: 'release-workflows', - managerData: { lineNumber: 3 }, - newValue: '4.2.0', - }; - const res = updateDependency({ fileContent: droneYAML, upgrade }); - expect(res).toBeNull(); - }); - }); -}); diff --git a/lib/manager/droneci/update.ts b/lib/manager/droneci/update.ts deleted file mode 100644 index 920a28770fac03127283495ebd1aa9619c1d25ea..0000000000000000000000000000000000000000 --- a/lib/manager/droneci/update.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { logger } from '../../logger'; -import { getNewFrom } from '../dockerfile/update'; -import { UpdateDependencyConfig } from '../common'; - -export function updateDependency({ - fileContent, - upgrade, -}: UpdateDependencyConfig): string | null { - try { - const lines = fileContent.split('\n'); - const lineToChange = lines[upgrade.managerData.lineNumber]; - if (upgrade.depType === 'docker') { - const newFrom = getNewFrom(upgrade); - logger.debug(`droneci.updateDependency(): ${newFrom}`); - const imageLine = /^(\s* image:\s*'?"?)[^\s'"]+('?"?\s*)$/; - if (!imageLine.test(lineToChange)) { - logger.debug('No image line found'); - return null; - } - const newLine = lineToChange.replace(imageLine, `$1${newFrom}$2`); - if (newLine === lineToChange) { - logger.debug('No changes necessary'); - return fileContent; - } - lines[upgrade.managerData.lineNumber] = newLine; - return lines.join('\n'); - } - logger.error('Unknown DroneCI depType'); - return null; - } catch (err) { - logger.debug({ err }, 'Error setting new DroneCI image value'); - return null; - } -} diff --git a/lib/manager/github-actions/__snapshots__/extract.spec.ts.snap b/lib/manager/github-actions/__snapshots__/extract.spec.ts.snap index d4638ac065c5048d34409dfe5edd59df73d6ad66..26f8db34d7b1a78def268e529a90cf3fa132ff7a 100644 --- a/lib/manager/github-actions/__snapshots__/extract.spec.ts.snap +++ b/lib/manager/github-actions/__snapshots__/extract.spec.ts.snap @@ -7,9 +7,7 @@ Array [ "currentValue": undefined, "datasource": "docker", "depName": "replicated/dockerfilelint", - "managerData": Object { - "lineNumber": 11, - }, + "replaceString": "replicated/dockerfilelint", "versioning": "docker", }, Object { @@ -18,9 +16,7 @@ Array [ "currentValue": "6", "datasource": "docker", "depName": "node", - "managerData": Object { - "lineNumber": 36, - }, + "replaceString": "node:6@sha256:7b65413af120ec5328077775022c78101f103258a1876ec2f83890bce416e896", "versioning": "docker", }, ] @@ -33,9 +29,7 @@ Array [ "currentValue": undefined, "datasource": "docker", "depName": "replicated/dockerfilelint", - "managerData": Object { - "lineNumber": 17, - }, + "replaceString": "replicated/dockerfilelint", "versioning": "docker", }, Object { @@ -44,9 +38,7 @@ Array [ "currentValue": "6", "datasource": "docker", "depName": "node", - "managerData": Object { - "lineNumber": 31, - }, + "replaceString": "node:6@sha256:7b65413af120ec5328077775022c78101f103258a1876ec2f83890bce416e896", "versioning": "docker", }, ] diff --git a/lib/manager/github-actions/extract.ts b/lib/manager/github-actions/extract.ts index 15fcc0290f32f447861731e1836891e09d45ee8a..02d3be9b1f8704ddeecdf9c054765146217e4d74 100644 --- a/lib/manager/github-actions/extract.ts +++ b/lib/manager/github-actions/extract.ts @@ -6,7 +6,6 @@ import * as dockerVersioning from '../../versioning/docker'; export function extractPackageFile(content: string): PackageFile | null { logger.debug('github-actions.extractPackageFile()'); const deps: PackageDependency[] = []; - let lineNumber = 0; for (const line of content.split('\n')) { // old github actions syntax will be deprecated on September 30, 2019 // after that, the first line can be removed @@ -24,11 +23,9 @@ export function extractPackageFile(content: string): PackageFile | null { }, 'Docker image inside GitHub Actions' ); - dep.managerData = { lineNumber }; dep.versioning = dockerVersioning.id; deps.push(dep); } - lineNumber += 1; } if (!deps.length) { return null; diff --git a/lib/manager/github-actions/index.ts b/lib/manager/github-actions/index.ts index a88cc79e19da45a2c8dcf2e47fe22a7b973ee55b..783e09e991c3924695e6d27ce0fab279c49d8fee 100644 --- a/lib/manager/github-actions/index.ts +++ b/lib/manager/github-actions/index.ts @@ -1,10 +1,9 @@ import { extractPackageFile } from './extract'; -import { updateDependency } from './update'; import { LANGUAGE_DOCKER } from '../../constants/languages'; const language = LANGUAGE_DOCKER; -export { extractPackageFile, language, updateDependency }; +export { extractPackageFile, language }; export const defaultConfig = { fileMatch: [ diff --git a/lib/manager/github-actions/update.spec.ts b/lib/manager/github-actions/update.spec.ts deleted file mode 100644 index 57d66b8034df95ab325e61234b44c3c55920b3e6..0000000000000000000000000000000000000000 --- a/lib/manager/github-actions/update.spec.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { readFileSync } from 'fs'; -import { updateDependency } from './update'; - -const workflow1 = readFileSync( - 'lib/manager/github-actions/__fixtures__/main.workflow.1', - 'utf8' -); - -const workflow2 = readFileSync( - 'lib/manager/github-actions/__fixtures__/workflow.yml.1', - 'utf8' -); - -describe('manager/github-actions/update', () => { - describe('updateDependency', () => { - it('replaces existing uses value', () => { - const upgrade = { - managerData: { lineNumber: 11 }, - depName: 'replicated/dockerfilelint', - newDigest: 'sha256:abcdefghijklmnop', - }; - const res = updateDependency({ fileContent: workflow1, upgrade }); - expect(res).not.toEqual(workflow1); - expect(res.includes(upgrade.newDigest)).toBe(true); - }); - it('returns same', () => { - const upgrade = { - managerData: { lineNumber: 11 }, - depName: 'replicated/dockerfilelint', - }; - const res = updateDependency({ fileContent: workflow1, upgrade }); - expect(res).toEqual(workflow1); - }); - it('returns null if mismatch', () => { - const upgrade = { - managerData: { lineNumber: 12 }, - newFrom: 'registry:2.6.2@sha256:abcdefghijklmnop', - }; - const res = updateDependency({ fileContent: workflow1, upgrade }); - expect(res).toBeNull(); - }); - it('returns null if error', () => { - const res = updateDependency({ fileContent: null, upgrade: null }); - expect(res).toBeNull(); - }); - it('replaces existing uses value in yaml file', () => { - const upgrade = { - managerData: { lineNumber: 17 }, - depName: 'replicated/dockerfilelint', - newDigest: 'sha256:abcdefghijklmnop', - }; - const res = updateDependency({ fileContent: workflow2, upgrade }); - expect(res).not.toEqual(workflow2); - expect(res.includes(upgrade.newDigest)).toBe(true); - }); - it('returns same in yaml file', () => { - const upgrade = { - managerData: { lineNumber: 17 }, - depName: 'replicated/dockerfilelint', - }; - const res = updateDependency({ fileContent: workflow2, upgrade }); - expect(res).toEqual(workflow2); - }); - it('returns null if mismatch in yaml file', () => { - const upgrade = { - managerData: { lineNumber: 12 }, - newFrom: 'registry:2.6.2@sha256:abcdefghijklmnop', - }; - const res = updateDependency({ fileContent: workflow2, upgrade }); - expect(res).toBeNull(); - }); - }); -}); diff --git a/lib/manager/github-actions/update.ts b/lib/manager/github-actions/update.ts deleted file mode 100644 index 0b005bbf0d680cec4cb655a4971fc253c4fd3419..0000000000000000000000000000000000000000 --- a/lib/manager/github-actions/update.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { logger } from '../../logger'; -import { getNewFrom } from '../dockerfile/update'; -import { UpdateDependencyConfig } from '../common'; - -export function updateDependency({ - fileContent, - upgrade, -}: UpdateDependencyConfig): string | null { - try { - const newFrom = getNewFrom(upgrade); - logger.debug(`github-actions.updateDependency(): ${newFrom}`); - const lines = fileContent.split('\n'); - const lineToChange = lines[upgrade.managerData.lineNumber]; - const imageLine = /^(.+docker:\/\/)[^"]+("\s*)?$/; - if (!imageLine.test(lineToChange)) { - logger.debug('No image line found'); - return null; - } - const newLine = lineToChange.replace(imageLine, `$1${newFrom}$2`); - if (newLine === lineToChange) { - logger.debug('No changes necessary'); - return fileContent; - } - lines[upgrade.managerData.lineNumber] = newLine; - return lines.join('\n'); - } catch (err) { - logger.debug({ err }, 'Error setting new github-actions value'); - return null; - } -} diff --git a/lib/manager/gitlabci/__snapshots__/extract.spec.ts.snap b/lib/manager/gitlabci/__snapshots__/extract.spec.ts.snap index 507c0c20f5b84ffdaea2a9be9177d4dd9a368784..2cdb5646846d0f06fea8be5238d40cde0bd6e1f9 100644 --- a/lib/manager/gitlabci/__snapshots__/extract.spec.ts.snap +++ b/lib/manager/gitlabci/__snapshots__/extract.spec.ts.snap @@ -8,9 +8,7 @@ Array [ "datasource": "docker", "depName": "hadolint/hadolint", "depType": "image", - "managerData": Object { - "lineNumber": 36, - }, + "replaceString": "hadolint/hadolint:latest", }, Object { "currentDigest": undefined, @@ -18,9 +16,7 @@ Array [ "datasource": "docker", "depName": "docker", "depType": "image", - "managerData": Object { - "lineNumber": 53, - }, + "replaceString": "docker:latest", }, Object { "currentDigest": undefined, @@ -28,9 +24,7 @@ Array [ "datasource": "docker", "depName": "docker", "depType": "service-image", - "managerData": Object { - "lineNumber": 55, - }, + "replaceString": "docker:dind", }, Object { "currentDigest": undefined, @@ -38,9 +32,7 @@ Array [ "datasource": "docker", "depName": "docker", "depType": "image", - "managerData": Object { - "lineNumber": 75, - }, + "replaceString": "docker:latest", }, Object { "currentDigest": undefined, @@ -48,9 +40,7 @@ Array [ "datasource": "docker", "depName": "docker", "depType": "service-image", - "managerData": Object { - "lineNumber": 77, - }, + "replaceString": "docker:dind", }, Object { "currentDigest": undefined, @@ -58,9 +48,7 @@ Array [ "datasource": "docker", "depName": "image-name-test", "depType": "image-name", - "managerData": Object { - "lineNumber": 102, - }, + "replaceString": "image-name-test:1.15", }, ] `; @@ -73,9 +61,7 @@ Array [ "datasource": "docker", "depName": "renovate/renovate", "depType": "image-name", - "managerData": Object { - "lineNumber": 2, - }, + "replaceString": "renovate/renovate:19.70.8-slim", }, Object { "currentDigest": undefined, @@ -83,9 +69,7 @@ Array [ "datasource": "docker", "depName": "mariadb", "depType": "service-image", - "managerData": Object { - "lineNumber": 6, - }, + "replaceString": "mariadb:10.4.11", }, Object { "currentDigest": undefined, @@ -93,9 +77,7 @@ Array [ "datasource": "docker", "depName": "other/image", "depType": "service-image", - "managerData": Object { - "lineNumber": 8, - }, + "replaceString": "other/image:1.0.0", }, ] `; diff --git a/lib/manager/gitlabci/extract.ts b/lib/manager/gitlabci/extract.ts index e938a2e996d691aa05bb816dd631f4970d1d29da..54955a6c6e450c732159550e7e9fbf6c7fb1561b 100644 --- a/lib/manager/gitlabci/extract.ts +++ b/lib/manager/gitlabci/extract.ts @@ -34,7 +34,6 @@ export function extractPackageFile(content: string): PackageFile | null { logger.trace(`Matched image name on line ${lineNumber}`); const currentFrom = imageNameMatch[1]; const dep = getDep(currentFrom); - dep.managerData = { lineNumber }; dep.depType = 'image-name'; deps.push(dep); } @@ -44,7 +43,6 @@ export function extractPackageFile(content: string): PackageFile | null { logger.trace(`Matched image on line ${lineNumber}`); const currentFrom = imageMatch[1]; const dep = getDep(currentFrom); - dep.managerData = { lineNumber }; dep.depType = 'image'; deps.push(dep); } @@ -67,7 +65,6 @@ export function extractPackageFile(content: string): PackageFile | null { const currentFrom = serviceImageMatch[1]; lineNumber = serviceImageLine.lineNumber; const dep = getDep(currentFrom); - dep.managerData = { lineNumber }; dep.depType = 'service-image'; deps.push(dep); } diff --git a/lib/manager/gitlabci/index.ts b/lib/manager/gitlabci/index.ts index 049a65d665af3a722f8fcfb7c106adc5c89b41c7..3251a4153f80cabdc30ad41f7ffa94ac7a118188 100644 --- a/lib/manager/gitlabci/index.ts +++ b/lib/manager/gitlabci/index.ts @@ -1,10 +1,9 @@ import { extractPackageFile } from './extract'; -import { updateDependency } from './update'; import { LANGUAGE_DOCKER } from '../../constants/languages'; const language = LANGUAGE_DOCKER; -export { extractPackageFile, language, updateDependency }; +export { extractPackageFile, language }; export const defaultConfig = { fileMatch: ['^\\.gitlab-ci\\.yml$'], diff --git a/lib/manager/gitlabci/update.spec.ts b/lib/manager/gitlabci/update.spec.ts deleted file mode 100644 index cc1538e28de11fb0ce51077f8651ad9d3719eb1c..0000000000000000000000000000000000000000 --- a/lib/manager/gitlabci/update.spec.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { readFileSync } from 'fs'; -import { updateDependency } from './update'; - -const yamlFile = readFileSync( - 'lib/manager/gitlabci/__fixtures__/gitlab-ci.yaml', - 'utf8' -); - -describe('manager/gitlabci/update', () => { - describe('updateDependency', () => { - it('replaces existing value', () => { - const upgrade = { - managerData: { lineNumber: 36 }, - depType: 'image', - depName: 'hadolint/hadolint', - newValue: '7.0.0', - newDigest: 'sha256:abcdefghijklmnop', - }; - const res = updateDependency({ fileContent: yamlFile, upgrade }); - expect(res).not.toEqual(yamlFile); - expect(res.includes(upgrade.newDigest)).toBe(true); - }); - it('returns same', () => { - const upgrade = { - depType: 'image', - managerData: { lineNumber: 36 }, - depName: 'hadolint/hadolint', - newValue: 'latest', - }; - const res = updateDependency({ fileContent: yamlFile, upgrade }); - expect(res).toEqual(yamlFile); - }); - it('returns null if mismatch', () => { - const upgrade = { - managerData: { lineNumber: 17 }, - depType: 'image', - depName: 'postgres', - newValue: '9.6.8', - newDigest: 'sha256:abcdefghijklmnop', - }; - const res = updateDependency({ fileContent: yamlFile, upgrade }); - expect(res).toBeNull(); - }); - it('replaces image-name value', () => { - const upgrade = { - managerData: { lineNumber: 102 }, - depType: 'image-name', - depName: 'image-name-test', - newValue: '1.35', - }; - const res = updateDependency({ fileContent: yamlFile, upgrade }); - expect(res).not.toEqual(yamlFile); - }); - it('returns same image-name value', () => { - const upgrade = { - managerData: { lineNumber: 102 }, - depType: 'image-name', - depName: 'image-name-test', - newValue: '1.15', - }; - const res = updateDependency({ fileContent: yamlFile, upgrade }); - expect(res).toEqual(yamlFile); - }); - it('replaces service-image update', () => { - const upgrade = { - managerData: { lineNumber: 55 }, - depType: 'service-image', - depName: 'hadolint/hadolint', - newValue: '7.0.0', - newDigest: 'sha256:abcdefghijklmnop', - }; - const res = updateDependency({ fileContent: yamlFile, upgrade }); - expect(res).not.toEqual(yamlFile); - expect(res.includes(upgrade.newDigest)).toBe(true); - }); - it('returns null if service-image mismatch', () => { - const upgrade = { - managerData: { lineNumber: 17 }, - depType: 'service-image', - depName: 'postgres', - newValue: '9.6.8', - newDigest: 'sha256:abcdefghijklmnop', - }; - const res = updateDependency({ fileContent: yamlFile, upgrade }); - expect(res).toBeNull(); - }); - it('returns service-image same', () => { - const upgrade = { - depType: 'serviceimage', - managerData: { lineNumber: 55 }, - depName: 'docker', - newValue: 'dind', - }; - const res = updateDependency({ fileContent: yamlFile, upgrade }); - expect(res).toEqual(yamlFile); - }); - it('returns null if error', () => { - const res = updateDependency({ fileContent: null, upgrade: null }); - expect(res).toBeNull(); - }); - }); -}); diff --git a/lib/manager/gitlabci/update.ts b/lib/manager/gitlabci/update.ts deleted file mode 100644 index bdd29099001ad2413224154ff17f4b4c8377b5ce..0000000000000000000000000000000000000000 --- a/lib/manager/gitlabci/update.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { logger } from '../../logger'; -import { getNewFrom } from '../dockerfile/update'; -import { UpdateDependencyConfig } from '../common'; - -export function updateDependency({ - fileContent, - upgrade, -}: UpdateDependencyConfig): string | null { - try { - const newFrom = getNewFrom(upgrade); - const lines = fileContent.split('\n'); - const lineToChange = lines[upgrade.managerData.lineNumber]; - if (['image', 'image-name'].includes(upgrade.depType)) { - const imageLine = /^(\s*(?:image|name):\s*'?"?)[^\s'"]+('?"?\s*)$/; - if (!imageLine.test(lineToChange)) { - logger.debug('No image line found'); - return null; - } - const newLine = lineToChange.replace(imageLine, `$1${newFrom}$2`); - if (newLine === lineToChange) { - logger.debug('No changes necessary'); - return fileContent; - } - lines[upgrade.managerData.lineNumber] = newLine; - return lines.join('\n'); - } - const serviceLine = /^(\s*-\s*'?"?)[^\s'"]+('?"?\s*)$/; - if (!serviceLine.test(lineToChange)) { - logger.debug('No image line found'); - return null; - } - const newLine = lineToChange.replace(serviceLine, `$1${newFrom}$2`); - if (newLine === lineToChange) { - logger.debug('No changes necessary'); - return fileContent; - } - lines[upgrade.managerData.lineNumber] = newLine; - return lines.join('\n'); - } catch (err) { - logger.debug({ err }, 'Error setting new Dockerfile value'); - return null; - } -} diff --git a/lib/manager/helm-values/__snapshots__/extract.spec.ts.snap b/lib/manager/helm-values/__snapshots__/extract.spec.ts.snap index 639a6cd8a38bfad7663a019c99b9558697d1c0c0..6f844977577f96583bceb4c951a4d633cad50945 100644 --- a/lib/manager/helm-values/__snapshots__/extract.spec.ts.snap +++ b/lib/manager/helm-values/__snapshots__/extract.spec.ts.snap @@ -8,18 +8,21 @@ Object { "currentValue": "11.6.0-debian-9-r0", "datasource": "docker", "depName": "bitnami/postgresql", + "replaceString": "bitnami/postgresql:11.6.0-debian-9-r0", }, Object { "currentDigest": undefined, "currentValue": "0.7.0-debian-9-r12", "datasource": "docker", "depName": "docker.io/bitnami/postgres-exporter", + "replaceString": "docker.io/bitnami/postgres-exporter:0.7.0-debian-9-r12", }, Object { "currentDigest": undefined, "currentValue": "11.5.0-debian-9-r0", "datasource": "docker", "depName": "docker.io/bitnami/postgresql", + "replaceString": "docker.io/bitnami/postgresql:11.5.0-debian-9-r0", }, ], } @@ -33,6 +36,7 @@ Object { "currentValue": "1.16.1", "datasource": "docker", "depName": "nginx", + "replaceString": "nginx:1.16.1", }, ], } diff --git a/lib/manager/helm-values/__snapshots__/update.spec.ts.snap b/lib/manager/helm-values/__snapshots__/update.spec.ts.snap deleted file mode 100644 index 817ed37a3af75a28e35170eb8552fc277b9922ae..0000000000000000000000000000000000000000 --- a/lib/manager/helm-values/__snapshots__/update.spec.ts.snap +++ /dev/null @@ -1,53 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`lib/manager/helm-values/update updateDependency() survives null values of keys 1`] = ` -" - empty_key: - image: - repository: bitnami/postgres-exporter - tag: 0.8.0 -" -`; - -exports[`lib/manager/helm-values/update updateDependency() upgrades correct dependency if registry included 1`] = ` -" - db: - image: - image: - repository: bitnami/postgresql - tag: 11.6.0-debian-9-r0 - some-non-image-related-key: 'with-some-value' - warehouse: - image: - registry: docker.io - repository: bitnami/postgresql - tag: 12.5.0 - some-non-image-related-key: 'with-some-value' -" -`; - -exports[`lib/manager/helm-values/update updateDependency() upgrades dependency if newValue version value is repeated 1`] = ` -" - db: - image: - image: - registry: docker.io - repository: bitnami/postgresql - tag: 12.5.0 - some-non-image-related-key: 'with-some-value' - warehouse: - image: - registry: docker.io - repository: bitnami/postgresql - tag: 11.6.0-debian-9-r0 - some-non-image-related-key: 'with-some-value' -" -`; - -exports[`lib/manager/helm-values/update updateDependency() upgrades dependency if valid upgrade 1`] = ` -" - image: - repository: bitnami/postgres-exporter - tag: 0.8.0 -" -`; diff --git a/lib/manager/helm-values/index.ts b/lib/manager/helm-values/index.ts index bb544cc0754783adbdef2277b05ed44cdca9d5c9..455e99092fcb3bb5649f02739d8ff1fb504c8351 100644 --- a/lib/manager/helm-values/index.ts +++ b/lib/manager/helm-values/index.ts @@ -1,5 +1,4 @@ export { extractPackageFile } from './extract'; -export { updateDependency } from './update'; export const defaultConfig = { commitMessageTopic: 'helm values {{depName}}', diff --git a/lib/manager/helm-values/update.spec.ts b/lib/manager/helm-values/update.spec.ts deleted file mode 100644 index 4ec85ed711a2f21b938393fc4cb25238a09de5a0..0000000000000000000000000000000000000000 --- a/lib/manager/helm-values/update.spec.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { updateDependency } from './update'; - -describe('lib/manager/helm-values/update', () => { - describe('updateDependency()', () => { - it('returns the same fileContent for undefined upgrade', () => { - const fileContent = 'someKey: "someValue"'; - const upgrade = undefined; - - expect(updateDependency({ fileContent, upgrade })).toBe(fileContent); - }); - it('returns the same fileContent for invalid values.yaml file', () => { - const fileContent = ` - Invalid values.yaml content. - `; - const upgrade = { - depName: 'bitnami/postgres-exporter', - currentValue: '0.7.0-debian-9-r12', - datasource: 'docker', - newValue: '0.8.0', - dockerRepository: 'bitnami/postgres-exporter', - }; - expect(updateDependency({ fileContent, upgrade })).toBe(fileContent); - }); - // https://github.com/renovatebot/renovate/issues/5298 - it('returns the same fileContent for duplicate key errors', () => { - const fileContent = ` - replicaCount: 1 - replicaCount: 5 - `; - const upgrade = { - depName: 'bitnami/postgres-exporter', - currentValue: '0.7.0-debian-9-r12', - datasource: 'docker', - newValue: '0.8.0', - dockerRepository: 'bitnami/postgres-exporter', - }; - expect(updateDependency({ fileContent, upgrade })).toBe(fileContent); - }); - it('returns the same fileContent for empty upgrade', () => { - const fileContent = 'someKey: "someValue"'; - const upgrade = {}; - expect(updateDependency({ fileContent, upgrade })).toBe(fileContent); - }); - it('returns the same fileContent for null content', () => { - const fileContent = null; - const upgrade = {}; - expect(updateDependency({ fileContent, upgrade })).toBe(fileContent); - }); - it('upgrades dependency if valid upgrade', () => { - const fileContent = ` - image: - repository: bitnami/postgres-exporter - tag: 0.7.0-debian-9-r12 - `; - const upgrade = { - depName: 'bitnami/postgres-exporter', - currentValue: '0.7.0-debian-9-r12', - newValue: '0.8.0', - dockerRepository: 'bitnami/postgres-exporter', - }; - expect(updateDependency({ fileContent, upgrade })).not.toBe(fileContent); - expect(updateDependency({ fileContent, upgrade })).toMatchSnapshot(); - }); - it('survives null values of keys', () => { - const fileContent = ` - empty_key: - image: - repository: bitnami/postgres-exporter - tag: 0.7.0-debian-9-r12 - `; - const upgrade = { - depName: 'bitnami/postgres-exporter', - currentValue: '0.7.0-debian-9-r12', - newValue: '0.8.0', - dockerRepository: 'bitnami/postgres-exporter', - }; - expect(updateDependency({ fileContent, upgrade })).not.toBe(fileContent); - expect(updateDependency({ fileContent, upgrade })).toMatchSnapshot(); - }); - it('upgrades dependency if newValue version value is repeated', () => { - const fileContent = ` - db: - image: - image: - registry: docker.io - repository: bitnami/postgresql - tag: 11.6.0-debian-9-r0 - some-non-image-related-key: 'with-some-value' - warehouse: - image: - registry: docker.io - repository: bitnami/postgresql - tag: 11.6.0-debian-9-r0 - some-non-image-related-key: 'with-some-value' - `; - const upgrade = { - depName: 'docker.io/bitnami/postgresql', - currentValue: '11.6.0-debian-9-r0', - newValue: '12.5.0', - dockerRepository: 'bitnami/postgresql', - }; - expect(updateDependency({ fileContent, upgrade })).not.toBe(fileContent); - expect(updateDependency({ fileContent, upgrade })).toMatchSnapshot(); - }); - it('upgrades correct dependency if registry included', () => { - const fileContent = ` - db: - image: - image: - repository: bitnami/postgresql - tag: 11.6.0-debian-9-r0 - some-non-image-related-key: 'with-some-value' - warehouse: - image: - registry: docker.io - repository: bitnami/postgresql - tag: 11.6.0-debian-9-r0 - some-non-image-related-key: 'with-some-value' - `; - const upgrade = { - depName: 'docker.io/bitnami/postgresql', - currentValue: '11.6.0-debian-9-r0', - newValue: '12.5.0', - dockerRepository: 'bitnami/postgresql', - }; - - expect(updateDependency({ fileContent, upgrade })).not.toBe(fileContent); - expect(updateDependency({ fileContent, upgrade })).toMatchSnapshot(); - }); - }); -}); diff --git a/lib/manager/helm-values/update.ts b/lib/manager/helm-values/update.ts deleted file mode 100644 index d0ce8ee3a47d295b6c556d07da8492e7c86f92ce..0000000000000000000000000000000000000000 --- a/lib/manager/helm-values/update.ts +++ /dev/null @@ -1,128 +0,0 @@ -import YAWN from 'yawn-yaml/cjs'; -import { logger } from '../../logger'; -import { UpdateDependencyConfig } from '../common'; -import { - matchesHelmValuesDockerHeuristic, - HelmDockerImageDependency, -} from './util'; - -function shouldUpdate( - parentKey: string, - data: unknown | HelmDockerImageDependency, - dockerRepository: string, - currentValue: string, - originalRegistryValue: string -): boolean { - return ( - matchesHelmValuesDockerHeuristic(parentKey, data) && - data.repository === dockerRepository && - data.tag === currentValue && - ((!data.registry && !originalRegistryValue) || - data.registry === originalRegistryValue) - ); -} - -/** - * Extract the originally set registry value if it is included in the depName. - */ -function getOriginalRegistryValue( - depName: string, - dockerRepository: string -): string { - if (depName.length > dockerRepository.length) { - return depName.substring(0, depName.lastIndexOf(dockerRepository) - 1); - } - return ''; -} - -/** - * Recursive function that walks the yaml strucuture - * and updates the first match of an 'image' key it finds, - * if it adheres to the supported structure. - * - * @param parsedContent The part of the yaml tree we should look at. - * @param dockerRepository The docker repository that should be updated. - * @param currentValue The current version that should be updated. - * @param newValue The update version that should be set instead of currentValue. - * @returns True if the parsedContent was updated, false otherwise. - */ -function updateDoc( - parsedContent: object | HelmDockerImageDependency, - dockerRepository: string, - currentValue: string, - newValue: string, - originalRegistryValue: string -): boolean { - for (const key of Object.keys(parsedContent)) { - if ( - shouldUpdate( - key, - parsedContent[key], - dockerRepository, - currentValue, - originalRegistryValue - ) - ) { - // the next statement intentionally updates the passed in parameter - // with the updated dependency value - // eslint-disable-next-line no-param-reassign - parsedContent[key].tag = newValue; - - return true; - } - - if (parsedContent[key] && typeof parsedContent[key] === 'object') { - const foundMatch = updateDoc( - parsedContent[key], - dockerRepository, - currentValue, - newValue, - originalRegistryValue - ); - if (foundMatch) { - return true; - } - } - } - return false; -} - -export function updateDependency({ - fileContent, - upgrade, -}: UpdateDependencyConfig): string | null { - if ( - !upgrade || - !upgrade.depName || - !upgrade.newValue || - !upgrade.currentValue || - !upgrade.dockerRepository - ) { - logger.debug('Failed to update dependency, invalid upgrade'); - return fileContent; - } - - try { - const yawn = new YAWN(fileContent); - - const doc = yawn.json; - - const originalRegistryValue = getOriginalRegistryValue( - upgrade.depName, - upgrade.dockerRepository - ); - updateDoc( - doc, - upgrade.dockerRepository, - upgrade.currentValue, - upgrade.newValue, - originalRegistryValue - ); - yawn.json = doc; - - return yawn.yaml; - } catch (err) { - logger.debug({ err }, 'Error setting new helm-values value'); - return fileContent; - } -} diff --git a/lib/manager/kubernetes/__snapshots__/extract.spec.ts.snap b/lib/manager/kubernetes/__snapshots__/extract.spec.ts.snap index 7454d333c04212e50722d7ce41e587526b208e80..fdd4afa86c3818c01d8d30a0743e03d60492e61e 100644 --- a/lib/manager/kubernetes/__snapshots__/extract.spec.ts.snap +++ b/lib/manager/kubernetes/__snapshots__/extract.spec.ts.snap @@ -7,9 +7,7 @@ Array [ "currentValue": "v2.1.0", "datasource": "docker", "depName": "quay.io/external_storage/local-volume-provisioner", - "managerData": Object { - "lineNumber": 14, - }, + "replaceString": "quay.io/external_storage/local-volume-provisioner:v2.1.0", }, ] `; @@ -21,18 +19,14 @@ Array [ "currentValue": "1.7.9", "datasource": "docker", "depName": "nginx", - "managerData": Object { - "lineNumber": 18, - }, + "replaceString": "nginx:1.7.9", }, Object { "currentDigest": undefined, "currentValue": "v1.11.1", "datasource": "docker", "depName": "k8s.gcr.io/kube-proxy-amd64", - "managerData": Object { - "lineNumber": 46, - }, + "replaceString": "k8s.gcr.io/kube-proxy-amd64:v1.11.1", }, ] `; diff --git a/lib/manager/kubernetes/__snapshots__/update.spec.ts.snap b/lib/manager/kubernetes/__snapshots__/update.spec.ts.snap deleted file mode 100644 index 47e76ca35ebd23c566e4fb9f52ee8224a93ac8a7..0000000000000000000000000000000000000000 --- a/lib/manager/kubernetes/__snapshots__/update.spec.ts.snap +++ /dev/null @@ -1,21 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`manager/kubernetes/update updateDependency replaces image inside YAML array 1`] = ` -"apiVersion: apps/v1 -kind: DaemonSet -metadata: - name: local-volume-provisioner - namespace: kube-system - labels: - app: local-volume-provisioner -spec: - selector: - matchLabels: - app: local-volume-provisioner - template: - spec: - containers: - - image: \\"quay.io/external_storage/local-volume-provisioner:v2.2.0\\" - name: provisioner -" -`; diff --git a/lib/manager/kubernetes/extract.ts b/lib/manager/kubernetes/extract.ts index 906080377d0ed57ddbf0c82ab9cc7404ffbd6fe5..3a875e2361c84cc600439b374fe0f49ee72cff3a 100644 --- a/lib/manager/kubernetes/extract.ts +++ b/lib/manager/kubernetes/extract.ts @@ -5,7 +5,6 @@ import { PackageFile, PackageDependency } from '../common'; export function extractPackageFile(content: string): PackageFile | null { logger.trace('kubernetes.extractPackageFile()'); let deps: PackageDependency[] = []; - let lineNumber = 0; const isKubernetesManifest = /\s*apiVersion\s*:/.test(content) && /\s*kind\s*:/.test(content); @@ -26,10 +25,8 @@ export function extractPackageFile(content: string): PackageFile | null { }, 'Kubernetes image' ); - dep.managerData = { lineNumber }; deps.push(dep); } - lineNumber += 1; } deps = deps.filter( (dep) => !(dep.currentValue && dep.currentValue.includes('${')) diff --git a/lib/manager/kubernetes/index.ts b/lib/manager/kubernetes/index.ts index 52e995d9a2de2d830a91fdfef175234cd8046e70..f9b4ba2246df7b9d08ca29893f887cee384b5c55 100644 --- a/lib/manager/kubernetes/index.ts +++ b/lib/manager/kubernetes/index.ts @@ -1,7 +1,6 @@ import { LANGUAGE_DOCKER } from '../../constants/languages'; export { extractPackageFile } from './extract'; -export { updateDependency } from './update'; export const language = LANGUAGE_DOCKER; diff --git a/lib/manager/kubernetes/update.spec.ts b/lib/manager/kubernetes/update.spec.ts deleted file mode 100644 index a853ed1a0703f25a26bae7283c1576ec6aa2be8a..0000000000000000000000000000000000000000 --- a/lib/manager/kubernetes/update.spec.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { readFileSync } from 'fs'; -import { updateDependency } from './update'; - -const yamlFile = readFileSync( - 'lib/manager/kubernetes/__fixtures__/kubernetes.yaml', - 'utf8' -); - -const arraySyntaxFile = readFileSync( - 'lib/manager/kubernetes/__fixtures__/array-syntax.yaml', - 'utf8' -); - -describe('manager/kubernetes/update', () => { - describe('updateDependency', () => { - it('replaces existing value', () => { - const upgrade = { - managerData: { lineNumber: 18 }, - depName: 'nginx', - newValue: '1.15.1', - newDigest: 'sha256:abcdefghijklmnop', - }; - const res = updateDependency({ fileContent: yamlFile, upgrade }); - expect(res).not.toEqual(yamlFile); - expect(res.includes(upgrade.newDigest)).toBe(true); - }); - it('returns same', () => { - const upgrade = { - managerData: { lineNumber: 46 }, - depName: 'k8s.gcr.io/kube-proxy-amd64', - newValue: 'v1.11.1', - }; - const res = updateDependency({ fileContent: yamlFile, upgrade }); - expect(res).toEqual(yamlFile); - }); - it('returns null if mismatch', () => { - const upgrade = { - managerData: { lineNumber: 1 }, - newFrom: 'k8s.gcr.io/kube-proxy-amd64:v1.11.1', - }; - const res = updateDependency({ fileContent: yamlFile, upgrade }); - expect(res).toBeNull(); - }); - it('returns null if error', () => { - const res = updateDependency({ fileContent: null, upgrade: null }); - expect(res).toBeNull(); - }); - it('replaces image inside YAML array', () => { - const upgrade = { - managerData: { lineNumber: 14 }, - depName: 'quay.io/external_storage/local-volume-provisioner', - newValue: 'v2.2.0', - }; - const res = updateDependency({ - fileContent: arraySyntaxFile, - upgrade, - }); - expect(res).not.toEqual(arraySyntaxFile); - expect(res).toMatchSnapshot(); - }); - }); -}); diff --git a/lib/manager/kubernetes/update.ts b/lib/manager/kubernetes/update.ts deleted file mode 100644 index f1ab8c2978cb67a9c5deae78617130b04f8f015d..0000000000000000000000000000000000000000 --- a/lib/manager/kubernetes/update.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { logger } from '../../logger'; -import { getNewFrom } from '../dockerfile/update'; -import { UpdateDependencyConfig } from '../common'; - -export function updateDependency({ - fileContent, - upgrade, -}: UpdateDependencyConfig): string | null { - try { - const newFrom = getNewFrom(upgrade); - logger.debug(`kubernetes.updateDependency(): ${newFrom}`); - const lines = fileContent.split('\n'); - const lineToChange = lines[upgrade.managerData.lineNumber]; - const imageLine = /^(\s*-?\s*image:\s*'?"?)[^\s'"]+('?"?\s*)$/; - if (!imageLine.test(lineToChange)) { - logger.debug('No image line found'); - return null; - } - const newLine = lineToChange.replace(imageLine, `$1${newFrom}$2`); - if (newLine === lineToChange) { - logger.debug('No changes necessary'); - return fileContent; - } - lines[upgrade.managerData.lineNumber] = newLine; - return lines.join('\n'); - } catch (err) { - logger.debug({ err }, 'Error setting new Kubernetes value'); - return null; - } -} diff --git a/lib/workers/branch/__snapshots__/auto-replace.spec.ts.snap b/lib/workers/branch/__snapshots__/auto-replace.spec.ts.snap index 878a1dc30a88ce08a8e4eb2a6bc4730097a5511d..aba6ee470ef45fec82ad7327b35305c66306ae7b 100644 --- a/lib/workers/branch/__snapshots__/auto-replace.spec.ts.snap +++ b/lib/workers/branch/__snapshots__/auto-replace.spec.ts.snap @@ -5,3 +5,5 @@ exports[`workers/branch/auto-replace doAutoReplace handles already updated 1`] = exports[`workers/branch/auto-replace doAutoReplace updates version and integrity 1`] = `" <script src=\\"https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.11.1/katex.min.js\\" integrity=\\"sha256-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\" crossorigin=\\"anonymous\\"> "`; exports[`workers/branch/auto-replace doAutoReplace updates version only 1`] = `" <script src=\\"https://cdnjs.cloudflare.com/ajax/libs/reactstrap/7.1.1/reactstrap.min.js\\"> "`; + +exports[`workers/branch/auto-replace doAutoReplace updates with autoReplaceNewString 1`] = `"FROM node:8.11.4-alpine@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa AS node"`; diff --git a/lib/workers/branch/auto-replace.spec.ts b/lib/workers/branch/auto-replace.spec.ts index ba7b8ffcbdaef2f1cb2a56670d9ca53e35237f30..4a1387972daffde738605b8efa07ea76bfe23e57 100644 --- a/lib/workers/branch/auto-replace.spec.ts +++ b/lib/workers/branch/auto-replace.spec.ts @@ -98,5 +98,24 @@ describe('workers/branch/auto-replace', () => { const res = await doAutoReplace(upgrade, src, parentBranch); expect(res).toMatchSnapshot(); }); + it('updates with autoReplaceNewString', async () => { + const dockerfile = + 'FROM node:8.11.3-alpine@sha256:d743b4141b02fcfb8beb68f92b4cd164f60ee457bf2d053f36785bf86de16b0d AS node'; + upgrade.manager = 'dockerfile'; + upgrade.depName = 'node'; + upgrade.lookupName = 'node'; + upgrade.currentValue = '8.11.3-alpine'; + upgrade.newValue = '8.11.4-alpine'; + upgrade.currentDigest = + 'sha256:d743b4141b02fcfb8beb68f92b4cd164f60ee457bf2d053f36785bf86de16b0d'; + upgrade.newDigest = 'sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; + upgrade.depIndex = 0; + upgrade.replaceString = + 'node:8.11.3-alpine@sha256:d743b4141b02fcfb8beb68f92b4cd164f60ee457bf2d053f36785bf86de16b0d'; + upgrade.autoReplaceStringTemplate = + '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}'; + const res = await doAutoReplace(upgrade, dockerfile, parentBranch); + expect(res).toMatchSnapshot(); + }); }); }); diff --git a/lib/workers/branch/auto-replace.ts b/lib/workers/branch/auto-replace.ts index 3db55742f60c0b723a038227597f2263ff283a61..d7b0a4caacca6fed83b9bf216f17a93280cf0b7a 100644 --- a/lib/workers/branch/auto-replace.ts +++ b/lib/workers/branch/auto-replace.ts @@ -3,6 +3,7 @@ import { get } from '../../manager'; import { WORKER_FILE_UPDATE_FAILED } from '../../constants/error-messages'; import { matchAt, replaceAt } from '../../util/string'; import { regEx, escapeRegExp } from '../../util/regex'; +import { compile } from '../../util/template'; export async function confirmIfDepUpdated( upgrade, @@ -71,7 +72,14 @@ export async function doAutoReplace( logger.debug('Branch dep is already updated'); return existingContent; } - const { depName, currentValue, newValue, currentDigest, newDigest } = upgrade; + const { + depName, + currentValue, + newValue, + currentDigest, + newDigest, + autoReplaceStringTemplate, + } = upgrade; const replaceString = upgrade.replaceString || currentValue; logger.trace({ depName, replaceString }, 'autoReplace replaceString'); let searchIndex = existingContent.indexOf(replaceString); @@ -83,15 +91,23 @@ export async function doAutoReplace( return existingContent; } try { - let newString = replaceString.replace( - regEx(escapeRegExp(currentValue), 'g'), - newValue - ); - if (currentDigest && newDigest) { - newString = newString.replace( - regEx(escapeRegExp(currentDigest), 'g'), - newDigest - ); + let newString: string; + if (autoReplaceStringTemplate) { + newString = compile(autoReplaceStringTemplate, upgrade, false); + } else { + newString = replaceString; + if (currentValue) { + newString = newString.replace( + regEx(escapeRegExp(currentValue), 'g'), + newValue + ); + } + if (currentDigest && newDigest) { + newString = newString.replace( + regEx(escapeRegExp(currentDigest), 'g'), + newDigest + ); + } } logger.debug(`Starting search at index ${searchIndex}`); // Iterate through the rest of the file diff --git a/package.json b/package.json index 7e9b4547256025d1865ce5bc1ccd4adb7f1e15c6..c3c5935396200aac6ff952f9d79aa0bf6047742d 100644 --- a/package.json +++ b/package.json @@ -170,8 +170,7 @@ "validate-npm-package-name": "3.0.0", "www-authenticate": "0.6.2", "xmldoc": "1.1.2", - "yarn": "1.22.4", - "yawn-yaml": "1.5.0" + "yarn": "1.22.4" }, "optionalDependencies": { "re2": "1.10.5" @@ -221,7 +220,6 @@ "@types/tmp": "0.1.0", "@types/traverse": "0.6.32", "@types/xmldoc": "1.1.4", - "@types/yawn-yaml": "1.4.0", "@typescript-eslint/eslint-plugin": "2.27.0", "@typescript-eslint/parser": "2.27.0", "aws-sdk-mock": "5.1.0", diff --git a/yarn.lock b/yarn.lock index bf37a75baf6d3006102d61923c6d14575c2c9489..86bcd18db4505839d5686edfa7564f122bd15d67 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1478,11 +1478,16 @@ resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.3.tgz#abf383c5b639d0aa8b8c4a420d6a85f703357d6c" integrity sha512-otRe77JNNWzoVGLKw8TCspKswRoQToys4tuL6XYVBFxjgeM0RUrx7m3jkaTdxILxeGry3zM8mGYkGXMeQ02guA== -"@types/json-schema@*", "@types/json-schema@^7.0.3": +"@types/json-schema@*": version "7.0.4" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== +"@types/json-schema@^7.0.3": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" + integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A== + "@types/json5@0.0.30": version "0.0.30" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.30.tgz#44cb52f32a809734ca562e685c6473b5754a7818" @@ -1652,11 +1657,6 @@ dependencies: "@types/yargs-parser" "*" -"@types/yawn-yaml@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@types/yawn-yaml/-/yawn-yaml-1.4.0.tgz#15e1c5722c9253d6da6a927d85ba34b2f34a3a02" - integrity sha512-9mfVO9Po29PF6lH24v3+5BCBXhnH+o3r9I6xRzU+AECT1cdlR/mNqk6NK2kTFGyo0vt8o4isjpq3V5iG3VmvFQ== - "@typescript-eslint/eslint-plugin@2.27.0": version "2.27.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.27.0.tgz#e479cdc4c9cf46f96b4c287755733311b0d0ba4b" @@ -1667,6 +1667,16 @@ regexpp "^3.0.0" tsutils "^3.17.1" +"@typescript-eslint/experimental-utils@2.26.0": + version "2.26.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.26.0.tgz#063390c404d9980767d76274df386c0aa675d91d" + integrity sha512-RELVoH5EYd+JlGprEyojUv9HeKcZqF7nZUGSblyAw1FwOGNnmQIU8kxJ69fttQvEwCsX5D6ECJT8GTozxrDKVQ== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "2.26.0" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + "@typescript-eslint/experimental-utils@2.27.0": version "2.27.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.27.0.tgz#801a952c10b58e486c9a0b36cf21e2aab1e9e01a" @@ -1677,7 +1687,7 @@ eslint-scope "^5.0.0" eslint-utils "^2.0.0" -"@typescript-eslint/parser@2.27.0", "@typescript-eslint/parser@^2.3.0": +"@typescript-eslint/parser@2.27.0": version "2.27.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.27.0.tgz#d91664335b2c46584294e42eb4ff35838c427287" integrity sha512-HFUXZY+EdwrJXZo31DW4IS1ujQW3krzlRjBrFRrJcMDh0zCu107/nRfhk/uBasO8m0NVDbBF5WZKcIUMRO7vPg== @@ -1687,6 +1697,29 @@ "@typescript-eslint/typescript-estree" "2.27.0" eslint-visitor-keys "^1.1.0" +"@typescript-eslint/parser@^2.3.0": + version "2.26.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.26.0.tgz#385463615818b33acb72a25b39c03579df93d76f" + integrity sha512-+Xj5fucDtdKEVGSh9353wcnseMRkPpEAOY96EEenN7kJVrLqy/EVwtIh3mxcUz8lsFXW1mT5nN5vvEam/a5HiQ== + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "2.26.0" + "@typescript-eslint/typescript-estree" "2.26.0" + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/typescript-estree@2.26.0": + version "2.26.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.26.0.tgz#d8132cf1ee8a72234f996519a47d8a9118b57d56" + integrity sha512-3x4SyZCLB4zsKsjuhxDLeVJN6W29VwBnYpCsZ7vIdPel9ZqLfIZJgJXO47MNUkurGpQuIBALdPQKtsSnWpE1Yg== + dependencies: + debug "^4.1.1" + eslint-visitor-keys "^1.1.0" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^6.3.0" + tsutils "^3.17.1" + "@typescript-eslint/typescript-estree@2.27.0": version "2.27.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.27.0.tgz#a288e54605412da8b81f1660b56c8b2e42966ce8" @@ -5571,7 +5604,7 @@ jmespath@0.15.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.13.1, js-yaml@^3.13.1, js-yaml@^3.4.2: +js-yaml@3.13.1, js-yaml@^3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -6100,7 +6133,7 @@ lodash.without@~4.4.0: resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" integrity sha1-PNRXSgC2e643OpS3SHcmQFB7eqw= -lodash@4.17.15, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4: +lodash@4.17.15, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -10172,11 +10205,6 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml-js@^0.1.3: - version "0.1.5" - resolved "https://registry.yarnpkg.com/yaml-js/-/yaml-js-0.1.5.tgz#a01369010b3558d8aaed2394615dfd0780fd8fac" - integrity sha1-oBNpAQs1WNiq7SOUYV39B4D9j6w= - yaml@^1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.7.2.tgz#f26aabf738590ab61efaca502358e48dc9f348b2" @@ -10245,12 +10273,3 @@ yarn@1.22.4: version "1.22.4" resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.4.tgz#01c1197ca5b27f21edc8bc472cd4c8ce0e5a470e" integrity sha512-oYM7hi/lIWm9bCoDMEWgffW8aiNZXCWeZ1/tGy0DWrN6vmzjCXIKu2Y21o8DYVBUtiktwKcNoxyGl/2iKLUNGA== - -yawn-yaml@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/yawn-yaml/-/yawn-yaml-1.5.0.tgz#95fba7544d5375fce3dc84514f12218ed0d2ebcb" - integrity sha512-sH2zX9K1QiWhWh9U19pye660qlzrEAd5c4ebw/6lqz17LZw7xYi7nqXlBoVLVtc2FZFXDKiJIsvVcKGYbLVyFQ== - dependencies: - js-yaml "^3.4.2" - lodash "^4.17.11" - yaml-js "^0.1.3"