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;
+}