diff --git a/lib/workers/repository/finalise/index.js b/lib/workers/repository/finalise/index.js
deleted file mode 100644
index 5f0cffca0993cad74e000e3462ddae9f863861a1..0000000000000000000000000000000000000000
--- a/lib/workers/repository/finalise/index.js
+++ /dev/null
@@ -1,17 +0,0 @@
-const { validatePrs } = require('./validate');
-const { pruneStaleBranches } = require('./prune');
-const { platform } = require('../../../platform');
-
-module.exports = {
-  finaliseRepo,
-};
-
-// istanbul ignore next
-async function finaliseRepo(config, branchList) {
-  // TODO: Promise.all
-  await validatePrs(config);
-  await pruneStaleBranches(config, branchList);
-  await platform.ensureIssueClosing(
-    `Action Required: Fix Renovate Configuration`
-  );
-}
diff --git a/lib/workers/repository/finalise/index.ts b/lib/workers/repository/finalise/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5f17134bee336cf96db3039c64b916898302d414
--- /dev/null
+++ b/lib/workers/repository/finalise/index.ts
@@ -0,0 +1,17 @@
+import { validatePrs } from './validate';
+import { pruneStaleBranches } from './prune';
+import { platform } from '../../../platform';
+import { RenovateConfig } from '../../../config';
+
+// istanbul ignore next
+export async function finaliseRepo(
+  config: RenovateConfig,
+  branchList: string[]
+): Promise<void> {
+  // TODO: Promise.all
+  await validatePrs(config);
+  await pruneStaleBranches(config, branchList);
+  await platform.ensureIssueClosing(
+    `Action Required: Fix Renovate Configuration`
+  );
+}
diff --git a/lib/workers/repository/finalise/prune.js b/lib/workers/repository/finalise/prune.ts
similarity index 89%
rename from lib/workers/repository/finalise/prune.js
rename to lib/workers/repository/finalise/prune.ts
index 8a138acc16b29cb010c2d6e1dad944c9adb567f9..96994b89fcbc527468cd788756340a83a55b6cd8 100644
--- a/lib/workers/repository/finalise/prune.js
+++ b/lib/workers/repository/finalise/prune.ts
@@ -1,14 +1,11 @@
-const { logger } = require('../../../logger');
-const { platform } = require('../../../platform');
-
-module.exports = {
-  pruneStaleBranches,
-};
+import { logger } from '../../../logger';
+import { platform } from '../../../platform';
+import { RenovateConfig } from '../../../config';
 
 async function cleanUpBranches(
-  { dryRun, pruneStaleBranches: enabled },
-  remainingBranches
-) {
+  { dryRun, pruneStaleBranches: enabled }: RenovateConfig,
+  remainingBranches: string[]
+): Promise<void> {
   for (const branchName of remainingBranches) {
     try {
       const pr = await platform.findPr(branchName, null, 'open');
@@ -63,7 +60,10 @@ async function cleanUpBranches(
   }
 }
 
-async function pruneStaleBranches(config, branchList) {
+export async function pruneStaleBranches(
+  config: RenovateConfig,
+  branchList: string[]
+): Promise<void> {
   logger.debug('Removing any stale branches');
   logger.trace({ config }, `pruneStaleBranches`);
   logger.debug(`config.repoIsOnboarded=${config.repoIsOnboarded}`);
diff --git a/lib/workers/repository/finalise/validate.js b/lib/workers/repository/finalise/validate.ts
similarity index 82%
rename from lib/workers/repository/finalise/validate.js
rename to lib/workers/repository/finalise/validate.ts
index b2e41f594abf0bd9bb96118a917f1e920d54da6a..b651d49916b2f8a162a5b496c1f929006ffb730c 100644
--- a/lib/workers/repository/finalise/validate.js
+++ b/lib/workers/repository/finalise/validate.ts
@@ -1,23 +1,24 @@
-const JSON5 = require('json5');
-const { logger, setMeta } = require('../../../logger');
-const { migrateAndValidate } = require('../../../config/migrate-validate');
-const { configFileNames } = require('../../../config/app-strings');
-const { platform } = require('../../../platform');
+import JSON5 from 'json5';
+import { logger, setMeta } from '../../../logger';
+import { migrateAndValidate } from '../../../config/migrate-validate';
+import { configFileNames } from '../../../config/app-strings';
+import { platform, Pr } from '../../../platform';
+import { RenovateConfig } from '../../../config';
 
-async function getRenovatePrs(branchPrefix) {
+async function getRenovatePrs(branchPrefix: string): Promise<Pr[]> {
   return (await platform.getPrList())
     .filter(pr => pr.state === 'open')
     .filter(pr => pr.branchName && !pr.branchName.startsWith(branchPrefix))
     .filter(pr => pr.title && pr.title.match(new RegExp('renovate', 'i')));
 }
 
-async function getRenovateFiles(prNo) {
+async function getRenovateFiles(prNo: number): Promise<string[]> {
   return (await platform.getPrFiles(prNo)).filter(file =>
     configFileNames.includes(file)
   );
 }
 
-async function validatePrs(config) {
+export async function validatePrs(config: RenovateConfig): Promise<void> {
   if (
     config.suppressNotifications &&
     config.suppressNotifications.includes('prValidation')
@@ -40,13 +41,17 @@ async function validatePrs(config) {
         'PR has renovate files'
       );
       for (const file of renovateFiles) {
-        let content;
+        let content: string;
         try {
           content = await platform.getFile(file, pr.sha || pr.branchName);
         } catch (err) /* istanbul ignore next */ {
           content = await platform.getFile(file, pr.branchName);
         }
-        let parsed;
+        // TODO: proper typing
+        let parsed: {
+          renovate?: RenovateConfig;
+          'renovate-config'?: RenovateConfig;
+        } & RenovateConfig;
         try {
           // istanbul ignore if
           if (file.endsWith('.json5')) {
@@ -81,8 +86,8 @@ async function validatePrs(config) {
         }
       }
       // if the PR has renovate files then we set a status no matter what
-      let status;
-      let description;
+      let status: 'failure' | 'success';
+      let description: string;
       const subject = `Renovate Configuration Errors`;
       if (validations.length) {
         const content = validations
@@ -126,7 +131,3 @@ async function validatePrs(config) {
     }
   }
 }
-
-module.exports = {
-  validatePrs,
-};
diff --git a/package.json b/package.json
index fa137310ac780d607a116b3460dad354cbd1854e..4538658ad83e88ed13c801709ea0d8c31e9fd30e 100644
--- a/package.json
+++ b/package.json
@@ -179,6 +179,7 @@
     "@types/ini": "1.3.30",
     "@types/jest": "24.0.24",
     "@types/js-yaml": "3.12.1",
+    "@types/json5": "0.0.30",
     "@types/later": "1.2.5",
     "@types/lodash": "4.14.149",
     "@types/luxon": "1.21.0",
diff --git a/test/workers/repository/finalise/prune.spec.js b/test/workers/repository/finalise/prune.spec.ts
similarity index 74%
rename from test/workers/repository/finalise/prune.spec.js
rename to test/workers/repository/finalise/prune.spec.ts
index 12f4639c7e168d3377ba2cbfc6970997c2e0cdd5..cf0e6a88029fd9220ec3af911cb02e4f59609b68 100644
--- a/test/workers/repository/finalise/prune.spec.js
+++ b/test/workers/repository/finalise/prune.spec.ts
@@ -1,13 +1,10 @@
-const cleanup = require('../../../../lib/workers/repository/finalise/prune');
+import * as cleanup from '../../../../lib/workers/repository/finalise/prune';
+import { platform, RenovateConfig, getConfig } from '../../../util';
 
-/** @type any */
-const { platform } = require('../../../../lib/platform');
-
-/** @type any */
-let config;
+let config: RenovateConfig;
 beforeEach(() => {
   jest.resetAllMocks();
-  config = require('../../../config/config/_fixtures');
+  config = getConfig();
   config.platform = 'github';
   config.errors = [];
   config.warnings = [];
@@ -22,22 +19,22 @@ describe('workers/repository/finalise/prune', () => {
     });
     it('returns if no renovate branches', async () => {
       config.branchList = [];
-      platform.getAllRenovateBranches.mockReturnValueOnce([]);
+      platform.getAllRenovateBranches.mockResolvedValueOnce([]);
       await cleanup.pruneStaleBranches(config, config.branchList);
     });
     it('returns if no remaining branches', async () => {
       config.branchList = ['renovate/a', 'renovate/b'];
-      platform.getAllRenovateBranches.mockReturnValueOnce(config.branchList);
+      platform.getAllRenovateBranches.mockResolvedValueOnce(config.branchList);
       await cleanup.pruneStaleBranches(config, config.branchList);
       expect(platform.getAllRenovateBranches).toHaveBeenCalledTimes(1);
       expect(platform.deleteBranch).toHaveBeenCalledTimes(0);
     });
     it('renames deletes remaining branch', async () => {
       config.branchList = ['renovate/a', 'renovate/b'];
-      platform.getAllRenovateBranches.mockReturnValueOnce(
+      platform.getAllRenovateBranches.mockResolvedValueOnce(
         config.branchList.concat(['renovate/c'])
       );
-      platform.findPr.mockReturnValueOnce({ title: 'foo' });
+      platform.findPr.mockResolvedValueOnce({ title: 'foo' } as never);
       await cleanup.pruneStaleBranches(config, config.branchList);
       expect(platform.getAllRenovateBranches).toHaveBeenCalledTimes(1);
       expect(platform.deleteBranch).toHaveBeenCalledTimes(1);
@@ -46,10 +43,10 @@ describe('workers/repository/finalise/prune', () => {
     it('does nothing on dryRun', async () => {
       config.branchList = ['renovate/a', 'renovate/b'];
       config.dryRun = true;
-      platform.getAllRenovateBranches.mockReturnValueOnce(
+      platform.getAllRenovateBranches.mockResolvedValueOnce(
         config.branchList.concat(['renovate/c'])
       );
-      platform.findPr.mockReturnValueOnce({ title: 'foo' });
+      platform.findPr.mockResolvedValueOnce({ title: 'foo' } as never);
       await cleanup.pruneStaleBranches(config, config.branchList);
       expect(platform.getAllRenovateBranches).toHaveBeenCalledTimes(1);
       expect(platform.deleteBranch).toHaveBeenCalledTimes(0);
@@ -59,10 +56,10 @@ describe('workers/repository/finalise/prune', () => {
       config.branchList = ['renovate/a', 'renovate/b'];
       config.dryRun = false;
       config.pruneStaleBranches = false;
-      platform.getAllRenovateBranches.mockReturnValueOnce(
+      platform.getAllRenovateBranches.mockResolvedValueOnce(
         config.branchList.concat(['renovate/c'])
       );
-      platform.findPr.mockReturnValueOnce({ title: 'foo' });
+      platform.findPr.mockResolvedValueOnce({ title: 'foo' } as never);
       await cleanup.pruneStaleBranches(config, config.branchList);
       expect(platform.getAllRenovateBranches).toHaveBeenCalledTimes(1);
       expect(platform.deleteBranch).toHaveBeenCalledTimes(0);
@@ -71,11 +68,11 @@ describe('workers/repository/finalise/prune', () => {
     it('posts comment if someone pushed to PR', async () => {
       config.branchList = ['renovate/a', 'renovate/b'];
       config.dryRun = false;
-      platform.getAllRenovateBranches.mockReturnValueOnce(
+      platform.getAllRenovateBranches.mockResolvedValueOnce(
         config.branchList.concat(['renovate/c'])
       );
-      platform.getBranchPr.mockReturnValueOnce({ isModified: true });
-      platform.findPr.mockReturnValueOnce({ title: 'foo' });
+      platform.getBranchPr.mockResolvedValueOnce({ isModified: true } as never);
+      platform.findPr.mockResolvedValueOnce({ title: 'foo' } as never);
       await cleanup.pruneStaleBranches(config, config.branchList);
       expect(platform.getAllRenovateBranches).toHaveBeenCalledTimes(1);
       expect(platform.deleteBranch).toHaveBeenCalledTimes(0);
@@ -85,11 +82,11 @@ describe('workers/repository/finalise/prune', () => {
     it('skips comment if dry run', async () => {
       config.branchList = ['renovate/a', 'renovate/b'];
       config.dryRun = true;
-      platform.getAllRenovateBranches.mockReturnValueOnce(
+      platform.getAllRenovateBranches.mockResolvedValueOnce(
         config.branchList.concat(['renovate/c'])
       );
-      platform.getBranchPr.mockReturnValueOnce({ isModified: true });
-      platform.findPr.mockReturnValueOnce({ title: 'foo' });
+      platform.getBranchPr.mockResolvedValueOnce({ isModified: true } as never);
+      platform.findPr.mockResolvedValueOnce({ title: 'foo' } as never);
       await cleanup.pruneStaleBranches(config, config.branchList);
       expect(platform.getAllRenovateBranches).toHaveBeenCalledTimes(1);
       expect(platform.deleteBranch).toHaveBeenCalledTimes(0);
diff --git a/test/workers/repository/finalise/validate.spec.js b/test/workers/repository/finalise/validate.spec.ts
similarity index 76%
rename from test/workers/repository/finalise/validate.spec.js
rename to test/workers/repository/finalise/validate.spec.ts
index db2791345b1dd2fed3144f6481c0d7832388d8ba..3676ee7f49c5f495731a44dfbcb7d3bc473211cc 100644
--- a/test/workers/repository/finalise/validate.spec.js
+++ b/test/workers/repository/finalise/validate.spec.ts
@@ -1,7 +1,5 @@
-const validate = require('../../../../lib/workers/repository/finalise/validate');
-
-/** @type any */
-const { platform } = require('../../../../lib/platform');
+import * as validate from '../../../../lib/workers/repository/finalise/validate';
+import { platform } from '../../../util';
 
 beforeEach(() => {
   jest.resetAllMocks();
@@ -13,7 +11,7 @@ describe('workers/repository/validate', () => {
       await validate.validatePrs({ suppressNotifications: ['prValidation'] });
     });
     it('catches error', async () => {
-      platform.getPrList.mockReturnValueOnce([
+      platform.getPrList.mockResolvedValueOnce([
         {
           state: 'open',
           branchName: 'some/branch',
@@ -26,29 +24,29 @@ describe('workers/repository/validate', () => {
       expect(platform.ensureCommentRemoval).toHaveBeenCalledTimes(0);
     });
     it('returns if no matching files', async () => {
-      platform.getPrList.mockReturnValueOnce([
+      platform.getPrList.mockResolvedValueOnce([
         {
           state: 'open',
           branchName: 'some/branch',
           title: 'Update Renovate',
         },
       ]);
-      platform.getPrFiles.mockReturnValueOnce(['readme.md']);
+      platform.getPrFiles.mockResolvedValueOnce(['readme.md']);
       await validate.validatePrs({});
       expect(platform.setBranchStatus).toHaveBeenCalledTimes(0);
       expect(platform.ensureComment).toHaveBeenCalledTimes(0);
       expect(platform.ensureCommentRemoval).toHaveBeenCalledTimes(0);
     });
     it('validates failures if cannot parse', async () => {
-      platform.getPrList.mockReturnValueOnce([
+      platform.getPrList.mockResolvedValueOnce([
         {
           state: 'open',
           branchName: 'some/branch',
           title: 'Update Renovate',
         },
       ]);
-      platform.getPrFiles.mockReturnValueOnce(['renovate.json']);
-      platform.getFile.mockReturnValue('not JSON');
+      platform.getPrFiles.mockResolvedValueOnce(['renovate.json']);
+      platform.getFile.mockResolvedValue('not JSON');
       await validate.validatePrs({});
       expect(platform.setBranchStatus).toHaveBeenCalledTimes(1);
       expect(platform.setBranchStatus.mock.calls[0][3]).toEqual('failure');
@@ -56,15 +54,15 @@ describe('workers/repository/validate', () => {
       expect(platform.ensureCommentRemoval).toHaveBeenCalledTimes(0);
     });
     it('validates failures if config validation fails', async () => {
-      platform.getPrList.mockReturnValueOnce([
+      platform.getPrList.mockResolvedValueOnce([
         {
           state: 'open',
           branchName: 'some/branch',
           title: 'Update Renovate',
         },
       ]);
-      platform.getPrFiles.mockReturnValueOnce(['renovate.json']);
-      platform.getFile.mockReturnValue('{"foo":1}');
+      platform.getPrFiles.mockResolvedValueOnce(['renovate.json']);
+      platform.getFile.mockResolvedValue('{"foo":1}');
       await validate.validatePrs({});
       expect(platform.setBranchStatus).toHaveBeenCalledTimes(1);
       expect(platform.setBranchStatus.mock.calls[0][3]).toEqual('failure');
@@ -72,15 +70,15 @@ describe('workers/repository/validate', () => {
       expect(platform.ensureCommentRemoval).toHaveBeenCalledTimes(0);
     });
     it('validates successfully', async () => {
-      platform.getPrList.mockReturnValueOnce([
+      platform.getPrList.mockResolvedValueOnce([
         {
           state: 'open',
           branchName: 'some/branch',
           title: 'Update Renovate',
         },
       ]);
-      platform.getPrFiles.mockReturnValueOnce(['renovate.json']);
-      platform.getFile.mockReturnValue('{}');
+      platform.getPrFiles.mockResolvedValueOnce(['renovate.json']);
+      platform.getFile.mockResolvedValue('{}');
       await validate.validatePrs({});
       expect(platform.setBranchStatus).toHaveBeenCalledTimes(1);
       expect(platform.setBranchStatus.mock.calls[0][3]).toEqual('success');
diff --git a/yarn.lock b/yarn.lock
index 833f440d4834c0792d5b4ff0e785e085d6a6ca75..3d891aef0e0b9af2b803678c1073e3a89308016c 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1247,6 +1247,11 @@
   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"
+  integrity sha512-sqm9g7mHlPY/43fcSNrCYfOeX9zkTTK+euO5E6+CVijSMm5tTjkVdwdqRkY3ljjIAf8679vps5jKUoJBCLsMDA==
+
 "@types/later@1.2.5":
   version "1.2.5"
   resolved "https://registry.yarnpkg.com/@types/later/-/later-1.2.5.tgz#56297f82ea0002549159219d75844a9380ad18bd"
@@ -6656,7 +6661,6 @@ npm@6.13.4, npm@^6.10.3:
     cmd-shim "^3.0.3"
     columnify "~1.5.4"
     config-chain "^1.1.12"
-    debuglog "*"
     detect-indent "~5.0.0"
     detect-newline "^2.1.0"
     dezalgo "~1.0.3"
@@ -6671,7 +6675,6 @@ npm@6.13.4, npm@^6.10.3:
     has-unicode "~2.0.1"
     hosted-git-info "^2.8.5"
     iferr "^1.0.2"
-    imurmurhash "*"
     infer-owner "^1.0.4"
     inflight "~1.0.6"
     inherits "^2.0.4"
@@ -6690,14 +6693,8 @@ npm@6.13.4, npm@^6.10.3:
     libnpx "^10.2.0"
     lock-verify "^2.1.0"
     lockfile "^1.0.4"
-    lodash._baseindexof "*"
     lodash._baseuniq "~4.6.0"
-    lodash._bindcallback "*"
-    lodash._cacheindexof "*"
-    lodash._createcache "*"
-    lodash._getnative "*"
     lodash.clonedeep "~4.5.0"
-    lodash.restparam "*"
     lodash.union "~4.6.0"
     lodash.uniq "~4.5.0"
     lodash.without "~4.4.0"