From a021e9fe6d24e5f39f868ec5720f30891a4ab318 Mon Sep 17 00:00:00 2001 From: Rhys Arkins <rhys@arkins.net> Date: Thu, 10 Oct 2024 15:17:31 +0200 Subject: [PATCH] feat: currentVersionAgeInDays, newVersionAgeInDays (#31818) --- docs/usage/configuration-options.md | 1 + lib/config/types.ts | 1 + lib/modules/manager/types.ts | 1 + lib/util/date.spec.ts | 5 + lib/util/date.ts | 9 +- lib/util/template/index.ts | 2 + .../repository/process/lookup/generate.ts | 4 +- .../repository/process/lookup/index.spec.ts | 172 +++++++++++++++--- .../repository/process/lookup/index.ts | 7 +- .../repository/process/lookup/types.ts | 1 + 10 files changed, 173 insertions(+), 30 deletions(-) diff --git a/docs/usage/configuration-options.md b/docs/usage/configuration-options.md index 97c5aa2c91..279c61f0ad 100644 --- a/docs/usage/configuration-options.md +++ b/docs/usage/configuration-options.md @@ -2869,6 +2869,7 @@ Here are some example `matchJsonata` strings for inspiration: $exists(deprecationMessage) $exists(vulnerabilityFixVersion) manager = 'dockerfile' and depType = 'final' +updateType = 'major' and newVersionAgeInDays < 7 ``` `matchJsonata` accepts an array of strings, and will return `true` if any of those JSONata expressions evaluate to `true`. diff --git a/lib/config/types.ts b/lib/config/types.ts index 8bc41bb87e..4b7169d168 100644 --- a/lib/config/types.ts +++ b/lib/config/types.ts @@ -548,6 +548,7 @@ export interface PackageRuleInputConfig extends Record<string, unknown> { packageRules?: (PackageRule & PackageRuleInputConfig)[]; releaseTimestamp?: string | null; repository?: string; + currentVersionAgeInDays?: number; currentVersionTimestamp?: string; enabled?: boolean; skipReason?: SkipReason; diff --git a/lib/modules/manager/types.ts b/lib/modules/manager/types.ts index 4cd752def3..a2ccd07d47 100644 --- a/lib/modules/manager/types.ts +++ b/lib/modules/manager/types.ts @@ -99,6 +99,7 @@ export interface LookupUpdate { checksumUrl?: string; downloadUrl?: string; releaseTimestamp?: any; + newVersionAgeInDays?: number; registryUrl?: string; } diff --git a/lib/util/date.spec.ts b/lib/util/date.spec.ts index aa5abd62ec..b68966f57f 100644 --- a/lib/util/date.spec.ts +++ b/lib/util/date.spec.ts @@ -22,6 +22,11 @@ describe('util/date', () => { const t = t0.minus({ days: 42 }); expect(getElapsedDays(t.toISO()!)).toBe(42); }); + + it('rounds down', () => { + const t = t0.minus({ days: 42, hours: 12 }); + expect(getElapsedDays(t.toISO()!)).toBe(42); + }); }); describe('getElapsedMinutes', () => { diff --git a/lib/util/date.ts b/lib/util/date.ts index d3078e2024..cca5c17462 100644 --- a/lib/util/date.ts +++ b/lib/util/date.ts @@ -1,12 +1,13 @@ import { DateTime } from 'luxon'; const ONE_MINUTE_MS = 60 * 1000; -const ONE_DAY_MS = 24 * 60 * ONE_MINUTE_MS; export function getElapsedDays(timestamp: string): number { - return Math.floor( - (new Date().getTime() - new Date(timestamp).getTime()) / ONE_DAY_MS, - ); + const currentVersionTimestampDate = DateTime.fromISO(timestamp); + const now = DateTime.now(); + const diffInDays = now.diff(currentVersionTimestampDate, 'days').as('days'); + const ageInDays = Math.floor(diffInDays); + return ageInDays; } export function getElapsedMinutes(date: Date): number { diff --git a/lib/util/template/index.ts b/lib/util/template/index.ts index f58a659756..1e3ab8e9c9 100644 --- a/lib/util/template/index.ts +++ b/lib/util/template/index.ts @@ -156,6 +156,7 @@ export const allowedFields = { currentValue: 'The extracted current value of the dependency being updated', currentVersion: 'The version that would be currently installed. For example, if currentValue is ^3.0.0 then currentVersion might be 3.1.0.', + currentVersionAgeInDays: 'The age of the current version in days', currentVersionTimestamp: 'The timestamp of the current version', currentDigest: 'The extracted current digest of the dependency being updated', currentDigestShort: @@ -203,6 +204,7 @@ export const allowedFields = { newValue: 'The new value in the upgrade. Can be a range or version e.g. "^3.0.0" or "3.1.0"', newVersion: 'The new version in the upgrade, e.g. "3.1.0"', + newVersionAgeInDays: 'The age of the new version in days', packageFile: 'The filename that the dependency was found in', packageFileDir: 'The directory with full path where the packageFile was found', diff --git a/lib/workers/repository/process/lookup/generate.ts b/lib/workers/repository/process/lookup/generate.ts index 5946a5e3a6..747149c9d1 100644 --- a/lib/workers/repository/process/lookup/generate.ts +++ b/lib/workers/repository/process/lookup/generate.ts @@ -4,6 +4,7 @@ import type { Release } from '../../../../modules/datasource'; import type { LookupUpdate } from '../../../../modules/manager/types'; import type { VersioningApi } from '../../../../modules/versioning'; import type { RangeStrategy } from '../../../../types'; +import { getElapsedDays } from '../../../../util/date'; import { getMergeConfidenceLevel } from '../../../../util/merge-confidence'; import type { LookupUpdateConfig } from './types'; import { getUpdateType } from './update-type'; @@ -37,8 +38,9 @@ export async function generateUpdate( update.newDigest = release.newDigest; } // istanbul ignore if - if (release.releaseTimestamp !== undefined) { + if (release.releaseTimestamp) { update.releaseTimestamp = release.releaseTimestamp; + update.newVersionAgeInDays = getElapsedDays(release.releaseTimestamp); } // istanbul ignore if if (release.registryUrl !== undefined) { diff --git a/lib/workers/repository/process/lookup/index.spec.ts b/lib/workers/repository/process/lookup/index.spec.ts index 5fb4291780..986d8bc395 100644 --- a/lib/workers/repository/process/lookup/index.spec.ts +++ b/lib/workers/repository/process/lookup/index.spec.ts @@ -161,6 +161,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '1.4.1', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'major', }, @@ -217,6 +218,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 7, newValue: '^0.9.0', newVersion: '0.9.7', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2013-09-04T17:07:22.948Z', updateType: 'minor', }, @@ -228,6 +230,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '^1.0.0', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'major', }, @@ -257,6 +260,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 4, newValue: '^0.4.0', newVersion: '0.4.4', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2011-06-10T17:20:04.719Z', updateType: 'patch', }, @@ -268,6 +272,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 7, newValue: '^0.9.0', newVersion: '0.9.7', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2013-09-04T17:07:22.948Z', updateType: 'minor', }, @@ -279,6 +284,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '^1.0.0', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'major', }, @@ -305,6 +311,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 7, newValue: '0.9.7', newVersion: '0.9.7', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'minor', }, @@ -315,6 +322,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '1.4.1', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'major', }, @@ -342,6 +350,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 4, newValue: '0.4.4', newVersion: '0.4.4', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'patch', }, @@ -352,6 +361,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 7, newValue: '0.9.7', newVersion: '0.9.7', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'minor', }, @@ -362,6 +372,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '1.4.1', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'major', }, @@ -389,6 +400,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '1.4.1', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'major', }, @@ -423,6 +435,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 7, newValue: '^0.9.0', newVersion: '0.9.7', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2013-09-04T17:07:22.948Z', updateType: 'minor', }, @@ -434,6 +447,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '^1.0.0', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'major', }, @@ -459,6 +473,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 7, newValue: '0.9.7', newVersion: '0.9.7', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'minor', }, @@ -484,6 +499,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 7, newValue: '0.9.7', newVersion: '0.9.7', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2013-09-04T17:07:22.948Z', updateType: 'minor', }, @@ -509,6 +525,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 7, newValue: '0.9.7', newVersion: '0.9.7', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2013-09-04T17:07:22.948Z', updateType: 'minor', }, @@ -535,6 +552,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 7, newValue: '0.9.7', newVersion: '0.9.7', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2013-09-04T17:07:22.948Z', updateType: 'minor', }, @@ -561,6 +579,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 4, newValue: '0.9.4', newVersion: '0.9.4', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2013-05-22T20:26:50.888Z', updateType: 'minor', }, @@ -598,6 +617,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 7, newValue: '0.9.7', newVersion: '0.9.7', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'patch', }, @@ -608,6 +628,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '1.4.1', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'major', }, @@ -639,6 +660,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 7, newValue: '0.9.7', newVersion: '0.9.7', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'patch', }, @@ -649,6 +671,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '1.4.1', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'major', }, @@ -675,6 +698,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 7, newValue: '0.9.7', newVersion: '0.9.7', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2013-09-04T17:07:22.948Z', updateType: 'patch', }, @@ -685,6 +709,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '1.4.1', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'major', }, @@ -711,6 +736,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 12, newValue: '0.8.12', newVersion: '0.8.12', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'patch', }, @@ -721,6 +747,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 7, newValue: '0.9.7', newVersion: '0.9.7', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'minor', }, @@ -731,6 +758,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '1.4.1', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'major', }, @@ -765,6 +793,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '^1.0.0', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'major', }, @@ -791,6 +820,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '1.4.1', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'minor', }, @@ -816,6 +846,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '1.0.1', newVersion: '1.0.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'patch', }, @@ -842,6 +873,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '1.4.1', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'minor', }, @@ -868,6 +900,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 0, newValue: '1.1.0', newVersion: '1.1.0', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'minor', }, @@ -894,6 +927,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 0, newValue: '1.1.0', newVersion: '1.1.0', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'minor', }, @@ -920,6 +954,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 0, newValue: '1.1.0', newVersion: '1.1.0', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'minor', }, @@ -947,6 +982,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '1.4.1', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'minor', }, @@ -973,6 +1009,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '1.0.1', newVersion: '1.0.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'patch', }, @@ -1021,6 +1058,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 7, newValue: '~0.9.0', newVersion: '0.9.7', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2013-09-04T17:07:22.948Z', updateType: 'minor', }, @@ -1032,6 +1070,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '~1.4.0', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'major', }, @@ -1176,6 +1215,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '~1.4.0', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'major', }, @@ -1209,6 +1249,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '~1.4.0', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'minor', }, @@ -1237,6 +1278,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '^1.2.1', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'minor', }, @@ -1265,6 +1307,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '^1.2.1', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'minor', }, @@ -1293,6 +1336,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '~1.2.0', newVersion: '1.2.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'patch', }, @@ -1320,6 +1364,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: undefined, newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'minor', }, @@ -1336,22 +1381,20 @@ describe('workers/repository/process/lookup/index', () => { const { updates } = await Result.wrap( lookup.lookupUpdates(config), ).unwrapOrThrow(); - expect(updates).toMatchInlineSnapshot(` - [ - { - "bucket": "non-major", - "isLockfileUpdate": true, - "isRange": true, - "newMajor": 1, - "newMinor": 3, - "newPatch": 0, - "newValue": undefined, - "newVersion": "1.3.0", - "releaseTimestamp": "2015-04-26T16:42:11.311Z", - "updateType": "minor", - }, - ] - `); + expect(updates).toMatchObject([ + { + bucket: 'non-major', + isLockfileUpdate: true, + isRange: true, + newMajor: 1, + newMinor: 3, + newPatch: 0, + newValue: undefined, + newVersion: '1.3.0', + releaseTimestamp: '2015-04-26T16:42:11.311Z', + updateType: 'minor', + }, + ]); expect(updates[0].newValue).toBeUndefined(); expect(updates[0].updateType).toBe('minor'); }); @@ -1376,6 +1419,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '~1.3.0 || ~1.4.0', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'minor', }, @@ -1402,6 +1446,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '~1.4.0', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'minor', }, @@ -1431,6 +1476,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '^2.0.0 || ^3.0.0', newVersion: '3.8.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2017-10-17T15:22:36.646Z', updateType: 'major', }, @@ -1460,6 +1506,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '^3.0.0', newVersion: '3.8.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2017-10-17T15:22:36.646Z', updateType: 'major', }, @@ -1567,6 +1614,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '~1.4.0', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'minor', }, @@ -1600,6 +1648,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '1.4.x', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'minor', }, @@ -1626,6 +1675,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '~1.4.0', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'minor', }, @@ -1652,6 +1702,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '1.x', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'major', }, @@ -1678,6 +1729,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '1.4.x', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'minor', }, @@ -1704,6 +1756,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '1.2.x - 1.4.x', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'minor', }, @@ -1730,6 +1783,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '1', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'major', }, @@ -1756,6 +1810,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '1.4', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'minor', }, @@ -1782,6 +1837,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 7, newValue: '~0.9.0', newVersion: '0.9.7', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2013-09-04T17:07:22.948Z', updateType: 'minor', }, @@ -1793,6 +1849,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '~1.4.0', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'major', }, @@ -1819,6 +1876,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 7, newValue: '^0.9.0', newVersion: '0.9.7', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2013-09-04T17:07:22.948Z', updateType: 'minor', }, @@ -1830,6 +1888,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '^1.0.0', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'major', }, @@ -1856,6 +1915,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 7, newValue: '^0.7.0 || ^0.8.0 || ^0.9.0', newVersion: '0.9.7', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'minor', }, @@ -1867,6 +1927,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '^0.7.0 || ^0.8.0 || ^1.0.0', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'major', }, @@ -1896,6 +1957,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '^1.0.0 || ^2.0.0 || ^3.0.0', newVersion: '3.8.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2017-10-17T15:22:36.646Z', updateType: 'major', }, @@ -1925,6 +1987,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '1.x - 3.x', newVersion: '3.8.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2017-10-17T15:22:36.646Z', updateType: 'major', }, @@ -1954,6 +2017,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '1.x || 2.x || 3.x', newVersion: '3.8.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2017-10-17T15:22:36.646Z', updateType: 'major', }, @@ -1983,6 +2047,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '1 || 2 || 3', newVersion: '3.8.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2017-10-17T15:22:36.646Z', updateType: 'major', }, @@ -2009,6 +2074,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '~1.2.0 || ~1.3.0 || ~1.4.0', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'minor', }, @@ -2049,6 +2115,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 7, newValue: '<= 0.9.7', newVersion: '0.9.7', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2013-09-04T17:07:22.948Z', updateType: 'minor', }, @@ -2060,6 +2127,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '<= 1.4.1', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'major', }, @@ -2086,6 +2154,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 7, newValue: '< 0.9.8', newVersion: '0.9.7', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2013-09-04T17:07:22.948Z', updateType: 'minor', }, @@ -2097,6 +2166,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '< 1.4.2', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'major', }, @@ -2123,6 +2193,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '< 2', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'major', }, @@ -2149,6 +2220,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '<= 1.4', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'minor', }, @@ -2175,6 +2247,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '=1.4.1', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'minor', }, @@ -2202,6 +2275,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 3, newValue: '<= 2', newVersion: '2.0.3', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-01-31T08:11:47.852Z', updateType: 'major', }, @@ -2228,6 +2302,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '<= 1.4.1', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'minor', }, @@ -2254,6 +2329,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '< 2.0.0', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'major', }, @@ -2280,6 +2356,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '>= 0.5.0 < 2.0.0', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'major', }, @@ -2306,6 +2383,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 7, newValue: '>= 0.5.0 <0.10', newVersion: '0.9.7', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'minor', }, @@ -2317,6 +2395,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '>= 0.5.0 <1.5', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'major', }, @@ -2343,6 +2422,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 7, newValue: '>= 0.5.0 <= 0.9.7', newVersion: '0.9.7', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'minor', }, @@ -2354,6 +2434,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '>= 0.5.0 <= 1.4.1', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'major', }, @@ -2393,6 +2474,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 3, newValue: '2.0.3', newVersion: '2.0.3', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-01-31T08:11:47.852Z', updateType: 'major', }, @@ -2487,8 +2569,14 @@ describe('workers/repository/process/lookup/index', () => { getGithubReleases.mockResolvedValueOnce({ releases: [ { version: '1.4.4' }, - { version: '1.4.5', releaseTimestamp: lastWeek.toISOString() }, - { version: '1.4.6', releaseTimestamp: yesterday.toISOString() }, + { + version: '1.4.5', + releaseTimestamp: lastWeek.toISOString(), + }, + { + version: '1.4.6', + releaseTimestamp: yesterday.toISOString(), + }, ], }); @@ -2505,6 +2593,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '1.4.6', newVersion: '1.4.6', pendingChecks: true, + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'patch', }, @@ -2524,8 +2613,14 @@ describe('workers/repository/process/lookup/index', () => { getGithubReleases.mockResolvedValueOnce({ releases: [ { version: '1.4.4' }, - { version: '1.4.5', releaseTimestamp: lastWeek.toISOString() }, - { version: '1.4.6', releaseTimestamp: yesterday.toISOString() }, + { + version: '1.4.5', + releaseTimestamp: lastWeek.toISOString(), + }, + { + version: '1.4.6', + releaseTimestamp: yesterday.toISOString(), + }, ], }); @@ -2542,6 +2637,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '1.4.5', newVersion: '1.4.5', pendingVersions: ['1.4.6'], + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'patch', }, @@ -2571,6 +2667,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 17, newValue: '2.5.17-beta.0', newVersion: '2.5.17-beta.0', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'patch', }, @@ -2598,6 +2695,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 0, newValue: '3.1.0-dev.20180813', newVersion: '3.1.0-dev.20180813', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'patch', }, @@ -2625,6 +2723,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '3.0.1', newVersion: '3.0.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'patch', }, @@ -2653,6 +2752,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 35, newValue: '0.0.35', newVersion: '0.0.35', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'patch', }, @@ -2698,6 +2798,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '3.0.1-insiders.20180726', newVersion: '3.0.1-insiders.20180726', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'patch', }, @@ -2753,6 +2854,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '3.0.1-insiders.20180726', newVersion: '3.0.1-insiders.20180726', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'patch', }, @@ -2948,6 +3050,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 35, newValue: '^0.0.35', newVersion: '0.0.35', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2017-04-27T16:59:06.479Z', updateType: 'patch', }, @@ -3001,6 +3104,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 0, newValue: '1.15.0', newVersion: '1.15.0', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'minor', }, @@ -3011,6 +3115,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '3.8.1', newVersion: '3.8.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'major', }, @@ -3039,6 +3144,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 0, newValue: '1.15.0', newVersion: '1.15.0', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'minor', }, @@ -3049,6 +3155,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 0, newValue: '2.7.0', newVersion: '2.7.0', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'major', }, @@ -3059,6 +3166,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '3.8.1', newVersion: '3.8.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'major', }, @@ -3118,6 +3226,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '^1.4.1', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'minor', }, @@ -3146,6 +3255,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '~1.0.1', newVersion: '1.0.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2014-03-11T18:47:17.560Z', updateType: 'patch', }, @@ -3157,6 +3267,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '~1.4.1', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'minor', }, @@ -3185,6 +3296,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '~1.0.1', newVersion: '1.0.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2014-03-11T18:47:17.560Z', updateType: 'patch', }, @@ -3196,6 +3308,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '~1.4.1', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'minor', }, @@ -3223,6 +3336,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '>=1.4.1', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'minor', }, @@ -3251,6 +3365,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '>=1.4.1', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'major', }, @@ -3319,6 +3434,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '1.4.1', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'minor', }, @@ -3420,6 +3536,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '~=1.4', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2015-05-17T04:25:07.299Z', updateType: 'major', }, @@ -3436,7 +3553,7 @@ describe('workers/repository/process/lookup/index', () => { lookup.lookupUpdates(config), ).unwrapOrThrow(); - expect(res).toEqual({ + expect(res).toMatchObject({ currentVersion: '1.3.0', currentVersionTimestamp: '2015-04-26T16:42:11.311Z', fixedVersion: '1.3.0', @@ -3451,6 +3568,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '1.4.1', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'minor', }, @@ -3478,7 +3596,7 @@ describe('workers/repository/process/lookup/index', () => { const res = await Result.wrap( lookup.lookupUpdates(config), ).unwrapOrThrow(); - expect(res).toEqual({ + expect(res).toMatchObject({ currentVersion: '1.3.0', currentVersionTimestamp: '2015-04-26T16:42:11.311Z', fixedVersion: '1.3.0', @@ -3493,6 +3611,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 0, newValue: '1.4.0', newVersion: '1.4.0', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'minor', }, @@ -3503,6 +3622,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 3, newValue: '2.0.3', newVersion: '2.0.3', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'major', }, @@ -3533,7 +3653,7 @@ describe('workers/repository/process/lookup/index', () => { lookup.lookupUpdates(config), ).unwrapOrThrow(); - expect(res).toEqual({ + expect(res).toMatchObject({ currentVersion: '1.3.0', currentVersionTimestamp: '2015-04-26T16:42:11.311Z', deprecationMessage: codeBlock` @@ -3556,6 +3676,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '1.4.1', newVersion: '1.4.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'minor', }, @@ -4274,6 +4395,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 0, newValue: '1.3.0', newVersion: '1.3.0', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: expect.any(String), updateType: 'major', }, @@ -4367,6 +4489,7 @@ describe('workers/repository/process/lookup/index', () => { expect(res).toEqual({ currentVersion: '17.0.0', + currentVersionAgeInDays: 1, currentVersionTimestamp: releaseTimestamp, fixedVersion: '17.0.0', isSingleVersion: true, @@ -4909,6 +5032,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '3.8.1', newVersion: '3.8.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2017-10-17T15:22:36.646Z', updateType: 'minor', }, @@ -4937,6 +5061,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 1, newValue: '3.8.1', newVersion: '3.8.1', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2017-10-17T15:22:36.646Z', updateType: 'minor', }, @@ -4996,6 +5121,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 0, newValue: 'v0.0.0-20240509183442-62759503f434', newVersion: 'v0.0.0-20240509183442-62759503f434', + newVersionAgeInDays: expect.any(Number), releaseTimestamp: '2024-05-09T18:34:42.000Z', updateType: 'digest', }, diff --git a/lib/workers/repository/process/lookup/index.ts b/lib/workers/repository/process/lookup/index.ts index c807c25ec3..ea4b77b968 100644 --- a/lib/workers/repository/process/lookup/index.ts +++ b/lib/workers/repository/process/lookup/index.ts @@ -24,6 +24,7 @@ import * as allVersioning from '../../../../modules/versioning'; import { id as dockerVersioningId } from '../../../../modules/versioning/docker'; import { ExternalHostError } from '../../../../types/errors/external-host-error'; import { assignKeys } from '../../../../util/assign-keys'; +import { getElapsedDays } from '../../../../util/date'; import { applyPackageRules } from '../../../../util/package-rules'; import { regEx } from '../../../../util/regex'; import { Result } from '../../../../util/result'; @@ -314,9 +315,11 @@ export async function lookupUpdates( if (is.nonEmptyString(currentVersionTimestamp)) { res.currentVersionTimestamp = currentVersionTimestamp; + res.currentVersionAgeInDays = getElapsedDays(currentVersionTimestamp); + if ( - config.packageRules?.some((rules) => - is.nonEmptyString(rules.matchCurrentAge), + config.packageRules?.some((rule) => + is.nonEmptyString(rule.matchCurrentAge), ) ) { // Reapply package rules to check matches for matchCurrentAge diff --git a/lib/workers/repository/process/lookup/types.ts b/lib/workers/repository/process/lookup/types.ts index 03ad7f9494..25950a3221 100644 --- a/lib/workers/repository/process/lookup/types.ts +++ b/lib/workers/repository/process/lookup/types.ts @@ -69,6 +69,7 @@ export interface UpdateResult { updates: LookupUpdate[]; warnings: ValidationMessage[]; versioning?: string; + currentVersionAgeInDays?: number; currentVersionTimestamp?: string; vulnerabilityFixVersion?: string; vulnerabilityFixStrategy?: string; -- GitLab