diff --git a/lib/manager/travis/package.ts b/lib/manager/travis/package.ts index 61f8e5096af10247df5c42aed6a64793a3f6ef90..b8e03b7f9fe96edaff55a78562d3a9ae1554b87e 100644 --- a/lib/manager/travis/package.ts +++ b/lib/manager/travis/package.ts @@ -1,90 +1,12 @@ import is from '@sindresorhus/is'; import equal from 'fast-deep-equal'; -import dataFiles from '../../data-files.generated'; import { getPkgReleases } from '../../datasource'; import * as datasourceGithubTags from '../../datasource/github-tags'; import { logger } from '../../logger'; +import { NodeJsPolicies, getPolicies } from '../../versioning/node/schedule'; import { isVersion, maxSatisfyingVersion } from '../../versioning/semver'; import { LookupUpdate, PackageUpdateConfig } from '../common'; -interface NodeJsPolicies { - all: number[]; - lts: number[]; - active: number[]; - lts_active: number[]; - lts_latest: number[]; - current: number[]; -} -interface NodeJsSchedule { - lts: string; - maintenance: string; - end: string; - start: string; -} -type NodeJsData = Record<string, NodeJsSchedule>; - -let policies: NodeJsPolicies; -let refreshDate: Date; - -function generatePolicies(): NodeJsData { - const nodeJsSchedule = JSON.parse( - dataFiles.get('node-js-schedule.json') - ) as NodeJsData; - policies = { - all: [], - lts: [], - active: [], - lts_active: [], - lts_latest: [], - current: [], - }; - - const now = new Date(); - - for (const [vRelease, data] of Object.entries(nodeJsSchedule)) { - const isAlive = new Date(data.start) < now && new Date(data.end) > now; - if (isAlive) { - const release = parseInt(vRelease.replace(/^v/, ''), 10); - policies.all.push(release); - const isMaintenance = - data.maintenance && new Date(data.maintenance) < now; - if (!isMaintenance) { - policies.active.push(release); - } - const isLts = data.lts && new Date(data.lts) < now; - if (isLts) { - policies.lts.push(release); - if (!isMaintenance) { - policies.lts_active.push(release); - } - } - } - } - policies.current.push(policies.active[policies.active.length - 1]); - policies.lts_latest.push(policies.lts[policies.lts.length - 1]); - - return nodeJsSchedule; -} - -function checkPolicies(): void { - if (policies && refreshDate > new Date()) { - return; - } - const nodeJsSchedule = generatePolicies(); - refreshDate = new Date('3000-01-01'); // y3k - const now = new Date(); - for (const data of Object.values(nodeJsSchedule)) { - const fields = ['start', 'lts', 'maintenance', 'end']; - for (const field of fields) { - const fieldDate = new Date(data[field]); - if (fieldDate > now && fieldDate < refreshDate) { - refreshDate = fieldDate; - } - } - } - logger.debug(`Node.js policies refresh date: ${refreshDate.toString()}`); -} - export async function getPackageUpdates( config: PackageUpdateConfig ): Promise<LookupUpdate[]> { @@ -93,7 +15,7 @@ export async function getPackageUpdates( if (!supportPolicy?.length) { return []; } - checkPolicies(); + const policies = getPolicies(); for (const policy of supportPolicy) { if (!Object.keys(policies).includes(policy)) { logger.warn({ policy }, `Unknown supportPolicy`); diff --git a/lib/versioning/node/schedule.ts b/lib/versioning/node/schedule.ts new file mode 100644 index 0000000000000000000000000000000000000000..dfd5df3096dfce2a03b256e457706bc46117a35e --- /dev/null +++ b/lib/versioning/node/schedule.ts @@ -0,0 +1,61 @@ +import dataFiles from '../../data-files.generated'; + +interface NodeJsSchedule { + lts?: string; + maintenance?: string; + end: string; + start: string; + codename?: string; +} + +export type NodeJsData = Record<string, NodeJsSchedule>; + +export const nodeSchedule: NodeJsData = JSON.parse( + dataFiles.get('node-js-schedule.json') +); + +export interface NodeJsPolicies { + all: number[]; + lts: number[]; + active: number[]; + lts_active: number[]; + lts_latest: number[]; + current: number[]; +} + +export function getPolicies(): NodeJsPolicies { + const policies = { + all: [], + lts: [], + active: [], + lts_active: [], + lts_latest: [], + current: [], + }; + + const now = new Date(); + + for (const [vRelease, data] of Object.entries(nodeSchedule)) { + const isAlive = new Date(data.start) < now && new Date(data.end) > now; + if (isAlive) { + const release = parseInt(vRelease.replace(/^v/, ''), 10); + policies.all.push(release); + const isMaintenance = + data.maintenance && new Date(data.maintenance) < now; + if (!isMaintenance) { + policies.active.push(release); + } + const isLts = data.lts && new Date(data.lts) < now; + if (isLts) { + policies.lts.push(release); + if (!isMaintenance) { + policies.lts_active.push(release); + } + } + } + } + policies.current.push(policies.active[policies.active.length - 1]); + policies.lts_latest.push(policies.lts[policies.lts.length - 1]); + + return policies; +}