diff --git a/lib/datasource/nuget/v2.js b/lib/datasource/nuget/v2.js
index aed75a5f4497a637d58003891cf430f1100a3ff8..80de3bf62bef25957cc307afc6029e530564bccd 100644
--- a/lib/datasource/nuget/v2.js
+++ b/lib/datasource/nuget/v2.js
@@ -28,6 +28,7 @@ async function getPkgReleases(feedUrl, pkgName) {
       const pkgVersionsListDoc = new XmlDocument(pkgVersionsListRaw.body);
 
       const pkgInfoList = pkgVersionsListDoc.children.filter(
+        // @ts-ignore
         node => node.name === 'entry'
       );
 
@@ -50,9 +51,11 @@ async function getPkgReleases(feedUrl, pkgName) {
       }
 
       const nextPkgUrlListLink = pkgVersionsListDoc.children.find(
+        // @ts-ignore
         node => node.name === 'link' && node.attr.rel === 'next'
       );
 
+      // @ts-ignore
       pkgUrlList = nextPkgUrlListLink ? nextPkgUrlListLink.attr.href : null;
     } while (pkgUrlList !== null);
 
diff --git a/lib/manager/ansible/extract.js b/lib/manager/ansible/extract.ts
similarity index 74%
rename from lib/manager/ansible/extract.js
rename to lib/manager/ansible/extract.ts
index 44f38ebe5aeffa9ba82912955881fd5953bc7aee..b28748cadb3c03c7b439412058868a9a7577ffe5 100644
--- a/lib/manager/ansible/extract.js
+++ b/lib/manager/ansible/extract.ts
@@ -1,13 +1,10 @@
-const { logger } = require('../../logger');
-const { getDep } = require('../dockerfile/extract');
+import { logger } from '../../logger';
+import { getDep } from '../dockerfile/extract';
+import { PackageFile, PackageDependency } from '../common';
 
-module.exports = {
-  extractPackageFile,
-};
-
-function extractPackageFile(content) {
+export default function extractPackageFile(content: string): PackageFile {
   logger.trace('ansible.extractPackageFile()');
-  let deps = [];
+  let deps: PackageDependency[] = [];
   let lineNumber = 0;
   for (const line of content.split('\n')) {
     const match = line.match(/^\s*image:\s*'?"?([^\s'"]+)'?"?\s*$/);
diff --git a/lib/manager/ansible/index.js b/lib/manager/ansible/index.js
deleted file mode 100644
index f98aa074d98cb6dc1534aeb4c1aa1250bf5fba71..0000000000000000000000000000000000000000
--- a/lib/manager/ansible/index.js
+++ /dev/null
@@ -1,10 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-
-const language = 'docker';
-
-module.exports = {
-  extractPackageFile,
-  language,
-  updateDependency,
-};
diff --git a/lib/manager/ansible/index.ts b/lib/manager/ansible/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..595304a1ea0e7202069fc15d7fd2df5b8b514944
--- /dev/null
+++ b/lib/manager/ansible/index.ts
@@ -0,0 +1,6 @@
+import extractPackageFile from './extract';
+import updateDependency from './update';
+
+const language = 'docker';
+
+export { extractPackageFile, language, updateDependency };
diff --git a/lib/manager/ansible/update.js b/lib/manager/ansible/update.ts
similarity index 78%
rename from lib/manager/ansible/update.js
rename to lib/manager/ansible/update.ts
index ac2727a519962d647cbae3a6e18ad8cb855b4b3a..ae2781a70b99f0e42f6d8d4fea72082ce0101b94 100644
--- a/lib/manager/ansible/update.js
+++ b/lib/manager/ansible/update.ts
@@ -1,11 +1,11 @@
-const { logger } = require('../../logger');
-const { getNewFrom } = require('../dockerfile/update');
+import { logger } from '../../logger';
+import { getNewFrom } from '../dockerfile/update';
+import { Upgrade } from '../common';
 
-module.exports = {
-  updateDependency,
-};
-
-function updateDependency(fileContent, upgrade) {
+export default function updateDependency(
+  fileContent: string,
+  upgrade: Upgrade
+) {
   try {
     const newFrom = getNewFrom(upgrade);
     logger.debug(`ansible.updateDependency(): ${newFrom}`);
diff --git a/lib/manager/bazel/extract.js b/lib/manager/bazel/extract.ts
similarity index 86%
rename from lib/manager/bazel/extract.js
rename to lib/manager/bazel/extract.ts
index 55c0cf2e6f97a3290b718b6363c8b302f51563b9..4269f55a0d9ba0fdd73b30e7f7d326d25766e7ed 100644
--- a/lib/manager/bazel/extract.js
+++ b/lib/manager/bazel/extract.ts
@@ -1,24 +1,21 @@
-/* eslint no-plusplus: 0 default-case: 0 */
-const parse = require('github-url-from-git');
-const URL = require('url');
-const { logger } = require('../../logger');
+/* eslint no-plusplus: 0  */
+import parse from 'github-url-from-git';
+import { parse as _parse } from 'url';
+import { logger } from '../../logger';
+import { PackageDependency, PackageFile } from '../common';
 
-module.exports = {
-  extractPackageFile,
-};
-
-function parseUrl(urlString) {
+function parseUrl(urlString: string) {
   // istanbul ignore if
   if (!urlString) {
     return null;
   }
-  const url = URL.parse(urlString);
+  const url = _parse(urlString);
   if (url.host !== 'github.com') {
     return null;
   }
   const path = url.path.split('/').slice(1);
   const repo = path[0] + '/' + path[1];
-  let currentValue = null;
+  let currentValue: string = null;
   if (path[2] === 'releases' && path[3] === 'download') {
     currentValue = path[4];
   }
@@ -32,7 +29,7 @@ function parseUrl(urlString) {
   return null;
 }
 
-function findBalancedParenIndex(longString) {
+function findBalancedParenIndex(longString: string) {
   /**
    * Minimalistic string parser with single task -> find last char in def.
    * It treats [)] as the last char.
@@ -57,13 +54,16 @@ function findBalancedParenIndex(longString) {
       case '"':
         if (i > 1 && arr.slice(i - 2, i).every(prev => char === prev))
           intShouldNotBeOdd++;
+        break;
+      default:
+        break;
     }
 
     return !parenNestingDepth && !(intShouldNotBeOdd % 2) && char === ')';
   });
 }
 
-function parseContent(content) {
+function parseContent(content: string) {
   return [
     'container_pull',
     'http_archive',
@@ -82,32 +82,32 @@ function parseContent(content) {
         })
         .filter(Boolean),
     ],
-    []
+    [] as string[]
   );
 }
 
-function extractPackageFile(content) {
+export function extractPackageFile(content: string): PackageFile {
   const definitions = parseContent(content);
   if (!definitions.length) {
     logger.debug('No matching WORKSPACE definitions found');
     return null;
   }
   logger.debug({ definitions }, `Found ${definitions.length} definitions`);
-  const deps = [];
+  const deps: PackageDependency[] = [];
   definitions.forEach(def => {
     logger.debug({ def }, 'Checking bazel definition');
     const [depType] = def.split('(', 1);
-    const dep = { depType, managerData: { def } };
-    let depName;
-    let importpath;
-    let remote;
-    let currentValue;
-    let commit;
-    let url;
-    let sha256;
-    let digest;
-    let repository;
-    let registry;
+    const dep: PackageDependency = { depType, managerData: { def } };
+    let depName: string;
+    let importpath: string;
+    let remote: string;
+    let currentValue: string;
+    let commit: string;
+    let url: string;
+    let sha256: string;
+    let digest: string;
+    let repository: string;
+    let registry: string;
     let match = def.match(/name\s*=\s*"([^"]+)"/);
     if (match) {
       [, depName] = match;
diff --git a/lib/manager/bazel/index.js b/lib/manager/bazel/index.js
deleted file mode 100644
index 749cae6f4db0ec27bb7cde5845780752ce144ac9..0000000000000000000000000000000000000000
--- a/lib/manager/bazel/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-
-module.exports = {
-  extractPackageFile,
-  updateDependency,
-};
diff --git a/lib/manager/bazel/index.ts b/lib/manager/bazel/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c8e0095e4c0b87742ea8ebb8b318ad025b50f123
--- /dev/null
+++ b/lib/manager/bazel/index.ts
@@ -0,0 +1,4 @@
+import { extractPackageFile } from './extract';
+import { updateDependency } from './update';
+
+export { extractPackageFile, updateDependency };
diff --git a/lib/manager/bazel/update.js b/lib/manager/bazel/update.ts
similarity index 87%
rename from lib/manager/bazel/update.js
rename to lib/manager/bazel/update.ts
index 6d5b19edd4725e0ffab90cba07bb4e922e267e54..318d723d81e53645fa0ab93f64bf3ed3c4532b6d 100644
--- a/lib/manager/bazel/update.js
+++ b/lib/manager/bazel/update.ts
@@ -1,12 +1,13 @@
-const hasha = require('hasha');
-const got = require('../../util/got');
-const { logger } = require('../../logger');
+import { fromStream } from 'hasha';
+import got from '../../util/got';
+import { logger } from '../../logger';
+import { Upgrade } from '../common';
 
-module.exports = {
-  updateDependency,
-};
-
-function updateWithNewVersion(content, currentValue, newValue) {
+function updateWithNewVersion(
+  content: string,
+  currentValue: string,
+  newValue: string
+) {
   const currentVersion = currentValue.replace(/^v/, '');
   const newVersion = newValue.replace(/^v/, '');
   let newContent = content;
@@ -16,7 +17,7 @@ function updateWithNewVersion(content, currentValue, newValue) {
   return newContent;
 }
 
-function extractUrl(flattened) {
+function extractUrl(flattened: string) {
   const urlMatch = flattened.match(/url="(.*?)"/);
   if (!urlMatch) {
     logger.debug('Cannot locate urls in new definition');
@@ -25,7 +26,7 @@ function extractUrl(flattened) {
   return [urlMatch[1]];
 }
 
-function extractUrls(content) {
+function extractUrls(content: string) {
   const flattened = content.replace(/\n/g, '').replace(/\s/g, '');
   const urlsMatch = flattened.match(/urls?=\[.*?\]/);
   if (!urlsMatch) {
@@ -39,13 +40,13 @@ function extractUrls(content) {
   return urls;
 }
 
-async function getHashFromUrl(url) {
+async function getHashFromUrl(url: string) {
   const cacheNamespace = 'url-sha256';
   const cachedResult = await renovateCache.get(cacheNamespace, url);
   /* istanbul ignore next line */
   if (cachedResult) return cachedResult;
   try {
-    const hash = await hasha.fromStream(got.stream(url), {
+    const hash = await fromStream(got.stream(url), {
       algorithm: 'sha256',
     });
     const cacheMinutes = 3 * 24 * 60; // 3 days
@@ -56,7 +57,7 @@ async function getHashFromUrl(url) {
   }
 }
 
-async function getHashFromUrls(urls) {
+async function getHashFromUrls(urls: string[]) {
   const hashes = (await Promise.all(
     urls.map(url => getHashFromUrl(url))
   )).filter(Boolean);
@@ -72,16 +73,19 @@ async function getHashFromUrls(urls) {
   return distinctHashes[0];
 }
 
-function setNewHash(content, hash) {
+function setNewHash(content: string, hash: string) {
   return content.replace(/(sha256\s*=\s*)"[^"]+"/, `$1"${hash}"`);
 }
 
-async function updateDependency(fileContent, upgrade) {
+export async function updateDependency(
+  fileContent: string,
+  upgrade: Upgrade
+): Promise<string> {
   try {
     logger.debug(
       `bazel.updateDependency(): ${upgrade.newValue || upgrade.newDigest}`
     );
-    let newDef;
+    let newDef: string;
     if (upgrade.depType === 'container_pull') {
       newDef = upgrade.managerData.def
         .replace(/(tag\s*=\s*)"[^"]+"/, `$1"${upgrade.newValue}"`)
diff --git a/lib/manager/buildkite/extract.js b/lib/manager/buildkite/extract.ts
similarity index 83%
rename from lib/manager/buildkite/extract.js
rename to lib/manager/buildkite/extract.ts
index ef2a946fffc56a3c12363010af25c255c453bab7..a5754c65ec7d78240e6e7cd6112dc3260a8aae08 100644
--- a/lib/manager/buildkite/extract.js
+++ b/lib/manager/buildkite/extract.ts
@@ -1,12 +1,11 @@
-const { logger } = require('../../logger');
-const { isVersion } = require('../../versioning/semver');
+import { logger } from '../../logger';
+import { isVersion } from '../../versioning/semver';
+import { PackageFile, PackageDependency } from '../common';
 
-module.exports = {
-  extractPackageFile,
-};
+export { extractPackageFile };
 
-function extractPackageFile(content) {
-  const deps = [];
+function extractPackageFile(content: string): PackageFile {
+  const deps: PackageDependency[] = [];
   try {
     const lines = content.split('\n');
     for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {
@@ -21,8 +20,8 @@ function extractPackageFile(content) {
           logger.trace('depLineMatch');
           lineNumber += 1;
           const [, depName, currentValue] = depLineMatch;
-          let skipReason;
-          let repo;
+          let skipReason: string;
+          let repo: string;
           if (depName.startsWith('https://') || depName.startsWith('git@')) {
             logger.debug({ dependency: depName }, 'Skipping git plugin');
             skipReason = 'git-plugin';
@@ -46,7 +45,7 @@ function extractPackageFile(content) {
               skipReason = 'unknown';
             }
           }
-          const dep = {
+          const dep: PackageDependency = {
             managerData: { lineNumber },
             depName,
             currentValue,
diff --git a/lib/manager/buildkite/index.js b/lib/manager/buildkite/index.js
deleted file mode 100644
index 749cae6f4db0ec27bb7cde5845780752ce144ac9..0000000000000000000000000000000000000000
--- a/lib/manager/buildkite/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-
-module.exports = {
-  extractPackageFile,
-  updateDependency,
-};
diff --git a/lib/manager/buildkite/index.ts b/lib/manager/buildkite/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c8e0095e4c0b87742ea8ebb8b318ad025b50f123
--- /dev/null
+++ b/lib/manager/buildkite/index.ts
@@ -0,0 +1,4 @@
+import { extractPackageFile } from './extract';
+import { updateDependency } from './update';
+
+export { extractPackageFile, updateDependency };
diff --git a/lib/manager/buildkite/update.js b/lib/manager/buildkite/update.ts
similarity index 82%
rename from lib/manager/buildkite/update.js
rename to lib/manager/buildkite/update.ts
index 9275ba513acd2d813b3b30e620c8db4b713987c8..fe9c8c3bcee8a543c7128f4e0539254f9c615f8c 100644
--- a/lib/manager/buildkite/update.js
+++ b/lib/manager/buildkite/update.ts
@@ -1,10 +1,7 @@
-const { logger } = require('../../logger');
+import { logger } from '../../logger';
+import { Upgrade } from '../common';
 
-module.exports = {
-  updateDependency,
-};
-
-function updateDependency(currentFileContent, upgrade) {
+export function updateDependency(currentFileContent: string, upgrade: Upgrade) {
   try {
     logger.debug(`buildkite.updateDependency: ${upgrade.newValue}`);
     const lines = currentFileContent.split('\n');
diff --git a/lib/manager/bundler/artifacts.js b/lib/manager/bundler/artifacts.ts
similarity index 81%
rename from lib/manager/bundler/artifacts.js
rename to lib/manager/bundler/artifacts.ts
index 66bdb078d4a2b05f06d3836c0c5e90ee6f50fe52..1dc820f246eedc7d686822821bf833946c124d2f 100644
--- a/lib/manager/bundler/artifacts.js
+++ b/lib/manager/bundler/artifacts.ts
@@ -1,27 +1,23 @@
-const fs = require('fs-extra');
-const upath = require('upath');
-const { exec } = require('../../util/exec');
-const { getChildProcessEnv } = require('../../util/env');
-const { logger } = require('../../logger');
-
-const { getPkgReleases } = require('../../datasource/docker');
-const {
+import { outputFile, readFile } from 'fs-extra';
+import { join, dirname } from 'upath';
+import { exec } from '../../util/exec';
+import { getChildProcessEnv } from '../../util/env';
+import { logger } from '../../logger';
+import { getPkgReleases } from '../../datasource/docker';
+import {
   isValid,
   isVersion,
   matches,
   sortVersions,
-} = require('../../versioning/ruby');
-
-module.exports = {
-  updateArtifacts,
-};
+} from '../../versioning/ruby';
+import { UpdateArtifactsConfig } from '../common';
 
 // istanbul ignore next
-async function updateArtifacts(
-  packageFileName,
-  updatedDeps,
-  newPackageFileContent,
-  config
+export async function updateArtifacts(
+  packageFileName: string,
+  updatedDeps: string[],
+  newPackageFileContent: string,
+  config: UpdateArtifactsConfig
 ) {
   logger.debug(`bundler.updateArtifacts(${packageFileName})`);
   // istanbul ignore if
@@ -35,28 +31,25 @@ async function updateArtifacts(
     logger.debug('No Gemfile.lock found');
     return null;
   }
-  const cwd = upath.join(config.localDir, upath.dirname(packageFileName));
-  let stdout;
-  let stderr;
+  const cwd = join(config.localDir, dirname(packageFileName));
+  let stdout: string;
+  let stderr: string;
   try {
-    const localPackageFileName = upath.join(config.localDir, packageFileName);
-    await fs.outputFile(localPackageFileName, newPackageFileContent);
-    const localLockFileName = upath.join(config.localDir, lockFileName);
+    const localPackageFileName = join(config.localDir, packageFileName);
+    await outputFile(localPackageFileName, newPackageFileContent);
+    const localLockFileName = join(config.localDir, lockFileName);
     const env = getChildProcessEnv();
     const startTime = process.hrtime();
     let cmd;
     if (config.binarySource === 'docker') {
       logger.info('Running bundler via docker');
       let tag = 'latest';
-      let rubyConstraint;
+      let rubyConstraint: string;
       if (config && config.compatibility && config.compatibility.ruby) {
         logger.debug('Using rubyConstraint from config');
         rubyConstraint = config.compatibility.ruby;
       } else {
-        const rubyVersionFile = upath.join(
-          upath.dirname(packageFileName),
-          '.ruby-version'
-        );
+        const rubyVersionFile = join(dirname(packageFileName), '.ruby-version');
         logger.debug('Checking ' + rubyVersionFile);
         const rubyVersionFileContent = await platform.getFile(rubyVersionFile);
         if (rubyVersionFileContent) {
@@ -135,7 +128,7 @@ async function updateArtifacts(
       {
         file: {
           name: lockFileName,
-          contents: await fs.readFile(localLockFileName, 'utf8'),
+          contents: await readFile(localLockFileName, 'utf8'),
         },
       },
     ];
@@ -153,7 +146,7 @@ async function updateArtifacts(
       throw new Error('bundler-credentials');
     }
     if (err.stderr && err.stderr.includes('incompatible marshal file format')) {
-      const gemrcFile = await platform.getFile(upath.join(cwd, '.gemrc'));
+      const gemrcFile = await platform.getFile(join(cwd, '.gemrc'));
       logger.debug(
         { err, gemfile: newPackageFileContent, gemrcFile },
         'Gemfile marshalling error'
diff --git a/lib/manager/bundler/extract.js b/lib/manager/bundler/extract.ts
similarity index 92%
rename from lib/manager/bundler/extract.js
rename to lib/manager/bundler/extract.ts
index 540be09e70c19e6977c7e5f2e436896fc1e2721e..ef60fb0ca977b985c8dd5dc40c1bfe871111af58 100644
--- a/lib/manager/bundler/extract.js
+++ b/lib/manager/bundler/extract.ts
@@ -1,12 +1,14 @@
-const { logger } = require('../../logger');
-const { isValid } = require('../../versioning/ruby');
+import { logger } from '../../logger';
+import { isValid } from '../../versioning/ruby';
+import { PackageFile, PackageDependency } from '../common';
 
-module.exports = {
-  extractPackageFile,
-};
+export { extractPackageFile };
 
-async function extractPackageFile(content, fileName) {
-  const res = {
+async function extractPackageFile(
+  content: string,
+  fileName?: string
+): Promise<PackageFile> {
+  const res: PackageFile = {
     registryUrls: [],
     deps: [],
   };
@@ -14,7 +16,7 @@ async function extractPackageFile(content, fileName) {
   const delimiters = ['"', "'"];
   for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {
     const line = lines[lineNumber];
-    let sourceMatch;
+    let sourceMatch: RegExpMatchArray;
     for (const delimiter of delimiters) {
       sourceMatch =
         sourceMatch ||
@@ -25,7 +27,7 @@ async function extractPackageFile(content, fileName) {
     if (sourceMatch) {
       res.registryUrls.push(sourceMatch[1]);
     }
-    let rubyMatch;
+    let rubyMatch: RegExpMatchArray;
     for (const delimiter of delimiters) {
       rubyMatch =
         rubyMatch ||
@@ -36,8 +38,8 @@ async function extractPackageFile(content, fileName) {
     if (rubyMatch) {
       res.compatibility = { ruby: rubyMatch[1] };
     }
-    let gemMatch;
-    let gemDelimiter;
+    let gemMatch: RegExpMatchArray;
+    let gemDelimiter: string;
     for (const delimiter of delimiters) {
       const gemMatchRegex = `^gem ${delimiter}([^${delimiter}]+)${delimiter}(,\\s+${delimiter}([^${delimiter}]+)${delimiter}){0,2}`;
       if (line.match(new RegExp(gemMatchRegex))) {
@@ -46,7 +48,7 @@ async function extractPackageFile(content, fileName) {
       }
     }
     if (gemMatch) {
-      const dep = {
+      const dep: PackageDependency = {
         depName: gemMatch[1],
         managerData: { lineNumber },
       };
diff --git a/lib/manager/bundler/index.js b/lib/manager/bundler/index.ts
similarity index 67%
rename from lib/manager/bundler/index.js
rename to lib/manager/bundler/index.ts
index 886cc5b07959ad1447853e90e2979f97f8e9c3ca..3cff436f7497d7c28ffbfe9526f3835cb8e08be0 100644
--- a/lib/manager/bundler/index.js
+++ b/lib/manager/bundler/index.ts
@@ -1,7 +1,7 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-const { updateArtifacts } = require('./artifacts');
-const { getRangeStrategy } = require('./range');
+import { extractPackageFile } from './extract';
+import { updateDependency } from './update';
+import { updateArtifacts } from './artifacts';
+import { getRangeStrategy } from './range';
 
 const language = 'ruby';
 
@@ -10,7 +10,7 @@ const language = 'ruby';
  * The best way to understand them in more detail is to look at the existing managers and find one that matches most closely what you need to do.
  */
 
-module.exports = {
+export {
   extractPackageFile, // Mandatory unless extractAllPackageFiles is used instead
   updateArtifacts, // Optional
   getRangeStrategy, // Optional
diff --git a/lib/manager/bundler/range.js b/lib/manager/bundler/range.ts
similarity index 86%
rename from lib/manager/bundler/range.js
rename to lib/manager/bundler/range.ts
index d40496c31cee853cddc23248dbb21331ae0c5e77..067a55721e5eb0fabc02a23ce95b23951a66524b 100644
--- a/lib/manager/bundler/range.js
+++ b/lib/manager/bundler/range.ts
@@ -1,7 +1,3 @@
-module.exports = {
-  getRangeStrategy,
-};
-
 /*
  * The getRangeStrategy() function is optional and can be removed if not applicable.
  * It is used when the user configures rangeStrategy=auto.
@@ -15,6 +11,6 @@ module.exports = {
  *
  */
 
-function getRangeStrategy() {
+export function getRangeStrategy() {
   return 'replace';
 }
diff --git a/lib/manager/bundler/update.js b/lib/manager/bundler/update.ts
similarity index 88%
rename from lib/manager/bundler/update.js
rename to lib/manager/bundler/update.ts
index 010668fd8ae56ead936d65d5f0bff880dbbfe6f0..2c0f3a2ebc9d9d57fac9d6a7ab8003d8fd217c64 100644
--- a/lib/manager/bundler/update.js
+++ b/lib/manager/bundler/update.ts
@@ -1,8 +1,5 @@
-const { logger } = require('../../logger');
-
-module.exports = {
-  updateDependency,
-};
+import { logger } from '../../logger';
+import { Upgrade } from '../common';
 
 /*
  * The updateDependency() function is mandatory, and is used for updating one dependency at a time.
@@ -10,7 +7,10 @@ module.exports = {
  * or with new content if changes are necessary.
  */
 
-function updateDependency(currentFileContent, upgrade) {
+export function updateDependency(
+  currentFileContent: string,
+  upgrade: Upgrade
+): string {
   try {
     const delimiter =
       currentFileContent.split('"').length >
diff --git a/lib/manager/cargo/artifacts.js b/lib/manager/cargo/artifacts.ts
similarity index 78%
rename from lib/manager/cargo/artifacts.js
rename to lib/manager/cargo/artifacts.ts
index 1ede6e8db7f7282ab1591e1fd8855677012aaf9a..1509aa56dc2fcd0a51ef829f5e63387fc4049c63 100644
--- a/lib/manager/cargo/artifacts.js
+++ b/lib/manager/cargo/artifacts.ts
@@ -1,20 +1,17 @@
-const upath = require('upath');
-const process = require('process');
-const fs = require('fs-extra');
-const { exec } = require('../../util/exec');
-const { getChildProcessEnv } = require('../../util/env');
-const { logger } = require('../../logger');
+import { join } from 'upath';
+import { hrtime } from 'process';
+import { outputFile, readFile } from 'fs-extra';
+import { exec } from '../../util/exec';
+import { getChildProcessEnv } from '../../util/env';
+import { logger } from '../../logger';
+import { UpdateArtifactsConfig, UpdateArtifactsResult } from '../common';
 
-module.exports = {
-  updateArtifacts,
-};
-
-async function updateArtifacts(
-  packageFileName,
-  updatedDeps,
-  newPackageFileContent,
-  config
-) {
+export async function updateArtifacts(
+  packageFileName: string,
+  updatedDeps: string[],
+  newPackageFileContent: string,
+  config: UpdateArtifactsConfig
+): Promise<UpdateArtifactsResult[]> {
   await logger.debug(`cargo.updateArtifacts(${packageFileName})`);
   if (updatedDeps === undefined || updatedDeps.length < 1) {
     logger.debug('No updated cargo deps - returning null');
@@ -26,12 +23,12 @@ async function updateArtifacts(
     logger.debug('No Cargo.lock found');
     return null;
   }
-  const localPackageFileName = upath.join(config.localDir, packageFileName);
-  const localLockFileName = upath.join(config.localDir, lockFileName);
-  let stdout;
-  let stderr;
+  const localPackageFileName = join(config.localDir, packageFileName);
+  const localLockFileName = join(config.localDir, lockFileName);
+  let stdout: string;
+  let stderr: string;
   try {
-    await fs.outputFile(localPackageFileName, newPackageFileContent);
+    await outputFile(localPackageFileName, newPackageFileContent);
     logger.debug('Updating ' + lockFileName);
     const cwd = config.localDir;
     const env = getChildProcessEnv();
@@ -39,7 +36,7 @@ async function updateArtifacts(
       const dep = updatedDeps[i];
       // Update dependency `${dep}` in Cargo.lock file corresponding to Cargo.toml file located
       // at ${localPackageFileName} path
-      let cmd;
+      let cmd: string;
       // istanbul ignore if
       if (config.binarySource === 'docker') {
         logger.info('Running cargo via docker');
@@ -55,7 +52,7 @@ async function updateArtifacts(
         cmd = 'cargo';
       }
       cmd += ` update --manifest-path ${localPackageFileName} --package ${dep}`;
-      const startTime = process.hrtime();
+      const startTime = hrtime();
       try {
         ({ stdout, stderr } = await exec(cmd, {
           cwd,
@@ -84,7 +81,7 @@ async function updateArtifacts(
           throw err; // this is caught below
         }
       }
-      const duration = process.hrtime(startTime);
+      const duration = hrtime(startTime);
       const seconds = Math.round(duration[0] + duration[1] / 1e9);
       logger.info(
         { seconds, type: 'Cargo.lock', stdout, stderr },
@@ -92,7 +89,7 @@ async function updateArtifacts(
       );
     }
     logger.debug('Returning updated Cargo.lock');
-    const newCargoLockContent = await fs.readFile(localLockFileName, 'utf8');
+    const newCargoLockContent = await readFile(localLockFileName, 'utf8');
     if (existingLockFileContent === newCargoLockContent) {
       logger.debug('Cargo.lock is unchanged');
       return null;
diff --git a/lib/manager/cargo/extract.js b/lib/manager/cargo/extract.ts
similarity index 72%
rename from lib/manager/cargo/extract.js
rename to lib/manager/cargo/extract.ts
index e80891fa59e377a227d9c5d712b6a1fc3878cbe2..399cee39bc25396923f322a9faacd402254e8c41 100644
--- a/lib/manager/cargo/extract.js
+++ b/lib/manager/cargo/extract.ts
@@ -1,16 +1,17 @@
-const toml = require('toml');
-const { logger } = require('../../logger');
-const semver = require('../../versioning/cargo');
+import { parse } from 'toml';
+import { logger } from '../../logger';
+import { isValid } from '../../versioning/cargo';
+import { PackageDependency, PackageFile } from '../common';
+import { CargoConfig, CargoSection } from './types';
 
-module.exports = {
-  extractPackageFile,
-};
-
-function extractPackageFile(content, fileName) {
+export function extractPackageFile(
+  content: string,
+  fileName: string
+): PackageFile {
   logger.trace(`cargo.extractPackageFile(${fileName})`);
-  let parsedContent;
+  let parsedContent: CargoConfig;
   try {
-    parsedContent = toml.parse(content);
+    parsedContent = parse(content);
   } catch (err) {
     logger.debug({ err }, 'Error parsing Cargo.toml file');
     return null;
@@ -24,7 +25,7 @@ function extractPackageFile(content, fileName) {
   */
   const targetSection = parsedContent.target;
   // An array of all dependencies in the target section
-  let targetDeps = [];
+  let targetDeps: PackageDependency[] = [];
   if (targetSection) {
     const targets = Object.keys(targetSection);
     targets.forEach(target => {
@@ -50,20 +51,24 @@ function extractPackageFile(content, fileName) {
   return { deps };
 }
 
-function extractFromSection(parsedContent, section, target) {
-  const deps = [];
+function extractFromSection(
+  parsedContent: CargoSection,
+  section: keyof CargoSection,
+  target?: string
+) {
+  const deps: PackageDependency[] = [];
   const sectionContent = parsedContent[section];
   if (!sectionContent) {
     return [];
   }
   Object.keys(sectionContent).forEach(depName => {
-    let skipReason;
+    let skipReason: string;
     let currentValue = sectionContent[depName];
     let nestedVersion = false;
     if (typeof currentValue !== 'string') {
-      const version = sectionContent[depName].version;
-      const path = sectionContent[depName].path;
-      const git = sectionContent[depName].git;
+      const version = currentValue.version;
+      const path = currentValue.path;
+      const git = currentValue.git;
       if (version) {
         currentValue = version;
         nestedVersion = true;
@@ -84,16 +89,16 @@ function extractFromSection(parsedContent, section, target) {
         skipReason = 'invalid-dependency-specification';
       }
     }
-    const dep = {
+    const dep: PackageDependency = {
       depName,
       depType: section,
-      currentValue,
+      currentValue: currentValue as any,
       managerData: { nestedVersion },
       datasource: 'cargo',
     };
     if (skipReason) {
       dep.skipReason = skipReason;
-    } else if (!semver.isValid(dep.currentValue)) {
+    } else if (!isValid(dep.currentValue)) {
       dep.skipReason = 'unknown-version';
     }
     if (target) {
diff --git a/lib/manager/cargo/index.js b/lib/manager/cargo/index.js
deleted file mode 100644
index fbe1889565be2e1e0ce13fd2a03b06cef5a85576..0000000000000000000000000000000000000000
--- a/lib/manager/cargo/index.js
+++ /dev/null
@@ -1,14 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-const { updateArtifacts } = require('./artifacts');
-
-const language = 'rust';
-
-module.exports = {
-  extractPackageFile,
-  updateArtifacts,
-  language,
-  updateDependency,
-  // TODO: Support this
-  supportsLockFileMaintenance: false,
-};
diff --git a/lib/manager/cargo/index.ts b/lib/manager/cargo/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b3e0f380d2758dde45c19da861444f00747516f0
--- /dev/null
+++ b/lib/manager/cargo/index.ts
@@ -0,0 +1,9 @@
+import { extractPackageFile } from './extract';
+import { updateDependency } from './update';
+import { updateArtifacts } from './artifacts';
+
+const language = 'rust';
+// TODO: Support this
+export const supportsLockFileMaintenance = false;
+
+export { extractPackageFile, updateArtifacts, language, updateDependency };
diff --git a/lib/manager/cargo/types.ts b/lib/manager/cargo/types.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e22022b7c7bebf6034c4389a9f19b73661f435ef
--- /dev/null
+++ b/lib/manager/cargo/types.ts
@@ -0,0 +1,17 @@
+export interface CargoDep {
+  path: any;
+  git: any;
+  version: any;
+}
+
+export type CargoDeps = Record<string, CargoDep | string>;
+
+export interface CargoSection {
+  dependencies: CargoDeps;
+  'dev-dependencies': CargoDeps;
+  'build-dependencies': CargoDeps;
+}
+
+export interface CargoConfig extends CargoSection {
+  target: Record<string, CargoSection>;
+}
diff --git a/lib/manager/cargo/update.js b/lib/manager/cargo/update.ts
similarity index 82%
rename from lib/manager/cargo/update.js
rename to lib/manager/cargo/update.ts
index 5b61b6a916afe08276b86db51431e5210d39a19b..0c8f1168988dec366caf16c8e48cec716ed6f609 100644
--- a/lib/manager/cargo/update.js
+++ b/lib/manager/cargo/update.ts
@@ -1,18 +1,21 @@
-const _ = require('lodash');
-const toml = require('toml');
-const { logger } = require('../../logger');
-
-module.exports = {
-  updateDependency,
-};
+import { isEqual } from 'lodash';
+import { parse } from 'toml';
+import { logger } from '../../logger';
+import { Upgrade } from '../common';
+import { CargoConfig, CargoSection } from './types';
 
 // Return true if the match string is found at index in content
-function matchAt(content, index, match) {
+function matchAt(content: string, index: number, match: string) {
   return content.substring(index, index + match.length) === match;
 }
 
 // Replace oldString with newString at location index of content
-function replaceAt(content, index, oldString, newString) {
+function replaceAt(
+  content: string,
+  index: number,
+  oldString: string,
+  newString: string
+) {
   logger.debug(`Replacing ${oldString} with ${newString} at index ${index}`);
   return (
     content.substr(0, index) +
@@ -21,21 +24,24 @@ function replaceAt(content, index, oldString, newString) {
   );
 }
 
-function updateDependency(fileContent, upgrade) {
+export function updateDependency(
+  fileContent: string,
+  upgrade: Upgrade<{ nestedVersion?: boolean }>
+) {
   logger.trace({ config: upgrade }, 'poetry.updateDependency()');
   if (!upgrade) {
     return fileContent;
   }
   const { target, depType, depName, newValue, managerData } = upgrade;
   const { nestedVersion } = managerData;
-  let parsedContent;
+  let parsedContent: CargoConfig;
   try {
-    parsedContent = toml.parse(fileContent);
+    parsedContent = parse(fileContent);
   } catch (err) {
     logger.debug({ err }, 'Error parsing Cargo.toml file');
     return fileContent;
   }
-  let section;
+  let section: CargoSection;
   if (target) {
     section = parsedContent.target[target];
     if (section) {
@@ -58,7 +64,7 @@ function updateDependency(fileContent, upgrade) {
     }
     return fileContent;
   }
-  let oldVersion;
+  let oldVersion: any;
   const oldDep = section[depName];
   if (!oldDep) {
     logger.info(
@@ -115,7 +121,7 @@ function updateDependency(fileContent, upgrade) {
         newString
       );
       // Compare the parsed toml structure of old and new
-      if (_.isEqual(parsedContent, toml.parse(testContent))) {
+      if (isEqual(parsedContent, parse(testContent))) {
         newFileContent = testContent;
         break;
       } else {
diff --git a/lib/manager/circleci/extract.js b/lib/manager/circleci/extract.ts
similarity index 84%
rename from lib/manager/circleci/extract.js
rename to lib/manager/circleci/extract.ts
index 732cf211614f330513d392b7238e44ed838b2620..ed12bc590ca806905fa97904b46d9c3f58d40674 100644
--- a/lib/manager/circleci/extract.js
+++ b/lib/manager/circleci/extract.ts
@@ -1,12 +1,9 @@
-const { logger } = require('../../logger');
-const { getDep } = require('../dockerfile/extract');
+import { logger } from '../../logger';
+import { getDep } from '../dockerfile/extract';
+import { PackageFile, PackageDependency } from '../common';
 
-module.exports = {
-  extractPackageFile,
-};
-
-function extractPackageFile(content) {
-  const deps = [];
+export function extractPackageFile(content: string): PackageFile {
+  const deps: PackageDependency[] = [];
   try {
     const lines = content.split('\n');
     for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {
@@ -14,7 +11,7 @@ function extractPackageFile(content) {
       const orbs = line.match(/^\s*orbs:\s*$/);
       if (orbs) {
         logger.trace(`Matched orbs on line ${lineNumber}`);
-        let foundOrb;
+        let foundOrb: boolean;
         do {
           foundOrb = false;
           const orbLine = lines[lineNumber + 1];
@@ -26,7 +23,7 @@ function extractPackageFile(content) {
             lineNumber += 1;
             const depName = orbMatch[1];
             const [orbName, currentValue] = orbMatch[2].split('@');
-            const dep = {
+            const dep: PackageDependency = {
               depType: 'orb',
               depName,
               currentValue,
diff --git a/lib/manager/circleci/index.js b/lib/manager/circleci/index.js
deleted file mode 100644
index f98aa074d98cb6dc1534aeb4c1aa1250bf5fba71..0000000000000000000000000000000000000000
--- a/lib/manager/circleci/index.js
+++ /dev/null
@@ -1,10 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-
-const language = 'docker';
-
-module.exports = {
-  extractPackageFile,
-  language,
-  updateDependency,
-};
diff --git a/lib/manager/circleci/index.ts b/lib/manager/circleci/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5705105fe4b3fc5c6ffd85e4a307850d0b81f0a3
--- /dev/null
+++ b/lib/manager/circleci/index.ts
@@ -0,0 +1,6 @@
+import { extractPackageFile } from './extract';
+import { updateDependency } from './update';
+
+const language = 'docker';
+
+export { extractPackageFile, language, updateDependency };
diff --git a/lib/manager/circleci/update.js b/lib/manager/circleci/update.ts
similarity index 86%
rename from lib/manager/circleci/update.js
rename to lib/manager/circleci/update.ts
index b81237f8b3cd2c0cfb5435c479ca4e2c9a821076..23b35a55465ca5d9397f29f1ace34ac84b84831e 100644
--- a/lib/manager/circleci/update.js
+++ b/lib/manager/circleci/update.ts
@@ -1,11 +1,11 @@
-const { logger } = require('../../logger');
-const { getNewFrom } = require('../dockerfile/update');
+import { logger } from '../../logger';
+import { getNewFrom } from '../dockerfile/update';
+import { Upgrade } from '../common';
 
-module.exports = {
-  updateDependency,
-};
-
-function updateDependency(fileContent, upgrade) {
+export function updateDependency(
+  fileContent: string,
+  upgrade: Upgrade
+): string {
   try {
     const lines = fileContent.split('\n');
     const lineToChange = lines[upgrade.managerData.lineNumber];
diff --git a/lib/manager/common.ts b/lib/manager/common.ts
new file mode 100644
index 0000000000000000000000000000000000000000..588773bd97144941fb3894c9a3e6f92e2870c802
--- /dev/null
+++ b/lib/manager/common.ts
@@ -0,0 +1,216 @@
+import { ReleaseType } from 'semver';
+import { RangeStrategy } from '../versioning';
+
+export type Result<T> = T | Promise<T>;
+
+export interface ManagerConfig {
+  binarySource?: string;
+  localDir?: string;
+  registryUrls?: (string | Registry)[];
+}
+
+export interface ManagerData<T> {
+  managerData?: T;
+}
+
+export interface ExtractConfig extends ManagerConfig {
+  endpoint?: string;
+  global?: any;
+  gradle?: { timeout?: number };
+  ignoreNpmrcFile?: boolean;
+
+  skipInstalls?: boolean;
+  versionScheme?: string;
+}
+
+export interface UpdateArtifactsConfig extends ManagerConfig {
+  isLockFileMaintenance?: boolean;
+  compatibility?: Record<string, string>;
+  cacheDir?: string;
+  postUpdateOptions?: string[];
+}
+
+export interface PackageUpdateConfig {
+  currentValue?: string;
+  rangeStrategy?: RangeStrategy;
+  supportPolicy?: string[];
+}
+
+export interface PackageUpdateResult {
+  newValue: string[];
+  newMajor: string;
+  isRange: boolean;
+  sourceUrl: string;
+}
+
+export interface RangeConfig<T = Record<string, any>> extends ManagerData<T> {
+  composerJsonType?: 'composer-plugin' | 'library' | 'metapackage' | 'project';
+  currentValue?: string;
+  depName?: string;
+  depType?: string;
+  manager?: string;
+  packageJsonType?: 'app' | 'library';
+  rangeStrategy: RangeStrategy;
+}
+
+export interface Registry {
+  type?: string;
+  url: string;
+}
+
+export interface NpmLockFiles {
+  yarnIntegrity?: boolean;
+  yarnLock?: string;
+  packageLock?: string;
+  shrinkwrapJson?: string;
+  pnpmShrinkwrap?: string;
+  npmLock?: string;
+  lernaDir?: string;
+}
+
+export interface PackageFile<T = Record<string, any>>
+  extends NpmLockFiles,
+    ManagerData<T> {
+  hasYarnWorkspaces?: boolean;
+  internalPackages?: string[];
+  compatibility?: Record<string, string>;
+  datasource?: string;
+  registryUrls?: (string | Registry)[];
+  deps: PackageDependency[];
+  ignoreNpmrcFile?: boolean;
+  lernaClient?: string;
+  lernaPackages?: string[];
+  manager?: string;
+  mavenProps?: Record<string, any>;
+  npmrc?: string;
+  packageFile?: string;
+  packageJsonName?: string;
+  packageJsonType?: 'app' | 'library';
+  packageJsonVersion?: string;
+  parent?: string;
+  skipInstalls?: boolean;
+  yarnrc?: string;
+  yarnWorkspacesPackages?: string[] | string;
+}
+
+export interface Package<T> extends ManagerData<T> {
+  currentValue?: string;
+  currentDigest?: string;
+  depName?: string;
+  depNameShort?: string;
+  depType?: string;
+  fileReplacePosition?: number;
+  groupName?: string;
+  lineNumber?: number;
+  lookupName?: string;
+  repo?: string;
+  target?: string;
+  versionScheme?: string;
+
+  // npm manager
+  bumpVersion?: ReleaseType | string;
+  npmPackageAlias?: boolean;
+  packageJsonVersion?: string;
+  gitRef?: boolean;
+  sourceUrl?: string;
+  githubRepo?: string;
+  pinDigests?: boolean;
+  currentRawValue?: string;
+  major?: { enabled?: boolean };
+  prettyDepType?: any;
+}
+
+export interface PackageDependency<T = Record<string, any>> extends Package<T> {
+  commitMessageTopic?: string;
+  currentDigestShort?: string;
+  datasource?: string;
+  digestOneAndOnly?: boolean;
+  fromVersion?: string;
+  lockedVersion?: string;
+  lookupType?: string;
+  moduleName?: string;
+  propSource?: string;
+  registryUrls?: string[];
+  rangeStrategy?: RangeStrategy;
+  skipReason?: string;
+  source?: string;
+  sourceLine?: number;
+  versionLine?: number;
+}
+
+export interface Upgrade<T = Record<string, any>>
+  extends Package<T>,
+    NpmLockFiles {
+  isLockfileUpdate?: boolean;
+  currentRawValue?: any;
+  checksumUrl?: string;
+  currentVersion?: string;
+  depGroup?: string;
+  downloadUrl?: string;
+  name?: string;
+  newDigest?: string;
+  newFrom?: string;
+  newMajor?: number;
+  newValue?: string;
+  newVersion?: string;
+  packageFile?: string;
+  rangeStrategy?: RangeStrategy;
+  toVersion?: string;
+  updateType?: string;
+  version?: string;
+}
+
+interface ArtifactError {
+  lockFile?: string;
+  stderr?: string;
+}
+
+export interface UpdateArtifactsResult {
+  artifactError?: ArtifactError;
+  file?: { name: string; contents: string };
+  lockFileError?: ArtifactError;
+}
+
+export interface ManagerApi {
+  language?: string;
+  supportsLockFileMaintenance?: boolean;
+
+  extractAllPackageFiles?(
+    config: ExtractConfig,
+    files: string[]
+  ): Result<PackageFile[]>;
+
+  extractPackageFile?(
+    content: string,
+    packageFile?: string,
+    config?: ExtractConfig
+  ): Result<PackageFile>;
+
+  getPackageUpdates(config: PackageUpdateConfig): Result<PackageUpdateResult[]>;
+
+  getRangeStrategy(config: RangeConfig): RangeStrategy;
+
+  updateArtifacts?(
+    packageFileName: string,
+    updatedDeps: string[],
+    newPackageFileContent: string,
+    config: UpdateArtifactsConfig
+  ): Result<UpdateArtifactsResult[]>;
+
+  updateDependency(fileContent: string, upgrade: Upgrade): Result<string>;
+}
+
+// TODO: name and properties used by npm manager
+export interface PostUpdateConfig extends ManagerConfig, Record<string, any> {
+  cacheDir?: string;
+
+  postUpdateOptions?: string[];
+  skipInstalls?: boolean;
+
+  platform?: string;
+  upgrades?: Upgrade[];
+  npmLock?: string;
+  yarnLock?: string;
+  branchName?: string;
+  parentBranch?: string;
+}
diff --git a/lib/manager/composer/artifacts.js b/lib/manager/composer/artifacts.ts
similarity index 90%
rename from lib/manager/composer/artifacts.js
rename to lib/manager/composer/artifacts.ts
index d7d439e9f4f9b6e63306bd1740953b6730f5809a..8ce8a4bcfc4e19382e9b5a53057f78dc60304985 100644
--- a/lib/manager/composer/artifacts.js
+++ b/lib/manager/composer/artifacts.ts
@@ -1,20 +1,18 @@
 import is from '@sindresorhus/is';
+import URL from 'url';
+import fs from 'fs-extra';
+import upath from 'upath';
 import { exec } from '../../util/exec';
+import { UpdateArtifactsConfig, Registry } from '../common';
+import { logger } from '../../logger';
+import * as hostRules from '../../util/host-rules';
+import { getChildProcessEnv } from '../../util/env';
 
-const URL = require('url');
-const fs = require('fs-extra');
-const upath = require('upath');
-const { logger } = require('../../logger');
-const hostRules = require('../../util/host-rules');
-const { getChildProcessEnv } = require('../../util/env');
-
-export { updateArtifacts };
-
-async function updateArtifacts(
-  packageFileName,
-  updatedDeps,
-  newPackageFileContent,
-  config
+export async function updateArtifacts(
+  packageFileName: string,
+  updatedDeps: string[],
+  newPackageFileContent: string,
+  config: UpdateArtifactsConfig
 ) {
   logger.debug(`composer.updateArtifacts(${packageFileName})`);
   process.env.COMPOSER_CACHE_DIR =
@@ -30,8 +28,8 @@ async function updateArtifacts(
   }
   const cwd = upath.join(config.localDir, upath.dirname(packageFileName));
   await fs.ensureDir(upath.join(cwd, 'vendor'));
-  let stdout;
-  let stderr;
+  let stdout: string;
+  let stderr: string;
   try {
     const localPackageFileName = upath.join(config.localDir, packageFileName);
     await fs.outputFile(localPackageFileName, newPackageFileContent);
@@ -63,7 +61,7 @@ async function updateArtifacts(
     try {
       // istanbul ignore else
       if (is.array(config.registryUrls)) {
-        for (const regUrl of config.registryUrls) {
+        for (const regUrl of config.registryUrls as Registry[]) {
           if (regUrl.url) {
             const { host } = URL.parse(regUrl.url);
             const hostRule = hostRules.find({
@@ -98,7 +96,7 @@ async function updateArtifacts(
     }
     const env = getChildProcessEnv(['COMPOSER_CACHE_DIR']);
     const startTime = process.hrtime();
-    let cmd;
+    let cmd: string;
     if (config.binarySource === 'docker') {
       logger.info('Running composer via docker');
       cmd = `docker run --rm `;
diff --git a/lib/manager/composer/extract.js b/lib/manager/composer/extract.ts
similarity index 77%
rename from lib/manager/composer/extract.js
rename to lib/manager/composer/extract.ts
index 262e8935f0e48f945d386c13f3523b313b939ccf..fe985b006400e9f5b0ceb5c733a06e8a753cd845 100644
--- a/lib/manager/composer/extract.js
+++ b/lib/manager/composer/extract.ts
@@ -1,9 +1,22 @@
 import is from '@sindresorhus/is';
+import { logger } from '../../logger';
+import { api as semverComposer } from '../../versioning/composer';
+import { PackageFile, PackageDependency, Registry } from '../common';
 
-const { logger } = require('../../logger');
-const semverComposer = require('../../versioning/composer');
+interface Repo {
+  name?: string;
+  type: 'composer' | 'git' | 'package' | 'vcs';
 
-export { extractPackageFile };
+  url: string;
+}
+
+interface ComposerConfig {
+  type?: string;
+  repositories: Record<string, Repo>;
+
+  require: Record<string, string>;
+  'require-dev': Record<string, string>;
+}
 
 /**
  * Parse the repositories field from a composer.json
@@ -15,7 +28,11 @@ export { extractPackageFile };
  * @param repositories
  * @param registryUrls
  */
-function parseRepositories(repoJson, repositories, registryUrls) {
+function parseRepositories(
+  repoJson: Record<string, Repo>,
+  repositories: Record<string, Repo>,
+  registryUrls: Registry[]
+) {
   try {
     Object.entries(repoJson).forEach(([key, repo]) => {
       const name = is.array(repoJson) ? repo.name : key;
@@ -26,7 +43,9 @@ function parseRepositories(repoJson, repositories, registryUrls) {
           repositories[name] = repo;
           break;
         default:
+          // TODO: only add required props
           registryUrls.push(repo);
+          break;
       }
     });
   } catch (e) /* istanbul ignore next */ {
@@ -37,18 +56,18 @@ function parseRepositories(repoJson, repositories, registryUrls) {
   }
 }
 
-async function extractPackageFile(content, fileName) {
+export async function extractPackageFile(content: string, fileName: string) {
   logger.trace(`composer.extractPackageFile(${fileName})`);
-  let composerJson;
+  let composerJson: ComposerConfig;
   try {
     composerJson = JSON.parse(content);
   } catch (err) {
     logger.info({ fileName }, 'Invalid JSON');
     return null;
   }
-  const repositories = {};
-  const registryUrls = [];
-  const res = {};
+  const repositories: Record<string, Repo> = {};
+  const registryUrls: Registry[] = [];
+  const res: PackageFile = { deps: [] };
 
   // handle lockfile
   const lockfilePath = fileName.replace(/\.json$/, '.lock');
@@ -75,9 +94,9 @@ async function extractPackageFile(content, fileName) {
   for (const depType of depTypes) {
     if (composerJson[depType]) {
       try {
-        for (const [depName, version] of Object.entries(
-          composerJson[depType]
-        )) {
+        for (const [depName, version] of Object.entries(composerJson[
+          depType
+        ] as Record<string, string>)) {
           const currentValue = version.trim();
           // Default datasource and lookupName
           let datasource = 'packagist';
@@ -94,7 +113,7 @@ async function extractPackageFile(content, fileName) {
                 break;
             }
           }
-          const dep = {
+          const dep: PackageDependency = {
             depType,
             depName,
             currentValue,
diff --git a/lib/manager/composer/index.js b/lib/manager/composer/index.js
deleted file mode 100644
index e31490e30d7ca86d5572c08e37e29bb89e4b3f5f..0000000000000000000000000000000000000000
--- a/lib/manager/composer/index.js
+++ /dev/null
@@ -1,15 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('../npm/update');
-const { updateArtifacts } = require('./artifacts');
-const { getRangeStrategy } = require('./range');
-
-const language = 'php';
-
-module.exports = {
-  extractPackageFile,
-  updateArtifacts,
-  language,
-  updateDependency,
-  getRangeStrategy,
-  supportsLockFileMaintenance: true,
-};
diff --git a/lib/manager/composer/index.ts b/lib/manager/composer/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7bd3bf71b41d702d18951972dbf7da86ec85ab69
--- /dev/null
+++ b/lib/manager/composer/index.ts
@@ -0,0 +1,15 @@
+import { extractPackageFile } from './extract';
+import { updateDependency } from '../npm/update';
+import { updateArtifacts } from './artifacts';
+import { getRangeStrategy } from './range';
+
+const language = 'php';
+export const supportsLockFileMaintenance = true;
+
+export {
+  extractPackageFile,
+  updateArtifacts,
+  language,
+  updateDependency,
+  getRangeStrategy,
+};
diff --git a/lib/manager/composer/range.js b/lib/manager/composer/range.ts
similarity index 83%
rename from lib/manager/composer/range.js
rename to lib/manager/composer/range.ts
index 407278044321294a5ec5ded1cac796153a0d36ea..2293a62587d33bb6eb7db95509953543f8ffc5c2 100644
--- a/lib/manager/composer/range.js
+++ b/lib/manager/composer/range.ts
@@ -1,10 +1,8 @@
-const { logger } = require('../../logger');
+import { logger } from '../../logger';
+import { RangeConfig } from '../common';
+import { RangeStrategy } from '../../versioning';
 
-module.exports = {
-  getRangeStrategy,
-};
-
-function getRangeStrategy(config) {
+export function getRangeStrategy(config: RangeConfig): RangeStrategy {
   const {
     managerData = {},
     depType,
diff --git a/lib/manager/deps-edn/extract.js b/lib/manager/deps-edn/extract.ts
similarity index 69%
rename from lib/manager/deps-edn/extract.js
rename to lib/manager/deps-edn/extract.ts
index c1196ecbf8fb2e2a3bcb715dcc986c0e0d0c7197..52a2a84003281b9c8aa4d61a5837c889190c4940 100644
--- a/lib/manager/deps-edn/extract.js
+++ b/lib/manager/deps-edn/extract.ts
@@ -1,8 +1,9 @@
-const { DEFAULT_MAVEN_REPO } = require('../maven/extract');
-const { expandDepName, DEFAULT_CLOJARS_REPO } = require('../leiningen/extract');
+import { DEFAULT_MAVEN_REPO } from '../maven/extract';
+import { expandDepName, DEFAULT_CLOJARS_REPO } from '../leiningen/extract';
+import { PackageFile, PackageDependency } from '../common';
 
-function extractPackageFile(content) {
-  const deps = [];
+export function extractPackageFile(content: string): PackageFile {
+  const deps: PackageDependency[] = [];
 
   const regex = /([^{\s,]*)[\s,]*{[\s,]*:mvn\/version[\s,]+"([^"]+)"[\s,]*}/;
   let rest = content;
@@ -28,7 +29,3 @@ function extractPackageFile(content) {
 
   return { deps };
 }
-
-module.exports = {
-  extractPackageFile,
-};
diff --git a/lib/manager/deps-edn/index.js b/lib/manager/deps-edn/index.js
deleted file mode 100644
index 749cae6f4db0ec27bb7cde5845780752ce144ac9..0000000000000000000000000000000000000000
--- a/lib/manager/deps-edn/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-
-module.exports = {
-  extractPackageFile,
-  updateDependency,
-};
diff --git a/lib/manager/deps-edn/index.ts b/lib/manager/deps-edn/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c8e0095e4c0b87742ea8ebb8b318ad025b50f123
--- /dev/null
+++ b/lib/manager/deps-edn/index.ts
@@ -0,0 +1,4 @@
+import { extractPackageFile } from './extract';
+import { updateDependency } from './update';
+
+export { extractPackageFile, updateDependency };
diff --git a/lib/manager/deps-edn/update.js b/lib/manager/deps-edn/update.js
deleted file mode 100644
index 5ab2e6e4e8da00366929311bf6c25b88ecbcc6a0..0000000000000000000000000000000000000000
--- a/lib/manager/deps-edn/update.js
+++ /dev/null
@@ -1,5 +0,0 @@
-const { updateAtPosition } = require('../maven/update');
-
-module.exports = {
-  updateDependency: updateAtPosition,
-};
diff --git a/lib/manager/deps-edn/update.ts b/lib/manager/deps-edn/update.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0d7226b3719017a03587f2e58bcea9c91930eeb1
--- /dev/null
+++ b/lib/manager/deps-edn/update.ts
@@ -0,0 +1 @@
+export { updateAtPosition as updateDependency } from '../maven/update';
diff --git a/lib/manager/docker-compose/extract.js b/lib/manager/docker-compose/extract.ts
similarity index 74%
rename from lib/manager/docker-compose/extract.js
rename to lib/manager/docker-compose/extract.ts
index 5fb1b5f53f4090ebe0ebf1dfb50ff5d7695fee18..1fd6e03ee798656b2536f7cf011df46ec71ea286 100644
--- a/lib/manager/docker-compose/extract.js
+++ b/lib/manager/docker-compose/extract.ts
@@ -1,13 +1,10 @@
-const { logger } = require('../../logger');
-const { getDep } = require('../dockerfile/extract');
+import { logger } from '../../logger';
+import { getDep } from '../dockerfile/extract';
+import { PackageFile, PackageDependency } from '../common';
 
-module.exports = {
-  extractPackageFile,
-};
-
-function extractPackageFile(content) {
+export function extractPackageFile(content: string): PackageFile {
   logger.debug('docker-compose.extractPackageFile()');
-  let deps = [];
+  let deps: PackageDependency[] = [];
   let lineNumber = 0;
   for (const line of content.split('\n')) {
     const match = line.match(/^\s*image:\s*'?"?([^\s'"]+)'?"?\s*$/);
diff --git a/lib/manager/docker-compose/index.js b/lib/manager/docker-compose/index.js
deleted file mode 100644
index f98aa074d98cb6dc1534aeb4c1aa1250bf5fba71..0000000000000000000000000000000000000000
--- a/lib/manager/docker-compose/index.js
+++ /dev/null
@@ -1,10 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-
-const language = 'docker';
-
-module.exports = {
-  extractPackageFile,
-  language,
-  updateDependency,
-};
diff --git a/lib/manager/docker-compose/index.ts b/lib/manager/docker-compose/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5705105fe4b3fc5c6ffd85e4a307850d0b81f0a3
--- /dev/null
+++ b/lib/manager/docker-compose/index.ts
@@ -0,0 +1,6 @@
+import { extractPackageFile } from './extract';
+import { updateDependency } from './update';
+
+const language = 'docker';
+
+export { extractPackageFile, language, updateDependency };
diff --git a/lib/manager/docker-compose/update.js b/lib/manager/docker-compose/update.ts
similarity index 78%
rename from lib/manager/docker-compose/update.js
rename to lib/manager/docker-compose/update.ts
index 3fd31907f54d41a6e8f05ed6f6dbb0ae87aff6d4..e36a85b0718cab65b63608d9fbb8b853a2454611 100644
--- a/lib/manager/docker-compose/update.js
+++ b/lib/manager/docker-compose/update.ts
@@ -1,11 +1,11 @@
-const { logger } = require('../../logger');
-const { getNewFrom } = require('../dockerfile/update');
+import { logger } from '../../logger';
+import { getNewFrom } from '../dockerfile/update';
+import { Upgrade } from '../common';
 
-module.exports = {
-  updateDependency,
-};
-
-function updateDependency(fileContent, upgrade) {
+export function updateDependency(
+  fileContent: string,
+  upgrade: Upgrade
+): string {
   try {
     const newFrom = getNewFrom(upgrade);
     logger.debug(`docker-compose.updateDependency(): ${newFrom}`);
diff --git a/lib/manager/dockerfile/extract.js b/lib/manager/dockerfile/extract.ts
similarity index 86%
rename from lib/manager/dockerfile/extract.js
rename to lib/manager/dockerfile/extract.ts
index 46e4e67f15163c6d135c7399bbb97a3be2d5861d..c032d917d3d2a245e94dcebf1b31f4cbc39f593b 100644
--- a/lib/manager/dockerfile/extract.js
+++ b/lib/manager/dockerfile/extract.ts
@@ -1,12 +1,7 @@
-const { logger } = require('../../logger');
+import { logger } from '../../logger';
+import { PackageDependency, PackageFile } from '../common';
 
-module.exports = {
-  splitImageParts,
-  getDep,
-  extractPackageFile,
-};
-
-function splitImageParts(currentFrom) {
+export function splitImageParts(currentFrom: string): PackageDependency {
   if (currentFrom.includes('$')) {
     return {
       skipReason: 'contains-variable',
@@ -14,8 +9,8 @@ function splitImageParts(currentFrom) {
   }
   const [currentDepTag, currentDigest] = currentFrom.split('@');
   const depTagSplit = currentDepTag.split(':');
-  let depName;
-  let currentValue;
+  let depName: string;
+  let currentValue: string;
   if (
     depTagSplit.length === 1 ||
     depTagSplit[depTagSplit.length - 1].includes('/')
@@ -25,7 +20,7 @@ function splitImageParts(currentFrom) {
     currentValue = depTagSplit.pop();
     depName = depTagSplit.join(':');
   }
-  const dep = {
+  const dep: PackageDependency = {
     depName,
     currentValue,
     currentDigest,
@@ -33,8 +28,7 @@ function splitImageParts(currentFrom) {
   return dep;
 }
 
-function getDep(currentFrom) {
-  /** @type any */
+export function getDep(currentFrom: string) {
   const dep = splitImageParts(currentFrom);
   dep.datasource = 'docker';
   if (
@@ -47,9 +41,9 @@ function getDep(currentFrom) {
   return dep;
 }
 
-function extractPackageFile(content) {
-  const deps = [];
-  const stageNames = [];
+export function extractPackageFile(content: string): PackageFile {
+  const deps: PackageDependency[] = [];
+  const stageNames: string[] = [];
   let lineNumber = 0;
   for (const fromLine of content.split('\n')) {
     const fromMatch = fromLine.match(/^FROM /i);
diff --git a/lib/manager/dockerfile/index.js b/lib/manager/dockerfile/index.js
deleted file mode 100644
index f98aa074d98cb6dc1534aeb4c1aa1250bf5fba71..0000000000000000000000000000000000000000
--- a/lib/manager/dockerfile/index.js
+++ /dev/null
@@ -1,10 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-
-const language = 'docker';
-
-module.exports = {
-  extractPackageFile,
-  language,
-  updateDependency,
-};
diff --git a/lib/manager/dockerfile/index.ts b/lib/manager/dockerfile/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5705105fe4b3fc5c6ffd85e4a307850d0b81f0a3
--- /dev/null
+++ b/lib/manager/dockerfile/index.ts
@@ -0,0 +1,6 @@
+import { extractPackageFile } from './extract';
+import { updateDependency } from './update';
+
+const language = 'docker';
+
+export { extractPackageFile, language, updateDependency };
diff --git a/lib/manager/dockerfile/update.js b/lib/manager/dockerfile/update.ts
similarity index 84%
rename from lib/manager/dockerfile/update.js
rename to lib/manager/dockerfile/update.ts
index b10f798e71b9c1921d352aa99606a2a8ed4f6272..feae2bfa3d191b7ff4833161db86c967e67b8cf8 100644
--- a/lib/manager/dockerfile/update.js
+++ b/lib/manager/dockerfile/update.ts
@@ -1,11 +1,7 @@
-const { logger } = require('../../logger');
+import { logger } from '../../logger';
+import { Upgrade } from '../common';
 
-module.exports = {
-  getNewFrom,
-  updateDependency,
-};
-
-function getNewFrom(upgrade) {
+export function getNewFrom(upgrade: Upgrade) {
   const { depName, newValue, newDigest } = upgrade;
   let newFrom = depName;
   if (newValue) {
@@ -17,7 +13,7 @@ function getNewFrom(upgrade) {
   return newFrom;
 }
 
-function updateDependency(fileContent, upgrade) {
+export function updateDependency(fileContent: string, upgrade: Upgrade) {
   try {
     const { lineNumber, fromSuffix } = upgrade.managerData;
     let { fromPrefix } = upgrade.managerData;
diff --git a/lib/manager/github-actions/extract.js b/lib/manager/github-actions/extract.ts
similarity index 73%
rename from lib/manager/github-actions/extract.js
rename to lib/manager/github-actions/extract.ts
index bcd6d38f2840218903bde7b736eb7f03df29a5ee..b50126c0936d19373ab547f54145bbbee7b15583 100644
--- a/lib/manager/github-actions/extract.js
+++ b/lib/manager/github-actions/extract.ts
@@ -1,19 +1,15 @@
-const { logger } = require('../../logger');
-const { getDep } = require('../dockerfile/extract');
+import { logger } from '../../logger';
+import { getDep } from '../dockerfile/extract';
+import { PackageFile, PackageDependency } from '../common';
 
-module.exports = {
-  extractPackageFile,
-};
-
-function extractPackageFile(content) {
+export function extractPackageFile(content: string): PackageFile {
   logger.debug('github-actions.extractPackageFile()');
-  const deps = [];
+  const deps: PackageDependency[] = [];
   let lineNumber = 0;
   for (const line of content.split('\n')) {
     const match = line.match(/^\s+uses = "docker:\/\/([^"]+)"\s*$/);
     if (match) {
       const currentFrom = match[1];
-      /** @type any */
       const dep = getDep(currentFrom);
       logger.debug(
         {
diff --git a/lib/manager/github-actions/index.js b/lib/manager/github-actions/index.js
deleted file mode 100644
index f98aa074d98cb6dc1534aeb4c1aa1250bf5fba71..0000000000000000000000000000000000000000
--- a/lib/manager/github-actions/index.js
+++ /dev/null
@@ -1,10 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-
-const language = 'docker';
-
-module.exports = {
-  extractPackageFile,
-  language,
-  updateDependency,
-};
diff --git a/lib/manager/github-actions/index.ts b/lib/manager/github-actions/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5705105fe4b3fc5c6ffd85e4a307850d0b81f0a3
--- /dev/null
+++ b/lib/manager/github-actions/index.ts
@@ -0,0 +1,6 @@
+import { extractPackageFile } from './extract';
+import { updateDependency } from './update';
+
+const language = 'docker';
+
+export { extractPackageFile, language, updateDependency };
diff --git a/lib/manager/github-actions/update.js b/lib/manager/github-actions/update.ts
similarity index 78%
rename from lib/manager/github-actions/update.js
rename to lib/manager/github-actions/update.ts
index 1f35a2697fc1f2f6a10392f0e066fec167939872..49e094dac9deb4baeeba239501a37f013496a220 100644
--- a/lib/manager/github-actions/update.js
+++ b/lib/manager/github-actions/update.ts
@@ -1,11 +1,11 @@
-const { logger } = require('../../logger');
-const { getNewFrom } = require('../dockerfile/update');
+import { logger } from '../../logger';
+import { getNewFrom } from '../dockerfile/update';
+import { Upgrade } from '../common';
 
-module.exports = {
-  updateDependency,
-};
-
-function updateDependency(fileContent, upgrade) {
+export function updateDependency(
+  fileContent: string,
+  upgrade: Upgrade
+): string {
   try {
     const newFrom = getNewFrom(upgrade);
     logger.debug(`github-actions.updateDependency(): ${newFrom}`);
diff --git a/lib/manager/gitlabci-include/extract.js b/lib/manager/gitlabci-include/extract.ts
similarity index 71%
rename from lib/manager/gitlabci-include/extract.js
rename to lib/manager/gitlabci-include/extract.ts
index 39a513a9a54de00b64e0876def3901125bacaaf1..0200c27a061e91f724813499fa82997ffa9748ee 100644
--- a/lib/manager/gitlabci-include/extract.js
+++ b/lib/manager/gitlabci-include/extract.ts
@@ -1,16 +1,17 @@
 import is from '@sindresorhus/is';
+import yaml from 'js-yaml';
+import { logger } from '../../logger';
+import { PackageDependency, ExtractConfig, PackageFile } from '../common';
 
-const yaml = require('js-yaml');
-
-const { logger } = require('../../logger');
-
-export { extractPackageFile };
-
-function extractDepFromInclude(includeObj) {
+function extractDepFromInclude(includeObj: {
+  file: any;
+  project: string;
+  ref: string;
+}) {
   if (!includeObj.file || !includeObj.project) {
     return null;
   }
-  const dep = {
+  const dep: PackageDependency = {
     datasource: 'gitlab',
     depName: includeObj.project,
     depType: 'repository',
@@ -23,8 +24,12 @@ function extractDepFromInclude(includeObj) {
   return dep;
 }
 
-function extractPackageFile(content, packageFile, config) {
-  const deps = [];
+export function extractPackageFile(
+  content: string,
+  _packageFile: string,
+  config: ExtractConfig
+): PackageFile {
+  const deps: PackageDependency[] = [];
   try {
     const doc = yaml.safeLoad(content);
     if (doc.include && is.array(doc.include)) {
diff --git a/lib/manager/gitlabci-include/index.js b/lib/manager/gitlabci-include/index.js
deleted file mode 100644
index 749cae6f4db0ec27bb7cde5845780752ce144ac9..0000000000000000000000000000000000000000
--- a/lib/manager/gitlabci-include/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-
-module.exports = {
-  extractPackageFile,
-  updateDependency,
-};
diff --git a/lib/manager/gitlabci-include/index.ts b/lib/manager/gitlabci-include/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c8e0095e4c0b87742ea8ebb8b318ad025b50f123
--- /dev/null
+++ b/lib/manager/gitlabci-include/index.ts
@@ -0,0 +1,4 @@
+import { extractPackageFile } from './extract';
+import { updateDependency } from './update';
+
+export { extractPackageFile, updateDependency };
diff --git a/lib/manager/gitlabci-include/update.js b/lib/manager/gitlabci-include/update.ts
similarity index 70%
rename from lib/manager/gitlabci-include/update.js
rename to lib/manager/gitlabci-include/update.ts
index cce3b683ab0345d098fcbd58571ceac7f00016b5..975ed795af902aed634cff6ba745807b01047f1c 100644
--- a/lib/manager/gitlabci-include/update.js
+++ b/lib/manager/gitlabci-include/update.ts
@@ -1,11 +1,11 @@
-const YAWN = require('yawn-yaml/cjs');
-const { logger } = require('../../logger');
+import YAWN from 'yawn-yaml/cjs';
+import { logger } from '../../logger';
+import { Upgrade } from '../common';
 
-module.exports = {
-  updateDependency,
-};
-
-function updateDependency(currentFileContent, upgrade) {
+export function updateDependency(
+  currentFileContent: string,
+  upgrade: Upgrade
+): string {
   try {
     const { depName, newValue } = upgrade;
 
diff --git a/lib/manager/gitlabci/extract.js b/lib/manager/gitlabci/extract.ts
similarity index 88%
rename from lib/manager/gitlabci/extract.js
rename to lib/manager/gitlabci/extract.ts
index 1c663445a863b9d89057817916f908974318c0a5..8e489ca12e68cf00c011f2e0d5a9eb8e4a9248eb 100644
--- a/lib/manager/gitlabci/extract.js
+++ b/lib/manager/gitlabci/extract.ts
@@ -1,12 +1,9 @@
-const { logger } = require('../../logger');
-const { getDep } = require('../dockerfile/extract');
+import { logger } from '../../logger';
+import { getDep } from '../dockerfile/extract';
+import { PackageFile, PackageDependency } from '../common';
 
-module.exports = {
-  extractPackageFile,
-};
-
-function extractPackageFile(content) {
-  const deps = [];
+export function extractPackageFile(content: string): PackageFile {
+  const deps: PackageDependency[] = [];
   try {
     const lines = content.split('\n');
     for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {
@@ -24,7 +21,6 @@ function extractPackageFile(content) {
               lineNumber += 1;
               logger.trace(`Matched image name on line ${lineNumber}`);
               const currentFrom = imageNameMatch[1];
-              /** @type any */
               const dep = getDep(currentFrom);
               dep.managerData = { lineNumber };
               dep.depType = 'image-name';
@@ -35,7 +31,6 @@ function extractPackageFile(content) {
           default: {
             logger.trace(`Matched image on line ${lineNumber}`);
             const currentFrom = imageMatch[1];
-            /** @type any */
             const dep = getDep(currentFrom);
             dep.managerData = { lineNumber };
             dep.depType = 'image';
@@ -59,7 +54,6 @@ function extractPackageFile(content) {
             foundImage = true;
             const currentFrom = serviceImageMatch[1];
             lineNumber += 1;
-            /** @type any */
             const dep = getDep(currentFrom);
             dep.managerData = { lineNumber };
             dep.depType = 'service-image';
diff --git a/lib/manager/gitlabci/index.js b/lib/manager/gitlabci/index.js
deleted file mode 100644
index f98aa074d98cb6dc1534aeb4c1aa1250bf5fba71..0000000000000000000000000000000000000000
--- a/lib/manager/gitlabci/index.js
+++ /dev/null
@@ -1,10 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-
-const language = 'docker';
-
-module.exports = {
-  extractPackageFile,
-  language,
-  updateDependency,
-};
diff --git a/lib/manager/gitlabci/index.ts b/lib/manager/gitlabci/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5705105fe4b3fc5c6ffd85e4a307850d0b81f0a3
--- /dev/null
+++ b/lib/manager/gitlabci/index.ts
@@ -0,0 +1,6 @@
+import { extractPackageFile } from './extract';
+import { updateDependency } from './update';
+
+const language = 'docker';
+
+export { extractPackageFile, language, updateDependency };
diff --git a/lib/manager/gitlabci/update.js b/lib/manager/gitlabci/update.ts
similarity index 85%
rename from lib/manager/gitlabci/update.js
rename to lib/manager/gitlabci/update.ts
index 4e16b2e62d876bffec11b93e8f115684d04cb002..f00493bff6d84a78b3d6dad3f5fbb6358cdc806c 100644
--- a/lib/manager/gitlabci/update.js
+++ b/lib/manager/gitlabci/update.ts
@@ -1,11 +1,11 @@
-const { logger } = require('../../logger');
-const { getNewFrom } = require('../dockerfile/update');
+import { logger } from '../../logger';
+import { getNewFrom } from '../dockerfile/update';
+import { Upgrade } from '../common';
 
-module.exports = {
-  updateDependency,
-};
-
-function updateDependency(currentFileContent, upgrade) {
+export function updateDependency(
+  currentFileContent: string,
+  upgrade: Upgrade
+): string {
   try {
     const newFrom = getNewFrom(upgrade);
     const lines = currentFileContent.split('\n');
diff --git a/lib/manager/gomod/artifacts.js b/lib/manager/gomod/artifacts.ts
similarity index 79%
rename from lib/manager/gomod/artifacts.js
rename to lib/manager/gomod/artifacts.ts
index 5f3e8c25a8da9de1da2b9e1496292518fabc9be9..3eacdbc95c60b03a7eb9b56e14913e75a16e45e7 100644
--- a/lib/manager/gomod/artifacts.js
+++ b/lib/manager/gomod/artifacts.ts
@@ -1,24 +1,21 @@
-const fs = require('fs-extra');
-const upath = require('upath');
-const { exec } = require('../../util/exec');
-const hostRules = require('../../util/host-rules');
-const { getChildProcessEnv } = require('../../util/env');
-const { logger } = require('../../logger');
+import { ensureDir, outputFile, readFile } from 'fs-extra';
+import { join, dirname } from 'upath';
+import { exec } from '../../util/exec';
+import { find } from '../../util/host-rules';
+import { getChildProcessEnv } from '../../util/env';
+import { logger } from '../../logger';
+import { UpdateArtifactsConfig, UpdateArtifactsResult } from '../common';
 
-module.exports = {
-  updateArtifacts,
-};
-
-async function updateArtifacts(
-  goModFileName,
-  updatedDeps,
-  newGoModContent,
-  config
-) {
+export async function updateArtifacts(
+  goModFileName: string,
+  _updatedDeps: string[],
+  newGoModContent: string,
+  config: UpdateArtifactsConfig
+): Promise<UpdateArtifactsResult[]> {
   logger.debug(`gomod.updateArtifacts(${goModFileName})`);
   process.env.GOPATH =
-    process.env.GOPATH || upath.join(config.cacheDir, './others/go');
-  await fs.ensureDir(process.env.GOPATH);
+    process.env.GOPATH || join(config.cacheDir, './others/go');
+  await ensureDir(process.env.GOPATH);
   logger.debug('Using GOPATH: ' + process.env.GOPATH);
   const sumFileName = goModFileName.replace(/\.mod$/, '.sum');
   const existingGoSumContent = await platform.getFile(sumFileName);
@@ -26,11 +23,11 @@ async function updateArtifacts(
     logger.debug('No go.sum found');
     return null;
   }
-  const cwd = upath.join(config.localDir, upath.dirname(goModFileName));
-  let stdout;
-  let stderr;
+  const cwd = join(config.localDir, dirname(goModFileName));
+  let stdout: string;
+  let stderr: string;
   try {
-    const localGoModFileName = upath.join(config.localDir, goModFileName);
+    const localGoModFileName = join(config.localDir, goModFileName);
     const massagedGoMod = newGoModContent.replace(
       /\n(replace\s+[^\s]+\s+=>\s+\.\.\/.*)/g,
       '\n// renovate-replace $1'
@@ -38,12 +35,12 @@ async function updateArtifacts(
     if (massagedGoMod !== newGoModContent) {
       logger.debug('Removed some relative replace statements from go.mod');
     }
-    await fs.outputFile(localGoModFileName, massagedGoMod);
-    const localGoSumFileName = upath.join(config.localDir, sumFileName);
+    await outputFile(localGoModFileName, massagedGoMod);
+    const localGoSumFileName = join(config.localDir, sumFileName);
     const customEnv = ['GOPATH', 'GOPROXY'];
     const env = getChildProcessEnv(customEnv);
     const startTime = process.hrtime();
-    let cmd;
+    let cmd: string;
     if (config.binarySource === 'docker') {
       logger.info('Running go via docker');
       cmd = `docker run --rm `;
@@ -54,7 +51,7 @@ async function updateArtifacts(
       cmd += '-e CGO_ENABLED=0 ';
       cmd += `-w ${cwd} `;
       cmd += `renovate/go `;
-      const credentials = hostRules.find({
+      const credentials = find({
         hostType: 'github',
         url: 'https://api.github.com/',
       });
@@ -116,11 +113,11 @@ async function updateArtifacts(
     res.push({
       file: {
         name: sumFileName,
-        contents: await fs.readFile(localGoSumFileName, 'utf8'),
+        contents: await readFile(localGoSumFileName, 'utf8'),
       },
     });
-    const vendorDir = upath.join(upath.dirname(goModFileName), 'vendor/');
-    const vendorModulesFileName = upath.join(vendorDir, 'modules.txt');
+    const vendorDir = join(dirname(goModFileName), 'vendor/');
+    const vendorModulesFileName = join(vendorDir, 'modules.txt');
     // istanbul ignore if
     if (await platform.getFile(vendorModulesFileName)) {
       args = 'mod vendor';
@@ -158,11 +155,11 @@ async function updateArtifacts(
       status = await platform.getRepoStatus();
       for (const f of status.modified.concat(status.not_added)) {
         if (f.startsWith(vendorDir)) {
-          const localModified = upath.join(config.localDir, f);
+          const localModified = join(config.localDir, f);
           res.push({
             file: {
               name: f,
-              contents: await fs.readFile(localModified, 'utf8'),
+              contents: await readFile(localModified, 'utf8'),
             },
           });
         }
@@ -176,7 +173,7 @@ async function updateArtifacts(
         });
       }
     }
-    const finalGoModContent = (await fs.readFile(
+    const finalGoModContent = (await readFile(
       localGoModFileName,
       'utf8'
     )).replace(/\/\/ renovate-replace /g, '');
diff --git a/lib/manager/gomod/extract.js b/lib/manager/gomod/extract.ts
similarity index 86%
rename from lib/manager/gomod/extract.js
rename to lib/manager/gomod/extract.ts
index 89d176939971ccba99682364cee27258d607b47a..965a9a72986e5e6a8160eb5febb2b49c23dd1c4a 100644
--- a/lib/manager/gomod/extract.js
+++ b/lib/manager/gomod/extract.ts
@@ -1,15 +1,12 @@
-const { logger } = require('../../logger');
-const { isVersion } = require('../../versioning/semver');
+import { logger } from '../../logger';
+import { isVersion } from '../../versioning/semver';
+import { PackageDependency, PackageFile } from '../common';
 
-module.exports = {
-  extractPackageFile,
-};
-
-function getDep(lineNumber, match, type) {
+function getDep(lineNumber: number, match: RegExpMatchArray, type: string) {
   const [, , currentValue] = match;
   let [, depName] = match;
   depName = depName.replace(/"/g, '');
-  const dep = {
+  const dep: PackageDependency = {
     managerData: {
       lineNumber,
     },
@@ -38,9 +35,9 @@ function getDep(lineNumber, match, type) {
   return dep;
 }
 
-function extractPackageFile(content) {
+export function extractPackageFile(content: string): PackageFile {
   logger.trace({ content }, 'gomod.extractPackageFile()');
-  const deps = [];
+  const deps: PackageDependency[] = [];
   try {
     const lines = content.split('\n');
     for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {
diff --git a/lib/manager/gomod/index.js b/lib/manager/gomod/index.js
deleted file mode 100644
index 4e6836ebcb6f4236f0602fb8d16afb94a36060f9..0000000000000000000000000000000000000000
--- a/lib/manager/gomod/index.js
+++ /dev/null
@@ -1,10 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-const { updateArtifacts } = require('./artifacts');
-
-module.exports = {
-  extractPackageFile,
-  updateDependency,
-  updateArtifacts,
-  language: 'golang',
-};
diff --git a/lib/manager/gomod/index.ts b/lib/manager/gomod/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6636c89068c943da7b01953eb77b21dfa2695df4
--- /dev/null
+++ b/lib/manager/gomod/index.ts
@@ -0,0 +1,6 @@
+import { extractPackageFile } from './extract';
+import { updateDependency } from './update';
+import { updateArtifacts } from './artifacts';
+
+export const language = 'golang';
+export { extractPackageFile, updateDependency, updateArtifacts };
diff --git a/lib/manager/gomod/update.js b/lib/manager/gomod/update.ts
similarity index 92%
rename from lib/manager/gomod/update.js
rename to lib/manager/gomod/update.ts
index 6a7d2dcd07fc702269ed72eb54efd7b3672fe66a..c63dbf3c9dc3cdd968f785972e56e88b3ada4d51 100644
--- a/lib/manager/gomod/update.js
+++ b/lib/manager/gomod/update.ts
@@ -1,11 +1,11 @@
-const { DateTime } = require('luxon');
-const { logger } = require('../../logger');
+import { DateTime } from 'luxon';
+import { logger } from '../../logger';
+import { Upgrade } from '../common';
 
-module.exports = {
-  updateDependency,
-};
-
-function updateDependency(currentFileContent, upgrade) {
+export function updateDependency(
+  currentFileContent: string,
+  upgrade: Upgrade
+): string {
   try {
     logger.debug(`gomod.updateDependency: ${upgrade.newValue}`);
     const { depName, depType } = upgrade;
@@ -28,7 +28,7 @@ function updateDependency(currentFileContent, upgrade) {
       );
       return null;
     }
-    let updateLineExp;
+    let updateLineExp: RegExp;
     if (depType === 'replace') {
       updateLineExp = new RegExp(
         /^(replace\s+[^\s]+[\s]+[=][>]+\s+)([^\s]+\s+)([^\s]+)/
@@ -44,7 +44,7 @@ function updateDependency(currentFileContent, upgrade) {
       logger.debug('No image line found');
       return null;
     }
-    let newLine;
+    let newLine: string;
     if (upgrade.updateType === 'digest') {
       const newDigestRightSized = upgrade.newDigest.substring(
         0,
diff --git a/lib/manager/gradle-wrapper/extract.js b/lib/manager/gradle-wrapper/extract.ts
similarity index 79%
rename from lib/manager/gradle-wrapper/extract.js
rename to lib/manager/gradle-wrapper/extract.ts
index 42e6a092f743027808620a672793bb8b7f20cb49..b4ccac285c3281fc89cad47fa3f2862e54f9746f 100644
--- a/lib/manager/gradle-wrapper/extract.js
+++ b/lib/manager/gradle-wrapper/extract.ts
@@ -1,11 +1,8 @@
-const { coerce } = require('semver');
-const { logger } = require('../../logger');
+import { coerce } from 'semver';
+import { logger } from '../../logger';
+import { PackageFile, PackageDependency } from '../common';
 
-module.exports = {
-  extractPackageFile,
-};
-
-function extractPackageFile(fileContent) {
+export function extractPackageFile(fileContent: string): PackageFile {
   logger.debug('gradle-wrapper.extractPackageFile()');
   const lines = fileContent.split('\n');
 
@@ -15,7 +12,7 @@ function extractPackageFile(fileContent) {
       /^distributionUrl=.*-((\d|\.)+)-(bin|all)\.zip\s*$/
     );
     if (match) {
-      const dependency = {
+      const dependency: PackageDependency = {
         datasource: 'gradleVersion',
         depType: 'gradle-wrapper',
         depName: 'gradle',
diff --git a/lib/manager/gradle-wrapper/index.js b/lib/manager/gradle-wrapper/index.js
deleted file mode 100644
index 749cae6f4db0ec27bb7cde5845780752ce144ac9..0000000000000000000000000000000000000000
--- a/lib/manager/gradle-wrapper/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-
-module.exports = {
-  extractPackageFile,
-  updateDependency,
-};
diff --git a/lib/manager/gradle-wrapper/index.ts b/lib/manager/gradle-wrapper/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..730b5b60ba42a35b24b351e0793557e86f185454
--- /dev/null
+++ b/lib/manager/gradle-wrapper/index.ts
@@ -0,0 +1,2 @@
+export { extractPackageFile } from './extract';
+export { updateDependency } from './update';
diff --git a/lib/manager/gradle-wrapper/update.js b/lib/manager/gradle-wrapper/update.ts
similarity index 81%
rename from lib/manager/gradle-wrapper/update.js
rename to lib/manager/gradle-wrapper/update.ts
index 3db4fc90784f611487e8025a51877640828008d4..a20f419b6fd7b1e96a3b82929762ff128fc723ab 100644
--- a/lib/manager/gradle-wrapper/update.js
+++ b/lib/manager/gradle-wrapper/update.ts
@@ -1,11 +1,11 @@
-const got = require('../../util/got');
-const { logger } = require('../../logger');
-
-module.exports = {
-  updateDependency,
-};
-
-async function updateDependency(fileContent, upgrade) {
+import got from '../../util/got';
+import { logger } from '../../logger';
+import { Upgrade } from '../common';
+
+export async function updateDependency(
+  fileContent: string,
+  upgrade: Upgrade
+): Promise<string> {
   try {
     logger.debug(upgrade, 'gradle-wrapper.updateDependency()');
     const lines = fileContent.split('\n');
@@ -35,11 +35,11 @@ async function updateDependency(fileContent, upgrade) {
   }
 }
 
-function replaceType(url) {
+function replaceType(url: string) {
   return url.replace('bin', 'all');
 }
 
-async function getChecksum(url) {
+async function getChecksum(url: string) {
   try {
     const response = await got(url);
     return response.body;
diff --git a/lib/manager/gradle/build-gradle.js b/lib/manager/gradle/build-gradle.ts
similarity index 70%
rename from lib/manager/gradle/build-gradle.js
rename to lib/manager/gradle/build-gradle.ts
index 03fc6debc028fcf294980a09604d9f40dc109100..d3f406b9841022db0d24fd5c4bbe026833c345aa 100644
--- a/lib/manager/gradle/build-gradle.js
+++ b/lib/manager/gradle/build-gradle.ts
@@ -1,13 +1,34 @@
+import { BuildDependency } from './gradle-updates-report';
+
 /**
  * Functions adapted/ported from https://github.com/patrikerdes/gradle-use-latest-versions-plugin
  * gradle-use-latest-versions-plugin is licensed under MIT and Copyright (c) 2018 Patrik Erdes
  */
 
-let variables = {};
+let variables: Record<string, string> = {};
+
+// TODO: Unify with BuildDependency ?
+export interface GradleDependency {
+  group: string;
+  name: string;
+  version?: string;
+}
 
-function updateGradleVersion(buildGradleContent, dependency, newVersion) {
+interface UpdateFunction {
+  (
+    dependency: GradleDependency,
+    buildGradleContent: string,
+    newVersion: string
+  ): string;
+}
+
+export function updateGradleVersion(
+  buildGradleContent: string,
+  dependency: GradleDependency,
+  newVersion: string
+) {
   if (dependency) {
-    const updateFunctions = [
+    const updateFunctions: UpdateFunction[] = [
       updateVersionStringFormat,
       updateVersionMapFormat,
       updateVersionMapVariableFormat,
@@ -33,9 +54,12 @@ function updateGradleVersion(buildGradleContent, dependency, newVersion) {
   return buildGradleContent;
 }
 
-function collectVersionVariables(dependencies, buildGradleContent) {
+export function collectVersionVariables(
+  dependencies: BuildDependency[],
+  buildGradleContent: string
+) {
   for (const dep of dependencies) {
-    const dependency = {
+    const dependency: GradleDependency = {
       ...dep,
       group: dep.depGroup,
     };
@@ -54,11 +78,15 @@ function collectVersionVariables(dependencies, buildGradleContent) {
   }
 }
 
-function init() {
+export function init() {
   variables = {};
 }
 
-function updateVersionStringFormat(dependency, buildGradleContent, newVersion) {
+function updateVersionStringFormat(
+  dependency: GradleDependency,
+  buildGradleContent: string,
+  newVersion: string
+) {
   const regex = moduleStringVersionFormatMatch(dependency);
   if (buildGradleContent.match(regex)) {
     return buildGradleContent.replace(regex, `$1${newVersion}$2`);
@@ -66,7 +94,11 @@ function updateVersionStringFormat(dependency, buildGradleContent, newVersion) {
   return null;
 }
 
-function updateVersionMapFormat(dependency, buildGradleContent, newVersion) {
+function updateVersionMapFormat(
+  dependency: GradleDependency,
+  buildGradleContent: string,
+  newVersion: string
+) {
   const regex = moduleMapVersionFormatMatch(dependency);
   if (buildGradleContent.match(regex)) {
     return buildGradleContent.replace(regex, `$1${newVersion}$2`);
@@ -75,9 +107,9 @@ function updateVersionMapFormat(dependency, buildGradleContent, newVersion) {
 }
 
 function updateVersionMapVariableFormat(
-  dependency,
-  buildGradleContent,
-  newVersion
+  dependency: GradleDependency,
+  buildGradleContent: string,
+  newVersion: string
 ) {
   const regex = moduleMapVariableVersionFormatMatch(dependency);
   const match = buildGradleContent.match(regex);
@@ -91,9 +123,9 @@ function updateVersionMapVariableFormat(
 }
 
 function updateVersionStringVariableFormat(
-  dependency,
-  buildGradleContent,
-  newVersion
+  dependency: GradleDependency,
+  buildGradleContent: string,
+  newVersion: string
 ) {
   const regex = moduleStringVariableInterpolationVersionFormatMatch(dependency);
   const match = buildGradleContent.match(regex);
@@ -107,9 +139,9 @@ function updateVersionStringVariableFormat(
 }
 
 function updateVersionExpressionVariableFormat(
-  dependency,
-  buildGradleContent,
-  newVersion
+  dependency: GradleDependency,
+  buildGradleContent: string,
+  newVersion: string
 ) {
   const regex = moduleStringVariableExpressionVersionFormatMatch(dependency);
   const match = buildGradleContent.match(regex);
@@ -122,7 +154,11 @@ function updateVersionExpressionVariableFormat(
   return null;
 }
 
-function updateGlobalVariables(dependency, buildGradleContent, newVersion) {
+function updateGlobalVariables(
+  dependency: GradleDependency,
+  buildGradleContent: string,
+  newVersion: string
+) {
   const variable = variables[`${dependency.group}:${dependency.name}`];
   if (variable) {
     const regex = variableDefinitionFormatMatch(variable);
@@ -138,9 +174,9 @@ function updateGlobalVariables(dependency, buildGradleContent, newVersion) {
 }
 
 function updatePropertyFileGlobalVariables(
-  dependency,
-  buildGradleContent,
-  newVersion
+  dependency: GradleDependency,
+  buildGradleContent: string,
+  newVersion: string
 ) {
   const variable = variables[`${dependency.group}:${dependency.name}`];
   if (variable) {
@@ -154,13 +190,13 @@ function updatePropertyFileGlobalVariables(
 }
 
 // https://github.com/patrikerdes/gradle-use-latest-versions-plugin/blob/8cf9c3917b8b04ba41038923cab270d2adda3aa6/src/main/groovy/se/patrikerdes/DependencyUpdate.groovy#L27-L29
-function moduleStringVersionFormatMatch(dependency) {
+function moduleStringVersionFormatMatch(dependency: GradleDependency) {
   return new RegExp(
     `(["']${dependency.group}:${dependency.name}:)[^$].*?(([:@].*?)?["'])`
   );
 }
 
-function moduleMapVersionFormatMatch(dependency) {
+function moduleMapVersionFormatMatch(dependency: GradleDependency) {
   // prettier-ignore
   return new RegExp(
     `(group\\s*:\\s*["']${dependency.group}["']\\s*,\\s*` +
@@ -169,7 +205,7 @@ function moduleMapVersionFormatMatch(dependency) {
   );
 }
 
-function moduleMapVariableVersionFormatMatch(dependency) {
+function moduleMapVariableVersionFormatMatch(dependency: GradleDependency) {
   // prettier-ignore
   return new RegExp(
     `group\\s*:\\s*["']${dependency.group}["']\\s*,\\s*` +
@@ -178,24 +214,22 @@ function moduleMapVariableVersionFormatMatch(dependency) {
   );
 }
 
-function moduleStringVariableInterpolationVersionFormatMatch(dependency) {
+function moduleStringVariableInterpolationVersionFormatMatch(
+  dependency: GradleDependency
+) {
   return new RegExp(
     `["']${dependency.group}:${dependency.name}:\\$([^{].*?)["']`
   );
 }
 
-function moduleStringVariableExpressionVersionFormatMatch(dependency) {
+function moduleStringVariableExpressionVersionFormatMatch(
+  dependency: GradleDependency
+) {
   return new RegExp(
     `["']${dependency.group}:${dependency.name}:\\$\{([^{].*?)}["']`
   );
 }
 
-function variableDefinitionFormatMatch(variable) {
+function variableDefinitionFormatMatch(variable: string) {
   return new RegExp(`(${variable}\\s*=\\s*?["'])(.*)(["'])`);
 }
-
-module.exports = {
-  updateGradleVersion,
-  collectVersionVariables,
-  init,
-};
diff --git a/lib/manager/gradle/gradle-updates-report.js b/lib/manager/gradle/gradle-updates-report.ts
similarity index 63%
rename from lib/manager/gradle/gradle-updates-report.js
rename to lib/manager/gradle/gradle-updates-report.ts
index fcbdba8b0f051013d5185e5a0703932494b9edf2..1dcf9da855ec0fd24996ac6ee472db8d608e8a93 100644
--- a/lib/manager/gradle/gradle-updates-report.js
+++ b/lib/manager/gradle/gradle-updates-report.ts
@@ -1,10 +1,33 @@
-const path = require('path');
-const fs = require('fs-extra');
-const { logger } = require('../../logger');
+import { join } from 'path';
+import { writeFile, exists, readFile } from 'fs-extra';
+import { logger } from '../../logger';
 
 const GRADLE_DEPENDENCY_REPORT_FILENAME = 'gradle-renovate-report.json';
 
-async function createRenovateGradlePlugin(localDir) {
+interface GradleProject {
+  project: string;
+  repositories: string[];
+  dependencies: GradleModule[];
+}
+
+interface GradleModule {
+  name: string;
+  group: string;
+  version: string;
+}
+
+type GradleModuleWithRepos = GradleModule & { repos: string[] };
+
+// TODO: Unify with GradleDependency ?
+export interface BuildDependency {
+  name: string;
+  depGroup: string;
+  depName?: string;
+  currentValue?: string;
+  registryUrls?: string[];
+}
+
+async function createRenovateGradlePlugin(localDir: string) {
   const content = `
 import groovy.json.JsonOutput
 import org.gradle.api.internal.artifacts.dependencies.DefaultExternalModuleDependency
@@ -36,14 +59,14 @@ gradle.buildFinished {
    def json = JsonOutput.toJson(output)
    outputFile.write json
 }  `;
-  const gradleInitFile = path.join(localDir, 'renovate-plugin.gradle');
+  const gradleInitFile = join(localDir, 'renovate-plugin.gradle');
   logger.debug(
     'Creating renovate-plugin.gradle file with renovate gradle plugin'
   );
-  await fs.writeFile(gradleInitFile, content);
+  await writeFile(gradleInitFile, content);
 }
 
-async function extractDependenciesFromUpdatesReport(localDir) {
+async function extractDependenciesFromUpdatesReport(localDir: string) {
   const gradleProjectConfigurations = await readGradleReport(localDir);
 
   const dependencies = gradleProjectConfigurations
@@ -54,16 +77,16 @@ async function extractDependenciesFromUpdatesReport(localDir) {
   return dependencies.map(gradleModule => buildDependency(gradleModule));
 }
 
-async function readGradleReport(localDir) {
-  const renovateReportFilename = path.join(
+async function readGradleReport(localDir: string): Promise<GradleProject[]> {
+  const renovateReportFilename = join(
     localDir,
     GRADLE_DEPENDENCY_REPORT_FILENAME
   );
-  if (!(await fs.exists(renovateReportFilename))) {
+  if (!(await exists(renovateReportFilename))) {
     return [];
   }
 
-  const contents = await fs.readFile(renovateReportFilename, 'utf8');
+  const contents = await readFile(renovateReportFilename, 'utf8');
   try {
     return JSON.parse(contents);
   } catch (err) {
@@ -72,7 +95,9 @@ async function readGradleReport(localDir) {
   }
 }
 
-function mergeDependenciesWithRepositories(project) {
+function mergeDependenciesWithRepositories(
+  project: GradleProject
+): GradleModuleWithRepos[] {
   if (!project.dependencies) {
     return [];
   }
@@ -82,12 +107,18 @@ function mergeDependenciesWithRepositories(project) {
   }));
 }
 
-function flatternDependencies(accumulator, currentValue) {
+function flatternDependencies(
+  accumulator: GradleModuleWithRepos[],
+  currentValue: GradleModuleWithRepos[]
+) {
   accumulator.push(...currentValue);
   return accumulator;
 }
 
-function combineReposOnDuplicatedDependencies(accumulator, currentValue) {
+function combineReposOnDuplicatedDependencies(
+  accumulator: GradleModuleWithRepos[],
+  currentValue: GradleModuleWithRepos
+): GradleModuleWithRepos[] {
   const existingDependency = accumulator.find(
     dep => dep.name === currentValue.name && dep.group === currentValue.group
   );
@@ -102,7 +133,7 @@ function combineReposOnDuplicatedDependencies(accumulator, currentValue) {
   return accumulator;
 }
 
-function buildDependency(gradleModule) {
+function buildDependency(gradleModule: GradleModuleWithRepos): BuildDependency {
   return {
     name: gradleModule.name,
     depGroup: gradleModule.group,
@@ -112,7 +143,7 @@ function buildDependency(gradleModule) {
   };
 }
 
-module.exports = {
+export {
   extractDependenciesFromUpdatesReport,
   createRenovateGradlePlugin,
   GRADLE_DEPENDENCY_REPORT_FILENAME,
diff --git a/lib/manager/gradle/index.js b/lib/manager/gradle/index.ts
similarity index 67%
rename from lib/manager/gradle/index.js
rename to lib/manager/gradle/index.ts
index 35eebc9e1bb8e2d0160c5fa4c63d573658e79711..353255b4bce0409b064a81a867d338ef11f27c5e 100644
--- a/lib/manager/gradle/index.js
+++ b/lib/manager/gradle/index.ts
@@ -1,34 +1,46 @@
-const fs = require('fs-extra');
-const { exec } = require('../../util/exec');
-const { logger } = require('../../logger');
+import { exists } from 'fs-extra';
+import { exec } from '../../util/exec';
+import { logger } from '../../logger';
 
-const gradle = require('./build-gradle');
-const updatesReport = require('./gradle-updates-report');
+import {
+  init,
+  collectVersionVariables,
+  updateGradleVersion,
+  GradleDependency,
+} from './build-gradle';
+import {
+  createRenovateGradlePlugin,
+  extractDependenciesFromUpdatesReport,
+} from './gradle-updates-report';
+import { PackageFile, ExtractConfig, Upgrade } from '../common';
 
 const GRADLE_DEPENDENCY_REPORT_OPTIONS =
   '--init-script renovate-plugin.gradle renovate';
 const TIMEOUT_CODE = 143;
 
-async function extractAllPackageFiles(config, packageFiles) {
+export async function extractAllPackageFiles(
+  config: ExtractConfig,
+  packageFiles: string[]
+): Promise<PackageFile[]> {
   if (!packageFiles.some(packageFile => packageFile === 'build.gradle')) {
     logger.warn('No root build.gradle found - skipping');
     return null;
   }
   logger.info('Extracting dependencies from all gradle files');
 
-  await updatesReport.createRenovateGradlePlugin(config.localDir);
+  await createRenovateGradlePlugin(config.localDir);
   await executeGradle(config);
 
-  gradle.init();
+  init();
 
-  const dependencies = await updatesReport.extractDependenciesFromUpdatesReport(
+  const dependencies = await extractDependenciesFromUpdatesReport(
     config.localDir
   );
   if (dependencies.length === 0) {
     return [];
   }
 
-  const gradleFiles = [];
+  const gradleFiles: PackageFile[] = [];
   for (const packageFile of packageFiles) {
     const content = await platform.getFile(packageFile);
     if (content) {
@@ -39,7 +51,7 @@ async function extractAllPackageFiles(config, packageFiles) {
         deps: dependencies,
       });
 
-      gradle.collectVersionVariables(dependencies, content);
+      collectVersionVariables(dependencies, content);
     } else {
       // istanbul ignore next
       logger.info({ packageFile }, 'packageFile has no content');
@@ -49,24 +61,27 @@ async function extractAllPackageFiles(config, packageFiles) {
   return gradleFiles;
 }
 
-function updateDependency(fileContent, upgrade) {
+export function updateDependency(
+  fileContent: string,
+  upgrade: Upgrade
+): string {
   // prettier-ignore
   logger.debug(`gradle.updateDependency(): packageFile:${upgrade.packageFile} depName:${upgrade.depName}, version:${upgrade.currentVersion} ==> ${upgrade.newValue}`);
 
-  return gradle.updateGradleVersion(
+  return updateGradleVersion(
     fileContent,
     buildGradleDependency(upgrade),
     upgrade.newValue
   );
 }
 
-function buildGradleDependency(config) {
+function buildGradleDependency(config: Upgrade): GradleDependency {
   return { group: config.depGroup, name: config.name, version: config.version };
 }
 
-async function executeGradle(config) {
-  let stdout;
-  let stderr;
+async function executeGradle(config: ExtractConfig) {
+  let stdout: string;
+  let stderr: string;
   const gradleTimeout =
     config.gradle && config.gradle.timeout
       ? config.gradle.timeout * 1000
@@ -98,9 +113,9 @@ async function executeGradle(config) {
   logger.info('Gradle report complete');
 }
 
-async function getGradleCommandLine(config) {
-  let cmd;
-  const gradlewExists = await fs.exists(config.localDir + '/gradlew');
+async function getGradleCommandLine(config: ExtractConfig) {
+  let cmd: string;
+  const gradlewExists = await exists(config.localDir + '/gradlew');
   if (config.binarySource === 'docker') {
     cmd = `docker run --rm -v ${config.localDir}:${config.localDir} -w ${config.localDir} renovate/gradle gradle`;
   } else if (gradlewExists) {
@@ -110,9 +125,4 @@ async function getGradleCommandLine(config) {
   }
   return cmd + ' ' + GRADLE_DEPENDENCY_REPORT_OPTIONS;
 }
-
-module.exports = {
-  extractAllPackageFiles,
-  updateDependency,
-  language: 'java',
-};
+export const language = 'java';
diff --git a/lib/manager/homebrew/extract.js b/lib/manager/homebrew/extract.ts
similarity index 83%
rename from lib/manager/homebrew/extract.js
rename to lib/manager/homebrew/extract.ts
index cab4695a294f231df6db0f2f3c7ab9ea622398c2..c4c51b0f047907083ad193731e63845cc42c37b3 100644
--- a/lib/manager/homebrew/extract.js
+++ b/lib/manager/homebrew/extract.ts
@@ -1,15 +1,10 @@
-const semver = require('../../versioning/semver');
-const { skip, isSpace, removeComments } = require('./util');
-
-const { logger } = require('../../logger');
-
-module.exports = {
-  extractPackageFile,
-  parseUrlPath,
-};
+import { isValid } from '../../versioning/semver';
+import { skip, isSpace, removeComments } from './util';
+import { logger } from '../../logger';
+import { PackageFile, PackageDependency } from '../common';
 
 // TODO: Maybe check if quotes/double-quotes are balanced
-function extractPackageFile(content) {
+export function extractPackageFile(content: string): PackageFile {
   logger.trace('extractPackageFile()');
   /*
     1. match "class className < Formula"
@@ -28,10 +23,10 @@ function extractPackageFile(content) {
     logger.debug('Invalid URL field');
   }
   const urlPathResult = parseUrlPath(url);
-  let skipReason;
-  let currentValue = null;
-  let ownerName = null;
-  let repoName = null;
+  let skipReason: string;
+  let currentValue: string = null;
+  let ownerName: string = null;
+  let repoName: string = null;
   if (urlPathResult) {
     currentValue = urlPathResult.currentValue;
     ownerName = urlPathResult.ownerName;
@@ -45,7 +40,7 @@ function extractPackageFile(content) {
     logger.debug('Error: Invalid sha256 field');
     skipReason = 'invalid-sha256';
   }
-  const dep = {
+  const dep: PackageDependency = {
     depName: `${ownerName}/${repoName}`,
     managerData: { ownerName, repoName, sha256, url },
     currentValue,
@@ -62,7 +57,7 @@ function extractPackageFile(content) {
   return { deps };
 }
 
-function extractSha256(content) {
+function extractSha256(content: string) {
   const sha256RegExp = /(^|\s)sha256(\s)/;
   let i = content.search(sha256RegExp);
   if (isSpace(content[i])) {
@@ -71,7 +66,7 @@ function extractSha256(content) {
   return parseSha256(i, content);
 }
 
-function parseSha256(idx, content) {
+function parseSha256(idx: number, content: string) {
   let i = idx;
   i += 'sha256'.length;
   i = skip(i, content, c => {
@@ -89,7 +84,7 @@ function parseSha256(idx, content) {
   return sha256;
 }
 
-function extractUrl(content) {
+function extractUrl(content: string) {
   const urlRegExp = /(^|\s)url(\s)/;
   let i = content.search(urlRegExp);
   // content.search() returns -1 if not found
@@ -103,7 +98,7 @@ function extractUrl(content) {
   return parseUrl(i, content);
 }
 
-function parseUrlPath(urlStr) {
+export function parseUrlPath(urlStr: string) {
   if (!urlStr) {
     return null;
   }
@@ -116,7 +111,7 @@ function parseUrlPath(urlStr) {
     s = s.filter(val => val);
     const ownerName = s[0];
     const repoName = s[1];
-    let currentValue;
+    let currentValue: string;
     if (s[2] === 'archive') {
       currentValue = s[3];
       const targz = currentValue.slice(
@@ -132,7 +127,7 @@ function parseUrlPath(urlStr) {
     if (!currentValue) {
       return null;
     }
-    if (!semver.isValid(currentValue)) {
+    if (!isValid(currentValue)) {
       return null;
     }
     return { currentValue, ownerName, repoName };
@@ -141,7 +136,7 @@ function parseUrlPath(urlStr) {
   }
 }
 
-function parseUrl(idx, content) {
+function parseUrl(idx: number, content: string) {
   let i = idx;
   i += 'url'.length;
   i = skip(i, content, c => {
@@ -160,7 +155,7 @@ function parseUrl(idx, content) {
   return url;
 }
 
-function extractClassName(content) {
+function extractClassName(content: string) {
   const classRegExp = /(^|\s)class\s/;
   let i = content.search(classRegExp);
   if (isSpace(content[i])) {
@@ -171,7 +166,7 @@ function extractClassName(content) {
 
 /* This function parses the "class className < Formula" header
    and returns the className and index of the character just after the header */
-function parseClassHeader(idx, content) {
+function parseClassHeader(idx: number, content: string) {
   let i = idx;
   i += 'class'.length;
   i = skip(i, content, c => {
diff --git a/lib/manager/homebrew/index.js b/lib/manager/homebrew/index.js
deleted file mode 100644
index 749cae6f4db0ec27bb7cde5845780752ce144ac9..0000000000000000000000000000000000000000
--- a/lib/manager/homebrew/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-
-module.exports = {
-  extractPackageFile,
-  updateDependency,
-};
diff --git a/lib/manager/homebrew/index.ts b/lib/manager/homebrew/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..730b5b60ba42a35b24b351e0793557e86f185454
--- /dev/null
+++ b/lib/manager/homebrew/index.ts
@@ -0,0 +1,2 @@
+export { extractPackageFile } from './extract';
+export { updateDependency } from './update';
diff --git a/lib/manager/homebrew/update.js b/lib/manager/homebrew/update.ts
similarity index 82%
rename from lib/manager/homebrew/update.js
rename to lib/manager/homebrew/update.ts
index 84e13b84298d00424c56f662894c63e9c812ad9c..a228bb5c1ef91dbcc900cd1c225e288759f88819 100644
--- a/lib/manager/homebrew/update.js
+++ b/lib/manager/homebrew/update.ts
@@ -1,24 +1,24 @@
-const crypto = require('crypto');
-const { coerce } = require('semver');
-const { parseUrlPath } = require('./extract');
-const { skip, isSpace, removeComments } = require('./util');
-const got = require('../../util/got');
-const { logger } = require('../../logger');
-
-module.exports = {
-  updateDependency,
-};
+import { createHash } from 'crypto';
+import { coerce } from 'semver';
+import { parseUrlPath } from './extract';
+import { skip, isSpace, removeComments } from './util';
+import got from '../../util/got';
+import { logger } from '../../logger';
+import { Upgrade } from '../common';
 
 // TODO: Refactor
-async function updateDependency(content, upgrade) {
+export async function updateDependency(
+  content: string,
+  upgrade: Upgrade
+): Promise<string> {
   logger.trace('updateDependency()');
   /*
     1. Update url field
     2. Update sha256 field
    */
   let newContent = content;
-  let newUrl;
-  let file;
+  let newUrl: string;
+  let file: string;
   // Example urls:
   // "https://github.com/bazelbuild/bazel-watcher/archive/v0.8.2.tar.gz"
   // "https://github.com/aide/aide/releases/download/v0.16.1/aide-0.16.1.tar.gz"
@@ -61,8 +61,7 @@ async function updateDependency(content, upgrade) {
     logger.debug(`Failed to update url for dependency ${upgrade.depName}`);
     return content;
   }
-  const newSha256 = crypto
-    .createHash('sha256')
+  const newSha256 = createHash('sha256')
     .update(file)
     .digest('hex');
   newContent = updateUrl(content, upgrade.managerData.url, newUrl);
@@ -78,7 +77,7 @@ async function updateDependency(content, upgrade) {
   return newContent;
 }
 
-function updateUrl(content, oldUrl, newUrl) {
+function updateUrl(content: string, oldUrl: string, newUrl: string) {
   const urlRegExp = /(^|\s)url(\s)/;
   let i = content.search(urlRegExp);
   if (i === -1) {
@@ -103,7 +102,7 @@ function updateUrl(content, oldUrl, newUrl) {
   return newContent;
 }
 
-function getUrlTestContent(content, oldUrl, newUrl) {
+function getUrlTestContent(content: string, oldUrl: string, newUrl: string) {
   const urlRegExp = /(^|\s)url(\s)/;
   const cleanContent = removeComments(content);
   let j = cleanContent.search(urlRegExp);
@@ -114,7 +113,12 @@ function getUrlTestContent(content, oldUrl, newUrl) {
   return testContent;
 }
 
-function replaceUrl(idx, content, oldUrl, newUrl) {
+function replaceUrl(
+  idx: number,
+  content: string,
+  oldUrl: string,
+  newUrl: string
+) {
   let i = idx;
   i += 'url'.length;
   i = skip(i, content, c => isSpace(c));
@@ -128,7 +132,7 @@ function replaceUrl(idx, content, oldUrl, newUrl) {
   return newContent;
 }
 
-function updateSha256(content, oldSha256, newSha256) {
+function updateSha256(content: string, oldSha256: string, newSha256: string) {
   const sha256RegExp = /(^|\s)sha256(\s)/;
   let i = content.search(sha256RegExp);
   if (i === -1) {
@@ -153,7 +157,11 @@ function updateSha256(content, oldSha256, newSha256) {
   return newContent;
 }
 
-function getSha256TestContent(content, oldSha256, newSha256) {
+function getSha256TestContent(
+  content: string,
+  oldSha256: string,
+  newSha256: string
+) {
   const sha256RegExp = /(^|\s)sha256(\s)/;
   const cleanContent = removeComments(content);
   let j = cleanContent.search(sha256RegExp);
@@ -164,7 +172,12 @@ function getSha256TestContent(content, oldSha256, newSha256) {
   return testContent;
 }
 
-function replaceSha256(idx, content, oldSha256, newSha256) {
+function replaceSha256(
+  idx: number,
+  content: string,
+  oldSha256: string,
+  newSha256: string
+) {
   let i = idx;
   i += 'sha256'.length;
   i = skip(i, content, c => isSpace(c));
diff --git a/lib/manager/homebrew/util.js b/lib/manager/homebrew/util.ts
similarity index 81%
rename from lib/manager/homebrew/util.js
rename to lib/manager/homebrew/util.ts
index bb52b1af02b2240d226b802a180a33a36b6af595..83e3e89e2299c4fed84957dc8d7e633d2d719cc9 100644
--- a/lib/manager/homebrew/util.js
+++ b/lib/manager/homebrew/util.ts
@@ -1,10 +1,8 @@
-module.exports = {
-  skip,
-  isSpace,
-  removeComments,
-};
-
-function skip(idx, content, cond) {
+export function skip(
+  idx: number,
+  content: string,
+  cond: (s: string) => boolean
+) {
   let i = idx;
   while (i < content.length) {
     if (!cond(content[i])) {
@@ -15,18 +13,18 @@ function skip(idx, content, cond) {
   return i;
 }
 
-function isSpace(c) {
+export function isSpace(c: string) {
   return /\s/.test(c);
 }
 
-function removeComments(content) {
+export function removeComments(content: string) {
   let newContent = removeLineComments(content);
   newContent = removeMultiLineComments(newContent);
   return newContent;
 }
 
 // Remove line comments starting with #
-function removeLineComments(content) {
+function removeLineComments(content: string) {
   let newContent = '';
   let comment = false;
   for (let i = 0; i < content.length; i += 1) {
@@ -47,7 +45,7 @@ function removeLineComments(content) {
 }
 
 // Remove multi-line comments enclosed between =begin and =end
-function removeMultiLineComments(content) {
+function removeMultiLineComments(content: string) {
   const beginRegExp = /(^|\n)=begin\s/;
   const endRegExp = /(^|\n)=end\s/;
   let newContent = content;
diff --git a/lib/manager/index.js b/lib/manager/index.js
deleted file mode 100644
index 3c019c00eba5b13d74fab2b07f6fc893d36d5e06..0000000000000000000000000000000000000000
--- a/lib/manager/index.js
+++ /dev/null
@@ -1,94 +0,0 @@
-const managerList = [
-  'ansible',
-  'bazel',
-  'buildkite',
-  'bundler',
-  'cargo',
-  'circleci',
-  'composer',
-  'deps-edn',
-  'docker-compose',
-  'dockerfile',
-  'github-actions',
-  'gitlabci',
-  'gitlabci-include',
-  'gomod',
-  'gradle',
-  'gradle-wrapper',
-  'kubernetes',
-  'leiningen',
-  'maven',
-  'meteor',
-  'npm',
-  'nuget',
-  'nvm',
-  'pip_requirements',
-  'pip_setup',
-  'pipenv',
-  'poetry',
-  'pub',
-  'sbt',
-  'swift',
-  'terraform',
-  'travis',
-  'ruby-version',
-  'homebrew',
-];
-const managers = {};
-for (const manager of managerList) {
-  // eslint-disable-next-line global-require,import/no-dynamic-require
-  managers[manager] = require(`./${manager}`);
-}
-
-const languageList = [
-  'dart',
-  'docker',
-  'dotnet',
-  'golang',
-  'js',
-  'node',
-  'php',
-  'python',
-  'ruby',
-  'rust',
-];
-
-const get = (manager, name) => managers[manager][name];
-const getLanguageList = () => languageList;
-const getManagerList = () => managerList;
-
-module.exports = {
-  get,
-  getLanguageList,
-  getManagerList,
-};
-
-const managerFunctions = [
-  'extractAllPackageFiles',
-  'extractPackageFile',
-  'getPackageUpdates',
-  'supportsLockFileMaintenance',
-  'updateDependency',
-];
-
-for (const f of managerFunctions) {
-  module.exports[f] = (manager, ...params) => {
-    if (managers[manager][f]) {
-      return managers[manager][f](...params);
-    }
-    return null;
-  };
-}
-
-module.exports.getRangeStrategy = config => {
-  const { manager, rangeStrategy } = config;
-  if (managers[manager].getRangeStrategy) {
-    // Use manager's own function if it exists
-    return managers[manager].getRangeStrategy(config);
-  }
-  if (rangeStrategy === 'auto') {
-    // default to 'replace' for auto
-    return 'replace';
-  }
-  return config.rangeStrategy;
-};
diff --git a/lib/manager/index.ts b/lib/manager/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..393d1b926c735a215adab585668b7d2f6a81ce4e
--- /dev/null
+++ b/lib/manager/index.ts
@@ -0,0 +1,109 @@
+import {
+  ManagerApi,
+  ExtractConfig,
+  RangeConfig,
+  PackageUpdateConfig,
+} from './common';
+
+const managerList = [
+  'ansible',
+  'bazel',
+  'buildkite',
+  'bundler',
+  'cargo',
+  'circleci',
+  'composer',
+  'deps-edn',
+  'docker-compose',
+  'dockerfile',
+  'github-actions',
+  'gitlabci',
+  'gitlabci-include',
+  'gomod',
+  'gradle',
+  'gradle-wrapper',
+  'kubernetes',
+  'leiningen',
+  'maven',
+  'meteor',
+  'npm',
+  'nuget',
+  'nvm',
+  'pip_requirements',
+  'pip_setup',
+  'pipenv',
+  'poetry',
+  'pub',
+  'sbt',
+  'swift',
+  'terraform',
+  'travis',
+  'ruby-version',
+  'homebrew',
+];
+
+const managers: Record<string, ManagerApi> = {};
+for (const manager of managerList) {
+  managers[manager] = require(`./${manager}`); // eslint-disable-line
+}
+
+const languageList = [
+  'dart',
+  'docker',
+  'dotnet',
+  'golang',
+  'js',
+  'node',
+  'php',
+  'python',
+  'ruby',
+  'rust',
+];
+
+export const get = <T extends keyof ManagerApi>(manager: string, name: T) =>
+  managers[manager][name];
+export const getLanguageList = () => languageList;
+export const getManagerList = () => managerList;
+
+export function extractAllPackageFiles(
+  manager: string,
+  config: ExtractConfig,
+  files: string[]
+) {
+  return managers[manager] && get(manager, 'extractAllPackageFiles')
+    ? get(manager, 'extractAllPackageFiles')(config, files)
+    : null;
+}
+
+export function getPackageUpdates(
+  manager: string,
+  config: PackageUpdateConfig
+) {
+  return managers[manager] && get(manager, 'getPackageUpdates')
+    ? get(manager, 'getPackageUpdates')(config)
+    : null;
+}
+
+export function extractPackageFile(
+  manager: string,
+  content: string,
+  fileName?: string,
+  config?: ExtractConfig
+) {
+  return managers[manager] && get(manager, 'extractPackageFile')
+    ? get(manager, 'extractPackageFile')(content, fileName, config)
+    : null;
+}
+
+export function getRangeStrategy(config: RangeConfig) {
+  const { manager, rangeStrategy } = config;
+  if (managers[manager].getRangeStrategy) {
+    // Use manager's own function if it exists
+    return managers[manager].getRangeStrategy(config);
+  }
+  if (rangeStrategy === 'auto') {
+    // default to 'replace' for auto
+    return 'replace';
+  }
+  return config.rangeStrategy;
+}
diff --git a/lib/manager/kubernetes/extract.js b/lib/manager/kubernetes/extract.ts
similarity index 77%
rename from lib/manager/kubernetes/extract.js
rename to lib/manager/kubernetes/extract.ts
index 8473b284deddd772b723585967cb7ce1623057a3..21a7709ff61de782b271ed8faee5c04326e8c595 100644
--- a/lib/manager/kubernetes/extract.js
+++ b/lib/manager/kubernetes/extract.ts
@@ -1,13 +1,10 @@
-const { logger } = require('../../logger');
-const { getDep } = require('../dockerfile/extract');
+import { logger } from '../../logger';
+import { getDep } from '../dockerfile/extract';
+import { PackageFile, PackageDependency } from '../common';
 
-module.exports = {
-  extractPackageFile,
-};
-
-function extractPackageFile(content) {
+export function extractPackageFile(content: string): PackageFile {
   logger.trace('kubernetes.extractPackageFile()');
-  let deps = [];
+  let deps: PackageDependency[] = [];
   let lineNumber = 0;
 
   const isKubernetesManifest =
@@ -20,7 +17,6 @@ function extractPackageFile(content) {
     const match = line.match(/^\s*-?\s*image:\s*'?"?([^\s'"]+)'?"?\s*$/);
     if (match) {
       const currentFrom = match[1];
-      /** @type any */
       const dep = getDep(currentFrom);
       logger.debug(
         {
diff --git a/lib/manager/kubernetes/index.js b/lib/manager/kubernetes/index.js
deleted file mode 100644
index f98aa074d98cb6dc1534aeb4c1aa1250bf5fba71..0000000000000000000000000000000000000000
--- a/lib/manager/kubernetes/index.js
+++ /dev/null
@@ -1,10 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-
-const language = 'docker';
-
-module.exports = {
-  extractPackageFile,
-  language,
-  updateDependency,
-};
diff --git a/lib/manager/kubernetes/index.ts b/lib/manager/kubernetes/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c356e13fd898b905f8f07f0aa9cd9362dd6be94d
--- /dev/null
+++ b/lib/manager/kubernetes/index.ts
@@ -0,0 +1,4 @@
+export { extractPackageFile } from './extract';
+export { updateDependency } from './update';
+
+export const language = 'docker';
diff --git a/lib/manager/kubernetes/update.js b/lib/manager/kubernetes/update.ts
similarity index 78%
rename from lib/manager/kubernetes/update.js
rename to lib/manager/kubernetes/update.ts
index 6487c205732c3e62144321a1bde416b9e9487607..56418fab2fce10372c39d621e51ebe9267a3f389 100644
--- a/lib/manager/kubernetes/update.js
+++ b/lib/manager/kubernetes/update.ts
@@ -1,11 +1,11 @@
-const { logger } = require('../../logger');
-const { getNewFrom } = require('../dockerfile/update');
+import { logger } from '../../logger';
+import { getNewFrom } from '../dockerfile/update';
+import { Upgrade } from '../common';
 
-module.exports = {
-  updateDependency,
-};
-
-function updateDependency(fileContent, upgrade) {
+export function updateDependency(
+  fileContent: string,
+  upgrade: Upgrade
+): string {
   try {
     const newFrom = getNewFrom(upgrade);
     logger.debug(`kubernetes.updateDependency(): ${newFrom}`);
diff --git a/lib/manager/leiningen/extract.js b/lib/manager/leiningen/extract.ts
similarity index 77%
rename from lib/manager/leiningen/extract.js
rename to lib/manager/leiningen/extract.ts
index f045af1bf1ac4cf1350d2c60d1e736cabebde8b1..dc3864a35b4a032553249f121c51e8bbe5530626 100644
--- a/lib/manager/leiningen/extract.js
+++ b/lib/manager/leiningen/extract.ts
@@ -1,8 +1,9 @@
-const { DEFAULT_MAVEN_REPO } = require('../maven/extract');
+import { DEFAULT_MAVEN_REPO } from '../maven/extract';
+import { PackageDependency, PackageFile } from '../common';
 
-const DEFAULT_CLOJARS_REPO = 'https://clojars.org/repo/';
+export const DEFAULT_CLOJARS_REPO = 'https://clojars.org/repo/';
 
-function trimAtKey(str, kwName) {
+export function trimAtKey(str: string, kwName: string) {
   const regex = new RegExp(`:${kwName}(?=\\s)`);
   const keyOffset = str.search(regex);
   if (keyOffset < 0) return null;
@@ -12,23 +13,32 @@ function trimAtKey(str, kwName) {
   return withSpaces.slice(valueOffset);
 }
 
-function expandDepName(name) {
+export function expandDepName(name: string) {
   return name.indexOf('/') === -1 ? `${name}:${name}` : name.replace('/', ':');
 }
 
-function extractFromVectors(str, offset = 0, ctx = {}) {
+export interface ExtractContext {
+  depType?: string;
+  registryUrls?: string[];
+}
+
+export function extractFromVectors(
+  str: string,
+  offset = 0,
+  ctx: ExtractContext = {}
+): PackageDependency[] {
   if (str.indexOf('[') !== 0) return [];
   let balance = 0;
-  const result = [];
+  const result: PackageDependency[] = [];
   let idx = 0;
   let vecPos = 0;
   let artifactId = '';
   let version = '';
-  let fileReplacePosition = null;
+  let fileReplacePosition: number = null;
 
-  const isSpace = ch => ch && /[\s,]/.test(ch);
+  const isSpace = (ch: string) => ch && /[\s,]/.test(ch);
 
-  const cleanStrLiteral = s => s.replace(/^"/, '').replace(/"$/, '');
+  const cleanStrLiteral = (s: string) => s.replace(/^"/, '').replace(/"$/, '');
 
   const yieldDep = () => {
     if (artifactId && version && fileReplacePosition) {
@@ -79,7 +89,7 @@ function extractFromVectors(str, offset = 0, ctx = {}) {
   return result;
 }
 
-function extractLeinRepos(content) {
+function extractLeinRepos(content: string) {
   const result = [DEFAULT_CLOJARS_REPO, DEFAULT_MAVEN_REPO];
 
   const repoContent = trimAtKey(
@@ -111,9 +121,9 @@ function extractLeinRepos(content) {
   return result;
 }
 
-function extractPackageFile(content) {
-  const collect = (key, ctx) => {
-    let result = [];
+export function extractPackageFile(content: string): PackageFile {
+  const collect = (key: string, ctx: ExtractContext) => {
+    let result: PackageDependency[] = [];
     let restContent = trimAtKey(content, key);
     while (restContent) {
       const offset = content.length - restContent.length;
@@ -125,7 +135,7 @@ function extractPackageFile(content) {
 
   const registryUrls = extractLeinRepos(content);
 
-  const deps = [
+  const deps: PackageDependency[] = [
     ...collect('dependencies', {
       depType: 'dependencies',
       registryUrls,
@@ -150,11 +160,3 @@ function extractPackageFile(content) {
 
   return { deps };
 }
-
-module.exports = {
-  trimAtKey,
-  extractFromVectors,
-  expandDepName,
-  DEFAULT_CLOJARS_REPO,
-  extractPackageFile,
-};
diff --git a/lib/manager/leiningen/index.js b/lib/manager/leiningen/index.js
deleted file mode 100644
index 749cae6f4db0ec27bb7cde5845780752ce144ac9..0000000000000000000000000000000000000000
--- a/lib/manager/leiningen/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-
-module.exports = {
-  extractPackageFile,
-  updateDependency,
-};
diff --git a/lib/manager/leiningen/index.ts b/lib/manager/leiningen/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..730b5b60ba42a35b24b351e0793557e86f185454
--- /dev/null
+++ b/lib/manager/leiningen/index.ts
@@ -0,0 +1,2 @@
+export { extractPackageFile } from './extract';
+export { updateDependency } from './update';
diff --git a/lib/manager/leiningen/update.js b/lib/manager/leiningen/update.js
deleted file mode 100644
index 5ab2e6e4e8da00366929311bf6c25b88ecbcc6a0..0000000000000000000000000000000000000000
--- a/lib/manager/leiningen/update.js
+++ /dev/null
@@ -1,5 +0,0 @@
-const { updateAtPosition } = require('../maven/update');
-
-module.exports = {
-  updateDependency: updateAtPosition,
-};
diff --git a/lib/manager/leiningen/update.ts b/lib/manager/leiningen/update.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0d7226b3719017a03587f2e58bcea9c91930eeb1
--- /dev/null
+++ b/lib/manager/leiningen/update.ts
@@ -0,0 +1 @@
+export { updateAtPosition as updateDependency } from '../maven/update';
diff --git a/lib/manager/maven/extract.js b/lib/manager/maven/extract.ts
similarity index 73%
rename from lib/manager/maven/extract.js
rename to lib/manager/maven/extract.ts
index 6fa33d2799195e84e5186d334810d43636e39ae7..bf535024ef3f3f271b26f97fcd26b83943e4a070 100644
--- a/lib/manager/maven/extract.js
+++ b/lib/manager/maven/extract.ts
@@ -1,12 +1,13 @@
-const path = require('path');
-const { XmlDocument } = require('xmldoc');
-const { isValid } = require('../../versioning/maven');
-const { logger } = require('../../logger');
+import { basename, dirname, normalize, join } from 'path';
+import { XmlDocument, XmlElement } from 'xmldoc';
+import { isValid } from '../../versioning/maven';
+import { logger } from '../../logger';
+import { ExtractConfig, PackageFile, PackageDependency } from '../common';
 
-const DEFAULT_MAVEN_REPO = 'https://repo.maven.apache.org/maven2';
+export const DEFAULT_MAVEN_REPO = 'https://repo.maven.apache.org/maven2';
 
-function parsePom(raw) {
-  let project;
+export function parsePom(raw: string) {
+  let project: XmlDocument;
   try {
     project = new XmlDocument(raw);
   } catch (e) {
@@ -18,11 +19,17 @@ function parsePom(raw) {
   return project;
 }
 
-function containsPlaceholder(str) {
+export function containsPlaceholder(str: string) {
   return /\${.*?}/g.test(str);
 }
 
-function depFromNode(node) {
+interface MavenProp {
+  val: string;
+  fileReplacePosition: number;
+  packageFile: string;
+}
+
+function depFromNode(node: XmlElement): PackageDependency {
   if (!node.valueWithPath) return null;
   const groupId = node.valueWithPath('groupId');
   const artifactId = node.valueWithPath('artifactId');
@@ -44,21 +51,28 @@ function depFromNode(node) {
   return null;
 }
 
-function deepExtract(node, result = [], isRoot = true) {
-  const dep = depFromNode(node);
+function deepExtract(
+  node: XmlElement,
+  result = [],
+  isRoot = true
+): PackageDependency[] {
+  const dep = depFromNode(node as XmlElement);
   if (dep && !isRoot) {
     result.push(dep);
   }
   if (node.children) {
     for (const child of node.children) {
-      deepExtract(child, result, false);
+      deepExtract(child as XmlElement, result, false);
     }
   }
   return result;
 }
 
-function applyProps(dep, props) {
-  const replaceAll = str =>
+function applyProps(
+  dep: PackageDependency<Record<string, any>>,
+  props: MavenProp
+) {
+  const replaceAll = (str: string) =>
     str.replace(/\${.*?}/g, substr => {
       const propKey = substr.slice(2, -1).trim();
       const propValue = props[propKey];
@@ -85,7 +99,7 @@ function applyProps(dep, props) {
     return substr;
   });
 
-  const result = {
+  const result: PackageDependency = {
     ...dep,
     depName,
     registryUrls,
@@ -109,35 +123,36 @@ function applyProps(dep, props) {
   return result;
 }
 
-function resolveParentFile(packageFile, parentPath) {
+function resolveParentFile(packageFile: string, parentPath: string) {
   let parentFile = 'pom.xml';
   let parentDir = parentPath;
-  const parentBasename = path.basename(parentPath);
+  const parentBasename = basename(parentPath);
   if (parentBasename === 'pom.xml' || /\.pom\.xml$/.test(parentBasename)) {
     parentFile = parentBasename;
-    parentDir = path.dirname(parentPath);
+    parentDir = dirname(parentPath);
   }
-  const dir = path.dirname(packageFile);
-  return path.normalize(path.join(dir, parentDir, parentFile));
+  const dir = dirname(packageFile);
+  return normalize(join(dir, parentDir, parentFile));
 }
 
-function extractPackage(rawContent, packageFile = null) {
+export function extractPackage(rawContent: string, packageFile: string = null) {
   if (!rawContent) return null;
 
   const project = parsePom(rawContent);
   if (!project) return null;
 
-  const result = {
+  const result: PackageFile = {
     datasource: 'maven',
     packageFile,
+    deps: [],
   };
 
   result.deps = deepExtract(project);
 
   const propsNode = project.childNamed('properties');
-  const props = {};
+  const props: Record<string, MavenProp> = {};
   if (propsNode && propsNode.children) {
-    for (const propNode of propsNode.children) {
+    for (const propNode of propsNode.children as XmlElement[]) {
       const key = propNode.name;
       const val = propNode.val && propNode.val.trim();
       if (key && val) {
@@ -172,11 +187,11 @@ function extractPackage(rawContent, packageFile = null) {
   return result;
 }
 
-function resolveProps(packages) {
-  const packageFileNames = [];
-  const extractedPackages = {};
-  const extractedDeps = {};
-  const extractedProps = {};
+export function resolveProps(packages: PackageFile[]): PackageFile[] {
+  const packageFileNames: string[] = [];
+  const extractedPackages: Record<string, PackageFile> = {};
+  const extractedDeps: Record<string, PackageDependency[]> = {};
+  const extractedProps: Record<string, MavenProp> = {};
   packages.forEach(pkg => {
     const name = pkg.packageFile;
     packageFileNames.push(name);
@@ -188,7 +203,7 @@ function resolveProps(packages) {
   // and merge them in reverse order,
   // which allows inheritance/overriding.
   packageFileNames.forEach(name => {
-    const hierarchy = [];
+    const hierarchy: Record<string, MavenProp>[] = [];
     let pkg = extractedPackages[name];
     while (pkg) {
       hierarchy.unshift(pkg.mavenProps);
@@ -225,8 +240,11 @@ function cleanResult(packageFiles) {
   return packageFiles;
 }
 
-async function extractAllPackageFiles(config, packageFiles) {
-  const packages = [];
+export async function extractAllPackageFiles(
+  _config: ExtractConfig,
+  packageFiles: string[]
+): Promise<PackageFile[]> {
+  const packages: PackageFile[] = [];
   for (const packageFile of packageFiles) {
     const content = await platform.getFile(packageFile);
     if (content) {
@@ -243,12 +261,3 @@ async function extractAllPackageFiles(config, packageFiles) {
 
   return cleanResult(resolveProps(packages));
 }
-
-module.exports = {
-  containsPlaceholder,
-  parsePom,
-  extractPackage,
-  resolveProps,
-  extractAllPackageFiles,
-  DEFAULT_MAVEN_REPO,
-};
diff --git a/lib/manager/maven/index.js b/lib/manager/maven/index.js
deleted file mode 100644
index 6fe73add6aee5ee31f789b500dce2b0601131ab1..0000000000000000000000000000000000000000
--- a/lib/manager/maven/index.js
+++ /dev/null
@@ -1,8 +0,0 @@
-const { extractAllPackageFiles } = require('./extract');
-const { updateDependency } = require('./update');
-
-module.exports = {
-  extractAllPackageFiles,
-  language: 'java',
-  updateDependency,
-};
diff --git a/lib/manager/maven/index.ts b/lib/manager/maven/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..683d30f630ee84659c533e4f1acbb006f17133e1
--- /dev/null
+++ b/lib/manager/maven/index.ts
@@ -0,0 +1,4 @@
+export { extractAllPackageFiles } from './extract';
+export { updateDependency } from './update';
+
+export const language = 'java';
diff --git a/lib/manager/maven/update.js b/lib/manager/maven/update.ts
similarity index 81%
rename from lib/manager/maven/update.js
rename to lib/manager/maven/update.ts
index 64a91f7f4b66be928248e9ee566fb5164d0904d1..1bfc0fa088584ca69f1aa60ce97b7f671bc8e62d 100644
--- a/lib/manager/maven/update.js
+++ b/lib/manager/maven/update.ts
@@ -1,11 +1,11 @@
-const { logger } = require('../../logger');
+import { logger } from '../../logger';
+import { Upgrade } from '../common';
 
-module.exports = {
-  updateAtPosition,
-  updateDependency,
-};
-
-function updateAtPosition(fileContent, upgrade, endingAnchor = '"') {
+export function updateAtPosition(
+  fileContent: string,
+  upgrade: Upgrade,
+  endingAnchor = '"'
+) {
   const { depName, currentValue, newValue, fileReplacePosition } = upgrade;
   const leftPart = fileContent.slice(0, fileReplacePosition);
   const rightPart = fileContent.slice(fileReplacePosition);
@@ -24,7 +24,7 @@ function updateAtPosition(fileContent, upgrade, endingAnchor = '"') {
   return null;
 }
 
-function updateDependency(fileContent, upgrade) {
+export function updateDependency(fileContent: string, upgrade: Upgrade) {
   const offset = fileContent.indexOf('<');
   const spaces = fileContent.slice(0, offset);
   const restContent = fileContent.slice(offset);
diff --git a/lib/manager/meteor/extract.js b/lib/manager/meteor/extract.ts
similarity index 81%
rename from lib/manager/meteor/extract.js
rename to lib/manager/meteor/extract.ts
index e85030876b054ed9e7c2c4fad077d023aff7a369..face708d11c227647c1e1417b238d5114e8eeab5 100644
--- a/lib/manager/meteor/extract.js
+++ b/lib/manager/meteor/extract.ts
@@ -1,11 +1,8 @@
-const { logger } = require('../../logger');
+import { logger } from '../../logger';
+import { PackageFile, PackageDependency } from '../common';
 
-module.exports = {
-  extractPackageFile,
-};
-
-function extractPackageFile(content) {
-  let deps = [];
+export function extractPackageFile(content: string): PackageFile {
+  let deps: PackageDependency[] = [];
   const npmDepends = content.match(/\nNpm\.depends\({([\s\S]*?)}\);/);
   if (!npmDepends) {
     return null;
diff --git a/lib/manager/meteor/index.js b/lib/manager/meteor/index.js
deleted file mode 100644
index c2e44ba353e13b81e9936e56dcbf429f15b6c0b2..0000000000000000000000000000000000000000
--- a/lib/manager/meteor/index.js
+++ /dev/null
@@ -1,8 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-
-module.exports = {
-  extractPackageFile,
-  language: 'js',
-  updateDependency,
-};
diff --git a/lib/manager/meteor/index.ts b/lib/manager/meteor/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8704d70aec4af354e7d4b8836b7c099379c77257
--- /dev/null
+++ b/lib/manager/meteor/index.ts
@@ -0,0 +1,4 @@
+export { extractPackageFile } from './extract';
+export { updateDependency } from './update';
+
+export const language = 'js';
diff --git a/lib/manager/meteor/update.js b/lib/manager/meteor/update.ts
similarity index 70%
rename from lib/manager/meteor/update.js
rename to lib/manager/meteor/update.ts
index c23d67eb3111d8ab6d48791940c44cab976cb16a..eb0e6c5b09b446ac1bf5889ebb35ad3fbec96546 100644
--- a/lib/manager/meteor/update.js
+++ b/lib/manager/meteor/update.ts
@@ -1,10 +1,7 @@
-const { logger } = require('../../logger');
+import { logger } from '../../logger';
+import { Upgrade } from '../common';
 
-module.exports = {
-  updateDependency,
-};
-
-function updateDependency(fileContent, upgrade) {
+export function updateDependency(fileContent: string, upgrade: Upgrade) {
   const { depName, currentValue, newValue } = upgrade;
   logger.debug(`meteor.updateDependency(): ${depName} = ${newValue}`);
   const regexReplace = new RegExp(
diff --git a/lib/manager/npm/extract/common.ts b/lib/manager/npm/extract/common.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cd8bca151f352341683d00eaad2513c29069f70c
--- /dev/null
+++ b/lib/manager/npm/extract/common.ts
@@ -0,0 +1,14 @@
+import { PackageJson } from 'type-fest';
+
+export interface NpmPackage extends PackageJson {
+  workspaces?: any;
+  renovate?: any;
+  _from?: any;
+  _args?: any;
+  _id?: any;
+}
+
+export type LockFileEntry = Record<
+  string,
+  { version: string; integrity?: boolean }
+>;
diff --git a/lib/manager/npm/extract/index.js b/lib/manager/npm/extract/index.ts
similarity index 81%
rename from lib/manager/npm/extract/index.js
rename to lib/manager/npm/extract/index.ts
index 2a80716a56260aa1be05c61cb73d32c7ee93c253..8e023fc442ff959b3d670c9abc243b38d8a33ca8 100644
--- a/lib/manager/npm/extract/index.js
+++ b/lib/manager/npm/extract/index.ts
@@ -1,22 +1,26 @@
-const fs = require('fs-extra');
-const path = require('path');
-const upath = require('upath');
-const validateNpmPackageName = require('validate-npm-package-name');
-const { logger } = require('../../../logger');
+import { remove } from 'fs-extra';
+import { dirname } from 'path';
+import { join } from 'upath';
+import validateNpmPackageName from 'validate-npm-package-name';
+import { logger } from '../../../logger';
 
-const { getLockedVersions } = require('./locked-versions');
-const { detectMonorepos } = require('./monorepo');
-const { mightBeABrowserLibrary } = require('./type');
-const semver = require('../../../versioning/npm');
+import { getLockedVersions } from './locked-versions';
+import { detectMonorepos } from './monorepo';
+import { mightBeABrowserLibrary } from './type';
+import { isValid, isVersion } from '../../../versioning/npm';
+import {
+  ExtractConfig,
+  PackageFile,
+  PackageDependency,
+  NpmLockFiles,
+} from '../../common';
+import { NpmPackage } from './common';
 
-module.exports = {
-  extractAllPackageFiles,
-  extractPackageFile,
-  postExtract,
-};
-
-async function extractAllPackageFiles(config, packageFiles) {
-  const npmFiles = [];
+export async function extractAllPackageFiles(
+  config: ExtractConfig,
+  packageFiles: string[]
+): Promise<PackageFile[]> {
+  const npmFiles: PackageFile[] = [];
   for (const packageFile of packageFiles) {
     const content = await platform.getFile(packageFile);
     if (content) {
@@ -36,11 +40,15 @@ async function extractAllPackageFiles(config, packageFiles) {
   return npmFiles;
 }
 
-async function extractPackageFile(content, fileName, config) {
+export async function extractPackageFile(
+  content: string,
+  fileName: string,
+  config: ExtractConfig
+): Promise<PackageFile> {
   logger.trace(`npm.extractPackageFile(${fileName})`);
   logger.trace({ content });
-  const deps = [];
-  let packageJson;
+  const deps: PackageDependency[] = [];
+  let packageJson: NpmPackage;
   try {
     packageJson = JSON.parse(content);
   } catch (err) {
@@ -74,7 +82,7 @@ async function extractPackageFile(content, fileName, config) {
     ? 'library'
     : 'app';
 
-  const lockFiles = {
+  const lockFiles: NpmLockFiles = {
     yarnLock: 'yarn.lock',
     packageLock: 'package-lock.json',
     shrinkwrapJson: 'npm-shrinkwrap.json',
@@ -82,7 +90,7 @@ async function extractPackageFile(content, fileName, config) {
   };
 
   for (const [key, val] of Object.entries(lockFiles)) {
-    const filePath = upath.join(path.dirname(fileName), val);
+    const filePath = join(dirname(fileName), val);
     if (await platform.getFile(filePath)) {
       lockFiles[key] = filePath;
     } else {
@@ -93,13 +101,13 @@ async function extractPackageFile(content, fileName, config) {
   delete lockFiles.packageLock;
   delete lockFiles.shrinkwrapJson;
 
-  let npmrc;
-  let ignoreNpmrcFile;
-  const npmrcFileName = upath.join(path.dirname(fileName), '.npmrc');
-  const npmrcFileNameLocal = upath.join(config.localDir || '', npmrcFileName);
+  let npmrc: string;
+  let ignoreNpmrcFile: boolean;
+  const npmrcFileName = join(dirname(fileName), '.npmrc');
+  const npmrcFileNameLocal = join(config.localDir || '', npmrcFileName);
   // istanbul ignore if
   if (config.ignoreNpmrcFile) {
-    await fs.remove(npmrcFileNameLocal);
+    await remove(npmrcFileNameLocal);
   } else {
     npmrc = await platform.getFile(npmrcFileName);
     if (npmrc && npmrc.includes('package-lock')) {
@@ -111,25 +119,24 @@ async function extractPackageFile(content, fileName, config) {
         logger.info('Discarding .npmrc file with variables');
         ignoreNpmrcFile = true;
         npmrc = undefined;
-        await fs.remove(npmrcFileNameLocal);
+        await remove(npmrcFileNameLocal);
       }
     } else {
       npmrc = undefined;
     }
   }
   const yarnrc =
-    (await platform.getFile(upath.join(path.dirname(fileName), '.yarnrc'))) ||
-    undefined;
+    (await platform.getFile(join(dirname(fileName), '.yarnrc'))) || undefined;
 
-  let lernaDir;
-  let lernaPackages;
-  let lernaClient;
+  let lernaDir: string;
+  let lernaPackages: string[];
+  let lernaClient: 'yarn' | 'npm';
   let hasFileRefs = false;
   const lernaJson = JSON.parse(
-    await platform.getFile(upath.join(path.dirname(fileName), 'lerna.json'))
+    await platform.getFile(join(dirname(fileName), 'lerna.json'))
   );
   if (lernaJson) {
-    lernaDir = path.dirname(fileName);
+    lernaDir = dirname(fileName);
     lernaPackages = lernaJson.packages;
     lernaClient =
       lernaJson.npmClient === 'yarn' || lockFiles.yarnLock ? 'yarn' : 'npm';
@@ -143,8 +150,8 @@ async function extractPackageFile(content, fileName, config) {
     engines: 'engine',
   };
 
-  function extractDependency(depType, depName, input) {
-    const dep = {};
+  function extractDependency(depType: string, depName: string, input: string) {
+    const dep: PackageDependency = {};
     if (!validateNpmPackageName(depName).validForOldPackages) {
       dep.skipReason = 'invalid-name';
       return dep;
@@ -168,7 +175,7 @@ async function extractPackageFile(content, fileName, config) {
       } else {
         dep.skipReason = 'unknown-engines';
       }
-      if (!semver.isValid(dep.currentValue)) {
+      if (!isValid(dep.currentValue)) {
         dep.skipReason = 'unknown-version';
       }
       return dep;
@@ -191,7 +198,7 @@ async function extractPackageFile(content, fileName, config) {
       hasFileRefs = true;
       return dep;
     }
-    if (semver.isValid(dep.currentValue)) {
+    if (isValid(dep.currentValue)) {
       dep.datasource = 'npm';
       if (dep.currentValue === '*') {
         dep.skipReason = 'any-version';
@@ -226,7 +233,7 @@ async function extractPackageFile(content, fileName, config) {
       dep.skipReason = 'unknown-version';
       return dep;
     }
-    if (semver.isVersion(depRefPart)) {
+    if (isVersion(depRefPart)) {
       dep.currentRawValue = dep.currentValue;
       dep.currentValue = depRefPart;
       dep.datasource = 'github';
@@ -254,8 +261,10 @@ async function extractPackageFile(content, fileName, config) {
   for (const depType of Object.keys(depTypes)) {
     if (packageJson[depType]) {
       try {
-        for (const [depName, val] of Object.entries(packageJson[depType])) {
-          const dep = {
+        for (const [depName, val] of Object.entries(packageJson[
+          depType
+        ] as Record<string, any>)) {
+          const dep: PackageDependency = {
             depType,
             depName,
           };
@@ -319,7 +328,7 @@ async function extractPackageFile(content, fileName, config) {
   };
 }
 
-async function postExtract(packageFiles) {
+export async function postExtract(packageFiles: PackageFile[]) {
   await detectMonorepos(packageFiles);
   await getLockedVersions(packageFiles);
 }
diff --git a/lib/manager/npm/extract/locked-versions.js b/lib/manager/npm/extract/locked-versions.ts
similarity index 79%
rename from lib/manager/npm/extract/locked-versions.js
rename to lib/manager/npm/extract/locked-versions.ts
index ad2a8a4c6f7c1a40e45b975c25fe931ca17cef9e..553a6eb1f220dff499894c75de1ecce100399108 100644
--- a/lib/manager/npm/extract/locked-versions.js
+++ b/lib/manager/npm/extract/locked-versions.ts
@@ -1,14 +1,11 @@
-const { valid } = require('semver');
-const { logger } = require('../../../logger');
-const { getNpmLock } = require('./npm');
-const { getYarnLock } = require('./yarn');
+import { valid } from 'semver';
+import { logger } from '../../../logger';
+import { getNpmLock } from './npm';
+import { getYarnLock } from './yarn';
+import { PackageFile } from '../../common';
 
-module.exports = {
-  getLockedVersions,
-};
-
-async function getLockedVersions(packageFiles) {
-  const lockFileCache = {};
+export async function getLockedVersions(packageFiles: PackageFile[]) {
+  const lockFileCache: Record<string, Record<string, string>> = {};
   logger.debug('Finding locked versions');
   for (const packageFile of packageFiles) {
     const { yarnLock, npmLock, pnpmShrinkwrap } = packageFile;
diff --git a/lib/manager/npm/extract/monorepo.js b/lib/manager/npm/extract/monorepo.ts
similarity index 85%
rename from lib/manager/npm/extract/monorepo.js
rename to lib/manager/npm/extract/monorepo.ts
index e678bb461b402d30c9bc03676a1ca1e626c5ed06..22834edded159d134250ad4c890d15ad170df5a2 100644
--- a/lib/manager/npm/extract/monorepo.js
+++ b/lib/manager/npm/extract/monorepo.ts
@@ -1,13 +1,12 @@
 import is from '@sindresorhus/is';
 
-const minimatch = require('minimatch');
-const path = require('path');
-const upath = require('upath');
-const { logger } = require('../../../logger');
+import minimatch from 'minimatch';
+import path from 'path';
+import upath from 'upath';
+import { logger } from '../../../logger';
+import { PackageFile } from '../../common';
 
-export { detectMonorepos };
-
-function matchesAnyPattern(val, patterns) {
+function matchesAnyPattern(val: string, patterns: string[]) {
   const res = patterns.some(
     pattern => pattern === val + '/' || minimatch(val, pattern, { dot: true })
   );
@@ -15,7 +14,7 @@ function matchesAnyPattern(val, patterns) {
   return res;
 }
 
-function detectMonorepos(packageFiles) {
+export function detectMonorepos(packageFiles: Partial<PackageFile>[]) {
   logger.debug('Detecting Lerna and Yarn Workspaces');
   for (const p of packageFiles) {
     const {
diff --git a/lib/manager/npm/extract/npm.js b/lib/manager/npm/extract/npm.ts
similarity index 50%
rename from lib/manager/npm/extract/npm.js
rename to lib/manager/npm/extract/npm.ts
index 447683d2a8a159ced08930515a15f12e328d7a7b..12455c7f834b5d76fa81c9b4c1168203dcc4d58c 100644
--- a/lib/manager/npm/extract/npm.js
+++ b/lib/manager/npm/extract/npm.ts
@@ -1,15 +1,15 @@
-const { logger } = require('../../../logger');
+import { logger } from '../../../logger';
+import { LockFileEntry } from './common';
 
-module.exports = {
-  getNpmLock,
-};
-
-async function getNpmLock(filePath) {
+export async function getNpmLock(
+  filePath: string
+): Promise<Record<string, string>> {
   const lockRaw = await platform.getFile(filePath);
   try {
     const lockParsed = JSON.parse(lockRaw);
-    const lockFile = {};
-    for (const [entry, val] of Object.entries(lockParsed.dependencies || {})) {
+    const lockFile: Record<string, string> = {};
+    for (const [entry, val] of Object.entries((lockParsed.dependencies ||
+      {}) as LockFileEntry)) {
       logger.trace({ entry, version: val.version });
       lockFile[entry] = val.version;
     }
diff --git a/lib/manager/npm/extract/type.js b/lib/manager/npm/extract/type.ts
similarity index 78%
rename from lib/manager/npm/extract/type.js
rename to lib/manager/npm/extract/type.ts
index 111498e1fdc2557acc6478782853f0325b4b28da..addc7d2f33426d5449b472bbe1dfdaf9c395d65b 100644
--- a/lib/manager/npm/extract/type.js
+++ b/lib/manager/npm/extract/type.ts
@@ -1,8 +1,6 @@
-module.exports = {
-  mightBeABrowserLibrary,
-};
+import { NpmPackage } from './common';
 
-function mightBeABrowserLibrary(packageJson) {
+export function mightBeABrowserLibrary(packageJson: NpmPackage) {
   // return true unless we're sure it's not a browser library
   if (packageJson.private === true) {
     // it's not published
diff --git a/lib/manager/npm/extract/yarn.js b/lib/manager/npm/extract/yarn.ts
similarity index 57%
rename from lib/manager/npm/extract/yarn.js
rename to lib/manager/npm/extract/yarn.ts
index b3dceef1f4f6718bcac1cf0d3a736aa37305dd0f..e175b0551439db2897db48f7109859c83dc4c465 100644
--- a/lib/manager/npm/extract/yarn.js
+++ b/lib/manager/npm/extract/yarn.ts
@@ -1,14 +1,15 @@
-const yarnLockParser = require('@yarnpkg/lockfile');
-const { logger } = require('../../../logger');
+import { parse } from '@yarnpkg/lockfile';
+import { logger } from '../../../logger';
+import { LockFileEntry } from './common';
 
-module.exports = {
-  getYarnLock,
+export type YarnLock = Record<string, string> & {
+  '@renovate_yarn_integrity'?: boolean;
 };
 
-async function getYarnLock(filePath) {
+export async function getYarnLock(filePath: string): Promise<YarnLock> {
   const yarnLockRaw = await platform.getFile(filePath);
   try {
-    const yarnLockParsed = yarnLockParser.parse(yarnLockRaw);
+    const yarnLockParsed = parse(yarnLockRaw);
     // istanbul ignore if
     if (yarnLockParsed.type !== 'success') {
       logger.info(
@@ -17,8 +18,11 @@ async function getYarnLock(filePath) {
       );
       return {};
     }
-    const lockFile = {};
-    for (const [entry, val] of Object.entries(yarnLockParsed.object)) {
+    const lockFile: YarnLock = {};
+
+    for (const [entry, val] of Object.entries(
+      yarnLockParsed.object as LockFileEntry
+    )) {
       logger.trace({ entry, version: val.version });
       lockFile[entry] = val.version;
       // istanbul ignore if
diff --git a/lib/manager/npm/index.js b/lib/manager/npm/index.js
deleted file mode 100644
index f8196c283b70baef0d60f22376ce78494cf8e9b6..0000000000000000000000000000000000000000
--- a/lib/manager/npm/index.js
+++ /dev/null
@@ -1,11 +0,0 @@
-const { extractAllPackageFiles } = require('./extract');
-const { updateDependency } = require('./update');
-const { getRangeStrategy } = require('./range');
-
-module.exports = {
-  extractAllPackageFiles,
-  language: 'js',
-  getRangeStrategy,
-  updateDependency,
-  supportsLockFileMaintenance: true,
-};
diff --git a/lib/manager/npm/index.ts b/lib/manager/npm/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..77f6c1cec305cacf25d2c1863a582cea9f663c9e
--- /dev/null
+++ b/lib/manager/npm/index.ts
@@ -0,0 +1,6 @@
+export { extractAllPackageFiles } from './extract';
+export { updateDependency } from './update';
+export { getRangeStrategy } from './range';
+
+export const language = 'js';
+export const supportsLockFileMaintenance = true;
diff --git a/lib/manager/npm/post-update/index.js b/lib/manager/npm/post-update/index.ts
similarity index 91%
rename from lib/manager/npm/post-update/index.js
rename to lib/manager/npm/post-update/index.ts
index 19aebd7280df3c338c3d3322ae50bb21190d2706..1c27087a336361ee87f9ab37ae17fd73b38ec873 100644
--- a/lib/manager/npm/post-update/index.js
+++ b/lib/manager/npm/post-update/index.ts
@@ -1,29 +1,32 @@
 import is from '@sindresorhus/is';
-
-const fs = require('fs-extra');
-const path = require('path');
-const upath = require('upath');
-const { logger } = require('../../../logger');
-const npm = require('./npm');
-const lerna = require('./lerna');
-const yarn = require('./yarn');
-const pnpm = require('./pnpm');
-const hostRules = require('../../../util/host-rules');
-const { getChildProcessEnv } = require('../../../util/env');
-
-export {
-  determineLockFileDirs,
-  writeExistingFiles,
-  writeUpdatedPackageFiles,
-  getAdditionalFiles,
-};
+import fs from 'fs-extra';
+import path from 'path';
+import upath from 'upath';
+import { PackageJson } from 'type-fest';
+import { logger } from '../../../logger';
+import * as npm from './npm';
+import * as lerna from './lerna';
+import * as yarn from './yarn';
+import * as pnpm from './pnpm';
+import * as hostRules from '../../../util/host-rules';
+import { getChildProcessEnv } from '../../../util/env';
+import { PostUpdateConfig, PackageFile, Upgrade } from '../../common';
 
 // Strips empty values, deduplicates, and returns the directories from filenames
 // istanbul ignore next
-const getDirs = arr => Array.from(new Set(arr.filter(Boolean)));
+const getDirs = (arr: string[]) => Array.from(new Set(arr.filter(Boolean)));
 
+export interface DetermineLockFileDirsResult {
+  yarnLockDirs: string[];
+  npmLockDirs: string[];
+  pnpmShrinkwrapDirs: string[];
+  lernaDirs: string[];
+}
 // istanbul ignore next
-function determineLockFileDirs(config, packageFiles) {
+export function determineLockFileDirs(
+  config: PostUpdateConfig,
+  packageFiles: AdditionalPackageFiles
+): DetermineLockFileDirsResult {
   const npmLockDirs = [];
   const yarnLockDirs = [];
   const pnpmShrinkwrapDirs = [];
@@ -49,7 +52,7 @@ function determineLockFileDirs(config, packageFiles) {
 
   if (
     config.upgrades.every(
-      upgrade =>
+      (upgrade: Upgrade) =>
         upgrade.updateType === 'lockFileMaintenance' || upgrade.isLockfileUpdate
     )
   ) {
@@ -61,7 +64,7 @@ function determineLockFileDirs(config, packageFiles) {
     };
   }
 
-  function getPackageFile(fileName) {
+  function getPackageFile(fileName: string): Partial<PackageFile> {
     logger.trace('Looking for packageFile: ' + fileName);
     for (const packageFile of packageFiles.npm) {
       if (packageFile.packageFile === fileName) {
@@ -103,7 +106,10 @@ function determineLockFileDirs(config, packageFiles) {
 }
 
 // istanbul ignore next
-async function writeExistingFiles(config, packageFiles) {
+export async function writeExistingFiles(
+  config: PostUpdateConfig,
+  packageFiles: AdditionalPackageFiles
+) {
   const lernaJson = await platform.getFile('lerna.json');
   if (lernaJson) {
     logger.debug(`Writing repo lerna.json (${config.localDir})`);
@@ -137,7 +143,7 @@ async function writeExistingFiles(config, packageFiles) {
     );
     logger.trace(`Writing package.json to ${basedir}`);
     // Massage the file to eliminate yarn errors
-    const massagedFile = JSON.parse(
+    const massagedFile: PackageJson = JSON.parse(
       await platform.getFile(packageFile.packageFile)
     );
     if (massagedFile.name) {
@@ -267,7 +273,9 @@ async function writeExistingFiles(config, packageFiles) {
 }
 
 // istanbul ignore next
-function listLocalLibs(dependencies) {
+function listLocalLibs(
+  dependencies: { [s: string]: unknown } | ArrayLike<unknown>
+) {
   logger.trace(`listLocalLibs (${dependencies})`);
   const toCopy = [];
   if (dependencies) {
@@ -287,7 +295,7 @@ function listLocalLibs(dependencies) {
 }
 
 // istanbul ignore next
-async function writeUpdatedPackageFiles(config) {
+export async function writeUpdatedPackageFiles(config: PostUpdateConfig) {
   logger.trace({ config }, 'writeUpdatedPackageFiles');
   logger.debug('Writing any updated package files');
   if (!config.updatedPackageFiles) {
@@ -330,11 +338,32 @@ async function writeUpdatedPackageFiles(config) {
   }
 }
 
+export interface AdditionalPackageFiles {
+  npm?: Partial<PackageFile>[];
+}
+
+interface ArtifactError {
+  lockFile: string;
+  stderr: string;
+}
+
+interface UpdatedArtifcats {
+  name: string;
+  contents: string;
+}
+
+export interface WriteExistingFilesResult {
+  artifactErrors: ArtifactError[];
+  updatedArtifacts: UpdatedArtifcats[];
+}
 // istanbul ignore next
-async function getAdditionalFiles(config, packageFiles) {
+export async function getAdditionalFiles(
+  config: PostUpdateConfig,
+  packageFiles: AdditionalPackageFiles
+): Promise<WriteExistingFilesResult> {
   logger.trace({ config }, 'getAdditionalFiles');
-  const artifactErrors = [];
-  const updatedArtifacts = [];
+  const artifactErrors: ArtifactError[] = [];
+  const updatedArtifacts: UpdatedArtifcats[] = [];
   if (!(packageFiles.npm && packageFiles.npm.length)) {
     return { artifactErrors, updatedArtifacts };
   }
@@ -351,10 +380,10 @@ async function getAdditionalFiles(config, packageFiles) {
     logger.debug('Skipping lockFileMaintenance update');
     return { artifactErrors, updatedArtifacts };
   }
-  const dirs = module.exports.determineLockFileDirs(config, packageFiles);
+  const dirs = determineLockFileDirs(config, packageFiles);
   logger.debug({ dirs }, 'lock file dirs');
-  await module.exports.writeExistingFiles(config, packageFiles);
-  await module.exports.writeUpdatedPackageFiles(config);
+  await writeExistingFiles(config, packageFiles);
+  await writeUpdatedPackageFiles(config);
 
   process.env.NPM_CONFIG_CACHE =
     process.env.NPM_CONFIG_CACHE || upath.join(config.cacheDir, './others/npm');
@@ -575,7 +604,7 @@ async function getAdditionalFiles(config, packageFiles) {
   }
 
   for (const lernaDir of dirs.lernaDirs) {
-    let lockFile;
+    let lockFile: string;
     logger.debug(`Finding package.json for lerna directory "${lernaDir}"`);
     const lernaPackageFile = packageFiles.npm.find(
       p => path.dirname(p.packageFile) === lernaDir
@@ -650,7 +679,7 @@ async function getAdditionalFiles(config, packageFiles) {
           const lockFilePath = upath.join(config.localDir, filename);
           logger.trace('Checking against ' + lockFilePath);
           try {
-            let newContent;
+            let newContent: string;
             try {
               newContent = await fs.readFile(lockFilePath, 'utf8');
             } catch (err) {
diff --git a/lib/manager/npm/post-update/lerna.js b/lib/manager/npm/post-update/lerna.ts
similarity index 81%
rename from lib/manager/npm/post-update/lerna.js
rename to lib/manager/npm/post-update/lerna.ts
index ceee6b228f8356af1b037ce0a73e099204977ab1..1677a7d93fb546cf739c6e4607db7d7a49c936ef 100644
--- a/lib/manager/npm/post-update/lerna.js
+++ b/lib/manager/npm/post-update/lerna.ts
@@ -1,28 +1,29 @@
-const { exec } = require('../../../util/exec');
-const { logger } = require('../../../logger');
+import { exec } from '../../../util/exec';
+import { logger } from '../../../logger';
 
-module.exports = {
-  generateLockFiles,
-};
+export interface GenerateLockFileResult {
+  error?: boolean;
+  stderr?: string;
+}
 
-async function generateLockFiles(
-  lernaClient,
-  cwd,
-  env,
-  skipInstalls,
-  binarySource
-) {
+export async function generateLockFiles(
+  lernaClient: string,
+  cwd: string,
+  env?: NodeJS.ProcessEnv,
+  skipInstalls?: boolean,
+  binarySource?: string
+): Promise<GenerateLockFileResult> {
   if (!lernaClient) {
     logger.warn('No lernaClient specified - returning');
     return { error: false };
   }
   logger.debug(`Spawning lerna with ${lernaClient} to create lock files`);
-  let stdout;
-  let stderr;
-  let cmd;
+  let stdout: string;
+  let stderr: string;
+  let cmd: string;
   try {
     const startTime = process.hrtime();
-    let lernaVersion;
+    let lernaVersion: string;
     try {
       const pJson = JSON.parse(await platform.getFile('package.json'));
       lernaVersion =
@@ -33,7 +34,7 @@ async function generateLockFiles(
     }
     lernaVersion = lernaVersion || 'latest';
     logger.debug('Using lerna version ' + lernaVersion);
-    let params;
+    let params: string;
     if (lernaClient === 'npm') {
       if (skipInstalls === false) {
         params = '--ignore-scripts  --no-audit';
diff --git a/lib/manager/npm/post-update/npm.js b/lib/manager/npm/post-update/npm.ts
similarity index 83%
rename from lib/manager/npm/post-update/npm.js
rename to lib/manager/npm/post-update/npm.ts
index a9cb6fd77814e4ef827ce494f4e3fc6c082f0a30..af943de4c9eb6f77c164689db2785db187a71210 100644
--- a/lib/manager/npm/post-update/npm.js
+++ b/lib/manager/npm/post-update/npm.ts
@@ -1,32 +1,34 @@
-const fs = require('fs-extra');
-const upath = require('upath');
-const { getInstalledPath } = require('get-installed-path');
-const { exec } = require('../../../util/exec');
-const { logger } = require('../../../logger');
+import { readFile } from 'fs-extra';
+import { join } from 'upath';
+import { getInstalledPath } from 'get-installed-path';
+import { exec } from '../../../util/exec';
+import { logger } from '../../../logger';
+import { PostUpdateConfig, Upgrade } from '../../common';
 
-module.exports = {
-  generateLockFile,
-};
-
-async function generateLockFile(
-  cwd,
-  env,
-  filename,
-  config = {},
-  upgrades = []
-) {
+export interface GenerateLockFileResult {
+  error?: boolean;
+  lockFile?: string;
+  stderr?: string;
+}
+export async function generateLockFile(
+  cwd: string,
+  env: NodeJS.ProcessEnv,
+  filename: string,
+  config: PostUpdateConfig = {},
+  upgrades: Upgrade[] = []
+): Promise<GenerateLockFileResult> {
   logger.debug(`Spawning npm install to create ${cwd}/${filename}`);
   const { skipInstalls, binarySource, postUpdateOptions } = config;
-  let lockFile = null;
+  let lockFile: string = null;
   let stdout = '';
   let stderr = '';
-  let cmd;
+  let cmd: string;
   let args = '';
   try {
     const startTime = process.hrtime();
     try {
       // See if renovate is installed locally
-      const installedPath = upath.join(
+      const installedPath = join(
         await getInstalledPath('npm', {
           local: true,
         }),
@@ -38,7 +40,7 @@ async function generateLockFile(
       // Look inside globally installed renovate
       try {
         const renovateLocation = await getInstalledPath('renovate');
-        const installedPath = upath.join(
+        const installedPath = join(
           await getInstalledPath('npm', {
             local: true,
             cwd: renovateLocation,
@@ -50,7 +52,7 @@ async function generateLockFile(
         logger.debug('Could not find globally nested npm');
         // look for global npm
         try {
-          const installedPath = upath.join(
+          const installedPath = join(
             await getInstalledPath('npm'),
             'bin/npm-cli.js'
           );
@@ -127,7 +129,7 @@ async function generateLockFile(
     }
     const duration = process.hrtime(startTime);
     const seconds = Math.round(duration[0] + duration[1] / 1e9);
-    lockFile = await fs.readFile(upath.join(cwd, filename), 'utf8');
+    lockFile = await readFile(join(cwd, filename), 'utf8');
     logger.info(
       { seconds, type: filename, stdout, stderr },
       'Generated lockfile'
diff --git a/lib/manager/npm/post-update/pnpm.js b/lib/manager/npm/post-update/pnpm.ts
similarity index 77%
rename from lib/manager/npm/post-update/pnpm.js
rename to lib/manager/npm/post-update/pnpm.ts
index 6972e588f1a4c605bf2a8211cefb24cd22f1a94f..6676354f60951960ac8d5ba73075cb725f576b4c 100644
--- a/lib/manager/npm/post-update/pnpm.js
+++ b/lib/manager/npm/post-update/pnpm.ts
@@ -1,24 +1,32 @@
-const fs = require('fs-extra');
-const upath = require('upath');
-const { getInstalledPath } = require('get-installed-path');
-const { exec } = require('../../../util/exec');
-const { logger } = require('../../../logger');
+import { readFile } from 'fs-extra';
+import { join } from 'upath';
+import { getInstalledPath } from 'get-installed-path';
+import { exec } from '../../../util/exec';
+import { logger } from '../../../logger';
+import { PostUpdateConfig } from '../../common';
 
-module.exports = {
-  generateLockFile,
-};
+export interface GenerateLockFileResult {
+  error?: boolean;
+  lockFile?: string;
+  stderr?: string;
+  stdout?: string;
+}
 
-async function generateLockFile(cwd, env, config) {
+export async function generateLockFile(
+  cwd: string,
+  env: NodeJS.ProcessEnv,
+  config: PostUpdateConfig
+): Promise<GenerateLockFileResult> {
   logger.debug(`Spawning pnpm install to create ${cwd}/pnpm-lock.yaml`);
   let lockFile = null;
-  let stdout;
-  let stderr;
-  let cmd;
+  let stdout: string;
+  let stderr: string;
+  let cmd: string;
   try {
     const startTime = process.hrtime();
     try {
       // See if renovate is installed locally
-      const installedPath = upath.join(
+      const installedPath = join(
         await getInstalledPath('pnpm', {
           local: true,
         }),
@@ -30,7 +38,7 @@ async function generateLockFile(cwd, env, config) {
       // Look inside globally installed renovate
       try {
         const renovateLocation = await getInstalledPath('renovate');
-        const installedPath = upath.join(
+        const installedPath = join(
           await getInstalledPath('pnpm', {
             local: true,
             cwd: renovateLocation,
@@ -42,7 +50,7 @@ async function generateLockFile(cwd, env, config) {
         logger.debug('Could not find globally nested pnpm');
         // look for global pnpm
         try {
-          const installedPath = upath.join(
+          const installedPath = join(
             await getInstalledPath('pnpm'),
             'lib/bin/pnpm.js'
           );
@@ -83,7 +91,7 @@ async function generateLockFile(cwd, env, config) {
     logger.debug(`pnpm stderr:\n${stderr}`);
     const duration = process.hrtime(startTime);
     const seconds = Math.round(duration[0] + duration[1] / 1e9);
-    lockFile = await fs.readFile(upath.join(cwd, 'pnpm-lock.yaml'), 'utf8');
+    lockFile = await readFile(join(cwd, 'pnpm-lock.yaml'), 'utf8');
     logger.info(
       { seconds, type: 'pnpm-lock.yaml', stdout, stderr },
       'Generated lockfile'
diff --git a/lib/manager/npm/post-update/yarn.js b/lib/manager/npm/post-update/yarn.ts
similarity index 85%
rename from lib/manager/npm/post-update/yarn.js
rename to lib/manager/npm/post-update/yarn.ts
index 78e87982c18dfefe1941670a8ce07fa99d7d1e82..3c48a995a26a8b333dcc7b491b2f86197c6ace4c 100644
--- a/lib/manager/npm/post-update/yarn.js
+++ b/lib/manager/npm/post-update/yarn.ts
@@ -1,25 +1,33 @@
-const fs = require('fs-extra');
-const upath = require('upath');
-const { getInstalledPath } = require('get-installed-path');
-const { exec } = require('../../../util/exec');
-const { logger } = require('../../../logger');
+import { readFile } from 'fs-extra';
+import { join } from 'upath';
+import { getInstalledPath } from 'get-installed-path';
+import { exec } from '../../../util/exec';
+import { logger } from '../../../logger';
+import { PostUpdateConfig, Upgrade } from '../../common';
 
-module.exports = {
-  generateLockFile,
-};
+export interface GenerateLockFileResult {
+  error?: boolean;
+  lockFile?: string;
+  stderr?: string;
+}
 
-async function generateLockFile(cwd, env, config = {}, upgrades = []) {
+export async function generateLockFile(
+  cwd: string,
+  env?: NodeJS.ProcessEnv,
+  config: PostUpdateConfig = {},
+  upgrades: Upgrade[] = []
+): Promise<GenerateLockFileResult> {
   const { binarySource } = config;
   logger.debug(`Spawning yarn install to create ${cwd}/yarn.lock`);
   let lockFile = null;
-  let stdout;
-  let stderr;
-  let cmd;
+  let stdout: string;
+  let stderr: string;
+  let cmd: string;
   try {
     const startTime = process.hrtime();
     try {
       // See if renovate is installed locally
-      const installedPath = upath.join(
+      const installedPath = join(
         await getInstalledPath('yarn', {
           local: true,
         }),
@@ -35,7 +43,7 @@ async function generateLockFile(cwd, env, config = {}, upgrades = []) {
             local: true,
           });
           logger.info('Using nested bundled yarn@1.9.4 for install');
-          cmd = 'node ' + upath.join(renovatePath, 'bin/yarn-1.9.4.js');
+          cmd = 'node ' + join(renovatePath, 'bin/yarn-1.9.4.js');
         } catch (err) {
           logger.info('Using bundled yarn@1.9.4 for install');
           cmd = cmd.replace(
@@ -49,7 +57,7 @@ async function generateLockFile(cwd, env, config = {}, upgrades = []) {
       // Look inside globally installed renovate
       try {
         const renovateLocation = await getInstalledPath('renovate');
-        const installedPath = upath.join(
+        const installedPath = join(
           await getInstalledPath('yarn', {
             local: true,
             cwd: renovateLocation,
@@ -61,7 +69,7 @@ async function generateLockFile(cwd, env, config = {}, upgrades = []) {
         logger.debug('Could not find globally nested yarn');
         // look for global yarn
         try {
-          const installedPath = upath.join(
+          const installedPath = join(
             await getInstalledPath('yarn'),
             'bin/yarn.js'
           );
@@ -150,7 +158,7 @@ async function generateLockFile(cwd, env, config = {}, upgrades = []) {
     }
     const duration = process.hrtime(startTime);
     const seconds = Math.round(duration[0] + duration[1] / 1e9);
-    lockFile = await fs.readFile(upath.join(cwd, 'yarn.lock'), 'utf8');
+    lockFile = await readFile(join(cwd, 'yarn.lock'), 'utf8');
     logger.info(
       { seconds, type: 'yarn.lock', stdout, stderr },
       'Generated lockfile'
diff --git a/lib/manager/npm/range.js b/lib/manager/npm/range.ts
similarity index 80%
rename from lib/manager/npm/range.js
rename to lib/manager/npm/range.ts
index 89083aa749434cd78f4a70e9309e6ee5aff28b7f..c431081cf66130e6ef5a150ef6893571a4890ad6 100644
--- a/lib/manager/npm/range.js
+++ b/lib/manager/npm/range.ts
@@ -1,11 +1,9 @@
-const { parseRange } = require('semver-utils');
-const { logger } = require('../../logger');
+import { parseRange } from 'semver-utils';
+import { logger } from '../../logger';
+import { RangeConfig } from '../common';
+import { RangeStrategy } from '../../versioning';
 
-module.exports = {
-  getRangeStrategy,
-};
-
-function getRangeStrategy(config) {
+export function getRangeStrategy(config: RangeConfig): RangeStrategy {
   const {
     depType,
     depName,
diff --git a/lib/manager/npm/update.js b/lib/manager/npm/update.ts
similarity index 89%
rename from lib/manager/npm/update.js
rename to lib/manager/npm/update.ts
index e2804069841aad8038023a8ff5c9a1dd0cdf860b..f7f5a5efe0d60f1d67551e07b7be73d58060132b 100644
--- a/lib/manager/npm/update.js
+++ b/lib/manager/npm/update.ts
@@ -1,13 +1,12 @@
-const _ = require('lodash');
-const semver = require('semver');
-const { logger } = require('../../logger');
+import { isEqual } from 'lodash';
+import { inc, ReleaseType } from 'semver';
+import { logger } from '../../logger';
+import { Upgrade } from '../common';
 
-module.exports = {
-  updateDependency,
-  bumpPackageVersion,
-};
-
-function updateDependency(fileContent, upgrade) {
+export function updateDependency(
+  fileContent: string,
+  upgrade: Upgrade
+): string {
   const { depType, depName } = upgrade;
   let { newValue } = upgrade;
   if (upgrade.currentRawValue) {
@@ -63,7 +62,7 @@ function updateDependency(fileContent, upgrade) {
           newString
         );
         // Compare the parsed JSON structure of old and new
-        if (_.isEqual(parsedContents, JSON.parse(testContent))) {
+        if (isEqual(parsedContents, JSON.parse(testContent))) {
           newFileContent = testContent;
           break;
         }
@@ -118,7 +117,7 @@ function updateDependency(fileContent, upgrade) {
               newResolution
             );
             // Compare the parsed JSON structure of old and new
-            if (_.isEqual(parsedContents, JSON.parse(testContent))) {
+            if (isEqual(parsedContents, JSON.parse(testContent))) {
               newFileContent = testContent;
               break;
             }
@@ -138,12 +137,17 @@ function updateDependency(fileContent, upgrade) {
 }
 
 // Return true if the match string is found at index in content
-function matchAt(content, index, match) {
+function matchAt(content: string, index: number, match: string) {
   return content.substring(index, index + match.length) === match;
 }
 
 // Replace oldString with newString at location index of content
-function replaceAt(content, index, oldString, newString) {
+function replaceAt(
+  content: string,
+  index: number,
+  oldString: string,
+  newString: string
+) {
   logger.debug(`Replacing ${oldString} with ${newString} at index ${index}`);
   return (
     content.substr(0, index) +
@@ -152,7 +156,11 @@ function replaceAt(content, index, oldString, newString) {
   );
 }
 
-function bumpPackageVersion(content, currentValue, bumpVersion) {
+export function bumpPackageVersion(
+  content: string,
+  currentValue: string,
+  bumpVersion: ReleaseType | string
+) {
   logger.debug('bumpVersion()');
   if (!bumpVersion) {
     return content;
@@ -176,7 +184,7 @@ function bumpPackageVersion(content, currentValue, bumpVersion) {
         return content;
       }
     } else {
-      newPjVersion = semver.inc(currentValue, bumpVersion);
+      newPjVersion = inc(currentValue, bumpVersion as ReleaseType);
     }
     logger.debug({ newPjVersion });
     const bumpedContent = content.replace(
diff --git a/lib/manager/nuget/extract.js b/lib/manager/nuget/extract.ts
similarity index 59%
rename from lib/manager/nuget/extract.js
rename to lib/manager/nuget/extract.ts
index d3a7153644972c92aa70ae703a5b8d91d01cd04f..edf654f13c0a8d6acfb94bf349fbfdde804e0ec5 100644
--- a/lib/manager/nuget/extract.js
+++ b/lib/manager/nuget/extract.ts
@@ -1,14 +1,15 @@
-const { logger } = require('../../logger');
-const versioning = require('../../versioning');
+import { logger } from '../../logger';
+import { get } from '../../versioning';
+import { PackageDependency, ExtractConfig, PackageFile } from '../common';
 
-module.exports = {
-  extractPackageFile,
-};
-
-function extractPackageFile(content, packageFile, config = {}) {
+export function extractPackageFile(
+  content: string,
+  packageFile: string,
+  config: ExtractConfig = {}
+): PackageFile {
   logger.trace(`nuget.extractPackageFile(${packageFile})`);
-  const { isVersion } = versioning.get(config.versionScheme || 'semver');
-  const deps = [];
+  const { isVersion } = get(config.versionScheme || 'semver');
+  const deps: PackageDependency[] = [];
 
   let lineNumber = 0;
   for (const line of content.split('\n')) {
@@ -18,7 +19,7 @@ function extractPackageFile(content, packageFile, config = {}) {
     if (match) {
       const depName = match[1];
       const currentValue = match[2];
-      const dep = {
+      const dep: PackageDependency = {
         depType: 'nuget',
         depName,
         currentValue,
diff --git a/lib/manager/nuget/index.js b/lib/manager/nuget/index.js
deleted file mode 100644
index 646426d4eb14292037e46fee09d28c59daab2c6f..0000000000000000000000000000000000000000
--- a/lib/manager/nuget/index.js
+++ /dev/null
@@ -1,8 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-
-module.exports = {
-  extractPackageFile,
-  language: 'dotnet',
-  updateDependency,
-};
diff --git a/lib/manager/nuget/index.ts b/lib/manager/nuget/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..721267a6f9cae10881109d471363f1aefc1ec3fa
--- /dev/null
+++ b/lib/manager/nuget/index.ts
@@ -0,0 +1,4 @@
+export { extractPackageFile } from './extract';
+export { updateDependency } from './update';
+
+export const language = 'dotnet';
diff --git a/lib/manager/nuget/update.js b/lib/manager/nuget/update.ts
similarity index 78%
rename from lib/manager/nuget/update.js
rename to lib/manager/nuget/update.ts
index 121c52dc68f964da8c8feec2c6dd4694255394a1..6869ded841b2c222b1ea6339b1484e7ace76070b 100644
--- a/lib/manager/nuget/update.js
+++ b/lib/manager/nuget/update.ts
@@ -1,10 +1,10 @@
-const { logger } = require('../../logger');
+import { logger } from '../../logger';
+import { Upgrade } from '../common';
 
-module.exports = {
-  updateDependency,
-};
-
-function updateDependency(fileContent, upgrade) {
+export function updateDependency(
+  fileContent: string,
+  upgrade: Upgrade
+): string {
   try {
     logger.debug(`nuget.updateDependency(): ${upgrade.newFrom}`);
     const lines = fileContent.split('\n');
diff --git a/lib/manager/nvm/extract.js b/lib/manager/nvm/extract.js
deleted file mode 100644
index 25d5725b7e191f8cbd68ebb7873599fdc4b53887..0000000000000000000000000000000000000000
--- a/lib/manager/nvm/extract.js
+++ /dev/null
@@ -1,18 +0,0 @@
-const node = require('../../versioning/node');
-
-module.exports = {
-  extractPackageFile,
-};
-
-function extractPackageFile(content) {
-  const dep = {
-    depName: 'node',
-    currentValue: content.trim(),
-    datasource: 'github',
-    lookupName: 'nodejs/node',
-  };
-  if (!node.isValid(dep.currentValue)) {
-    dep.skipReason = 'unsupported-version';
-  }
-  return { deps: [dep] };
-}
diff --git a/lib/manager/nvm/extract.ts b/lib/manager/nvm/extract.ts
new file mode 100644
index 0000000000000000000000000000000000000000..87c30d3c7f96ea9c722268cfb1067adebcdb6583
--- /dev/null
+++ b/lib/manager/nvm/extract.ts
@@ -0,0 +1,15 @@
+import { isValid } from '../../versioning/node';
+import { PackageFile, PackageDependency } from '../common';
+
+export function extractPackageFile(content: string): PackageFile {
+  const dep: PackageDependency = {
+    depName: 'node',
+    currentValue: content.trim(),
+    datasource: 'github',
+    lookupName: 'nodejs/node',
+  };
+  if (!isValid(dep.currentValue)) {
+    dep.skipReason = 'unsupported-version';
+  }
+  return { deps: [dep] };
+}
diff --git a/lib/manager/nvm/index.js b/lib/manager/nvm/index.js
deleted file mode 100644
index 26d28e951e2a30c3edfda15778cf51f9c9d71f2d..0000000000000000000000000000000000000000
--- a/lib/manager/nvm/index.js
+++ /dev/null
@@ -1,10 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-
-const language = 'node';
-
-module.exports = {
-  extractPackageFile,
-  language,
-  updateDependency,
-};
diff --git a/lib/manager/nvm/index.ts b/lib/manager/nvm/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e5ce4fd8d10ac0455b7de9dff4a1e96fb624fb5f
--- /dev/null
+++ b/lib/manager/nvm/index.ts
@@ -0,0 +1,4 @@
+export { extractPackageFile } from './extract';
+export { updateDependency } from './update';
+
+export const language = 'node';
diff --git a/lib/manager/nvm/update.js b/lib/manager/nvm/update.js
deleted file mode 100644
index 5de15329f5d2bb1e82b0ff3c70f05a6ca5b396c1..0000000000000000000000000000000000000000
--- a/lib/manager/nvm/update.js
+++ /dev/null
@@ -1,10 +0,0 @@
-const { logger } = require('../../logger');
-
-module.exports = {
-  updateDependency,
-};
-
-function updateDependency(fileContent, upgrade) {
-  logger.debug(`nvm.updateDependency(): ${upgrade.newVersions}`);
-  return `${upgrade.newValue}\n`;
-}
diff --git a/lib/manager/nvm/update.ts b/lib/manager/nvm/update.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cd6d4eefb51e124468a85054b989b807049d4468
--- /dev/null
+++ b/lib/manager/nvm/update.ts
@@ -0,0 +1,7 @@
+import { logger } from '../../logger';
+import { Upgrade } from '../common';
+
+export function updateDependency(_fileContent: string, upgrade: Upgrade) {
+  logger.debug(`nvm.updateDependency(): ${upgrade.newVersion}`);
+  return `${upgrade.newValue}\n`;
+}
diff --git a/lib/manager/pip_requirements/extract.js b/lib/manager/pip_requirements/extract.ts
similarity index 74%
rename from lib/manager/pip_requirements/extract.js
rename to lib/manager/pip_requirements/extract.ts
index af13cfd3f8a31abfcead56d61c39e646fc4865eb..fde9321fbea43874eff9a9aa842528906f6f6214 100644
--- a/lib/manager/pip_requirements/extract.js
+++ b/lib/manager/pip_requirements/extract.ts
@@ -1,26 +1,31 @@
 // based on https://www.python.org/dev/peps/pep-0508/#names
-const packagePattern = '[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9]';
-const extrasPattern = '(?:\\s*\\[[^\\]]+\\])?';
-const rangePattern = require('@renovate/pep440/lib/specifier').RANGE_PATTERN;
+import { RANGE_PATTERN as rangePattern } from '@renovate/pep440/lib/specifier';
+import { logger } from '../../logger';
+import { isSkipComment } from '../../util/ignore';
+import { isValid, isSingleVersion } from '../../versioning/pep440';
+import {
+  ExtractConfig,
+  Registry,
+  PackageDependency,
+  PackageFile,
+} from '../common';
 
-const { logger } = require('../../logger');
-const { isSkipComment } = require('../../util/ignore');
+export const packagePattern =
+  '[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9]';
+const extrasPattern = '(?:\\s*\\[[^\\]]+\\])?';
 
 const specifierPartPattern = `\\s*${rangePattern.replace(/\?<\w+>/g, '?:')}`;
 const specifierPattern = `${specifierPartPattern}(?:\\s*,${specifierPartPattern})*`;
-const dependencyPattern = `(${packagePattern})(${extrasPattern})(${specifierPattern})`;
-const { isValid, isSingleVersion } = require('../../versioning/pep440');
-
-module.exports = {
-  dependencyPattern,
-  packagePattern,
-  extractPackageFile,
-};
+export const dependencyPattern = `(${packagePattern})(${extrasPattern})(${specifierPattern})`;
 
-function extractPackageFile(content, _, config) {
+export function extractPackageFile(
+  content: string,
+  _: string,
+  config: ExtractConfig
+) {
   logger.trace('pip_requirements.extractPackageFile()');
 
-  let indexUrl;
+  let indexUrl: string;
   const extraUrls = [];
   content.split('\n').forEach(line => {
     if (line.startsWith('--index-url ')) {
@@ -33,7 +38,7 @@ function extractPackageFile(content, _, config) {
       extraUrls.push(extraUrl);
     }
   });
-  let registryUrls = [];
+  let registryUrls: (string | Registry)[] = [];
   if (indexUrl) {
     // index url in file takes precedence
     registryUrls.push(indexUrl);
@@ -50,7 +55,7 @@ function extractPackageFile(content, _, config) {
   const deps = content
     .split('\n')
     .map((rawline, lineNumber) => {
-      let dep = {};
+      let dep: PackageDependency = {};
       const [line, comment] = rawline.split('#').map(part => part.trim());
       if (isSkipComment(comment)) {
         dep.skipReason = 'ignored';
@@ -81,7 +86,7 @@ function extractPackageFile(content, _, config) {
   if (!deps.length) {
     return null;
   }
-  const res = { deps };
+  const res: PackageFile = { deps };
   if (registryUrls.length > 0) {
     res.registryUrls = registryUrls;
   }
diff --git a/lib/manager/pip_requirements/index.js b/lib/manager/pip_requirements/index.js
deleted file mode 100644
index ef1eea7cd6720949886e064a13cada1e51520af8..0000000000000000000000000000000000000000
--- a/lib/manager/pip_requirements/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-const { getRangeStrategy } = require('./range');
-
-const language = 'python';
-
-module.exports = {
-  extractPackageFile,
-  getRangeStrategy,
-  language,
-  updateDependency,
-};
diff --git a/lib/manager/pip_requirements/index.ts b/lib/manager/pip_requirements/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4737e5fb3745bb06a14167c5aec73a45e3ce0444
--- /dev/null
+++ b/lib/manager/pip_requirements/index.ts
@@ -0,0 +1,5 @@
+export { extractPackageFile } from './extract';
+export { updateDependency } from './update';
+export { getRangeStrategy } from './range';
+
+export const language = 'python';
diff --git a/lib/manager/pip_requirements/range.js b/lib/manager/pip_requirements/range.js
deleted file mode 100644
index 06dcb2b9aec54d25166a44f8e5fb2a3200d17d53..0000000000000000000000000000000000000000
--- a/lib/manager/pip_requirements/range.js
+++ /dev/null
@@ -1,10 +0,0 @@
-module.exports = {
-  getRangeStrategy,
-};
-
-function getRangeStrategy(config) {
-  if (config.rangeStrategy === 'auto') {
-    return 'pin';
-  }
-  return config.rangeStrategy;
-}
diff --git a/lib/manager/pip_requirements/range.ts b/lib/manager/pip_requirements/range.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e45e36ec71fcf4282857354e26f7b5192bc4b65b
--- /dev/null
+++ b/lib/manager/pip_requirements/range.ts
@@ -0,0 +1,9 @@
+import { RangeConfig } from '../common';
+import { RangeStrategy } from '../../versioning';
+
+export function getRangeStrategy(config: RangeConfig): RangeStrategy {
+  if (config.rangeStrategy === 'auto') {
+    return 'pin';
+  }
+  return config.rangeStrategy;
+}
diff --git a/lib/manager/pip_requirements/update.js b/lib/manager/pip_requirements/update.ts
similarity index 83%
rename from lib/manager/pip_requirements/update.js
rename to lib/manager/pip_requirements/update.ts
index 7809aa63a8eb5b784bd9c4de043523668b766863..34061f6bb981c0d97e4f313f9d67e2b3d4fef76d 100644
--- a/lib/manager/pip_requirements/update.js
+++ b/lib/manager/pip_requirements/update.ts
@@ -1,11 +1,11 @@
-const { logger } = require('../../logger');
-const { dependencyPattern } = require('./extract');
+import { logger } from '../../logger';
+import { dependencyPattern } from './extract';
+import { Upgrade } from '../common';
 
-module.exports = {
-  updateDependency,
-};
-
-function updateDependency(fileContent, upgrade) {
+export function updateDependency(
+  fileContent: string,
+  upgrade: Upgrade
+): string {
   try {
     logger.debug(`pip_requirements.updateDependency(): ${upgrade.newValue}`);
     const lines = fileContent.split('\n');
diff --git a/lib/manager/pip_setup/extract.js b/lib/manager/pip_setup/extract.ts
similarity index 77%
rename from lib/manager/pip_setup/extract.js
rename to lib/manager/pip_setup/extract.ts
index f419e58ac74f9439193b4b7ecbfd6c691dc1a56f..1e3309cf83692df0b15678a3b7131667cbbff269 100644
--- a/lib/manager/pip_setup/extract.js
+++ b/lib/manager/pip_setup/extract.ts
@@ -1,25 +1,19 @@
-const { join } = require('upath');
-const { exec } = require('../../util/exec');
-const { logger } = require('../../logger');
-const { isSkipComment } = require('../../util/ignore');
-const { dependencyPattern } = require('../pip_requirements/extract');
+import { join } from 'upath';
+import { exec } from '../../util/exec';
+import { logger } from '../../logger';
+import { isSkipComment } from '../../util/ignore';
+import { dependencyPattern } from '../pip_requirements/extract';
+import { ExtractConfig, PackageFile, PackageDependency } from '../common';
 
-const pythonVersions = ['python', 'python3', 'python3.7'];
-let pythonAlias = null;
-module.exports = {
-  extractPackageFile,
-  extractSetupFile,
-  parsePythonVersion,
-  getPythonAlias,
-  pythonVersions,
-};
+export const pythonVersions = ['python', 'python3', 'python3.7'];
+let pythonAlias: string = null;
 
-function parsePythonVersion(str) {
+export function parsePythonVersion(str: string) {
   const arr = str.split(' ')[1].split('.');
   return [parseInt(arr[0], 10), parseInt(arr[1], 10)];
 }
 
-async function getPythonAlias() {
+export async function getPythonAlias() {
   if (pythonAlias) {
     return pythonAlias;
   }
@@ -37,10 +31,17 @@ async function getPythonAlias() {
   }
   return pythonAlias;
 }
-
-async function extractSetupFile(content, packageFile, config) {
+interface PythonSetup {
+  extras_require: string[];
+  install_requires: string[];
+}
+export async function extractSetupFile(
+  _content: string,
+  packageFile: string,
+  config: ExtractConfig
+): Promise<PythonSetup> {
   const cwd = config.localDir;
-  let cmd;
+  let cmd: string;
   const args = [join(__dirname, 'extract.py'), packageFile];
   // istanbul ignore if
   if (config.binarySource === 'docker') {
@@ -84,16 +85,20 @@ async function extractSetupFile(content, packageFile, config) {
   return JSON.parse(res.stdout);
 }
 
-async function extractPackageFile(content, packageFile, config) {
+export async function extractPackageFile(
+  content: string,
+  packageFile: string,
+  config: ExtractConfig
+): Promise<PackageFile> {
   logger.debug('pip_setup.extractPackageFile()');
-  let setup;
+  let setup: PythonSetup;
   try {
     setup = await extractSetupFile(content, packageFile, config);
   } catch (err) {
     logger.warn({ err, content, packageFile }, 'Failed to read setup.py file');
     return null;
   }
-  const requires = [];
+  const requires: string[] = [];
   if (setup.install_requires) {
     requires.push(...setup.install_requires);
   }
@@ -111,7 +116,7 @@ async function extractPackageFile(content, packageFile, config) {
         return null;
       }
       const rawline = lines[lineNumber];
-      let dep = {};
+      let dep: PackageDependency = {};
       const [, comment] = rawline.split('#').map(part => part.trim());
       if (isSkipComment(comment)) {
         dep.skipReason = 'ignored';
diff --git a/lib/manager/pip_setup/index.js b/lib/manager/pip_setup/index.js
deleted file mode 100644
index a6af78689a4f6a4c33747f28a3d4225461635416..0000000000000000000000000000000000000000
--- a/lib/manager/pip_setup/index.js
+++ /dev/null
@@ -1,10 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('../pip_requirements/update');
-
-const language = 'python';
-
-module.exports = {
-  extractPackageFile,
-  language,
-  updateDependency,
-};
diff --git a/lib/manager/pip_setup/index.ts b/lib/manager/pip_setup/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..816d4c0336b38314f237d5f222b339fc27b8eb05
--- /dev/null
+++ b/lib/manager/pip_setup/index.ts
@@ -0,0 +1,4 @@
+export { extractPackageFile } from './extract';
+export { updateDependency } from '../pip_requirements/update';
+
+export const language = 'python';
diff --git a/lib/manager/pipenv/artifacts.js b/lib/manager/pipenv/artifacts.ts
similarity index 66%
rename from lib/manager/pipenv/artifacts.js
rename to lib/manager/pipenv/artifacts.ts
index df1b7d66761860ebdd4902be3c251f3ba09614b7..f4af20c5f8af7b33b300384a1f41e80ae059e5e4 100644
--- a/lib/manager/pipenv/artifacts.js
+++ b/lib/manager/pipenv/artifacts.ts
@@ -1,24 +1,20 @@
-const fs = require('fs-extra');
-const upath = require('upath');
-const { exec } = require('../../util/exec');
-const { getChildProcessEnv } = require('../../util/env');
-const { logger } = require('../../logger');
+import { ensureDir, outputFile, readFile } from 'fs-extra';
+import { join, dirname } from 'upath';
+import { exec } from '../../util/exec';
+import { getChildProcessEnv } from '../../util/env';
+import { logger } from '../../logger';
+import { UpdateArtifactsResult, UpdateArtifactsConfig } from '../common';
 
-module.exports = {
-  updateArtifacts,
-};
-
-async function updateArtifacts(
-  pipfileName,
-  updatedDeps,
-  newPipfileContent,
-  config
-) {
+export async function updateArtifacts(
+  pipfileName: string,
+  _updatedDeps: string[],
+  newPipfileContent: string,
+  config: UpdateArtifactsConfig
+): Promise<UpdateArtifactsResult[]> {
   logger.debug(`pipenv.updateArtifacts(${pipfileName})`);
   process.env.PIPENV_CACHE_DIR =
-    process.env.PIPENV_CACHE_DIR ||
-    upath.join(config.cacheDir, './others/pipenv');
-  await fs.ensureDir(process.env.PIPENV_CACHE_DIR);
+    process.env.PIPENV_CACHE_DIR || join(config.cacheDir, './others/pipenv');
+  await ensureDir(process.env.PIPENV_CACHE_DIR);
   logger.debug('Using pipenv cache ' + process.env.PIPENV_CACHE_DIR);
   const lockFileName = pipfileName + '.lock';
   const existingLockFileContent = await platform.getFile(lockFileName);
@@ -26,16 +22,16 @@ async function updateArtifacts(
     logger.debug('No Pipfile.lock found');
     return null;
   }
-  const cwd = upath.join(config.localDir, upath.dirname(pipfileName));
-  let stdout;
-  let stderr;
+  const cwd = join(config.localDir, dirname(pipfileName));
+  let stdout: string;
+  let stderr: string;
   try {
-    const localPipfileFileName = upath.join(config.localDir, pipfileName);
-    await fs.outputFile(localPipfileFileName, newPipfileContent);
-    const localLockFileName = upath.join(config.localDir, lockFileName);
+    const localPipfileFileName = join(config.localDir, pipfileName);
+    await outputFile(localPipfileFileName, newPipfileContent);
+    const localLockFileName = join(config.localDir, lockFileName);
     const env = getChildProcessEnv(['LC_ALL', 'LANG', 'PIPENV_CACHE_DIR']);
     const startTime = process.hrtime();
-    let cmd;
+    let cmd: string;
     if (config.binarySource === 'docker') {
       logger.info('Running pipenv via docker');
       cmd = `docker run --rm `;
@@ -71,7 +67,7 @@ async function updateArtifacts(
       {
         file: {
           name: lockFileName,
-          contents: await fs.readFile(localLockFileName, 'utf8'),
+          contents: await readFile(localLockFileName, 'utf8'),
         },
       },
     ];
diff --git a/lib/manager/pipenv/extract.js b/lib/manager/pipenv/extract.ts
similarity index 75%
rename from lib/manager/pipenv/extract.js
rename to lib/manager/pipenv/extract.ts
index e5b6d392a9a51cfe8de232df298a1ca45e50bd0f..75eaeef9aaa08143ae7a20b3a47d0e6d36b18e70 100644
--- a/lib/manager/pipenv/extract.js
+++ b/lib/manager/pipenv/extract.ts
@@ -1,30 +1,49 @@
 import is from '@sindresorhus/is';
-
-const toml = require('toml');
+import toml from 'toml';
+import { RANGE_PATTERN } from '@renovate/pep440/lib/specifier';
+import { logger } from '../../logger';
+import { PackageFile, PackageDependency } from '../common';
 
 // based on https://www.python.org/dev/peps/pep-0508/#names
 const packageRegex = /^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$/i;
-const rangePattern = require('@renovate/pep440/lib/specifier').RANGE_PATTERN;
-const { logger } = require('../../logger');
+const rangePattern = RANGE_PATTERN;
 
 const specifierPartPattern = `\\s*${rangePattern.replace(
   /\?<\w+>/g,
   '?:'
 )}\\s*`;
 const specifierPattern = `${specifierPartPattern}(?:,${specifierPartPattern})*`;
+interface PipSource {
+  name: string;
+  url: string;
+}
 
-export { extractPackageFile };
+interface PipFile {
+  source: PipSource[];
+
+  packages?: Record<string, PipRequirement>;
+  'dev-packages'?: Record<string, PipRequirement>;
+}
 
-function extractPackageFile(content) {
+interface PipRequirement {
+  index?: string;
+  version?: string;
+  path?: string;
+  file?: string;
+  git?: string;
+}
+
+export function extractPackageFile(content: string): PackageFile {
   logger.debug('pipenv.extractPackageFile()');
-  let pipfile;
+
+  let pipfile: PipFile;
   try {
     pipfile = toml.parse(content);
   } catch (err) {
     logger.debug({ err }, 'Error parsing Pipfile');
     return null;
   }
-  const res = {};
+  const res: PackageFile = { deps: [] };
   if (pipfile.source) {
     res.registryUrls = pipfile.source.map(source => source.url);
   }
@@ -39,7 +58,10 @@ function extractPackageFile(content) {
   return null;
 }
 
-function extractFromSection(pipfile, section) {
+function extractFromSection(
+  pipfile: PipFile,
+  section: 'packages' | 'dev-packages'
+): PackageDependency[] {
   if (!(section in pipfile)) {
     return [];
   }
@@ -49,9 +71,9 @@ function extractFromSection(pipfile, section) {
   const deps = Object.entries(pipfileSection)
     .map(x => {
       const [depName, requirements] = x;
-      let currentValue;
-      let nestedVersion;
-      let skipReason;
+      let currentValue: string;
+      let nestedVersion: boolean;
+      let skipReason: string;
       if (requirements.git) {
         skipReason = 'git-dependency';
       } else if (requirements.file) {
@@ -85,7 +107,7 @@ function extractFromSection(pipfile, section) {
           skipReason = 'invalid-version';
         }
       }
-      const dep = {
+      const dep: PackageDependency = {
         depType: section,
         depName,
         managerData: {},
diff --git a/lib/manager/pipenv/index.js b/lib/manager/pipenv/index.js
deleted file mode 100644
index 28b8605f087b5d287f54b7f9cf580d73298c6cac..0000000000000000000000000000000000000000
--- a/lib/manager/pipenv/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-const { updateArtifacts } = require('./artifacts');
-
-const language = 'python';
-
-module.exports = {
-  extractPackageFile,
-  updateDependency,
-  updateArtifacts,
-  language,
-};
diff --git a/lib/manager/pipenv/index.ts b/lib/manager/pipenv/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..29e3d697e21f093db11a549556a2c568b1ad1d9c
--- /dev/null
+++ b/lib/manager/pipenv/index.ts
@@ -0,0 +1,5 @@
+export { extractPackageFile } from './extract';
+export { updateDependency } from './update';
+export { updateArtifacts } from './artifacts';
+
+export const language = 'python';
diff --git a/lib/manager/pipenv/update.js b/lib/manager/pipenv/update.ts
similarity index 80%
rename from lib/manager/pipenv/update.js
rename to lib/manager/pipenv/update.ts
index c4b95b953ebd6d06885da0e0e62d04b6bd32f888..b283af298bad14c8a9a080a09835a1259b7e8527 100644
--- a/lib/manager/pipenv/update.js
+++ b/lib/manager/pipenv/update.ts
@@ -1,18 +1,20 @@
-const _ = require('lodash');
-const toml = require('toml');
-const { logger } = require('../../logger');
-
-module.exports = {
-  updateDependency,
-};
+import { isEqual } from 'lodash';
+import { parse } from 'toml';
+import { logger } from '../../logger';
+import { Upgrade } from '../common';
 
 // Return true if the match string is found at index in content
-function matchAt(content, index, match) {
+function matchAt(content: string, index: number, match: string) {
   return content.substring(index, index + match.length) === match;
 }
 
 // Replace oldString with newString at location index of content
-function replaceAt(content, index, oldString, newString) {
+function replaceAt(
+  content: string,
+  index: number,
+  oldString: string,
+  newString: string
+) {
   logger.debug(`Replacing ${oldString} with ${newString} at index ${index}`);
   return (
     content.substr(0, index) +
@@ -21,13 +23,16 @@ function replaceAt(content, index, oldString, newString) {
   );
 }
 
-function updateDependency(fileContent, upgrade) {
+export function updateDependency(
+  fileContent: string,
+  upgrade: Upgrade
+): string {
   try {
     const { depType, depName, newValue, managerData = {} } = upgrade;
     const { nestedVersion } = managerData;
     logger.debug(`pipenv.updateDependency(): ${newValue}`);
-    const parsedContents = toml.parse(fileContent);
-    let oldVersion;
+    const parsedContents = parse(fileContent);
+    let oldVersion: string;
     if (nestedVersion) {
       oldVersion = parsedContents[depType][depName].version;
     } else {
@@ -58,7 +63,7 @@ function updateDependency(fileContent, upgrade) {
           newString
         );
         // Compare the parsed toml structure of old and new
-        if (_.isEqual(parsedContents, toml.parse(testContent))) {
+        if (isEqual(parsedContents, parse(testContent))) {
           newFileContent = testContent;
           break;
         } else {
diff --git a/lib/manager/poetry/artifacts.js b/lib/manager/poetry/artifacts.ts
similarity index 65%
rename from lib/manager/poetry/artifacts.js
rename to lib/manager/poetry/artifacts.ts
index 1c8096c6b41339f9bf8c6912ea1bc9d7c4fd0834..7a165c214e2bd4f85ac15b50ffae63b583b1966f 100644
--- a/lib/manager/poetry/artifacts.js
+++ b/lib/manager/poetry/artifacts.ts
@@ -1,32 +1,28 @@
-const upath = require('upath');
-const process = require('process');
-const fs = require('fs-extra');
-const { exec } = require('../../util/exec');
-const { getChildProcessEnv } = require('../../util/env');
+import { parse, join } from 'upath';
+import { hrtime } from 'process';
+import { outputFile, readFile } from 'fs-extra';
+import { exec } from '../../util/exec';
+import { getChildProcessEnv } from '../../util/env';
+import { logger } from '../../logger';
+import { UpdateArtifactsConfig, UpdateArtifactsResult } from '../common';
 
-const { logger } = require('../../logger');
-
-module.exports = {
-  updateArtifacts,
-};
-
-async function updateArtifacts(
-  packageFileName,
-  updatedDeps,
-  newPackageFileContent,
-  config
-) {
+export async function updateArtifacts(
+  packageFileName: string,
+  updatedDeps: string[],
+  newPackageFileContent: string,
+  config: UpdateArtifactsConfig
+): Promise<UpdateArtifactsResult[]> {
   await logger.debug(`poetry.updateArtifacts(${packageFileName})`);
   if (updatedDeps === undefined || updatedDeps.length < 1) {
     logger.debug('No updated poetry deps - returning null');
     return null;
   }
-  const subDirectory = upath.parse(packageFileName).dir;
-  const lockFileName = upath.join(subDirectory, 'poetry.lock');
+  const subDirectory = parse(packageFileName).dir;
+  const lockFileName = join(subDirectory, 'poetry.lock');
   let existingLockFileContent = await platform.getFile(lockFileName);
-  let oldLockFileName;
+  let oldLockFileName: string;
   if (!existingLockFileContent) {
-    oldLockFileName = upath.join(subDirectory, 'pyproject.lock');
+    oldLockFileName = join(subDirectory, 'pyproject.lock');
     existingLockFileContent = await platform.getFile(oldLockFileName);
     // istanbul ignore if
     if (existingLockFileContent) {
@@ -36,17 +32,17 @@ async function updateArtifacts(
       return null;
     }
   }
-  const localPackageFileName = upath.join(config.localDir, packageFileName);
-  const localLockFileName = upath.join(config.localDir, lockFileName);
-  let stdout;
-  let stderr;
-  const startTime = process.hrtime();
+  const localPackageFileName = join(config.localDir, packageFileName);
+  const localLockFileName = join(config.localDir, lockFileName);
+  let stdout: string;
+  let stderr: string;
+  const startTime = hrtime();
   try {
-    await fs.outputFile(localPackageFileName, newPackageFileContent);
+    await outputFile(localPackageFileName, newPackageFileContent);
     logger.debug(`Updating ${lockFileName}`);
-    const cwd = upath.join(config.localDir, subDirectory);
+    const cwd = join(config.localDir, subDirectory);
     const env = getChildProcessEnv();
-    let cmd;
+    let cmd: string;
     // istanbul ignore if
     if (config.binarySource === 'docker') {
       logger.info('Running poetry via docker');
@@ -69,19 +65,19 @@ async function updateArtifacts(
         env,
       }));
     }
-    const duration = process.hrtime(startTime);
+    const duration = hrtime(startTime);
     const seconds = Math.round(duration[0] + duration[1] / 1e9);
     logger.info(
       { seconds, type: `${lockFileName}`, stdout, stderr },
       'Updated lockfile'
     );
     logger.debug(`Returning updated ${lockFileName}`);
-    const newPoetryLockContent = await fs.readFile(localLockFileName, 'utf8');
+    const newPoetryLockContent = await readFile(localLockFileName, 'utf8');
     if (existingLockFileContent === newPoetryLockContent) {
       logger.debug(`${lockFileName} is unchanged`);
       return null;
     }
-    let fileName;
+    let fileName: string;
     // istanbul ignore if
     if (oldLockFileName) {
       fileName = oldLockFileName;
diff --git a/lib/manager/poetry/extract.js b/lib/manager/poetry/extract.ts
similarity index 67%
rename from lib/manager/poetry/extract.js
rename to lib/manager/poetry/extract.ts
index 309124250797358c39cfa23947cb27f9f784c7ab..478ddad293ec32eaee86472bd4eedb39c6d201e7 100644
--- a/lib/manager/poetry/extract.js
+++ b/lib/manager/poetry/extract.ts
@@ -1,16 +1,17 @@
-const toml = require('toml');
-const semver = require('../../versioning/poetry');
-const { logger } = require('../../logger');
+import { parse } from 'toml';
+import { isValid } from '../../versioning/poetry';
+import { logger } from '../../logger';
+import { PackageFile, PackageDependency } from '../common';
+import { PoetryFile, PoetrySection } from './types';
 
-module.exports = {
-  extractPackageFile,
-};
-
-function extractPackageFile(content, fileName) {
+export function extractPackageFile(
+  content: string,
+  fileName: string
+): PackageFile {
   logger.trace(`poetry.extractPackageFile(${fileName})`);
-  let pyprojectfile;
+  let pyprojectfile: PoetryFile;
   try {
-    pyprojectfile = toml.parse(content);
+    pyprojectfile = parse(content);
   } catch (err) {
     logger.debug({ err }, 'Error parsing pyproject.toml file');
     return null;
@@ -30,20 +31,23 @@ function extractPackageFile(content, fileName) {
   return { deps };
 }
 
-function extractFromSection(parsedFile, section) {
+function extractFromSection(
+  parsedFile: PoetryFile,
+  section: keyof PoetrySection
+): PackageDependency[] {
   const deps = [];
   const sectionContent = parsedFile.tool.poetry[section];
   if (!sectionContent) {
     return [];
   }
   Object.keys(sectionContent).forEach(depName => {
-    let skipReason;
+    let skipReason: string;
     let currentValue = sectionContent[depName];
     let nestedVersion = false;
     if (typeof currentValue !== 'string') {
-      const version = sectionContent[depName].version;
-      const path = sectionContent[depName].path;
-      const git = sectionContent[depName].git;
+      const version = currentValue.version;
+      const path = currentValue.path;
+      const git = currentValue.git;
       if (version) {
         currentValue = version;
         nestedVersion = true;
@@ -64,16 +68,16 @@ function extractFromSection(parsedFile, section) {
         skipReason = 'multiple-constraint-dep';
       }
     }
-    const dep = {
+    const dep: PackageDependency = {
       depName,
       depType: section,
-      currentValue,
+      currentValue: currentValue as string,
       managerData: { nestedVersion },
       datasource: 'pypi',
     };
     if (skipReason) {
       dep.skipReason = skipReason;
-    } else if (!semver.isValid(dep.currentValue)) {
+    } else if (!isValid(dep.currentValue)) {
       dep.skipReason = 'unknown-version';
     }
     deps.push(dep);
diff --git a/lib/manager/poetry/index.js b/lib/manager/poetry/index.js
deleted file mode 100644
index 5a4a763d731301f9d109c41dea2ab3e65ef0d4b3..0000000000000000000000000000000000000000
--- a/lib/manager/poetry/index.js
+++ /dev/null
@@ -1,14 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-const { updateArtifacts } = require('./artifacts');
-
-const language = 'python';
-
-module.exports = {
-  extractPackageFile,
-  updateArtifacts,
-  language,
-  updateDependency,
-  // TODO: Support this
-  supportsLockFileMaintenance: false,
-};
diff --git a/lib/manager/poetry/index.ts b/lib/manager/poetry/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..62e8aafece55f975fffabd4264350ffbaabcee61
--- /dev/null
+++ b/lib/manager/poetry/index.ts
@@ -0,0 +1,6 @@
+export { extractPackageFile } from './extract';
+export { updateDependency } from './update';
+export { updateArtifacts } from './artifacts';
+
+export const language = 'python';
+export const supportsLockFileMaintenance = false;
diff --git a/lib/manager/poetry/types.ts b/lib/manager/poetry/types.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e409718d83cdfe9d36bd66d84899b468fb533190
--- /dev/null
+++ b/lib/manager/poetry/types.ts
@@ -0,0 +1,17 @@
+export interface PoetrySection {
+  dependencies: Record<string, PoetryDependency | string>;
+  'dev-dependencies': Record<string, PoetryDependency | string>;
+  extras: Record<string, PoetryDependency | string>;
+}
+
+export interface PoetryFile {
+  tool?: {
+    poetry?: PoetrySection;
+  };
+}
+
+export interface PoetryDependency {
+  path?: string;
+  git?: string;
+  version?: string;
+}
diff --git a/lib/manager/poetry/update.js b/lib/manager/poetry/update.ts
similarity index 81%
rename from lib/manager/poetry/update.js
rename to lib/manager/poetry/update.ts
index a826d1a453ffe470dc23a432cad24e4df9edfc48..b1321b17152aab04a76d80df3aae85398b08cc94 100644
--- a/lib/manager/poetry/update.js
+++ b/lib/manager/poetry/update.ts
@@ -1,20 +1,22 @@
-const _ = require('lodash');
-const toml = require('toml');
-
-const { logger } = require('../../logger');
-
-module.exports = {
-  updateDependency,
-};
+import { isEqual } from 'lodash';
+import { parse } from 'toml';
+import { logger } from '../../logger';
+import { Upgrade } from '../common';
+import { PoetryFile } from './types';
 
 // TODO: Maybe factor out common code from pipenv.updateDependency and poetry.updateDependency
 // Return true if the match string is found at index in content
-function matchAt(content, index, match) {
+function matchAt(content: string, index: number, match: string) {
   return content.substring(index, index + match.length) === match;
 }
 
 // Replace oldString with newString at location index of content
-function replaceAt(content, index, oldString, newString) {
+function replaceAt(
+  content: string,
+  index: number,
+  oldString: string,
+  newString: string
+) {
   logger.debug(`Replacing ${oldString} with ${newString} at index ${index}`);
   return (
     content.substr(0, index) +
@@ -23,14 +25,17 @@ function replaceAt(content, index, oldString, newString) {
   );
 }
 
-function updateDependency(fileContent, upgrade) {
+export function updateDependency(
+  fileContent: string,
+  upgrade: Upgrade<{ nestedVersion?: boolean }>
+): string {
   logger.trace({ config: upgrade }, 'poetry.updateDependency()');
   if (!upgrade) {
     return null;
   }
   const { depType, depName, newValue, managerData } = upgrade;
   const { nestedVersion } = managerData;
-  const parsedContents = toml.parse(fileContent);
+  const parsedContents: PoetryFile = parse(fileContent);
   if (!parsedContents.tool.poetry[depType]) {
     logger.info(
       { config: upgrade },
@@ -38,7 +43,7 @@ function updateDependency(fileContent, upgrade) {
     );
     return null;
   }
-  let oldVersion;
+  let oldVersion: string;
   if (nestedVersion) {
     const oldDep = parsedContents.tool.poetry[depType][depName];
     if (!oldDep) {
@@ -84,7 +89,7 @@ function updateDependency(fileContent, upgrade) {
         newString
       );
       // Compare the parsed toml structure of old and new
-      if (_.isEqual(parsedContents, toml.parse(testContent))) {
+      if (isEqual(parsedContents, parse(testContent))) {
         newFileContent = testContent;
         break;
       } else {
diff --git a/lib/manager/pub/extract.js b/lib/manager/pub/extract.ts
similarity index 58%
rename from lib/manager/pub/extract.js
rename to lib/manager/pub/extract.ts
index 99bce6dc9bb805a1dfff923d9ef9dca42cb13613..f2aa0ffb05d0434863b11567130ed26c77625c78 100644
--- a/lib/manager/pub/extract.js
+++ b/lib/manager/pub/extract.ts
@@ -1,12 +1,12 @@
-const yaml = require('js-yaml');
-const npm = require('../../versioning/npm/index');
-const { logger } = require('../../logger');
-
-module.exports = {
-  extractPackageFile,
-};
-
-function getDeps(depsObj, preset = {}) {
+import { safeLoad } from 'js-yaml';
+import { isValid } from '../../versioning/npm/index';
+import { logger } from '../../logger';
+import { PackageDependency, PackageFile } from '../common';
+
+function getDeps(
+  depsObj: { [x: string]: any },
+  preset: { depType: string }
+): PackageDependency[] {
   if (!depsObj) return [];
   return Object.keys(depsObj).reduce((acc, depName) => {
     if (depName === 'meta') return acc;
@@ -14,16 +14,15 @@ function getDeps(depsObj, preset = {}) {
     const section = depsObj[depName];
     let currentValue = null;
 
-    if (section && npm.isValid(section.toString())) {
+    if (section && isValid(section.toString())) {
       currentValue = section.toString();
     }
 
-    if (section.version && npm.isValid(section.version.toString())) {
+    if (section.version && isValid(section.version.toString())) {
       currentValue = section.version.toString();
     }
 
-    /** @type any */
-    const dep = { ...preset, depName, currentValue };
+    const dep: PackageDependency = { ...preset, depName, currentValue };
     if (!currentValue) {
       dep.skipReason = 'not-a-version';
     }
@@ -32,9 +31,12 @@ function getDeps(depsObj, preset = {}) {
   }, []);
 }
 
-function extractPackageFile(content, packageFile) {
+export function extractPackageFile(
+  content: string,
+  packageFile: string
+): PackageFile {
   try {
-    const doc = yaml.safeLoad(content);
+    const doc = safeLoad(content);
     const deps = [
       ...getDeps(doc.dependencies, {
         depType: 'dependencies',
diff --git a/lib/manager/pub/index.js b/lib/manager/pub/index.js
deleted file mode 100644
index 749cae6f4db0ec27bb7cde5845780752ce144ac9..0000000000000000000000000000000000000000
--- a/lib/manager/pub/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-
-module.exports = {
-  extractPackageFile,
-  updateDependency,
-};
diff --git a/lib/manager/pub/index.ts b/lib/manager/pub/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..730b5b60ba42a35b24b351e0793557e86f185454
--- /dev/null
+++ b/lib/manager/pub/index.ts
@@ -0,0 +1,2 @@
+export { extractPackageFile } from './extract';
+export { updateDependency } from './update';
diff --git a/lib/manager/pub/update.js b/lib/manager/pub/update.ts
similarity index 68%
rename from lib/manager/pub/update.js
rename to lib/manager/pub/update.ts
index ff1ff78481b127abb02909c6d392736c31214fa8..53c3680346732cd3ebd6cdef4812e9de848d466c 100644
--- a/lib/manager/pub/update.js
+++ b/lib/manager/pub/update.ts
@@ -1,29 +1,29 @@
-const yaml = require('js-yaml');
+import { load } from 'js-yaml';
+import { Upgrade } from '../common';
 
-module.exports = {
-  updateDependency,
-};
-
-function updateDependency(fileContent, upgrade) {
+export function updateDependency(
+  fileContent: string,
+  upgrade: Upgrade
+): string {
   const { depName, depType, currentValue, newValue } = upgrade;
 
   if (currentValue === newValue) return fileContent;
 
   const sectionBeginRegExp = new RegExp(`^${depType}:`);
-  const isSectionBegin = line => sectionBeginRegExp.test(line);
-  const isSectionEnd = line => /^[^\s]/.test(line);
+  const isSectionBegin = (line: string) => sectionBeginRegExp.test(line);
+  const isSectionEnd = (line: string) => /^[^\s]/.test(line);
 
   const simpleDepRegExp = new RegExp(`^\\s+${depName}:\\s*[^\\s]+\\s*$`);
-  const isOneLineDep = line => simpleDepRegExp.test(line);
+  const isOneLineDep = (line: string) => simpleDepRegExp.test(line);
 
   const multilineDepRegExp = new RegExp(`^\\s+${depName}:\\s*$`);
-  const isMultilineDepRegExp = line => multilineDepRegExp.test(line);
+  const isMultilineDepRegExp = (line: string) => multilineDepRegExp.test(line);
 
   const versionRegExp = new RegExp('^\\s+version:\\s*[^\\s]+\\s*$');
-  const isVersionLine = line => versionRegExp.test(line);
+  const isVersionLine = (line: string) => versionRegExp.test(line);
 
-  const isValidVersion = line => {
-    const version = yaml.load(line.replace(/^.*:\s*/, '')).toString();
+  const isValidVersion = (line: string) => {
+    const version = load(line.replace(/^.*:\s*/, '')).toString();
     return version === currentValue;
   };
 
diff --git a/lib/manager/ruby-version/extract.js b/lib/manager/ruby-version/extract.js
deleted file mode 100644
index f999ecbc598e56014b7623f9ac53ca7aafbf0289..0000000000000000000000000000000000000000
--- a/lib/manager/ruby-version/extract.js
+++ /dev/null
@@ -1,19 +0,0 @@
-const ruby = require('../../versioning/ruby');
-const { logger } = require('../../logger');
-
-module.exports = {
-  extractPackageFile,
-};
-
-function extractPackageFile(content) {
-  logger.trace('ruby-version.extractPackageFile()');
-  const dep = {
-    depName: 'ruby',
-    currentValue: content.trim(),
-    datasource: 'rubyVersion',
-  };
-  if (!ruby.isValid(dep.currentValue)) {
-    dep.skipReason = 'unsupported-version';
-  }
-  return { deps: [dep] };
-}
diff --git a/lib/manager/ruby-version/extract.ts b/lib/manager/ruby-version/extract.ts
new file mode 100644
index 0000000000000000000000000000000000000000..54fe52bcf66f603588da794503e99b4efa597ad7
--- /dev/null
+++ b/lib/manager/ruby-version/extract.ts
@@ -0,0 +1,16 @@
+import { isValid } from '../../versioning/ruby';
+import { logger } from '../../logger';
+import { PackageDependency, PackageFile } from '../common';
+
+export function extractPackageFile(content: string): PackageFile {
+  logger.trace('ruby-version.extractPackageFile()');
+  const dep: PackageDependency = {
+    depName: 'ruby',
+    currentValue: content.trim(),
+    datasource: 'rubyVersion',
+  };
+  if (!isValid(dep.currentValue)) {
+    dep.skipReason = 'unsupported-version';
+  }
+  return { deps: [dep] };
+}
diff --git a/lib/manager/ruby-version/index.js b/lib/manager/ruby-version/index.js
deleted file mode 100644
index 8ad1ffee8f458457c2a7271493621dc6e6eb0ced..0000000000000000000000000000000000000000
--- a/lib/manager/ruby-version/index.js
+++ /dev/null
@@ -1,10 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-
-const language = 'ruby';
-
-module.exports = {
-  extractPackageFile,
-  language,
-  updateDependency,
-};
diff --git a/lib/manager/ruby-version/index.ts b/lib/manager/ruby-version/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3c09a2db01cf681112a02f94a94bf95c5f17b0c7
--- /dev/null
+++ b/lib/manager/ruby-version/index.ts
@@ -0,0 +1,4 @@
+export { extractPackageFile } from './extract';
+export { updateDependency } from './update';
+
+export const language = 'ruby';
diff --git a/lib/manager/ruby-version/update.js b/lib/manager/ruby-version/update.js
deleted file mode 100644
index d84012f0e9c2c312d4457b75a963db5575ff80dd..0000000000000000000000000000000000000000
--- a/lib/manager/ruby-version/update.js
+++ /dev/null
@@ -1,10 +0,0 @@
-const { logger } = require('../../logger');
-
-module.exports = {
-  updateDependency,
-};
-
-function updateDependency(fileContent, upgrade) {
-  logger.debug(`ruby-version.updateDependency(): ${upgrade.newValue}`);
-  return `${upgrade.newValue}\n`;
-}
diff --git a/lib/manager/ruby-version/update.ts b/lib/manager/ruby-version/update.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3734bf268bbbb422df2687c07c2154b455fa6227
--- /dev/null
+++ b/lib/manager/ruby-version/update.ts
@@ -0,0 +1,10 @@
+import { logger } from '../../logger';
+import { Upgrade } from '../common';
+
+export function updateDependency(
+  _fileContent: string,
+  upgrade: Upgrade
+): string {
+  logger.debug(`ruby-version.updateDependency(): ${upgrade.newValue}`);
+  return `${upgrade.newValue}\n`;
+}
diff --git a/lib/manager/sbt/extract.js b/lib/manager/sbt/extract.ts
similarity index 75%
rename from lib/manager/sbt/extract.js
rename to lib/manager/sbt/extract.ts
index 07bf40d5e03b318142bef27f031b043e36c07247..9d74af885f5903d80175a95b28f98a4e4927e72f 100644
--- a/lib/manager/sbt/extract.js
+++ b/lib/manager/sbt/extract.ts
@@ -1,36 +1,38 @@
-const { DEFAULT_MAVEN_REPO } = require('../maven/extract');
+import { DEFAULT_MAVEN_REPO } from '../maven/extract';
+import { PackageFile, PackageDependency } from '../common';
 
-const isComment = str => /^\s*\/\//.test(str);
+const isComment = (str: string) => /^\s*\/\//.test(str);
 
-const isSingleLineDep = str =>
+const isSingleLineDep = (str: string) =>
   /^\s*(libraryDependencies|dependencyOverrides)\s*\+=\s*/.test(str);
 
-const isDepsBegin = str =>
+const isDepsBegin = (str: string) =>
   /^\s*(libraryDependencies|dependencyOverrides)\s*\+\+=\s*/.test(str);
 
-const isPluginDep = str => /^\s*addSbtPlugin\s*\(.*\)\s*$/.test(str);
+const isPluginDep = (str: string) => /^\s*addSbtPlugin\s*\(.*\)\s*$/.test(str);
 
-const isStringLiteral = str => /^"[^"]*"$/.test(str);
+const isStringLiteral = (str: string) => /^"[^"]*"$/.test(str);
 
-const isScalaVersion = str => /^\s*scalaVersion\s*:=\s*"[^"]*"\s*$/.test(str);
-const getScalaVersion = str =>
+const isScalaVersion = (str: string) =>
+  /^\s*scalaVersion\s*:=\s*"[^"]*"\s*$/.test(str);
+const getScalaVersion = (str: string) =>
   str.replace(/^\s*scalaVersion\s*:=\s*"/, '').replace(/"\s*$/, '');
 
-const isResolver = str =>
+const isResolver = (str: string) =>
   /^\s*(resolvers\s*\+\+?=\s*(Seq\()?)?"[^"]*"\s*at\s*"[^"]*"[\s,)]*$/.test(
     str
   );
-const getResolverUrl = str =>
+const getResolverUrl = (str: string) =>
   str
     .replace(/^\s*(resolvers\s*\+\+?=\s*(Seq\()?)?"[^"]*"\s*at\s*"/, '')
     .replace(/"[\s,)]*$/, '');
 
-const isVarDef = str =>
+const isVarDef = (str: string) =>
   /^\s*val\s+[_a-zA-Z][_a-zA-Z0-9]*\s*=\s*"[^"]*"\s*$/.test(str);
-const getVarName = str =>
+const getVarName = (str: string) =>
   str.replace(/^\s*val\s+/, '').replace(/\s*=\s*"[^"]*"\s*$/, '');
-const isVarName = str => /^[_a-zA-Z][_a-zA-Z0-9]*$/.test(str);
-const getVarInfo = (str, ctx) => {
+const isVarName = (str: string) => /^[_a-zA-Z][_a-zA-Z0-9]*$/.test(str);
+const getVarInfo = (str: string, ctx: ParseContext) => {
   const { fileOffset } = ctx;
   const rightPart = str.replace(/^\s*val\s+[_a-zA-Z][_a-zA-Z0-9]*\s*=\s*"/, '');
   const fileReplacePosition = str.search(rightPart) + fileOffset;
@@ -38,14 +40,21 @@ const getVarInfo = (str, ctx) => {
   return { val, fileReplacePosition };
 };
 
-function parseDepExpr(expr, ctx) {
+interface ParseContext {
+  fileOffset: number;
+  scalaVersion: string;
+  variables: any;
+  depType?: string;
+}
+
+function parseDepExpr(expr: string, ctx: ParseContext) {
   const { scalaVersion, fileOffset, variables } = ctx;
   let { depType } = ctx;
 
-  const isValidToken = str =>
+  const isValidToken = (str: string) =>
     isStringLiteral(str) || (isVarName(str) && !!variables[str]);
 
-  const resolveToken = str =>
+  const resolveToken = (str: string) =>
     isStringLiteral(str)
       ? str.replace(/^"/, '').replace(/"$/, '')
       : variables[str].val;
@@ -85,7 +94,7 @@ function parseDepExpr(expr, ctx) {
     depType = rawScope.replace(/^"/, '').replace(/"$/, '');
   }
 
-  let fileReplacePosition;
+  let fileReplacePosition: number;
   if (isStringLiteral(rawVersion)) {
     // Calculate fileReplacePosition incrementally
     // help us to avoid errors in updating phase.
@@ -101,7 +110,7 @@ function parseDepExpr(expr, ctx) {
     fileReplacePosition = variables[rawVersion].fileReplacePosition;
   }
 
-  const result = {
+  const result: PackageDependency = {
     depName,
     currentValue,
     fileReplacePosition,
@@ -113,19 +122,30 @@ function parseDepExpr(expr, ctx) {
 
   return result;
 }
+interface ParseOptions {
+  fileOffset?: number;
+  isMultiDeps?: boolean;
+  scalaVersion?: string;
+  variables?: Record<string, any>;
+}
 
-function parseSbtLine(acc, line, lineIndex, lines) {
+function parseSbtLine(
+  acc: PackageFile & ParseOptions,
+  line: string,
+  lineIndex: number,
+  lines: string[]
+): PackageFile & ParseOptions {
   const { deps, registryUrls, fileOffset, variables } = acc;
 
   let { isMultiDeps, scalaVersion } = acc;
 
-  const ctx = {
+  const ctx: ParseContext = {
     scalaVersion,
     fileOffset,
     variables,
   };
 
-  let dep = null;
+  let dep: PackageDependency = null;
   if (!isComment(line)) {
     if (isScalaVersion(line)) {
       isMultiDeps = false;
@@ -170,7 +190,7 @@ function parseSbtLine(acc, line, lineIndex, lines) {
   if (dep)
     deps.push({
       datasource: 'sbt',
-      registryUrls,
+      registryUrls: registryUrls as string[],
       ...dep,
     });
 
@@ -185,7 +205,7 @@ function parseSbtLine(acc, line, lineIndex, lines) {
   return null;
 }
 
-function extractPackageFile(content) {
+export function extractPackageFile(content: string): PackageFile {
   if (!content) return null;
   const lines = content.split(/\n/);
   return lines.reduce(parseSbtLine, {
@@ -197,7 +217,3 @@ function extractPackageFile(content) {
     variables: {},
   });
 }
-
-module.exports = {
-  extractPackageFile,
-};
diff --git a/lib/manager/sbt/index.js b/lib/manager/sbt/index.js
deleted file mode 100644
index 749cae6f4db0ec27bb7cde5845780752ce144ac9..0000000000000000000000000000000000000000
--- a/lib/manager/sbt/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-
-module.exports = {
-  extractPackageFile,
-  updateDependency,
-};
diff --git a/lib/manager/sbt/index.ts b/lib/manager/sbt/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..730b5b60ba42a35b24b351e0793557e86f185454
--- /dev/null
+++ b/lib/manager/sbt/index.ts
@@ -0,0 +1,2 @@
+export { extractPackageFile } from './extract';
+export { updateDependency } from './update';
diff --git a/lib/manager/sbt/update.js b/lib/manager/sbt/update.js
deleted file mode 100644
index 5ab2e6e4e8da00366929311bf6c25b88ecbcc6a0..0000000000000000000000000000000000000000
--- a/lib/manager/sbt/update.js
+++ /dev/null
@@ -1,5 +0,0 @@
-const { updateAtPosition } = require('../maven/update');
-
-module.exports = {
-  updateDependency: updateAtPosition,
-};
diff --git a/lib/manager/sbt/update.ts b/lib/manager/sbt/update.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0d7226b3719017a03587f2e58bcea9c91930eeb1
--- /dev/null
+++ b/lib/manager/sbt/update.ts
@@ -0,0 +1 @@
+export { updateAtPosition as updateDependency } from '../maven/update';
diff --git a/lib/manager/swift/extract.js b/lib/manager/swift/extract.ts
similarity index 93%
rename from lib/manager/swift/extract.js
rename to lib/manager/swift/extract.ts
index bc5cbb9dce7badcb81f0babf3c1c10ed7a46ab8c..c55b10b1d3d1433f3d011ce37561b38c56db0ff8 100644
--- a/lib/manager/swift/extract.js
+++ b/lib/manager/swift/extract.ts
@@ -1,4 +1,5 @@
-const { isValid } = require('../../versioning/swift');
+import { isValid } from '../../versioning/swift';
+import { PackageFile, PackageDependency } from '../common';
 
 const regExps = {
   wildcard: /^.*?/,
@@ -86,8 +87,14 @@ function searchKeysForState(state) {
       return [DEPS];
   }
 }
+interface MatchResult {
+  idx: number;
+  len: number;
+  label: string;
+  substr: string;
+}
 
-function getMatch(str, state) {
+function getMatch(str: string, state: string): MatchResult {
   const keys = searchKeysForState(state);
   let result = null;
   for (let i = 0; i < keys.length; i += 1) {
@@ -110,7 +117,7 @@ function getMatch(str, state) {
   return result;
 }
 
-function getDepName(url) {
+function getDepName(url: string) {
   try {
     const { host, pathname } = new URL(url);
     if (host === 'github.com' || host === 'gitlab.com') {
@@ -125,27 +132,31 @@ function getDepName(url) {
   }
 }
 
-function extractPackageFile(content, packageFile = null) {
+export function extractPackageFile(
+  content: string,
+  packageFile: string = null
+): PackageFile {
   if (!content) return null;
 
-  const result = {
+  const result: PackageFile = {
     packageFile,
+    deps: null,
   };
-  const deps = [];
+  const deps: PackageDependency[] = [];
 
   let offset = 0;
   let restStr = content;
-  let state = null;
+  let state: string = null;
   let match = getMatch(restStr, state);
 
-  let lookupName = null;
-  let currentValue = null;
-  let fileReplacePosition = null;
+  let lookupName: string = null;
+  let currentValue: string = null;
+  let fileReplacePosition: number = null;
 
   function yieldDep() {
     const depName = getDepName(lookupName);
     if (depName && currentValue && fileReplacePosition) {
-      const dep = {
+      const dep: PackageDependency = {
         datasource: 'gitTags',
         depName,
         lookupName,
@@ -340,7 +351,3 @@ function extractPackageFile(content, packageFile = null) {
   }
   return deps.length ? { ...result, deps } : null;
 }
-
-module.exports = {
-  extractPackageFile,
-};
diff --git a/lib/manager/swift/index.js b/lib/manager/swift/index.js
deleted file mode 100644
index 749cae6f4db0ec27bb7cde5845780752ce144ac9..0000000000000000000000000000000000000000
--- a/lib/manager/swift/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-
-module.exports = {
-  extractPackageFile,
-  updateDependency,
-};
diff --git a/lib/manager/swift/index.ts b/lib/manager/swift/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..730b5b60ba42a35b24b351e0793557e86f185454
--- /dev/null
+++ b/lib/manager/swift/index.ts
@@ -0,0 +1,2 @@
+export { extractPackageFile } from './extract';
+export { updateDependency } from './update';
diff --git a/lib/manager/swift/update.js b/lib/manager/swift/update.ts
similarity index 81%
rename from lib/manager/swift/update.js
rename to lib/manager/swift/update.ts
index 09b2baa68c4902af34d01c81a03b376feaf7735b..66131fc9568673a488c64405b7564efefa6e649e 100644
--- a/lib/manager/swift/update.js
+++ b/lib/manager/swift/update.ts
@@ -1,8 +1,12 @@
-const { isVersion } = require('../../versioning/swift');
+import { isVersion } from '../../versioning/swift';
+import { Upgrade } from '../common';
 
 const fromParam = /^\s*from\s*:\s*"([^"]+)"\s*$/;
 
-function updateDependency(fileContent, upgrade) {
+export function updateDependency(
+  fileContent: string,
+  upgrade: Upgrade
+): string {
   const { currentValue, newValue, fileReplacePosition } = upgrade;
   const leftPart = fileContent.slice(0, fileReplacePosition);
   const rightPart = fileContent.slice(fileReplacePosition);
@@ -24,7 +28,3 @@ function updateDependency(fileContent, upgrade) {
   }
   return null;
 }
-
-module.exports = {
-  updateDependency,
-};
diff --git a/lib/manager/terraform/extract.js b/lib/manager/terraform/extract.ts
similarity index 89%
rename from lib/manager/terraform/extract.js
rename to lib/manager/terraform/extract.ts
index 79c531664b7746feb8860cb2326e00043ea75cc6..808a67e9ca9ed34879be1fbb5b25cfa4dcd1f79c 100644
--- a/lib/manager/terraform/extract.js
+++ b/lib/manager/terraform/extract.ts
@@ -1,16 +1,13 @@
-const { logger } = require('../../logger');
-const { isValid, isVersion } = require('../../versioning/hashicorp');
+import { logger } from '../../logger';
+import { isValid, isVersion } from '../../versioning/hashicorp';
+import { PackageDependency, PackageFile } from '../common';
 
-module.exports = {
-  extractPackageFile,
-};
-
-function extractPackageFile(content) {
+export function extractPackageFile(content: string): PackageFile {
   logger.trace({ content }, 'terraform.extractPackageFile()');
   if (!content.includes('module "')) {
     return null;
   }
-  const deps = [];
+  const deps: PackageDependency[] = [];
   try {
     const lines = content.split('\n');
     for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {
@@ -18,7 +15,7 @@ function extractPackageFile(content) {
       const module = line.match(/^module\s+"([^"]+)"\s+{\s*$/);
       if (module) {
         logger.trace(`Matched module on line ${lineNumber}`);
-        const dep = {
+        const dep: PackageDependency = {
           moduleName: module[1],
           managerData: {},
         };
diff --git a/lib/manager/terraform/index.js b/lib/manager/terraform/index.js
deleted file mode 100644
index 749cae6f4db0ec27bb7cde5845780752ce144ac9..0000000000000000000000000000000000000000
--- a/lib/manager/terraform/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { updateDependency } = require('./update');
-
-module.exports = {
-  extractPackageFile,
-  updateDependency,
-};
diff --git a/lib/manager/terraform/index.ts b/lib/manager/terraform/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..730b5b60ba42a35b24b351e0793557e86f185454
--- /dev/null
+++ b/lib/manager/terraform/index.ts
@@ -0,0 +1,2 @@
+export { extractPackageFile } from './extract';
+export { updateDependency } from './update';
diff --git a/lib/manager/terraform/update.js b/lib/manager/terraform/update.ts
similarity index 85%
rename from lib/manager/terraform/update.js
rename to lib/manager/terraform/update.ts
index 07f132aec63bb9218bfb36c32b6f876f43bba783..f7d08539b34b100924a5dddab8d83fac8e6fe6b1 100644
--- a/lib/manager/terraform/update.js
+++ b/lib/manager/terraform/update.ts
@@ -1,10 +1,10 @@
-const { logger } = require('../../logger');
+import { logger } from '../../logger';
+import { Upgrade } from '../common';
 
-module.exports = {
-  updateDependency,
-};
-
-function updateDependency(currentFileContent, upgrade) {
+export function updateDependency(
+  currentFileContent: string,
+  upgrade: Upgrade
+): string {
   try {
     logger.debug(`terraform.updateDependency: ${upgrade.newValue}`);
     const lines = currentFileContent.split('\n');
diff --git a/lib/manager/travis/extract.js b/lib/manager/travis/extract.ts
similarity index 58%
rename from lib/manager/travis/extract.js
rename to lib/manager/travis/extract.ts
index 682f7506f700c1d02674d9d09a15149e1a4a7d61..d30076c36be7534c48d75bdd2cc663f10a2631fb 100644
--- a/lib/manager/travis/extract.js
+++ b/lib/manager/travis/extract.ts
@@ -1,12 +1,10 @@
 import is from '@sindresorhus/is';
+import yaml from 'js-yaml';
+import { PackageFile, PackageDependency } from '../common';
 
-const yaml = require('js-yaml');
-
-export { extractPackageFile };
-
-function extractPackageFile(content) {
+export function extractPackageFile(content: string): PackageFile {
   const doc = yaml.safeLoad(content);
-  let deps = [];
+  let deps: PackageDependency[] = [];
   if (doc && is.array(doc.node_js)) {
     deps = [
       {
diff --git a/lib/manager/travis/index.js b/lib/manager/travis/index.js
deleted file mode 100644
index 460b84a0d18a8c671da6f8f605346b2eade67f09..0000000000000000000000000000000000000000
--- a/lib/manager/travis/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-const { extractPackageFile } = require('./extract');
-const { getPackageUpdates } = require('./package');
-const { updateDependency } = require('./update');
-
-const language = 'node';
-
-module.exports = {
-  extractPackageFile,
-  getPackageUpdates,
-  language,
-  updateDependency,
-};
diff --git a/lib/manager/travis/index.ts b/lib/manager/travis/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..91796056c605fd2c5cb365f4c2b6986bec1c04c5
--- /dev/null
+++ b/lib/manager/travis/index.ts
@@ -0,0 +1,5 @@
+export { extractPackageFile } from './extract';
+export { getPackageUpdates } from './package';
+export { updateDependency } from './update';
+
+export const language = 'node';
diff --git a/lib/manager/travis/package.js b/lib/manager/travis/package.ts
similarity index 69%
rename from lib/manager/travis/package.js
rename to lib/manager/travis/package.ts
index bb5370eba139200b2ab1c092dc9ea799b353b0a7..558309c46649f32dedb5e4dd0a272f3fc724cbde 100644
--- a/lib/manager/travis/package.js
+++ b/lib/manager/travis/package.ts
@@ -1,15 +1,29 @@
 import is from '@sindresorhus/is';
+import { isEqual } from 'lodash';
+import { logger } from '../../logger';
+import { getPkgReleases } from '../../datasource';
+import { isVersion, maxSatisfyingVersion } from '../../versioning/semver';
+import nodeJsSchedule from '../../../data/node-js-schedule.json';
+import { PackageUpdateConfig, PackageUpdateResult } from '../common';
 
-const { isEqual } = require('lodash');
-const { getPkgReleases } = require('../../datasource');
-const { isVersion, maxSatisfyingVersion } = require('../../versioning/semver');
-const { logger } = require('../../logger');
-const nodeJsSchedule = require('../../../data/node-js-schedule.json');
-
-export { getPackageUpdates };
+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;
-let refreshDate;
+let policies: NodeJsPolicies;
+let refreshDate: Date;
 
 function generatePolicies() {
   policies = {
@@ -23,7 +37,7 @@ function generatePolicies() {
 
   const now = new Date();
 
-  for (const [vRelease, data] of Object.entries(nodeJsSchedule)) {
+  for (const [vRelease, data] of Object.entries(nodeJsSchedule as NodeJsData)) {
     const isAlive = new Date(data.start) < now && new Date(data.end) > now;
     if (isAlive) {
       const release = parseInt(vRelease.replace(/^v/, ''), 10);
@@ -49,7 +63,7 @@ function checkPolicies() {
   generatePolicies();
   refreshDate = new Date('3000-01-01'); // y3k
   const now = new Date();
-  for (const data of Object.values(nodeJsSchedule)) {
+  for (const data of Object.values(nodeJsSchedule as NodeJsData)) {
     const fields = ['start', 'lts', 'maintenance', 'end'];
     for (const field of fields) {
       const fieldDate = new Date(data[field]);
@@ -61,7 +75,9 @@ function checkPolicies() {
   logger.debug('Node.js policies refresh date: ' + refreshDate);
 }
 
-async function getPackageUpdates(config) {
+export async function getPackageUpdates(
+  config: PackageUpdateConfig
+): Promise<PackageUpdateResult[]> {
   logger.trace('travis.getPackageUpdates()');
   const { supportPolicy } = config;
   if (!(supportPolicy && supportPolicy.length)) {
@@ -75,7 +91,8 @@ async function getPackageUpdates(config) {
     }
   }
   logger.debug({ supportPolicy }, `supportPolicy`);
-  let newValue = supportPolicy
+  // TODO: `newValue` is a (string | number)[] !
+  let newValue: any[] = (supportPolicy as (keyof NodeJsPolicies)[])
     .map(policy => policies[policy])
     .reduce((result, policy) => result.concat(policy), [])
     .sort((a, b) => a - b);
@@ -94,7 +111,9 @@ async function getPackageUpdates(config) {
     newValue = newValue.map(val => `${val}`);
   }
   newValue.sort((a, b) => a - b);
-  config.currentValue.sort((a, b) => a - b);
+
+  // TODO: `config.currentValue` is a string!
+  (config.currentValue as any).sort((a, b) => a - b);
   if (isEqual(config.currentValue, newValue)) {
     return [];
   }
diff --git a/lib/manager/travis/update.js b/lib/manager/travis/update.ts
similarity index 67%
rename from lib/manager/travis/update.js
rename to lib/manager/travis/update.ts
index 44e8d31a165616ec18065e4888fbc20443e04a2d..e39c66691d9c9860c1e6189af5bc05defd6e97c2 100644
--- a/lib/manager/travis/update.js
+++ b/lib/manager/travis/update.ts
@@ -1,15 +1,16 @@
 import is from '@sindresorhus/is';
+import detectIndent from 'detect-indent';
+import { Upgrade } from '../common';
+import { logger } from '../../logger';
 
-const detectIndent = require('detect-indent');
-const { logger } = require('../../logger');
-
-export { updateDependency };
-
-function updateDependency(fileContent, upgrade) {
+export function updateDependency(
+  fileContent: string,
+  upgrade: Upgrade
+): string {
   try {
     logger.debug(`travis.updateDependency(): ${upgrade.newValue}`);
     const indent = detectIndent(fileContent).indent || '  ';
-    let quote;
+    let quote: string;
     if (is.string(upgrade.currentValue[0])) {
       quote =
         fileContent.split(`'`).length > fileContent.split(`"`).length
@@ -19,7 +20,8 @@ function updateDependency(fileContent, upgrade) {
       quote = '';
     }
     let newString = `node_js:\n`;
-    upgrade.newValue.forEach(version => {
+    // TODO: `newValue` is a string!
+    (upgrade.newValue as any).forEach(version => {
       newString += `${indent}- ${quote}${version}${quote}\n`;
     });
     return fileContent.replace(/node_js:(\n\s+-[^\n]+)+\n/, newString);
diff --git a/lib/types/github-url-from-git.d.ts b/lib/types/github-url-from-git.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..faf18841c4f32a37d7c5f78395e9beaa0aac1a40
--- /dev/null
+++ b/lib/types/github-url-from-git.d.ts
@@ -0,0 +1,7 @@
+declare module 'github-url-from-git' {
+  interface Options {
+    extraBaseUrls?: string[];
+  }
+  function parse(uri: string, options?: Options): string;
+  export = parse;
+}
diff --git a/lib/types/yawn-yaml.d.ts b/lib/types/yawn-yaml.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..37d6f205e0087c2683bd5b538b8c0eebf88d3916
--- /dev/null
+++ b/lib/types/yawn-yaml.d.ts
@@ -0,0 +1,19 @@
+declare module 'yawn-yaml' {
+  export default class YAWN {
+    constructor(content: string);
+
+    json: any;
+
+    yaml: string;
+  }
+}
+
+declare module 'yawn-yaml/cjs' {
+  export default class YAWN {
+    constructor(content: string);
+
+    json: any;
+
+    yaml: string;
+  }
+}
diff --git a/lib/versioning/common.ts b/lib/versioning/common.ts
index cc31d41e48f9506484f009443b96a59f47b1d988..0c22d1d2c76277aa9fe9864d258e7709003cf946 100644
--- a/lib/versioning/common.ts
+++ b/lib/versioning/common.ts
@@ -3,6 +3,7 @@ import { SemVer, Range } from 'semver';
 export type RangeStrategy =
   | 'auto'
   | 'bump'
+  | 'future'
   | 'pin'
   | 'replace'
   | 'update-lockfile'
diff --git a/package.json b/package.json
index f30f54bb6e8cadbe7b11a3c189d31953f54b9ab1..95647b34c31a788439d9e3825ccbd0143458523a 100644
--- a/package.json
+++ b/package.json
@@ -162,15 +162,20 @@
     "@babel/preset-env": "7.5.5",
     "@babel/preset-typescript": "7.3.3",
     "@types/bunyan": "1.8.6",
+    "@types/chai": "4.1.7",
     "@types/convert-hrtime": "2.0.0",
     "@types/fs-extra": "8.0.0",
     "@types/got": "9.6.2",
     "@types/jest": "24.0.15",
+    "@types/js-yaml": "3.12.1",
+    "@types/lodash": "4.14.136",
+    "@types/luxon": "1.15.2",
     "@types/node": "11.13.18",
     "@types/parse-link-header": "1.0.0",
     "@types/semver": "6.0.1",
     "@types/shelljs": "0.8.5",
     "@types/tmp": "0.1.0",
+    "@types/xmldoc": "1.1.4",
     "@typescript-eslint/eslint-plugin": "1.12.0",
     "@typescript-eslint/parser": "1.12.0",
     "babel-jest": "24.8.0",
diff --git a/test/.eslintrc.js b/test/.eslintrc.js
index ab1eca82ccbee6608ff40ca220237687f87007d6..195c79c4fbbe5c9f1ce55780ae526e013fc3eccc 100644
--- a/test/.eslintrc.js
+++ b/test/.eslintrc.js
@@ -12,5 +12,7 @@ module.exports = {
     'import/no-extraneous-dependencies': 0,
     'import/no-named-as-default-member': 0,
     'global-require': 0,
+
+    '@typescript-eslint/no-object-literal-type-assertion': 0,
   },
 };
diff --git a/test/manager/ansible/__snapshots__/extract.spec.js.snap b/test/manager/ansible/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/ansible/__snapshots__/extract.spec.js.snap
rename to test/manager/ansible/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/ansible/extract.spec.js b/test/manager/ansible/extract.spec.ts
similarity index 80%
rename from test/manager/ansible/extract.spec.js
rename to test/manager/ansible/extract.spec.ts
index 4683256ded6690b27bdce7ba5ddcdd20e3b45b9e..832a02c757666dcac8df7a4cc50961e5cdecfbaf 100644
--- a/test/manager/ansible/extract.spec.js
+++ b/test/manager/ansible/extract.spec.ts
@@ -1,11 +1,11 @@
-const fs = require('fs');
-const { extractPackageFile } = require('../../../lib/manager/ansible/extract');
+import { readFileSync } from 'fs';
+import extractPackageFile from '../../../lib/manager/ansible/extract';
 
-const yamlFile1 = fs.readFileSync(
+const yamlFile1 = readFileSync(
   'test/manager/ansible/_fixtures/main1.yaml',
   'utf8'
 );
-const yamlFile2 = fs.readFileSync(
+const yamlFile2 = readFileSync(
   'test/manager/ansible/_fixtures/main2.yaml',
   'utf8'
 );
diff --git a/test/manager/ansible/update.spec.js b/test/manager/ansible/update.spec.ts
similarity index 74%
rename from test/manager/ansible/update.spec.js
rename to test/manager/ansible/update.spec.ts
index b00f9e2ae3f731a2fcddbe31898655968fda2be8..44a444ed46d6f435b62d778d800acad642d18d7c 100644
--- a/test/manager/ansible/update.spec.js
+++ b/test/manager/ansible/update.spec.ts
@@ -1,11 +1,11 @@
-const fs = require('fs');
-const dcUpdate = require('../../../lib/manager/ansible/update');
+import { readFileSync } from 'fs';
+import updateDependency from '../../../lib/manager/ansible/update';
 
-const yamlFile1 = fs.readFileSync(
+const yamlFile1 = readFileSync(
   'test/manager/ansible/_fixtures/main1.yaml',
   'utf8'
 );
-const yamlFile2 = fs.readFileSync(
+const yamlFile2 = readFileSync(
   'test/manager/ansible/_fixtures/main2.yaml',
   'utf8'
 );
@@ -19,7 +19,7 @@ describe('manager/ansible/update', () => {
         newValue: '1.29.3',
         newDigest: 'sha256:abcdefghijklmnop',
       };
-      const res = dcUpdate.updateDependency(yamlFile1, upgrade);
+      const res = updateDependency(yamlFile1, upgrade);
       expect(res).not.toEqual(yamlFile1);
       expect(res.includes(upgrade.newDigest)).toBe(true);
     });
@@ -30,7 +30,7 @@ describe('manager/ansible/update', () => {
         newValue: '11.5.1',
         newDigest: 'sha256:abcdefghijklmnop',
       };
-      const res = dcUpdate.updateDependency(yamlFile2, upgrade);
+      const res = updateDependency(yamlFile2, upgrade);
       expect(res).not.toEqual(yamlFile2);
       expect(res.includes(upgrade.newDigest)).toBe(true);
     });
@@ -40,7 +40,7 @@ describe('manager/ansible/update', () => {
         depName: 'sameersbn/redis',
         newValue: '4.0.9-1',
       };
-      const res = dcUpdate.updateDependency(yamlFile2, upgrade);
+      const res = updateDependency(yamlFile2, upgrade);
       expect(res).toEqual(yamlFile2);
     });
     it('returns null if mismatch', () => {
@@ -48,11 +48,11 @@ describe('manager/ansible/update', () => {
         managerData: { lineNumber: 52 },
         newFrom: 'registry:2.6.2@sha256:abcdefghijklmnop',
       };
-      const res = dcUpdate.updateDependency(yamlFile2, upgrade);
+      const res = updateDependency(yamlFile2, upgrade);
       expect(res).toBeNull();
     });
     it('returns null if error', () => {
-      const res = dcUpdate.updateDependency(null, null);
+      const res = updateDependency(null, null);
       expect(res).toBeNull();
     });
   });
diff --git a/test/manager/bazel/__snapshots__/extract.spec.js.snap b/test/manager/bazel/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/bazel/__snapshots__/extract.spec.js.snap
rename to test/manager/bazel/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/bazel/__snapshots__/update.spec.js.snap b/test/manager/bazel/__snapshots__/update.spec.ts.snap
similarity index 100%
rename from test/manager/bazel/__snapshots__/update.spec.js.snap
rename to test/manager/bazel/__snapshots__/update.spec.ts.snap
diff --git a/test/manager/bazel/extract.spec.js b/test/manager/bazel/extract.spec.ts
similarity index 93%
rename from test/manager/bazel/extract.spec.js
rename to test/manager/bazel/extract.spec.ts
index 8d529f1222b827483b279d69ca07118708ec7adc..4844a4835b4d1f33c4eb47d0890047e99bd4dcee 100644
--- a/test/manager/bazel/extract.spec.js
+++ b/test/manager/bazel/extract.spec.ts
@@ -1,12 +1,12 @@
-const fs = require('fs');
-const { extractPackageFile } = require('../../../lib/manager/bazel/extract');
+import { readFileSync } from 'fs';
+import { extractPackageFile } from '../../../lib/manager/bazel/extract';
 
-const workspaceFile = fs.readFileSync(
+const workspaceFile = readFileSync(
   'test/manager/bazel/_fixtures/WORKSPACE1',
   'utf8'
 );
 
-const fileWithBzlExtension = fs.readFileSync(
+const fileWithBzlExtension = readFileSync(
   'test/manager/bazel/_fixtures/repositories.bzl',
   'utf8'
 );
diff --git a/test/manager/bazel/update.spec.js b/test/manager/bazel/update.spec.ts
similarity index 82%
rename from test/manager/bazel/update.spec.js
rename to test/manager/bazel/update.spec.ts
index c55954a40e0fe785c12be6da351ad6d713bb098c..ab7ec4c0e67bfa09af82a71c513d13459c486889 100644
--- a/test/manager/bazel/update.spec.js
+++ b/test/manager/bazel/update.spec.ts
@@ -1,23 +1,24 @@
-const fs = require('fs');
-/** @type any */
-const hasha = require('hasha');
-const path = require('path');
-const bazelfile = require('../../../lib/manager/bazel/update');
+import { readFileSync } from 'fs';
+import { fromStream as _fromStream } from 'hasha';
+import { resolve } from 'path';
+import { updateDependency } from '../../../lib/manager/bazel/update';
 
 jest.mock('hasha');
 jest.mock('../../../lib/util/got');
 
-const content = fs.readFileSync(
-  path.resolve('test/manager/bazel/_fixtures/WORKSPACE1'),
+const fromStream: jest.Mock<Promise<string>> = _fromStream as any;
+
+const content = readFileSync(
+  resolve('test/manager/bazel/_fixtures/WORKSPACE1'),
   'utf8'
 );
 
-const contentContainerPull = fs.readFileSync(
-  path.resolve('test/manager/bazel/_fixtures/container_pull'),
+const contentContainerPull = readFileSync(
+  resolve('test/manager/bazel/_fixtures/container_pull'),
   'utf8'
 );
 
-const fileWithBzlExtension = fs.readFileSync(
+const fileWithBzlExtension = readFileSync(
   'test/manager/bazel/_fixtures/repositories.bzl',
   'utf8'
 );
@@ -45,7 +46,7 @@ describe('manager/bazel/update', () => {
         currentValue: '0.1.8',
         newValue: '0.2.0',
       };
-      const res = await bazelfile.updateDependency(content, upgrade);
+      const res = await updateDependency(content, upgrade);
       expect(res).not.toEqual(content);
     });
 
@@ -70,10 +71,7 @@ describe('manager/bazel/update', () => {
           'sha256:2c29ba015faef92a3f55b37632fc373a7fbc2c9fddd31e317bf07113391c640b',
         newValue: 'v1.0.0-alpha42.cli-migrations',
       };
-      const res = await bazelfile.updateDependency(
-        contentContainerPull,
-        upgrade
-      );
+      const res = await updateDependency(contentContainerPull, upgrade);
       expect(res).toMatchSnapshot();
       expect(res).not.toEqual(contentContainerPull);
       expect(res.includes('# v1.0.0-alpha31.cli-migrations 11/28')).toBe(true);
@@ -97,7 +95,7 @@ describe('manager/bazel/update', () => {
         newValue: 'v1.0.3',
         updateType: 'major',
       };
-      const res = await bazelfile.updateDependency(content, upgrade);
+      const res = await updateDependency(content, upgrade);
       expect(res).toMatchSnapshot();
       expect(res).not.toEqual(content);
       expect(
@@ -114,8 +112,8 @@ describe('manager/bazel/update', () => {
         },
         newDigest: '033387ac8853e6cc1cd47df6c346bc53cbc490d8',
       };
-      hasha.fromStream.mockReturnValueOnce('abc123');
-      const res = await bazelfile.updateDependency(content, upgrade);
+      fromStream.mockResolvedValueOnce('abc123');
+      const res = await updateDependency(content, upgrade);
       expect(res).not.toEqual(content);
     });
     it('updates http archive with content other then WORKSPACE', async () => {
@@ -134,11 +132,8 @@ describe('manager/bazel/update', () => {
         currentValue: '0.6.0',
         newValue: '0.8.0',
       };
-      hasha.fromStream.mockReturnValueOnce('abc123');
-      const res = await bazelfile.updateDependency(
-        fileWithBzlExtension,
-        upgrade
-      );
+      fromStream.mockResolvedValueOnce('abc123');
+      const res = await updateDependency(fileWithBzlExtension, upgrade);
       expect(res).not.toEqual(fileWithBzlExtension);
       expect(res.indexOf('0.8.0')).not.toBe(-1);
     });
@@ -158,11 +153,8 @@ describe('manager/bazel/update', () => {
         currentValue: '0.6.0',
         newValue: '0.8.0',
       };
-      hasha.fromStream.mockReturnValueOnce('abc123');
-      const res = await bazelfile.updateDependency(
-        fileWithBzlExtension,
-        upgrade
-      );
+      fromStream.mockResolvedValueOnce('abc123');
+      const res = await updateDependency(fileWithBzlExtension, upgrade);
       expect(res).not.toEqual(fileWithBzlExtension);
       expect(res.indexOf('0.8.0')).not.toBe(-1);
     });
@@ -182,10 +174,7 @@ describe('manager/bazel/update', () => {
         currentValue: '0.6.0',
         newValue: '0.8.0',
       };
-      const res = await bazelfile.updateDependency(
-        fileWithBzlExtension,
-        upgrade
-      );
+      const res = await updateDependency(fileWithBzlExtension, upgrade);
       expect(res).toBeNull();
     });
     it('errors for http_archive without urls', async () => {
@@ -206,8 +195,8 @@ http_archive(
         currentValue: '0.5.0',
         newValue: '0.6.2',
       };
-      hasha.fromStream.mockReturnValueOnce('abc123');
-      const res = await bazelfile.updateDependency(content, upgrade);
+      fromStream.mockResolvedValueOnce('abc123');
+      const res = await updateDependency(content, upgrade);
       expect(res).toBeNull();
     });
     it('updates http_archive with urls array', async () => {
@@ -232,8 +221,8 @@ http_archive(
         currentValue: '0.5.0',
         newValue: '0.6.2',
       };
-      hasha.fromStream.mockReturnValueOnce('abc123');
-      const res = await bazelfile.updateDependency(content, upgrade);
+      fromStream.mockResolvedValueOnce('abc123');
+      const res = await updateDependency(content, upgrade);
       expect(res).not.toEqual(content);
       expect(res.indexOf('0.5.0')).toBe(-1);
       expect(res.indexOf('0.6.2')).not.toBe(-1);
diff --git a/test/manager/buildkite/__snapshots__/extract.spec.js.snap b/test/manager/buildkite/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/buildkite/__snapshots__/extract.spec.js.snap
rename to test/manager/buildkite/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/buildkite/__snapshots__/update.spec.js.snap b/test/manager/buildkite/__snapshots__/update.spec.ts.snap
similarity index 100%
rename from test/manager/buildkite/__snapshots__/update.spec.js.snap
rename to test/manager/buildkite/__snapshots__/update.spec.ts.snap
diff --git a/test/manager/buildkite/extract.spec.js b/test/manager/buildkite/extract.spec.ts
similarity index 82%
rename from test/manager/buildkite/extract.spec.js
rename to test/manager/buildkite/extract.spec.ts
index 0a06072b78f663397383b658ccc4333b3ca5da47..54cce560f552edbe37220fdf842bb3a59feb28c9 100644
--- a/test/manager/buildkite/extract.spec.js
+++ b/test/manager/buildkite/extract.spec.ts
@@ -1,21 +1,19 @@
-const fs = require('fs');
-const {
-  extractPackageFile,
-} = require('../../../lib/manager/buildkite/extract');
+import { readFileSync } from 'fs';
+import { extractPackageFile } from '../../../lib/manager/buildkite/extract';
 
-const pipeline1 = fs.readFileSync(
+const pipeline1 = readFileSync(
   'test/manager/buildkite/_fixtures/pipeline1.yml',
   'utf8'
 );
-const pipeline2 = fs.readFileSync(
+const pipeline2 = readFileSync(
   'test/manager/buildkite/_fixtures/pipeline2.yml',
   'utf8'
 );
-const pipeline3 = fs.readFileSync(
+const pipeline3 = readFileSync(
   'test/manager/buildkite/_fixtures/pipeline3.yml',
   'utf8'
 );
-const pipeline4 = fs.readFileSync(
+const pipeline4 = readFileSync(
   'test/manager/buildkite/_fixtures/pipeline4.yml',
   'utf8'
 );
diff --git a/test/manager/buildkite/update.spec.js b/test/manager/buildkite/update.spec.ts
similarity index 72%
rename from test/manager/buildkite/update.spec.js
rename to test/manager/buildkite/update.spec.ts
index c1e80933e0d08a10815cb6cc7064b246651099f4..d846c0d2b131a620367718527ab02094165c0b3e 100644
--- a/test/manager/buildkite/update.spec.js
+++ b/test/manager/buildkite/update.spec.ts
@@ -1,15 +1,15 @@
-const fs = require('fs');
-const bkUpdate = require('../../../lib/manager/buildkite/update');
+import { readFileSync } from 'fs';
+import { updateDependency } from '../../../lib/manager/buildkite/update';
 
-const pipeline1 = fs.readFileSync(
+const pipeline1 = readFileSync(
   'test/manager/buildkite/_fixtures/pipeline1.yml',
   'utf8'
 );
-const pipeline2 = fs.readFileSync(
+const pipeline2 = readFileSync(
   'test/manager/buildkite/_fixtures/pipeline2.yml',
   'utf8'
 );
-const pipeline4 = fs.readFileSync(
+const pipeline4 = readFileSync(
   'test/manager/buildkite/_fixtures/pipeline4.yml',
   'utf8'
 );
@@ -21,7 +21,7 @@ describe('manager/buildkite/update', () => {
         managerData: { lineNumber: 2 },
         newValue: 'v2.2.0',
       };
-      const res = bkUpdate.updateDependency(pipeline1, upgrade);
+      const res = updateDependency(pipeline1, upgrade);
       expect(res).not.toEqual(pipeline1);
       expect(res.includes(upgrade.newValue)).toBe(true);
     });
@@ -30,7 +30,7 @@ describe('manager/buildkite/update', () => {
         managerData: { lineNumber: 10 },
         newValue: 'v2.2.0',
       };
-      const res = bkUpdate.updateDependency(pipeline4, upgrade);
+      const res = updateDependency(pipeline4, upgrade);
       expect(res).not.toEqual(pipeline4);
       expect(res.includes(upgrade.newValue)).toBe(true);
     });
@@ -39,14 +39,14 @@ describe('manager/buildkite/update', () => {
         managerData: { lineNumber: 4 },
         newValue: 'v1.5.0',
       };
-      const res1 = bkUpdate.updateDependency(pipeline2, upgrade1);
+      const res1 = updateDependency(pipeline2, upgrade1);
       expect(res1).not.toEqual(pipeline2);
       expect(res1.includes(upgrade1.newValue)).toBe(true);
       const upgrade2 = {
         managerData: { lineNumber: 15 },
         newValue: 'v1.5.0',
       };
-      const res2 = bkUpdate.updateDependency(res1, upgrade2);
+      const res2 = updateDependency(res1, upgrade2);
       expect(res2).not.toEqual(res1);
       expect(res2).toMatchSnapshot();
     });
@@ -55,7 +55,7 @@ describe('manager/buildkite/update', () => {
         managerData: { lineNumber: 2 },
         newValue: 'v2.0.0',
       };
-      const res = bkUpdate.updateDependency(pipeline1, upgrade);
+      const res = updateDependency(pipeline1, upgrade);
       expect(res).toEqual(pipeline1);
     });
     it('returns null if mismatch', () => {
@@ -63,11 +63,11 @@ describe('manager/buildkite/update', () => {
         managerData: { lineNumber: 3 },
         newValue: 'v2.2.0',
       };
-      const res = bkUpdate.updateDependency(pipeline1, upgrade);
+      const res = updateDependency(pipeline1, upgrade);
       expect(res).toBeNull();
     });
     it('returns null if error', () => {
-      const res = bkUpdate.updateDependency(null, null);
+      const res = updateDependency(null, null);
       expect(res).toBeNull();
     });
   });
diff --git a/test/manager/bundler/__snapshots__/extract.spec.js.snap b/test/manager/bundler/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/bundler/__snapshots__/extract.spec.js.snap
rename to test/manager/bundler/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/bundler/artifacts.spec.js b/test/manager/bundler/artifacts.spec.ts
similarity index 57%
rename from test/manager/bundler/artifacts.spec.js
rename to test/manager/bundler/artifacts.spec.ts
index 08cfdee3d0a977598242dc28e5d604a3563b85e4..247879677e1a4597b84eb42566baaf8d8ad5b25b 100644
--- a/test/manager/bundler/artifacts.spec.js
+++ b/test/manager/bundler/artifacts.spec.ts
@@ -1,4 +1,4 @@
-const cargo = require('../../../lib/manager/bundler/artifacts');
+import { updateArtifacts } from '../../../lib/manager/bundler/artifacts';
 
 let config;
 
@@ -8,6 +8,6 @@ describe('bundler.updateArtifacts()', () => {
     config = {};
   });
   it('returns null by default', async () => {
-    expect(await cargo.updateArtifacts('', [], '', config)).toBeNull();
+    expect(await updateArtifacts('', [], '', config)).toBeNull();
   });
 });
diff --git a/test/manager/bundler/extract.spec.js b/test/manager/bundler/extract.spec.ts
similarity index 79%
rename from test/manager/bundler/extract.spec.js
rename to test/manager/bundler/extract.spec.ts
index 220c6fcb0214add1aa43a54b796c4e575634e6e3..7c6c295f8110c12d0cebe6baf1c9c6dc0b72afb7 100644
--- a/test/manager/bundler/extract.spec.js
+++ b/test/manager/bundler/extract.spec.ts
@@ -1,19 +1,18 @@
-const fs = require('fs');
-const { extractPackageFile } = require('../../../lib/manager/bundler/extract');
+import { readFileSync } from 'fs';
+import { extractPackageFile } from '../../../lib/manager/bundler/extract';
 
-/** @type any */
-const platform = global.platform;
+const platform: any = global.platform;
 
-const railsGemfile = fs.readFileSync(
+const railsGemfile = readFileSync(
   'test/manager/bundler/_fixtures/Gemfile.rails',
   'utf8'
 );
-const railsGemfileLock = fs.readFileSync(
+const railsGemfileLock = readFileSync(
   'test/manager/bundler/_fixtures/Gemfile.rails.lock',
   'utf8'
 );
 
-const sourceGroupGemfile = fs.readFileSync(
+const sourceGroupGemfile = readFileSync(
   'test/manager/bundler/_fixtures/Gemfile.sourceGroup',
   'utf8'
 );
diff --git a/test/manager/bundler/range.spec.js b/test/manager/bundler/range.spec.ts
similarity index 74%
rename from test/manager/bundler/range.spec.js
rename to test/manager/bundler/range.spec.ts
index 2b69f36a7ed7899381831d7d7b930674e4657477..9983e51d5df5e743888d0537e40874dac6f155bf 100644
--- a/test/manager/bundler/range.spec.js
+++ b/test/manager/bundler/range.spec.ts
@@ -1,4 +1,4 @@
-const { getRangeStrategy } = require('../../../lib/manager/bundler');
+import { getRangeStrategy } from '../../../lib/manager/bundler';
 
 describe('lib/manager/bundler/range', () => {
   describe('getRangeStrategy()', () => {
diff --git a/test/manager/bundler/update.spec.js b/test/manager/bundler/update.spec.ts
similarity index 91%
rename from test/manager/bundler/update.spec.js
rename to test/manager/bundler/update.spec.ts
index 3aee0a21e2c05626e3f0116ee29b51a5e6823353..ff4db0833d76547d40a99d9c7fe94afc18fa34b3 100644
--- a/test/manager/bundler/update.spec.js
+++ b/test/manager/bundler/update.spec.ts
@@ -1,7 +1,7 @@
-const fs = require('fs');
-const { updateDependency } = require('../../../lib/manager/bundler/update');
+import { readFileSync } from 'fs';
+import { updateDependency } from '../../../lib/manager/bundler/update';
 
-const railsGemfile = fs.readFileSync(
+const railsGemfile = readFileSync(
   'test/manager/bundler/_fixtures/Gemfile.rails',
   'utf8'
 );
diff --git a/test/manager/cargo/__snapshots__/artifacts.spec.js.snap b/test/manager/cargo/__snapshots__/artifacts.spec.ts.snap
similarity index 100%
rename from test/manager/cargo/__snapshots__/artifacts.spec.js.snap
rename to test/manager/cargo/__snapshots__/artifacts.spec.ts.snap
diff --git a/test/manager/cargo/__snapshots__/extract.spec.js.snap b/test/manager/cargo/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/cargo/__snapshots__/extract.spec.js.snap
rename to test/manager/cargo/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/cargo/__snapshots__/update.spec.js.snap b/test/manager/cargo/__snapshots__/update.spec.ts.snap
similarity index 100%
rename from test/manager/cargo/__snapshots__/update.spec.js.snap
rename to test/manager/cargo/__snapshots__/update.spec.ts.snap
diff --git a/test/manager/cargo/artifacts.spec.js b/test/manager/cargo/artifacts.spec.ts
similarity index 73%
rename from test/manager/cargo/artifacts.spec.js
rename to test/manager/cargo/artifacts.spec.ts
index baa4021e74875f4f4586be12e8342fb6080c7ae1..7d6047401b164396cea6e28809d68480aafb709f 100644
--- a/test/manager/cargo/artifacts.spec.js
+++ b/test/manager/cargo/artifacts.spec.ts
@@ -1,14 +1,12 @@
+import _fs from 'fs-extra';
+import * as cargo from '../../../lib/manager/cargo/artifacts';
+
 jest.mock('fs-extra');
 jest.mock('../../../lib/util/exec');
-
-/** @type any */
-const fs = require('fs-extra');
-/** @type any */
 const { exec } = require('../../../lib/util/exec');
-const cargo = require('../../../lib/manager/cargo/artifacts');
 
-/** @type any */
-const platform = global.platform;
+const platform: any = global.platform;
+const fs: any = _fs;
 
 const config = {
   localDir: '/tmp/github/some/repo',
@@ -22,12 +20,7 @@ describe('.updateArtifacts()', () => {
     delete global.trustLevel;
   });
   it('returns null if no Cargo.lock found', async () => {
-    const updatedDeps = [
-      {
-        depName: 'dep1',
-        currentValue: '1.2.3',
-      },
-    ];
+    const updatedDeps = ['dep1'];
     expect(
       await cargo.updateArtifacts('Cargo.toml', updatedDeps, '', config)
     ).toBeNull();
@@ -44,12 +37,7 @@ describe('.updateArtifacts()', () => {
       stderror: '',
     });
     fs.readFile = jest.fn(() => 'Current Cargo.lock');
-    const updatedDeps = [
-      {
-        depName: 'dep1',
-        currentValue: '1.2.3',
-      },
-    ];
+    const updatedDeps = ['dep1'];
     expect(
       await cargo.updateArtifacts('Cargo.toml', updatedDeps, '', config)
     ).toBeNull();
@@ -61,12 +49,7 @@ describe('.updateArtifacts()', () => {
       stderror: '',
     });
     fs.readFile = jest.fn(() => 'New Cargo.lock');
-    const updatedDeps = [
-      {
-        depName: 'dep1',
-        currentValue: '1.2.3',
-      },
-    ];
+    const updatedDeps = ['dep1'];
     global.trustLevel = 'high';
     expect(
       await cargo.updateArtifacts('Cargo.toml', updatedDeps, '{}', config)
@@ -77,12 +60,7 @@ describe('.updateArtifacts()', () => {
     fs.outputFile = jest.fn(() => {
       throw new Error('not found');
     });
-    const updatedDeps = [
-      {
-        depName: 'dep1',
-        currentValue: '1.2.3',
-      },
-    ];
+    const updatedDeps = ['dep1'];
     expect(
       await cargo.updateArtifacts('Cargo.toml', updatedDeps, '{}', config)
     ).toMatchSnapshot();
diff --git a/test/manager/cargo/extract.spec.js b/test/manager/cargo/extract.spec.ts
similarity index 87%
rename from test/manager/cargo/extract.spec.js
rename to test/manager/cargo/extract.spec.ts
index 41a5a2c5986ec4f17a43e2df99bb9b3f4fceae71..9694f6682c33d8f485b4e9f0790acb76e16edd44 100644
--- a/test/manager/cargo/extract.spec.js
+++ b/test/manager/cargo/extract.spec.ts
@@ -1,23 +1,23 @@
-const fs = require('fs');
-const { extractPackageFile } = require('../../../lib/manager/cargo/extract');
+import { readFileSync } from 'fs';
+import { extractPackageFile } from '../../../lib/manager/cargo/extract';
 
-const cargo1toml = fs.readFileSync(
+const cargo1toml = readFileSync(
   'test/manager/cargo/_fixtures/Cargo.1.toml',
   'utf8'
 );
-const cargo2toml = fs.readFileSync(
+const cargo2toml = readFileSync(
   'test/manager/cargo/_fixtures/Cargo.2.toml',
   'utf8'
 );
-const cargo3toml = fs.readFileSync(
+const cargo3toml = readFileSync(
   'test/manager/cargo/_fixtures/Cargo.3.toml',
   'utf8'
 );
-const cargo4toml = fs.readFileSync(
+const cargo4toml = readFileSync(
   'test/manager/cargo/_fixtures/Cargo.4.toml',
   'utf8'
 );
-const cargo5toml = fs.readFileSync(
+const cargo5toml = readFileSync(
   'test/manager/cargo/_fixtures/Cargo.5.toml',
   'utf8'
 );
diff --git a/test/manager/cargo/update.spec.js b/test/manager/cargo/update.spec.ts
similarity index 96%
rename from test/manager/cargo/update.spec.js
rename to test/manager/cargo/update.spec.ts
index 733a313ca1596abd13b289aa6fd2f63b35dcdce7..d74c3657cd6cc260919f1f5d760a7345c5b09f3b 100644
--- a/test/manager/cargo/update.spec.js
+++ b/test/manager/cargo/update.spec.ts
@@ -1,15 +1,15 @@
-const fs = require('fs');
-const { updateDependency } = require('../../../lib/manager/cargo/update');
+import { readFileSync } from 'fs';
+import { updateDependency } from '../../../lib/manager/cargo/update';
 
-const cargo1toml = fs.readFileSync(
+const cargo1toml = readFileSync(
   'test/manager/cargo/_fixtures/Cargo.1.toml',
   'utf8'
 );
-const cargo4toml = fs.readFileSync(
+const cargo4toml = readFileSync(
   'test/manager/cargo/_fixtures/Cargo.4.toml',
   'utf8'
 );
-const cargo5toml = fs.readFileSync(
+const cargo5toml = readFileSync(
   'test/manager/cargo/_fixtures/Cargo.5.toml',
   'utf8'
 );
diff --git a/test/manager/circleci/__snapshots__/extract.spec.js.snap b/test/manager/circleci/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/circleci/__snapshots__/extract.spec.js.snap
rename to test/manager/circleci/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/circleci/extract.spec.js b/test/manager/circleci/extract.spec.ts
similarity index 80%
rename from test/manager/circleci/extract.spec.js
rename to test/manager/circleci/extract.spec.ts
index 92a66b5784373128555fa30d0a88f9b07abeb7c1..35c2b5e6ebd94612d2c9260c6413cc0756032150 100644
--- a/test/manager/circleci/extract.spec.js
+++ b/test/manager/circleci/extract.spec.ts
@@ -1,11 +1,11 @@
-const fs = require('fs');
-const { extractPackageFile } = require('../../../lib/manager/circleci/extract');
+import { readFileSync } from 'fs';
+import { extractPackageFile } from '../../../lib/manager/circleci/extract';
 
-const file1 = fs.readFileSync(
+const file1 = readFileSync(
   'test/manager/circleci/_fixtures/config.yml',
   'utf8'
 );
-const file2 = fs.readFileSync(
+const file2 = readFileSync(
   'test/manager/circleci/_fixtures/config2.yml',
   'utf8'
 );
diff --git a/test/manager/circleci/update.spec.js b/test/manager/circleci/update.spec.ts
similarity index 94%
rename from test/manager/circleci/update.spec.js
rename to test/manager/circleci/update.spec.ts
index a4357ba3b61d99545fcd27179345a0da95bd59d3..6c22cfd3638e7d335039c560d5a84c905db2fa5c 100644
--- a/test/manager/circleci/update.spec.js
+++ b/test/manager/circleci/update.spec.ts
@@ -1,11 +1,11 @@
-const fs = require('fs');
-const dcUpdate = require('../../../lib/manager/circleci/update');
+import { readFileSync } from 'fs';
+import * as dcUpdate from '../../../lib/manager/circleci/update';
 
-const yamlFile = fs.readFileSync(
+const yamlFile = readFileSync(
   'test/manager/circleci/_fixtures/config.yml',
   'utf8'
 );
-const yamlFile2 = fs.readFileSync(
+const yamlFile2 = readFileSync(
   'test/manager/circleci/_fixtures/config2.yml',
   'utf8'
 );
diff --git a/test/manager/composer/__snapshots__/artifacts.spec.js.snap b/test/manager/composer/__snapshots__/artifacts.spec.ts.snap
similarity index 100%
rename from test/manager/composer/__snapshots__/artifacts.spec.js.snap
rename to test/manager/composer/__snapshots__/artifacts.spec.ts.snap
diff --git a/test/manager/composer/__snapshots__/extract.spec.js.snap b/test/manager/composer/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/composer/__snapshots__/extract.spec.js.snap
rename to test/manager/composer/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/composer/artifacts.spec.js b/test/manager/composer/artifacts.spec.ts
similarity index 95%
rename from test/manager/composer/artifacts.spec.js
rename to test/manager/composer/artifacts.spec.ts
index 01980647dbd0551d7040d329353bb94cc22250d0..215b9a5a6176f7da1677e83f1ac73a3dfdd320aa 100644
--- a/test/manager/composer/artifacts.spec.js
+++ b/test/manager/composer/artifacts.spec.ts
@@ -1,17 +1,15 @@
+import _fs from 'fs-extra';
+import * as composer from '../../../lib/manager/composer/artifacts';
+
 jest.mock('fs-extra');
 jest.mock('../../../lib/util/exec');
 jest.mock('../../../lib/util/host-rules');
 
-/** @type any */
-const fs = require('fs-extra');
-/** @type any */
 const { exec } = require('../../../lib/util/exec');
-const composer = require('../../../lib/manager/composer/artifacts');
-/** @type any */
 const hostRules = require('../../../lib/util/host-rules');
 
-/** @type any */
-const platform = global.platform;
+const platform: any = global.platform;
+const fs: any = _fs;
 
 const config = {
   localDir: '/tmp/github/some/repo',
diff --git a/test/manager/composer/extract.spec.js b/test/manager/composer/extract.spec.ts
similarity index 80%
rename from test/manager/composer/extract.spec.js
rename to test/manager/composer/extract.spec.ts
index c01ce51f071f7fe8e6cf63652ca1980a11e30915..380bfb27908e720e33eab97fe8f1f5ec43c7a0a3 100644
--- a/test/manager/composer/extract.spec.js
+++ b/test/manager/composer/extract.spec.ts
@@ -1,30 +1,29 @@
-const fs = require('fs');
-const { extractPackageFile } = require('../../../lib/manager/composer/extract');
+import { readFileSync } from 'fs';
+import { extractPackageFile } from '../../../lib/manager/composer/extract';
 
-/** @type any */
-const platform = global.platform;
+const platform: jest.Mocked<typeof global.platform> = global.platform as any;
 
-const requirements1 = fs.readFileSync(
+const requirements1 = readFileSync(
   'test/manager/composer/_fixtures/composer1.json',
   'utf8'
 );
-const requirements2 = fs.readFileSync(
+const requirements2 = readFileSync(
   'test/manager/composer/_fixtures/composer2.json',
   'utf8'
 );
-const requirements3 = fs.readFileSync(
+const requirements3 = readFileSync(
   'test/manager/composer/_fixtures/composer3.json',
   'utf8'
 );
-const requirements4 = fs.readFileSync(
+const requirements4 = readFileSync(
   'test/manager/composer/_fixtures/composer4.json',
   'utf8'
 );
-const requirements5 = fs.readFileSync(
+const requirements5 = readFileSync(
   'test/manager/composer/_fixtures/composer5.json',
   'utf8'
 );
-const requirements5Lock = fs.readFileSync(
+const requirements5Lock = readFileSync(
   'test/manager/composer/_fixtures/composer5.lock',
   'utf8'
 );
@@ -61,13 +60,13 @@ describe('lib/manager/composer/extract', () => {
       expect(res.registryUrls).toHaveLength(1);
     });
     it('extracts object repositories and registryUrls with lock file', async () => {
-      platform.getFile.mockReturnValueOnce(requirements5Lock);
+      platform.getFile.mockResolvedValue(requirements5Lock);
       const res = await extractPackageFile(requirements5, packageFile);
       expect(res).toMatchSnapshot();
       expect(res.registryUrls).toHaveLength(1);
     });
     it('extracts dependencies with lock file', async () => {
-      platform.getFile.mockReturnValueOnce('some content');
+      platform.getFile.mockResolvedValue('some content');
       const res = await extractPackageFile(requirements1, packageFile);
       expect(res).toMatchSnapshot();
     });
diff --git a/test/manager/composer/range.spec.js b/test/manager/composer/range.spec.ts
similarity index 67%
rename from test/manager/composer/range.spec.js
rename to test/manager/composer/range.spec.ts
index 985f3daf3a8ef32259e2cf384eaef863fa1b0953..c7a01066b25848a75d1f84a665ea944495ad01a5 100644
--- a/test/manager/composer/range.spec.js
+++ b/test/manager/composer/range.spec.ts
@@ -1,16 +1,20 @@
-const { getRangeStrategy } = require('../../../lib/manager/composer');
+import { getRangeStrategy } from '../../../lib/manager/composer';
+import { RangeConfig } from '../../../lib/manager/common';
 
 describe('getRangeStrategy', () => {
   it('returns same if not auto', () => {
-    const config = { rangeStrategy: 'widen' };
+    const config: RangeConfig = { rangeStrategy: 'widen' };
     expect(getRangeStrategy(config)).toEqual('widen');
   });
   it('pins require-dev', () => {
-    const config = { rangeStrategy: 'auto', depType: 'require-dev' };
+    const config: RangeConfig = {
+      rangeStrategy: 'auto',
+      depType: 'require-dev',
+    };
     expect(getRangeStrategy(config)).toEqual('pin');
   });
   it('pins project require', () => {
-    const config = {
+    const config: RangeConfig = {
       rangeStrategy: 'auto',
       managerData: { composerJsonType: 'project' },
       depType: 'require',
@@ -18,7 +22,7 @@ describe('getRangeStrategy', () => {
     expect(getRangeStrategy(config)).toEqual('pin');
   });
   it('widens complex ranges', () => {
-    const config = {
+    const config: RangeConfig = {
       rangeStrategy: 'auto',
       depType: 'require',
       currentValue: '^1.6.0 || ^2.0.0',
@@ -26,7 +30,7 @@ describe('getRangeStrategy', () => {
     expect(getRangeStrategy(config)).toEqual('widen');
   });
   it('widens complex bump', () => {
-    const config = {
+    const config: RangeConfig = {
       rangeStrategy: 'bump',
       depType: 'require',
       currentValue: '^1.6.0 || ^2.0.0',
@@ -34,7 +38,7 @@ describe('getRangeStrategy', () => {
     expect(getRangeStrategy(config)).toEqual('widen');
   });
   it('defaults to replace', () => {
-    const config = { rangeStrategy: 'auto', depType: 'require' };
+    const config: RangeConfig = { rangeStrategy: 'auto', depType: 'require' };
     expect(getRangeStrategy(config)).toEqual('replace');
   });
 });
diff --git a/test/manager/deps-edn/__snapshots__/extract.spec.js.snap b/test/manager/deps-edn/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/deps-edn/__snapshots__/extract.spec.js.snap
rename to test/manager/deps-edn/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/deps-edn/extract.spec.js b/test/manager/deps-edn/extract.spec.js
deleted file mode 100644
index e5b1856ddb5649d635d6897fe3162bd42831e2ad..0000000000000000000000000000000000000000
--- a/test/manager/deps-edn/extract.spec.js
+++ /dev/null
@@ -1,15 +0,0 @@
-/* eslint-disable no-template-curly-in-string */
-const fs = require('fs');
-const path = require('path');
-const { extractPackageFile } = require('../../../lib/manager/deps-edn/extract');
-
-const depsEdn = fs.readFileSync(
-  path.resolve(__dirname, `./_fixtures/deps.edn`),
-  'utf8'
-);
-
-describe('manager/deps-edn/extract', () => {
-  it('extractPackageFile', () => {
-    expect(extractPackageFile(depsEdn)).toMatchSnapshot();
-  });
-});
diff --git a/test/manager/deps-edn/extract.spec.ts b/test/manager/deps-edn/extract.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d3f41c6263ba66d37f4859274c6badaf150d85a6
--- /dev/null
+++ b/test/manager/deps-edn/extract.spec.ts
@@ -0,0 +1,15 @@
+/* eslint-disable no-template-curly-in-string */
+import { readFileSync } from 'fs';
+import { resolve } from 'path';
+import { extractPackageFile } from '../../../lib/manager/deps-edn/extract';
+
+const depsEdn = readFileSync(
+  resolve(__dirname, `./_fixtures/deps.edn`),
+  'utf8'
+);
+
+describe('manager/deps-edn/extract', () => {
+  it('extractPackageFile', () => {
+    expect(extractPackageFile(depsEdn)).toMatchSnapshot();
+  });
+});
diff --git a/test/manager/deps-edn/update.spec.js b/test/manager/deps-edn/update.spec.ts
similarity index 64%
rename from test/manager/deps-edn/update.spec.js
rename to test/manager/deps-edn/update.spec.ts
index 61ac28a57b1d5b09085fcdad9d995f343dbd9de0..4d71d698d3ed22ee23738bd6ff801639945b0585 100644
--- a/test/manager/deps-edn/update.spec.js
+++ b/test/manager/deps-edn/update.spec.ts
@@ -1,11 +1,11 @@
 /* eslint-disable no-template-curly-in-string */
-const fs = require('fs');
-const path = require('path');
-const { extractPackageFile } = require('../../../lib/manager/deps-edn/extract');
-const { updateDependency } = require('../../../lib/manager/deps-edn/update');
+import { readFileSync } from 'fs';
+import { resolve } from 'path';
+import { extractPackageFile } from '../../../lib/manager/deps-edn/extract';
+import { updateDependency } from '../../../lib/manager/deps-edn/update';
 
-const depsEdn = fs.readFileSync(
-  path.resolve(__dirname, `./_fixtures/deps.edn`),
+const depsEdn = readFileSync(
+  resolve(__dirname, `./_fixtures/deps.edn`),
   'utf8'
 );
 
diff --git a/test/manager/docker-compose/__snapshots__/extract.spec.js.snap b/test/manager/docker-compose/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/docker-compose/__snapshots__/extract.spec.js.snap
rename to test/manager/docker-compose/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/docker-compose/extract.spec.js b/test/manager/docker-compose/extract.spec.ts
similarity index 76%
rename from test/manager/docker-compose/extract.spec.js
rename to test/manager/docker-compose/extract.spec.ts
index 51bf755ecaed3972c933c8a6034c3b227c90c02f..40875f90f57da59053ef0dcfa885b41f281c3599 100644
--- a/test/manager/docker-compose/extract.spec.js
+++ b/test/manager/docker-compose/extract.spec.ts
@@ -1,9 +1,7 @@
-const fs = require('fs');
-const {
-  extractPackageFile,
-} = require('../../../lib/manager/docker-compose/extract');
+import { readFileSync } from 'fs';
+import { extractPackageFile } from '../../../lib/manager/docker-compose/extract';
 
-const yamlFile = fs.readFileSync(
+const yamlFile = readFileSync(
   'test/manager/docker-compose/_fixtures/docker-compose.1.yml',
   'utf8'
 );
diff --git a/test/manager/docker-compose/update.spec.js b/test/manager/docker-compose/update.spec.ts
similarity index 72%
rename from test/manager/docker-compose/update.spec.js
rename to test/manager/docker-compose/update.spec.ts
index b23a1543aded026eafc019a7bb0d4e5d700b29b2..4b215593181dfabe33378bb70a9223f1658e571e 100644
--- a/test/manager/docker-compose/update.spec.js
+++ b/test/manager/docker-compose/update.spec.ts
@@ -1,7 +1,7 @@
-const fs = require('fs');
-const dcUpdate = require('../../../lib/manager/docker-compose/update');
+import { readFileSync } from 'fs';
+import { updateDependency } from '../../../lib/manager/docker-compose/update';
 
-const yamlFile = fs.readFileSync(
+const yamlFile = readFileSync(
   'test/manager/docker-compose/_fixtures/docker-compose.1.yml',
   'utf8'
 );
@@ -15,7 +15,7 @@ describe('manager/docker-compose/update', () => {
         newValue: '9.6.8',
         newDigest: 'sha256:abcdefghijklmnop',
       };
-      const res = dcUpdate.updateDependency(yamlFile, upgrade);
+      const res = updateDependency(yamlFile, upgrade);
       expect(res).not.toEqual(yamlFile);
       expect(res.includes(upgrade.newDigest)).toBe(true);
     });
@@ -25,7 +25,7 @@ describe('manager/docker-compose/update', () => {
         depName: 'quay.io/something/redis',
         newValue: 'alpine',
       };
-      const res = dcUpdate.updateDependency(yamlFile, upgrade);
+      const res = updateDependency(yamlFile, upgrade);
       expect(res).toEqual(yamlFile);
     });
     it('returns null if mismatch', () => {
@@ -33,11 +33,11 @@ describe('manager/docker-compose/update', () => {
         managerData: { lineNumber: 17 },
         newFrom: 'postgres:9.6.8@sha256:abcdefghijklmnop',
       };
-      const res = dcUpdate.updateDependency(yamlFile, upgrade);
+      const res = updateDependency(yamlFile, upgrade);
       expect(res).toBeNull();
     });
     it('returns null if error', () => {
-      const res = dcUpdate.updateDependency(null, null);
+      const res = updateDependency(null, null);
       expect(res).toBeNull();
     });
   });
diff --git a/test/manager/dockerfile/__snapshots__/extract.spec.js.snap b/test/manager/dockerfile/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/dockerfile/__snapshots__/extract.spec.js.snap
rename to test/manager/dockerfile/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/dockerfile/__snapshots__/update.spec.js.snap b/test/manager/dockerfile/__snapshots__/update.spec.ts.snap
similarity index 100%
rename from test/manager/dockerfile/__snapshots__/update.spec.js.snap
rename to test/manager/dockerfile/__snapshots__/update.spec.ts.snap
diff --git a/test/manager/dockerfile/extract.spec.js b/test/manager/dockerfile/extract.spec.ts
similarity index 97%
rename from test/manager/dockerfile/extract.spec.js
rename to test/manager/dockerfile/extract.spec.ts
index e348ea6fc2e5862d938d911a6b94176ec2382628..310d7cadff9aea2a98f2a31eee7442985882ee90 100644
--- a/test/manager/dockerfile/extract.spec.js
+++ b/test/manager/dockerfile/extract.spec.ts
@@ -1,9 +1,7 @@
-const fs = require('fs');
-const {
-  extractPackageFile,
-} = require('../../../lib/manager/dockerfile/extract');
+import { readFileSync } from 'fs';
+import { extractPackageFile } from '../../../lib/manager/dockerfile/extract';
 
-const d1 = fs.readFileSync(
+const d1 = readFileSync(
   'test/manager/dockerfile/_fixtures/Dockerfile1',
   'utf8'
 );
diff --git a/test/manager/dockerfile/update.spec.js b/test/manager/dockerfile/update.spec.ts
similarity index 98%
rename from test/manager/dockerfile/update.spec.js
rename to test/manager/dockerfile/update.spec.ts
index 5a9280a9423bada45e71ed26c1832e02ab7b573d..c9a65e8b918dc4687d76772472a3fd3789c91f58 100644
--- a/test/manager/dockerfile/update.spec.js
+++ b/test/manager/dockerfile/update.spec.ts
@@ -1,4 +1,4 @@
-const dockerfile = require('../../../lib/manager/dockerfile/update');
+import * as dockerfile from '../../../lib/manager/dockerfile/update';
 
 describe('manager/dockerfile/update', () => {
   describe('updateDependency', () => {
diff --git a/test/manager/github-actions/__snapshots__/extract.spec.js.snap b/test/manager/github-actions/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/github-actions/__snapshots__/extract.spec.js.snap
rename to test/manager/github-actions/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/github-actions/extract.spec.js b/test/manager/github-actions/extract.spec.ts
similarity index 76%
rename from test/manager/github-actions/extract.spec.js
rename to test/manager/github-actions/extract.spec.ts
index c5fa9d75fdf9d657ce1a1cfb1790ed4c2f9e8eab..73b920be4deffe38586f3062d147956f0e28687d 100644
--- a/test/manager/github-actions/extract.spec.js
+++ b/test/manager/github-actions/extract.spec.ts
@@ -1,9 +1,7 @@
-const fs = require('fs');
-const {
-  extractPackageFile,
-} = require('../../../lib/manager/github-actions/extract');
+import { readFileSync } from 'fs';
+import { extractPackageFile } from '../../../lib/manager/github-actions/extract';
 
-const workflow1 = fs.readFileSync(
+const workflow1 = readFileSync(
   'test/manager/github-actions/_fixtures/main.workflow.1',
   'utf8'
 );
diff --git a/test/manager/github-actions/update.spec.js b/test/manager/github-actions/update.spec.ts
similarity index 71%
rename from test/manager/github-actions/update.spec.js
rename to test/manager/github-actions/update.spec.ts
index 1022c4e3be720dcf1df2b7865781cd4115446200..b260273f3eebf63798af6197255207fa36ab1c4b 100644
--- a/test/manager/github-actions/update.spec.js
+++ b/test/manager/github-actions/update.spec.ts
@@ -1,7 +1,7 @@
-const fs = require('fs');
-const dcUpdate = require('../../../lib/manager/github-actions/update');
+import { readFileSync } from 'fs';
+import { updateDependency } from '../../../lib/manager/github-actions/update';
 
-const workflow1 = fs.readFileSync(
+const workflow1 = readFileSync(
   'test/manager/github-actions/_fixtures/main.workflow.1',
   'utf8'
 );
@@ -14,7 +14,7 @@ describe('manager/github-actions/update', () => {
         depName: 'replicated/dockerfilelint',
         newDigest: 'sha256:abcdefghijklmnop',
       };
-      const res = dcUpdate.updateDependency(workflow1, upgrade);
+      const res = updateDependency(workflow1, upgrade);
       expect(res).not.toEqual(workflow1);
       expect(res.includes(upgrade.newDigest)).toBe(true);
     });
@@ -23,7 +23,7 @@ describe('manager/github-actions/update', () => {
         managerData: { lineNumber: 11 },
         depName: 'replicated/dockerfilelint',
       };
-      const res = dcUpdate.updateDependency(workflow1, upgrade);
+      const res = updateDependency(workflow1, upgrade);
       expect(res).toEqual(workflow1);
     });
     it('returns null if mismatch', () => {
@@ -31,11 +31,11 @@ describe('manager/github-actions/update', () => {
         managerData: { lineNumber: 12 },
         newFrom: 'registry:2.6.2@sha256:abcdefghijklmnop',
       };
-      const res = dcUpdate.updateDependency(workflow1, upgrade);
+      const res = updateDependency(workflow1, upgrade);
       expect(res).toBeNull();
     });
     it('returns null if error', () => {
-      const res = dcUpdate.updateDependency(null, null);
+      const res = updateDependency(null, null);
       expect(res).toBeNull();
     });
   });
diff --git a/test/manager/gitlabci-include/__snapshots__/extract.spec.js.snap b/test/manager/gitlabci-include/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/gitlabci-include/__snapshots__/extract.spec.js.snap
rename to test/manager/gitlabci-include/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/gitlabci-include/extract.spec.js b/test/manager/gitlabci-include/extract.spec.ts
similarity index 77%
rename from test/manager/gitlabci-include/extract.spec.js
rename to test/manager/gitlabci-include/extract.spec.ts
index bb479bd4beaf20438fac6c1728511be9e5cef483..57458c8e5a43cbfc06604ac10306268f747ee104 100644
--- a/test/manager/gitlabci-include/extract.spec.js
+++ b/test/manager/gitlabci-include/extract.spec.ts
@@ -1,7 +1,6 @@
-const fs = require('fs');
-const {
-  extractPackageFile,
-} = require('../../../lib/manager/gitlabci-include/extract');
+import fs from 'fs';
+import { extractPackageFile } from '../../../lib/manager/gitlabci-include/extract';
+import { ExtractConfig } from '../../../lib/manager/common';
 
 const yamlFile = fs.readFileSync(
   'test/manager/gitlabci-include/_fixtures/gitlab-ci.yaml',
@@ -10,7 +9,7 @@ const yamlFile = fs.readFileSync(
 
 describe('lib/manager/gitlabci-include/extract', () => {
   describe('extractPackageFile()', () => {
-    let config;
+    let config: ExtractConfig;
     beforeEach(() => {
       config = {
         endpoint: 'http://gitlab.test/api/v4/',
diff --git a/test/manager/gitlabci-include/update.spec.js b/test/manager/gitlabci-include/update.spec.ts
similarity index 70%
rename from test/manager/gitlabci-include/update.spec.js
rename to test/manager/gitlabci-include/update.spec.ts
index a3fb903afc0f1d91e6c275d1ac5f1a30c21043c3..6c3dddff72de8d9f2d832a7d20591fed51f78de5 100644
--- a/test/manager/gitlabci-include/update.spec.js
+++ b/test/manager/gitlabci-include/update.spec.ts
@@ -1,7 +1,7 @@
-const fs = require('fs');
-const dcUpdate = require('../../../lib/manager/gitlabci-include/update');
+import { readFileSync } from 'fs';
+import { updateDependency } from '../../../lib/manager/gitlabci-include/update';
 
-const yamlFile = fs.readFileSync(
+const yamlFile = readFileSync(
   'test/manager/gitlabci-include/_fixtures/gitlab-ci.yaml',
   'utf8'
 );
@@ -14,7 +14,7 @@ describe('manager/gitlabci-include/update', () => {
         depName: 'mikebryant/include-source-example',
         newValue: '1.0.1',
       };
-      const res = dcUpdate.updateDependency(yamlFile, upgrade);
+      const res = updateDependency(yamlFile, upgrade);
       expect(res).not.toEqual(yamlFile);
       expect(res.includes(upgrade.newValue)).toBe(true);
     });
@@ -24,11 +24,11 @@ describe('manager/gitlabci-include/update', () => {
         depName: 'mikebryant/include-source-example',
         newValue: '1.0.0',
       };
-      const res = dcUpdate.updateDependency(yamlFile, upgrade);
+      const res = updateDependency(yamlFile, upgrade);
       expect(res).toEqual(yamlFile);
     });
     it('returns null if error', () => {
-      const res = dcUpdate.updateDependency(null, null);
+      const res = updateDependency(null, null);
       expect(res).toBeNull();
     });
   });
diff --git a/test/manager/gitlabci/__snapshots__/extract.spec.js.snap b/test/manager/gitlabci/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/gitlabci/__snapshots__/extract.spec.js.snap
rename to test/manager/gitlabci/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/gitlabci/extract.spec.js b/test/manager/gitlabci/extract.spec.ts
similarity index 76%
rename from test/manager/gitlabci/extract.spec.js
rename to test/manager/gitlabci/extract.spec.ts
index b86f618fcea0da574ee4f9cd636b45d25f9dc84f..51201ee49bb7ae66d04494a760364162e6754cfd 100644
--- a/test/manager/gitlabci/extract.spec.js
+++ b/test/manager/gitlabci/extract.spec.ts
@@ -1,7 +1,7 @@
-const fs = require('fs');
-const { extractPackageFile } = require('../../../lib/manager/gitlabci/extract');
+import { readFileSync } from 'fs';
+import { extractPackageFile } from '../../../lib/manager/gitlabci/extract';
 
-const yamlFile = fs.readFileSync(
+const yamlFile = readFileSync(
   'test/manager/gitlabci/_fixtures/gitlab-ci.yaml',
   'utf8'
 );
diff --git a/test/manager/gitlabci/update.spec.js b/test/manager/gitlabci/update.spec.ts
similarity index 78%
rename from test/manager/gitlabci/update.spec.js
rename to test/manager/gitlabci/update.spec.ts
index b08a0b58327a365237187291888610cc5c745323..9f0032abc51072c2253a694c3245bc1b5c7c4dd3 100644
--- a/test/manager/gitlabci/update.spec.js
+++ b/test/manager/gitlabci/update.spec.ts
@@ -1,7 +1,7 @@
-const fs = require('fs');
-const dcUpdate = require('../../../lib/manager/gitlabci/update');
+import { readFileSync } from 'fs';
+import { updateDependency } from '../../../lib/manager/gitlabci/update';
 
-const yamlFile = fs.readFileSync(
+const yamlFile = readFileSync(
   'test/manager/gitlabci/_fixtures/gitlab-ci.yaml',
   'utf8'
 );
@@ -16,7 +16,7 @@ describe('manager/gitlabci/update', () => {
         newValue: '7.0.0',
         newDigest: 'sha256:abcdefghijklmnop',
       };
-      const res = dcUpdate.updateDependency(yamlFile, upgrade);
+      const res = updateDependency(yamlFile, upgrade);
       expect(res).not.toEqual(yamlFile);
       expect(res.includes(upgrade.newDigest)).toBe(true);
     });
@@ -27,7 +27,7 @@ describe('manager/gitlabci/update', () => {
         depName: 'hadolint/hadolint',
         newValue: 'latest',
       };
-      const res = dcUpdate.updateDependency(yamlFile, upgrade);
+      const res = updateDependency(yamlFile, upgrade);
       expect(res).toEqual(yamlFile);
     });
     it('returns null if mismatch', () => {
@@ -38,7 +38,7 @@ describe('manager/gitlabci/update', () => {
         newValue: '9.6.8',
         newDigest: 'sha256:abcdefghijklmnop',
       };
-      const res = dcUpdate.updateDependency(yamlFile, upgrade);
+      const res = updateDependency(yamlFile, upgrade);
       expect(res).toBeNull();
     });
     it('replaces image-name value', () => {
@@ -48,7 +48,7 @@ describe('manager/gitlabci/update', () => {
         depName: 'image-name-test',
         newValue: '1.35',
       };
-      const res = dcUpdate.updateDependency(yamlFile, upgrade);
+      const res = updateDependency(yamlFile, upgrade);
       expect(res).not.toEqual(yamlFile);
     });
     it('returns same image-name value', () => {
@@ -58,7 +58,7 @@ describe('manager/gitlabci/update', () => {
         depName: 'image-name-test',
         newValue: '1.15',
       };
-      const res = dcUpdate.updateDependency(yamlFile, upgrade);
+      const res = updateDependency(yamlFile, upgrade);
       expect(res).toEqual(yamlFile);
     });
     it('replaces service-image update', () => {
@@ -69,7 +69,7 @@ describe('manager/gitlabci/update', () => {
         newValue: '7.0.0',
         newDigest: 'sha256:abcdefghijklmnop',
       };
-      const res = dcUpdate.updateDependency(yamlFile, upgrade);
+      const res = updateDependency(yamlFile, upgrade);
       expect(res).not.toEqual(yamlFile);
       expect(res.includes(upgrade.newDigest)).toBe(true);
     });
@@ -81,7 +81,7 @@ describe('manager/gitlabci/update', () => {
         newValue: '9.6.8',
         newDigest: 'sha256:abcdefghijklmnop',
       };
-      const res = dcUpdate.updateDependency(yamlFile, upgrade);
+      const res = updateDependency(yamlFile, upgrade);
       expect(res).toBeNull();
     });
     it('returns service-image same', () => {
@@ -91,11 +91,11 @@ describe('manager/gitlabci/update', () => {
         depName: 'docker',
         newValue: 'dind',
       };
-      const res = dcUpdate.updateDependency(yamlFile, upgrade);
+      const res = updateDependency(yamlFile, upgrade);
       expect(res).toEqual(yamlFile);
     });
     it('returns null if error', () => {
-      const res = dcUpdate.updateDependency(null, null);
+      const res = updateDependency(null, null);
       expect(res).toBeNull();
     });
   });
diff --git a/test/manager/gomod/__snapshots__/artifacts.spec.js.snap b/test/manager/gomod/__snapshots__/artifacts.spec.ts.snap
similarity index 100%
rename from test/manager/gomod/__snapshots__/artifacts.spec.js.snap
rename to test/manager/gomod/__snapshots__/artifacts.spec.ts.snap
diff --git a/test/manager/gomod/__snapshots__/extract.spec.js.snap b/test/manager/gomod/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/gomod/__snapshots__/extract.spec.js.snap
rename to test/manager/gomod/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/gomod/__snapshots__/update.spec.js.snap b/test/manager/gomod/__snapshots__/update.spec.ts.snap
similarity index 100%
rename from test/manager/gomod/__snapshots__/update.spec.js.snap
rename to test/manager/gomod/__snapshots__/update.spec.ts.snap
diff --git a/test/manager/gomod/artifacts.spec.js b/test/manager/gomod/artifacts.spec.ts
similarity index 95%
rename from test/manager/gomod/artifacts.spec.js
rename to test/manager/gomod/artifacts.spec.ts
index acecb96d2e5afe2f1aefeb910e5bcd0fb0311fb2..b05158629b47ebe87202175bbf201963fd7f1237 100644
--- a/test/manager/gomod/artifacts.spec.js
+++ b/test/manager/gomod/artifacts.spec.ts
@@ -1,17 +1,15 @@
+import _fs from 'fs-extra';
+import * as gomod from '../../../lib/manager/gomod/artifacts';
+
 jest.mock('fs-extra');
 jest.mock('../../../lib/util/exec');
 jest.mock('../../../lib/util/host-rules');
 
-/** @type any */
-const fs = require('fs-extra');
-/** @type any */
 const { exec } = require('../../../lib/util/exec');
-const gomod = require('../../../lib/manager/gomod/artifacts');
-/** @type any */
 const hostRules = require('../../../lib/util/host-rules');
 
-/** @type any */
-const platform = global.platform;
+const fs: any = _fs;
+const platform: any = global.platform;
 
 const gomod1 = `module github.com/renovate-tests/gomod1
 
diff --git a/test/manager/gomod/extract.spec.js b/test/manager/gomod/extract.spec.ts
similarity index 74%
rename from test/manager/gomod/extract.spec.js
rename to test/manager/gomod/extract.spec.ts
index 0b01a595b4e436cfb099feec3f449aa6fdce6c34..405070a926d66c3e71e12f924918032ac3f5a362 100644
--- a/test/manager/gomod/extract.spec.js
+++ b/test/manager/gomod/extract.spec.ts
@@ -1,8 +1,8 @@
-const fs = require('fs');
-const { extractPackageFile } = require('../../../lib/manager/gomod/extract');
+import { readFileSync } from 'fs';
+import { extractPackageFile } from '../../../lib/manager/gomod/extract';
 
-const gomod1 = fs.readFileSync('test/manager/gomod/_fixtures/1/go.mod', 'utf8');
-const gomod2 = fs.readFileSync('test/manager/gomod/_fixtures/2/go.mod', 'utf8');
+const gomod1 = readFileSync('test/manager/gomod/_fixtures/1/go.mod', 'utf8');
+const gomod2 = readFileSync('test/manager/gomod/_fixtures/2/go.mod', 'utf8');
 
 describe('lib/manager/gomod/extract', () => {
   describe('extractPackageFile()', () => {
diff --git a/test/manager/gomod/update.spec.js b/test/manager/gomod/update.spec.ts
similarity index 83%
rename from test/manager/gomod/update.spec.js
rename to test/manager/gomod/update.spec.ts
index 7e723cef9b380a7cb20cc88a9d8bb1fb8acacc89..261c0d585e1c590b2c905e0c423e40a64e4441a0 100644
--- a/test/manager/gomod/update.spec.js
+++ b/test/manager/gomod/update.spec.ts
@@ -1,8 +1,8 @@
-const fs = require('fs');
-const goUpdate = require('../../../lib/manager/gomod/update');
+import { readFileSync } from 'fs';
+import { updateDependency } from '../../../lib/manager/gomod/update';
 
-const gomod1 = fs.readFileSync('test/manager/gomod/_fixtures/1/go.mod', 'utf8');
-const gomod2 = fs.readFileSync('test/manager/gomod/_fixtures/2/go.mod', 'utf8');
+const gomod1 = readFileSync('test/manager/gomod/_fixtures/1/go.mod', 'utf8');
+const gomod2 = readFileSync('test/manager/gomod/_fixtures/2/go.mod', 'utf8');
 
 describe('manager/gomod/update', () => {
   describe('updateDependency', () => {
@@ -13,7 +13,7 @@ describe('manager/gomod/update', () => {
         newValue: 'v0.8.0',
         depType: 'require',
       };
-      const res = goUpdate.updateDependency(gomod1, upgrade);
+      const res = updateDependency(gomod1, upgrade);
       expect(res).not.toEqual(gomod1);
       expect(res.includes(upgrade.newValue)).toBe(true);
     });
@@ -24,7 +24,7 @@ describe('manager/gomod/update', () => {
         newValue: 'v0.8.0',
         depType: 'require',
       };
-      const res1 = goUpdate.updateDependency(gomod1, upgrade1);
+      const res1 = updateDependency(gomod1, upgrade1);
       expect(res1).not.toEqual(gomod1);
       expect(res1.includes(upgrade1.newValue)).toBe(true);
       const upgrade2 = {
@@ -33,7 +33,7 @@ describe('manager/gomod/update', () => {
         newValue: 'v1.15.36',
         depType: 'require',
       };
-      const res2 = goUpdate.updateDependency(res1, upgrade2);
+      const res2 = updateDependency(res1, upgrade2);
       expect(res2).not.toEqual(res1);
       expect(res2).toMatchSnapshot();
     });
@@ -43,7 +43,7 @@ describe('manager/gomod/update', () => {
         managerData: { lineNumber: 2 },
         newValue: 'v0.7.0',
       };
-      const res = goUpdate.updateDependency(gomod1, upgrade);
+      const res = updateDependency(gomod1, upgrade);
       expect(res).toEqual(gomod1);
     });
     it('replaces major updates > 1', () => {
@@ -56,7 +56,7 @@ describe('manager/gomod/update', () => {
         newValue: 'v2.0.0',
         depType: 'require',
       };
-      const res = goUpdate.updateDependency(gomod1, upgrade);
+      const res = updateDependency(gomod1, upgrade);
       expect(res).not.toEqual(gomod2);
       expect(res.includes(upgrade.newValue)).toBe(true);
       expect(res.includes('github.com/pkg/errors/v2')).toBe(true);
@@ -71,7 +71,7 @@ describe('manager/gomod/update', () => {
         newValue: 'v2.0.0',
         depType: 'require',
       };
-      const res = goUpdate.updateDependency(gomod1, upgrade);
+      const res = updateDependency(gomod1, upgrade);
       expect(res).toMatchSnapshot();
       expect(res).not.toEqual(gomod2);
       expect(res.includes('gopkg.in/russross/blackfriday.v2 v2.0.0')).toBe(
@@ -84,11 +84,11 @@ describe('manager/gomod/update', () => {
         managerData: { lineNumber: 2 },
         newValue: 'v1.15.36',
       };
-      const res = goUpdate.updateDependency(gomod1, upgrade);
+      const res = updateDependency(gomod1, upgrade);
       expect(res).toBeNull();
     });
     it('returns null if error', () => {
-      const res = goUpdate.updateDependency(null, null);
+      const res = updateDependency(null, null);
       expect(res).toBeNull();
     });
     it('replaces multiline', () => {
@@ -98,7 +98,7 @@ describe('manager/gomod/update', () => {
         newValue: 'v1.8.0',
         depType: 'require',
       };
-      const res = goUpdate.updateDependency(gomod2, upgrade);
+      const res = updateDependency(gomod2, upgrade);
       expect(res).not.toEqual(gomod2);
       expect(res.includes(upgrade.newValue)).toBe(true);
     });
@@ -109,7 +109,7 @@ describe('manager/gomod/update', () => {
         newValue: 'v4.8.0',
         depType: 'require',
       };
-      const res = goUpdate.updateDependency(gomod2, upgrade);
+      const res = updateDependency(gomod2, upgrade);
       expect(res).toMatchSnapshot();
       expect(res).not.toEqual(gomod2);
       expect(res.includes(upgrade.newValue)).toBe(true);
@@ -124,7 +124,7 @@ describe('manager/gomod/update', () => {
         updateType: 'major',
         depType: 'require',
       };
-      const res = goUpdate.updateDependency(gomod2, upgrade);
+      const res = updateDependency(gomod2, upgrade);
       expect(res).not.toEqual(gomod2);
       expect(res.includes(upgrade.newValue)).toBe(true);
       expect(res.includes('github.com/emirpasic/gods/v2')).toBe(true);
@@ -139,7 +139,7 @@ describe('manager/gomod/update', () => {
         updateType: 'major',
         depType: 'require',
       };
-      const res = goUpdate.updateDependency(gomod2, upgrade);
+      const res = updateDependency(gomod2, upgrade);
       expect(res).not.toEqual(gomod2);
       expect(res.includes(upgrade.newValue)).toBe(true);
       expect(res.includes('github.com/src-d/gcfg/v3')).toBe(true);
@@ -154,7 +154,7 @@ describe('manager/gomod/update', () => {
         newDigest: '123456123456abcdef',
         depType: 'require',
       };
-      const res = goUpdate.updateDependency(gomod2, upgrade);
+      const res = updateDependency(gomod2, upgrade);
       expect(res).not.toEqual(gomod2);
       expect(res.includes(upgrade.newDigest)).toBe(false);
       expect(res.includes(upgrade.newDigest.substring(0, 12))).toBe(true);
@@ -169,7 +169,7 @@ describe('manager/gomod/update', () => {
         newDigest: '14d3d4c51834000000',
         depType: 'require',
       };
-      const res = goUpdate.updateDependency(gomod2, upgrade);
+      const res = updateDependency(gomod2, upgrade);
       expect(res).toEqual(gomod2);
     });
     it('handles multiline mismatch', () => {
@@ -179,7 +179,7 @@ describe('manager/gomod/update', () => {
         newValue: 'v1.8.0',
         depType: 'require',
       };
-      const res = goUpdate.updateDependency(gomod2, upgrade);
+      const res = updateDependency(gomod2, upgrade);
       expect(res).toBeNull();
     });
     it('handles +incompatible tag', () => {
@@ -189,7 +189,7 @@ describe('manager/gomod/update', () => {
         newValue: 'v26.0.0',
         depType: 'require',
       };
-      const res = goUpdate.updateDependency(gomod1, upgrade);
+      const res = updateDependency(gomod1, upgrade);
       expect(res).not.toEqual(gomod1);
       // Assert that the version still contains +incompatible tag.
       expect(res.includes(upgrade.newValue + '+incompatible')).toBe(true);
@@ -201,7 +201,7 @@ describe('manager/gomod/update', () => {
         newValue: 'v0.0.1',
         depType: 'replace',
       };
-      const res = goUpdate.updateDependency(gomod1, upgrade);
+      const res = updateDependency(gomod1, upgrade);
       expect(res).not.toEqual(gomod1);
       expect(res.includes(upgrade.newValue)).toBe(true);
     });
@@ -215,7 +215,7 @@ describe('manager/gomod/update', () => {
         newMajor: 2,
         updateType: 'major',
       };
-      const res = goUpdate.updateDependency(gomod1, upgrade);
+      const res = updateDependency(gomod1, upgrade);
       expect(res).not.toEqual(gomod1);
       expect(res.includes(upgrade.newValue)).toBe(true);
     });
@@ -231,7 +231,7 @@ describe('manager/gomod/update', () => {
         currentDigest: '14d3d4c51834',
         newDigest: '123456123456abcdef',
       };
-      const res = goUpdate.updateDependency(gomod1, upgrade);
+      const res = updateDependency(gomod1, upgrade);
       expect(res).not.toEqual(gomod1);
       expect(res.includes(upgrade.newDigest.substring(0, 12))).toBe(true);
     });
diff --git a/test/manager/gradle-wrapper/__snapshots__/extract.spec.js.snap b/test/manager/gradle-wrapper/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/gradle-wrapper/__snapshots__/extract.spec.js.snap
rename to test/manager/gradle-wrapper/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/gradle-wrapper/__snapshots__/update.spec.js.snap b/test/manager/gradle-wrapper/__snapshots__/update.spec.ts.snap
similarity index 100%
rename from test/manager/gradle-wrapper/__snapshots__/update.spec.js.snap
rename to test/manager/gradle-wrapper/__snapshots__/update.spec.ts.snap
diff --git a/test/manager/gradle-wrapper/extract.spec.js b/test/manager/gradle-wrapper/extract.spec.ts
similarity index 77%
rename from test/manager/gradle-wrapper/extract.spec.js
rename to test/manager/gradle-wrapper/extract.spec.ts
index 08a4af42b2e3037cf17162adf0bc9c00a8202818..419c468fa6d7b9bd9515ea43bec4258eff1d9f5d 100644
--- a/test/manager/gradle-wrapper/extract.spec.js
+++ b/test/manager/gradle-wrapper/extract.spec.ts
@@ -1,13 +1,11 @@
-const fs = require('fs');
-const {
-  extractPackageFile,
-} = require('../../../lib/manager/gradle-wrapper/extract');
+import { readFileSync } from 'fs';
+import { extractPackageFile } from '../../../lib/manager/gradle-wrapper/extract';
 
-const propertiesFile1 = fs.readFileSync(
+const propertiesFile1 = readFileSync(
   'test/datasource/gradle-wrapper/_fixtures/gradle-wrapper-1.properties',
   'utf8'
 );
-const propertiesFile2 = fs.readFileSync(
+const propertiesFile2 = readFileSync(
   'test/datasource/gradle-wrapper/_fixtures/gradle-wrapper-2.properties',
   'utf8'
 );
diff --git a/test/manager/gradle-wrapper/update.spec.js b/test/manager/gradle-wrapper/update.spec.ts
similarity index 87%
rename from test/manager/gradle-wrapper/update.spec.js
rename to test/manager/gradle-wrapper/update.spec.ts
index 1c4730b796c459cdc920c4bfe014704c65f7f057..8a89d6c54d9e7f4eecb03f735732732eb6d83f40 100644
--- a/test/manager/gradle-wrapper/update.spec.js
+++ b/test/manager/gradle-wrapper/update.spec.ts
@@ -1,9 +1,11 @@
-const fs = require('fs');
-const got = require('../../../lib/util/got');
-const dcUpdate = require('../../../lib/manager/gradle-wrapper/update');
+import fs from 'fs';
+import * as dcUpdate from '../../../lib/manager/gradle-wrapper';
+import * as _got from '../../../lib/util/got';
 
 jest.mock('../../../lib/util/got');
 
+const got: jest.Mock<any> = _got as any;
+
 const propertiesFile2 = fs.readFileSync(
   'test/datasource/gradle-wrapper/_fixtures/gradle-wrapper-2.properties',
   'utf8'
@@ -72,18 +74,18 @@ describe('manager/gradle-wrapper/update', () => {
       const upgrade = {
         toVersion: '4.10.3',
         version: '4.10.3',
-        lineNumber: 5,
-        checksumLineNumber: 6,
+        managerData: {
+          lineNumber: 5,
+          checksumLineNumber: 6,
+        },
         downloadUrl:
           'https://services.gradle.org/distributions/gradle-4.10.3-all.zip',
         checksumUrl:
           'https://services.gradle.org/distributions/gradle-4.10.3-all.zip.sha256',
       };
-      got.mockImplementation(() =>
-        Promise.reject({
-          statusCode: 404,
-        })
-      );
+      got.mockRejectedValueOnce({
+        statusCode: 404,
+      });
       const res = await dcUpdate.updateDependency(propertiesFile2, upgrade);
       expect(res).toBeNull();
     });
@@ -92,16 +94,16 @@ describe('manager/gradle-wrapper/update', () => {
       const upgrade = {
         toVersion: '4.10.3',
         version: '4.10.3',
-        lineNumber: 5,
-        checksumLineNumber: 6,
+        managerData: {
+          lineNumber: 5,
+          checksumLineNumber: 6,
+        },
         downloadUrl:
           'https://services.gradle.org/distributions/gradle-4.10.3-all.zip',
         checksumUrl:
           'https://services.gradle.org/distributions/gradle-4.10.3-all.zip.sha256',
       };
-      got.mockImplementation(() => {
-        throw new Error();
-      });
+      got.mockRejectedValueOnce(new Error());
       const res = await dcUpdate.updateDependency(propertiesFile2, upgrade);
       expect(res).toBeNull();
     });
diff --git a/test/manager/gradle/__snapshots__/index.spec.js.snap b/test/manager/gradle/__snapshots__/index.spec.ts.snap
similarity index 100%
rename from test/manager/gradle/__snapshots__/index.spec.js.snap
rename to test/manager/gradle/__snapshots__/index.spec.ts.snap
diff --git a/test/manager/gradle/build-gradle.spec.js b/test/manager/gradle/build-gradle.spec.ts
similarity index 84%
rename from test/manager/gradle/build-gradle.spec.js
rename to test/manager/gradle/build-gradle.spec.ts
index 514973395a74eb9dcf2926f63da7249d5a2822f6..da7d7c86cfe40aae7bf194a3f903b245365ce370 100644
--- a/test/manager/gradle/build-gradle.spec.js
+++ b/test/manager/gradle/build-gradle.spec.ts
@@ -1,23 +1,23 @@
-const gradle = require('../../../lib/manager/gradle/build-gradle');
+import {
+  init,
+  updateGradleVersion,
+  collectVersionVariables,
+} from '../../../lib/manager/gradle/build-gradle';
 
 describe('lib/manager/gradle/updateGradleVersion', () => {
   beforeEach(() => {
-    gradle.init();
+    init();
   });
 
   it('returns the same file if dependency is null', () => {
     const gradleFile = "runtime('mysql:mysql-connector-java:6.0.5')";
-    const updatedGradleFile = gradle.updateGradleVersion(
-      gradleFile,
-      null,
-      null
-    );
+    const updatedGradleFile = updateGradleVersion(gradleFile, null, null);
     expect(updatedGradleFile).toEqual(gradleFile);
   });
 
   it('returns the same file if version is not found', () => {
     const gradleFile = "runtime('mysql:mysql-connector-java:6.0.5')";
-    const updatedGradleFile = gradle.updateGradleVersion(
+    const updatedGradleFile = updateGradleVersion(
       gradleFile,
       { group: 'org.codehaus.groovy', name: 'groovy', version: '2.4.9' },
       '7.0.0'
@@ -27,7 +27,7 @@ describe('lib/manager/gradle/updateGradleVersion', () => {
 
   it('returns a file updated if the version is found', () => {
     const gradleFile = "runtime (  'mysql:mysql-connector-java:6.0.5'  )";
-    const updatedGradleFile = gradle.updateGradleVersion(
+    const updatedGradleFile = updateGradleVersion(
       gradleFile,
       { group: 'mysql', name: 'mysql-connector-java', version: '6.0.5' },
       '7.0.0'
@@ -40,7 +40,7 @@ describe('lib/manager/gradle/updateGradleVersion', () => {
   it('should returns a file updated with keeping an extension if the version is found', () => {
     const gradleFile =
       "runtime (  'com.crashlytics.sdk.android:crashlytics:2.8.0@aar'  )";
-    const updatedGradleFile = gradle.updateGradleVersion(
+    const updatedGradleFile = updateGradleVersion(
       gradleFile,
       {
         group: 'com.crashlytics.sdk.android',
@@ -56,7 +56,7 @@ describe('lib/manager/gradle/updateGradleVersion', () => {
 
   it('should returns a file updated with keeping a classifier and an extension if the version is found', () => {
     const gradleFile = "runtime (  'junit:junit:4.0:javadoc@jar'  )";
-    const updatedGradleFile = gradle.updateGradleVersion(
+    const updatedGradleFile = updateGradleVersion(
       gradleFile,
       { group: 'junit', name: 'junit', version: '4.0' },
       '5.0'
@@ -70,7 +70,7 @@ describe('lib/manager/gradle/updateGradleVersion', () => {
     const gradleFile = `compile group  : 'mysql'               ,
                name   : 'mysql-connector-java',
                version: '6.0.5'`;
-    const updatedGradleFile = gradle.updateGradleVersion(
+    const updatedGradleFile = updateGradleVersion(
       gradleFile,
       { group: 'mysql', name: 'mysql-connector-java', version: '6.0.5' },
       '7.0.0'
@@ -86,7 +86,7 @@ describe('lib/manager/gradle/updateGradleVersion', () => {
     const gradleFile = `String mysqlVersion= "6.0.5"
     runtime (  "mysql:mysql-connector-java:$mysqlVersion"  )
     `;
-    const updatedGradleFile = gradle.updateGradleVersion(
+    const updatedGradleFile = updateGradleVersion(
       gradleFile,
       { group: 'mysql', name: 'mysql-connector-java', version: '6.0.5' },
       '7.0.0'
@@ -100,7 +100,7 @@ describe('lib/manager/gradle/updateGradleVersion', () => {
     const gradleFile = `String mysqlVersion = "6.0.5"
     runtime (  "mysql:mysql-connector-java:\${mysqlVersion}"  )
     `;
-    const updatedGradleFile = gradle.updateGradleVersion(
+    const updatedGradleFile = updateGradleVersion(
       gradleFile,
       { group: 'mysql', name: 'mysql-connector-java', version: '6.0.5' },
       '7.0.0'
@@ -116,7 +116,7 @@ describe('lib/manager/gradle/updateGradleVersion', () => {
                name           : 'mysql-connector-java',
                version        : mysqlVersion
                `;
-    const updatedGradleFile = gradle.updateGradleVersion(
+    const updatedGradleFile = updateGradleVersion(
       gradleFile,
       { group: 'mysql', name: 'mysql-connector-java', version: '6.0.5' },
       '7.0.0'
@@ -139,10 +139,10 @@ describe('lib/manager/gradle/updateGradleVersion', () => {
       name: 'mysql-connector-java',
       version: '6.0.5',
     };
-    gradle.collectVersionVariables([mysqlDependency], gradleFile);
+    collectVersionVariables([mysqlDependency], gradleFile);
 
     const gradleWithVersionFile = 'String mysqlVersion = "6.0.5"';
-    const updatedGradleFile = gradle.updateGradleVersion(
+    const updatedGradleFile = updateGradleVersion(
       gradleWithVersionFile,
       mysqlDependency,
       '7.0.0'
@@ -159,10 +159,10 @@ describe('lib/manager/gradle/updateGradleVersion', () => {
       name: 'mysql-connector-java',
       version: '6.0.5',
     };
-    gradle.collectVersionVariables([mysqlDependency], gradleFile);
+    collectVersionVariables([mysqlDependency], gradleFile);
 
     const propertyFile = 'mysqlVersion=6.0.5';
-    const updatedGradleFile = gradle.updateGradleVersion(
+    const updatedGradleFile = updateGradleVersion(
       propertyFile,
       mysqlDependency,
       '7.0.0'
@@ -181,10 +181,10 @@ describe('lib/manager/gradle/updateGradleVersion', () => {
       name: 'mysql-connector-java',
       version: '6.0.5',
     };
-    gradle.collectVersionVariables([mysqlDependency], gradleFile);
+    collectVersionVariables([mysqlDependency], gradleFile);
 
     const gradleWithVersionFile = 'String mysqlVersion = "6.0.5"';
-    const updatedGradleFile = gradle.updateGradleVersion(
+    const updatedGradleFile = updateGradleVersion(
       gradleWithVersionFile,
       mysqlDependency,
       '7.0.0'
@@ -201,10 +201,10 @@ describe('lib/manager/gradle/updateGradleVersion', () => {
       name: 'mysql-connector-java',
       version: '6.0.5',
     };
-    gradle.collectVersionVariables([mysqlDependency], gradleFile);
+    collectVersionVariables([mysqlDependency], gradleFile);
 
     const gradleWithVersionFile = 'String mysqlVersion = "6.0.5"';
-    const updatedGradleFile = gradle.updateGradleVersion(
+    const updatedGradleFile = updateGradleVersion(
       gradleWithVersionFile,
       mysqlDependency,
       '7.0.0'
diff --git a/test/manager/gradle/index.spec.js b/test/manager/gradle/index.spec.ts
similarity index 81%
rename from test/manager/gradle/index.spec.js
rename to test/manager/gradle/index.spec.ts
index 0cf393329945e9e52e6bfae4fc53711ed67acd07..f2f27b37ab6cbf679a416c3035bdf6dca82e9b69 100644
--- a/test/manager/gradle/index.spec.js
+++ b/test/manager/gradle/index.spec.ts
@@ -1,17 +1,15 @@
+import { toUnix } from 'upath';
+import _fs from 'fs-extra';
+import fsReal from 'fs';
+import { exec as _exec } from '../../../lib/util/exec';
+import * as manager from '../../../lib/manager/gradle';
+
 jest.mock('fs-extra');
 jest.mock('../../../lib/util/exec');
 
-const { toUnix } = require('upath');
-/** @type any */
-const fs = require('fs-extra');
-const fsReal = require('fs');
-/** @type any */
-const { exec } = require('../../../lib/util/exec');
-
-const manager = require('../../../lib/manager/gradle/index');
-
-/** @type any */
-const platform = global.platform;
+const _platform: jest.Mocked<typeof global.platform> = global.platform as any;
+const fs: jest.Mocked<typeof _fs> = _fs as any;
+const exec: jest.Mock<typeof _exec> = _exec as any;
 
 const config = {
   localDir: 'localDir',
@@ -28,11 +26,11 @@ const updatesDependenciesReport = fsReal.readFileSync(
 describe('manager/gradle', () => {
   beforeEach(() => {
     jest.resetAllMocks();
-    fs.readFile.mockReturnValue(updatesDependenciesReport);
-    fs.mkdir.mockReturnValue(true);
-    fs.exists.mockReturnValue(true);
-    exec.mockReturnValue({ stdout: 'gradle output', stderr: '' });
-    platform.getFile.mockReturnValue('some content');
+    fs.readFile.mockResolvedValue(updatesDependenciesReport as any);
+    fs.mkdir.mockResolvedValue();
+    fs.exists.mockResolvedValue(true);
+    exec.mockResolvedValue({ stdout: 'gradle output', stderr: '' } as never);
+    _platform.getFile.mockResolvedValue('some content');
   });
 
   describe('extractPackageFile', () => {
@@ -45,12 +43,10 @@ describe('manager/gradle', () => {
     });
 
     it('should return empty if there are no dependencies', async () => {
-      fs.readFile.mockReturnValue(
-        fsReal.readFileSync(
-          'test/datasource/gradle/_fixtures/updatesReportEmpty.json',
-          'utf8'
-        )
-      );
+      fs.readFile.mockResolvedValue(fsReal.readFileSync(
+        'test/datasource/gradle/_fixtures/updatesReportEmpty.json',
+        'utf8'
+      ) as any);
       const dependencies = await manager.extractAllPackageFiles(config, [
         'build.gradle',
       ]);
@@ -68,7 +64,7 @@ describe('manager/gradle', () => {
     });
 
     it('should return empty if there is no dependency report', async () => {
-      fs.exists.mockReturnValue(false);
+      fs.exists.mockResolvedValue(false);
       const dependencies = await manager.extractAllPackageFiles(config, [
         'build.gradle',
       ]);
@@ -80,7 +76,7 @@ describe('manager/gradle', () => {
       const renovateReport = `
         Invalid JSON]
       `;
-      fs.readFile.mockReturnValue(renovateReport);
+      fs.readFile.mockResolvedValue(renovateReport as any);
 
       const dependencies = await manager.extractAllPackageFiles(config, [
         'build.gradle',
@@ -93,7 +89,7 @@ describe('manager/gradle', () => {
         'test/datasource/gradle/_fixtures/MultiProjectUpdatesReport.json',
         'utf8'
       );
-      fs.readFile.mockReturnValue(multiProjectUpdatesReport);
+      fs.readFile.mockResolvedValue(multiProjectUpdatesReport as any);
 
       const dependencies = await manager.extractAllPackageFiles(config, [
         'build.gradle',
@@ -125,7 +121,7 @@ describe('manager/gradle', () => {
     it('should configure the renovate report plugin', async () => {
       await manager.extractAllPackageFiles(config, ['build.gradle']);
 
-      expect(toUnix(fs.writeFile.mock.calls[0][0])).toBe(
+      expect(toUnix(fs.writeFile.mock.calls[0][0] as string)).toBe(
         'localDir/renovate-plugin.gradle'
       );
     });
diff --git a/test/manager/homebrew/__snapshots__/extract.spec.js.snap b/test/manager/homebrew/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/homebrew/__snapshots__/extract.spec.js.snap
rename to test/manager/homebrew/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/homebrew/__snapshots__/update.spec.js.snap b/test/manager/homebrew/__snapshots__/update.spec.ts.snap
similarity index 100%
rename from test/manager/homebrew/__snapshots__/update.spec.js.snap
rename to test/manager/homebrew/__snapshots__/update.spec.ts.snap
diff --git a/test/manager/homebrew/extract.spec.js b/test/manager/homebrew/extract.spec.ts
similarity index 98%
rename from test/manager/homebrew/extract.spec.js
rename to test/manager/homebrew/extract.spec.ts
index f5bd5fd101c101234af58d8cafe93b464c28b80c..1993ba0bd471d095e1a9466a513eb8b55f2f5dbf 100644
--- a/test/manager/homebrew/extract.spec.js
+++ b/test/manager/homebrew/extract.spec.ts
@@ -1,5 +1,5 @@
-const fs = require('fs');
-const { extractPackageFile } = require('../../../lib/manager/homebrew/extract');
+import fs from 'fs';
+import { extractPackageFile } from '../../../lib/manager/homebrew/extract';
 
 const aalib = fs.readFileSync(
   'test/manager/homebrew/_fixtures/aalib.rb',
diff --git a/test/manager/homebrew/update.spec.js b/test/manager/homebrew/update.spec.ts
similarity index 98%
rename from test/manager/homebrew/update.spec.js
rename to test/manager/homebrew/update.spec.ts
index 6d7e1515b57d00bef481e0e1970d2a32dd89c132..06cc5e01e9003188ab139546bed42987f2987f3d 100644
--- a/test/manager/homebrew/update.spec.js
+++ b/test/manager/homebrew/update.spec.ts
@@ -1,6 +1,7 @@
-const fs = require('fs');
+import fs from 'fs';
+import { updateDependency } from '../../../lib/manager/homebrew/update';
+
 const got = require('../../../lib/util/got');
-const { updateDependency } = require('../../../lib/manager/homebrew/update');
 
 jest.mock('../../../lib/util/got');
 
diff --git a/test/manager/homebrew/util.spec.js b/test/manager/homebrew/util.spec.ts
similarity index 81%
rename from test/manager/homebrew/util.spec.js
rename to test/manager/homebrew/util.spec.ts
index 4f4fea0b7fb1471c0e5d49222cb0ed96ce8e5dab..7276dd7bf989ec2adc6379c52254e9ba69faa3b8 100644
--- a/test/manager/homebrew/util.spec.js
+++ b/test/manager/homebrew/util.spec.ts
@@ -1,4 +1,4 @@
-const { skip } = require('../../../lib/manager/homebrew/util');
+import { skip } from '../../../lib/manager/homebrew/util';
 
 describe('lib/manager/homebrew/util', () => {
   describe('skip()', () => {
diff --git a/test/manager/index.spec.js b/test/manager/index.spec.ts
similarity index 51%
rename from test/manager/index.spec.js
rename to test/manager/index.spec.ts
index 87a08361965002f61b96ea9a34c76bea1810dbe7..2b847612c171e96077f5737add98243e830ff02d 100644
--- a/test/manager/index.spec.js
+++ b/test/manager/index.spec.ts
@@ -1,4 +1,4 @@
-const manager = require('../../lib/manager');
+import * as manager from '../../lib/manager';
 
 describe('manager', () => {
   describe('get()', () => {
@@ -18,10 +18,26 @@ describe('manager', () => {
   });
   describe('extractAllPackageFiles()', () => {
     it('returns null', () => {
-      expect(manager.extractAllPackageFiles('dockerfile', [])).toBeNull();
+      expect(
+        manager.extractAllPackageFiles('dockerfile', {} as any, [])
+      ).toBeNull();
     });
     it('returns non-null', () => {
-      expect(manager.extractAllPackageFiles('npm', {}, [])).not.toBeNull();
+      expect(
+        manager.extractAllPackageFiles('npm', {} as any, [])
+      ).not.toBeNull();
+    });
+  });
+
+  describe('extractPackageFile()', () => {
+    it('returns null', () => {
+      expect(manager.extractPackageFile('unknown', null)).toBeNull();
+    });
+  });
+
+  describe('getPackageUpdates', () => {
+    it('returns null', () => {
+      expect(manager.getPackageUpdates('unknown', null)).toBeNull();
     });
   });
 });
diff --git a/test/manager/kubernetes/__snapshots__/extract.spec.js.snap b/test/manager/kubernetes/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/kubernetes/__snapshots__/extract.spec.js.snap
rename to test/manager/kubernetes/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/kubernetes/__snapshots__/update.spec.js.snap b/test/manager/kubernetes/__snapshots__/update.spec.ts.snap
similarity index 100%
rename from test/manager/kubernetes/__snapshots__/update.spec.js.snap
rename to test/manager/kubernetes/__snapshots__/update.spec.ts.snap
diff --git a/test/manager/kubernetes/extract.spec.js b/test/manager/kubernetes/extract.spec.ts
similarity index 77%
rename from test/manager/kubernetes/extract.spec.js
rename to test/manager/kubernetes/extract.spec.ts
index 2a51d6ff4258826231bb7fcc014b2dc543541153..ba871d08ec51018dd1f44c2c069f5e4595c10775 100644
--- a/test/manager/kubernetes/extract.spec.js
+++ b/test/manager/kubernetes/extract.spec.ts
@@ -1,24 +1,22 @@
-const fs = require('fs');
-const {
-  extractPackageFile,
-} = require('../../../lib/manager/kubernetes/extract');
+import { readFileSync } from 'fs';
+import { extractPackageFile } from '../../../lib/manager/kubernetes/extract';
 
-const kubernetesImagesFile = fs.readFileSync(
+const kubernetesImagesFile = readFileSync(
   'test/manager/kubernetes/_fixtures/kubernetes.yaml',
   'utf8'
 );
 
-const kubernetesConfigMapFile = fs.readFileSync(
+const kubernetesConfigMapFile = readFileSync(
   'test/manager/kubernetes/_fixtures/configmap.yaml',
   'utf8'
 );
 
-const kubernetesArraySyntaxFile = fs.readFileSync(
+const kubernetesArraySyntaxFile = readFileSync(
   'test/manager/kubernetes/_fixtures/array-syntax.yaml',
   'utf8'
 );
 
-const otherYamlFile = fs.readFileSync(
+const otherYamlFile = readFileSync(
   'test/manager/kubernetes/_fixtures/gitlab-ci.yaml',
   'utf8'
 );
diff --git a/test/manager/kubernetes/update.spec.js b/test/manager/kubernetes/update.spec.ts
similarity index 73%
rename from test/manager/kubernetes/update.spec.js
rename to test/manager/kubernetes/update.spec.ts
index df19b6fb6bedfc69a1523ec11568aef68f6c81dc..036a82fa14cb5d445acd4fc11960ca5b231db57a 100644
--- a/test/manager/kubernetes/update.spec.js
+++ b/test/manager/kubernetes/update.spec.ts
@@ -1,12 +1,12 @@
-const fs = require('fs');
-const dcUpdate = require('../../../lib/manager/kubernetes/update');
+import { readFileSync } from 'fs';
+import { updateDependency } from '../../../lib/manager/kubernetes/update';
 
-const yamlFile = fs.readFileSync(
+const yamlFile = readFileSync(
   'test/manager/kubernetes/_fixtures/kubernetes.yaml',
   'utf8'
 );
 
-const arraySyntaxFile = fs.readFileSync(
+const arraySyntaxFile = readFileSync(
   'test/manager/kubernetes/_fixtures/array-syntax.yaml',
   'utf8'
 );
@@ -20,7 +20,7 @@ describe('manager/kubernetes/update', () => {
         newValue: '1.15.1',
         newDigest: 'sha256:abcdefghijklmnop',
       };
-      const res = dcUpdate.updateDependency(yamlFile, upgrade);
+      const res = updateDependency(yamlFile, upgrade);
       expect(res).not.toEqual(yamlFile);
       expect(res.includes(upgrade.newDigest)).toBe(true);
     });
@@ -30,7 +30,7 @@ describe('manager/kubernetes/update', () => {
         depName: 'k8s.gcr.io/kube-proxy-amd64',
         newValue: 'v1.11.1',
       };
-      const res = dcUpdate.updateDependency(yamlFile, upgrade);
+      const res = updateDependency(yamlFile, upgrade);
       expect(res).toEqual(yamlFile);
     });
     it('returns null if mismatch', () => {
@@ -38,11 +38,11 @@ describe('manager/kubernetes/update', () => {
         managerData: { lineNumber: 1 },
         newFrom: 'k8s.gcr.io/kube-proxy-amd64:v1.11.1',
       };
-      const res = dcUpdate.updateDependency(yamlFile, upgrade);
+      const res = updateDependency(yamlFile, upgrade);
       expect(res).toBeNull();
     });
     it('returns null if error', () => {
-      const res = dcUpdate.updateDependency(null, null);
+      const res = updateDependency(null, null);
       expect(res).toBeNull();
     });
     it('replaces image inside YAML array', () => {
@@ -51,7 +51,7 @@ describe('manager/kubernetes/update', () => {
         depName: 'quay.io/external_storage/local-volume-provisioner',
         newValue: 'v2.2.0',
       };
-      const res = dcUpdate.updateDependency(arraySyntaxFile, upgrade);
+      const res = updateDependency(arraySyntaxFile, upgrade);
       expect(res).not.toEqual(arraySyntaxFile);
       expect(res).toMatchSnapshot();
     });
diff --git a/test/manager/leiningen/__snapshots__/extract.spec.js.snap b/test/manager/leiningen/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/leiningen/__snapshots__/extract.spec.js.snap
rename to test/manager/leiningen/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/leiningen/extract.spec.js b/test/manager/leiningen/extract.spec.ts
similarity index 85%
rename from test/manager/leiningen/extract.spec.js
rename to test/manager/leiningen/extract.spec.ts
index 378f21f8e1e34c5228e01f9401e51a6ab9d4f2ea..1652dabfcf1eced2ea87d02f2719ce100f6390a3 100644
--- a/test/manager/leiningen/extract.spec.js
+++ b/test/manager/leiningen/extract.spec.ts
@@ -1,14 +1,14 @@
 /* eslint-disable no-template-curly-in-string */
-const fs = require('fs');
-const path = require('path');
-const {
+import { readFileSync } from 'fs';
+import { resolve } from 'path';
+import {
   trimAtKey,
   extractFromVectors,
   extractPackageFile,
-} = require('../../../lib/manager/leiningen/extract');
+} from '../../../lib/manager/leiningen/extract';
 
-const leinProjectClj = fs.readFileSync(
-  path.resolve(__dirname, `./_fixtures/project.clj`),
+const leinProjectClj = readFileSync(
+  resolve(__dirname, `./_fixtures/project.clj`),
   'utf8'
 );
 
diff --git a/test/manager/leiningen/update.spec.js b/test/manager/leiningen/update.spec.ts
similarity index 64%
rename from test/manager/leiningen/update.spec.js
rename to test/manager/leiningen/update.spec.ts
index ea9e752222964aab7635cbf7f514df2cfa0dbc07..10d7452ee8e1a185106c959b32f32cafc90a451f 100644
--- a/test/manager/leiningen/update.spec.js
+++ b/test/manager/leiningen/update.spec.ts
@@ -1,13 +1,11 @@
 /* eslint-disable no-template-curly-in-string */
-const fs = require('fs');
-const path = require('path');
-const {
-  extractPackageFile,
-} = require('../../../lib/manager/leiningen/extract');
-const { updateDependency } = require('../../../lib/manager/leiningen/update');
+import { readFileSync } from 'fs';
+import { resolve } from 'path';
+import { extractPackageFile } from '../../../lib/manager/leiningen/extract';
+import { updateDependency } from '../../../lib/manager/leiningen/update';
 
-const leinProjectClj = fs.readFileSync(
-  path.resolve(__dirname, `./_fixtures/project.clj`),
+const leinProjectClj = readFileSync(
+  resolve(__dirname, `./_fixtures/project.clj`),
   'utf8'
 );
 
diff --git a/test/manager/manager-docs.spec.js b/test/manager/manager-docs.spec.ts
similarity index 75%
rename from test/manager/manager-docs.spec.js
rename to test/manager/manager-docs.spec.ts
index 6f20bc6c5490daf5bcaa83c4f7164cf5546da970..5adc4a66319de333a5cd82de71454daa7e469e94 100644
--- a/test/manager/manager-docs.spec.js
+++ b/test/manager/manager-docs.spec.ts
@@ -1,15 +1,15 @@
-const fs = require('fs-extra');
+import { readdir, readFile } from 'fs-extra';
 
 describe('manager readmes', () => {
   it('has same questions for all managers', async () => {
-    const managers = (await fs.readdir('lib/manager')).filter(
+    const managers = (await readdir('lib/manager')).filter(
       item => !item.includes('.')
     );
-    let expectedHeaders;
+    let expectedHeaders: string[];
     for (const manager of managers) {
-      let readme;
+      let readme: string;
       try {
-        readme = await fs.readFile(
+        readme = await readFile(
           'lib/manager/' + manager + '/readme.md',
           'utf8'
         );
diff --git a/test/manager/maven/__snapshots__/extract.spec.js.snap b/test/manager/maven/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/maven/__snapshots__/extract.spec.js.snap
rename to test/manager/maven/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/maven/__snapshots__/index.spec.js.snap b/test/manager/maven/__snapshots__/index.spec.ts.snap
similarity index 100%
rename from test/manager/maven/__snapshots__/index.spec.js.snap
rename to test/manager/maven/__snapshots__/index.spec.ts.snap
diff --git a/test/manager/maven/extract.spec.js b/test/manager/maven/extract.spec.ts
similarity index 66%
rename from test/manager/maven/extract.spec.js
rename to test/manager/maven/extract.spec.ts
index 5728f6def5875d3c8e29bac32ec78fb135ab4cee..3447194b61758d0e2b8ebd85f546d7c0872dea07 100644
--- a/test/manager/maven/extract.spec.js
+++ b/test/manager/maven/extract.spec.ts
@@ -1,17 +1,17 @@
 /* eslint-disable no-template-curly-in-string */
-const fs = require('fs');
-const path = require('path');
-const { extractPackage } = require('../../../lib/manager/maven/extract');
+import { readFileSync } from 'fs';
+import { resolve } from 'path';
+import { extractPackage } from '../../../lib/manager/maven/extract';
 
-const simpleContent = fs.readFileSync(
-  path.resolve(__dirname, `./_fixtures/simple.pom.xml`),
+const simpleContent = readFileSync(
+  resolve(__dirname, `./_fixtures/simple.pom.xml`),
   'utf8'
 );
 
 describe('manager/maven/extract', () => {
   describe('extractDependencies', () => {
     it('returns null for invalid XML', () => {
-      expect(extractPackage()).toBeNull();
+      expect(extractPackage(undefined)).toBeNull();
       expect(extractPackage('invalid xml content')).toBeNull();
       expect(extractPackage('<foobar></foobar>')).toBeNull();
       expect(extractPackage('<project></project>')).toBeNull();
diff --git a/test/manager/maven/index.spec.js b/test/manager/maven/index.spec.ts
similarity index 89%
rename from test/manager/maven/index.spec.js
rename to test/manager/maven/index.spec.ts
index 412a1b27dc0f21b8c1ff2031e0f6ae4fbc465bb1..783d0ac3bffc2ed92b0d202b918a2bb33889b785 100644
--- a/test/manager/maven/index.spec.js
+++ b/test/manager/maven/index.spec.ts
@@ -1,34 +1,34 @@
-const fs = require('fs');
-const {
+import { readFileSync } from 'fs';
+import {
   extractPackage,
   resolveProps,
-} = require('../../../lib/manager/maven/extract');
-const {
+} from '../../../lib/manager/maven/extract';
+import {
   extractAllPackageFiles,
   updateDependency,
-} = require('../../../lib/manager/maven/index');
+} from '../../../lib/manager/maven/index';
+import { PackageDependency, PackageFile } from '../../../lib/manager/common';
 
-/** @type any */
-const platform = global.platform;
+const platform: any = global.platform;
 
-const pomContent = fs.readFileSync(
+const pomContent = readFileSync(
   'test/manager/maven/_fixtures/simple.pom.xml',
   'utf8'
 );
-const pomParent = fs.readFileSync(
+const pomParent = readFileSync(
   'test/manager/maven/_fixtures/parent.pom.xml',
   'utf8'
 );
-const pomChild = fs.readFileSync(
+const pomChild = readFileSync(
   'test/manager/maven/_fixtures/child.pom.xml',
   'utf8'
 );
-const origContent = fs.readFileSync(
+const origContent = readFileSync(
   'test/manager/maven/_fixtures/grouping.pom.xml',
   'utf8'
 );
 
-function selectDep(deps, name = 'org.example:quuz') {
+function selectDep(deps: PackageDependency[], name = 'org.example:quuz') {
   return deps.find(dep => dep.depName === name);
 }
 
@@ -67,7 +67,8 @@ describe('manager/maven', () => {
     });
 
     it('should update existing dependency defined via properties', () => {
-      const finder = ({ depName }) => depName === 'org.example:quux';
+      const finder = ({ depName }: PackageDependency) =>
+        depName === 'org.example:quux';
       const newValue = '9.9.9.9-final';
 
       const packages = resolveProps([
@@ -154,7 +155,8 @@ describe('manager/maven', () => {
     });
     it('should update ranges', () => {
       const newValue = '[1.2.3]';
-      const select = depSet => selectDep(depSet.deps, 'org.example:hard-range');
+      const select = (depSet: PackageFile) =>
+        selectDep(depSet.deps, 'org.example:hard-range');
       const oldContent = extractPackage(pomContent);
       const dep = select(oldContent);
       const upgrade = { ...dep, newValue };
@@ -164,7 +166,7 @@ describe('manager/maven', () => {
     });
     it('should preserve ranges', () => {
       const newValue = '[1.0.0]';
-      const select = depSet =>
+      const select = (depSet: PackageFile) =>
         depSet && depSet.deps
           ? selectDep(depSet.deps, 'org.example:hard-range')
           : null;
diff --git a/test/manager/meteor/__snapshots__/extract.spec.js.snap b/test/manager/meteor/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/meteor/__snapshots__/extract.spec.js.snap
rename to test/manager/meteor/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/meteor/__snapshots__/update.spec.js.snap b/test/manager/meteor/__snapshots__/update.spec.ts.snap
similarity index 100%
rename from test/manager/meteor/__snapshots__/update.spec.js.snap
rename to test/manager/meteor/__snapshots__/update.spec.ts.snap
diff --git a/test/manager/meteor/extract.spec.js b/test/manager/meteor/extract.spec.ts
similarity index 64%
rename from test/manager/meteor/extract.spec.js
rename to test/manager/meteor/extract.spec.ts
index 2b26dbd2f82a407c2f4f8725c73e76b408c3e7e8..e4b9a6818877469b5f635fbca551b0c101c8ccea 100644
--- a/test/manager/meteor/extract.spec.js
+++ b/test/manager/meteor/extract.spec.ts
@@ -1,12 +1,9 @@
-const fs = require('fs');
-const path = require('path');
-const { extractPackageFile } = require('../../../lib/manager/meteor/extract');
+import { readFileSync } from 'fs';
+import { resolve } from 'path';
+import { extractPackageFile } from '../../../lib/manager/meteor/extract';
 
-function readFixture(fixture) {
-  return fs.readFileSync(
-    path.resolve(__dirname, `./_fixtures/${fixture}`),
-    'utf8'
-  );
+function readFixture(fixture: string) {
+  return readFileSync(resolve(__dirname, `./_fixtures/${fixture}`), 'utf8');
 }
 
 const input01Content = readFixture('package-1.js');
diff --git a/test/manager/meteor/update.spec.js b/test/manager/meteor/update.spec.ts
similarity index 59%
rename from test/manager/meteor/update.spec.js
rename to test/manager/meteor/update.spec.ts
index 5918fe368b73421e245af4f9aa29e8785d8460e0..5c7acc426bc732e42fdc6265e8e40373ca6a5204 100644
--- a/test/manager/meteor/update.spec.js
+++ b/test/manager/meteor/update.spec.ts
@@ -1,12 +1,9 @@
-const fs = require('fs');
-const path = require('path');
-const meteorUpdater = require('../../../lib/manager/meteor/update');
+import { readFileSync } from 'fs';
+import { resolve } from 'path';
+import { updateDependency } from '../../../lib/manager/meteor/update';
 
-function readFixture(fixture) {
-  return fs.readFileSync(
-    path.resolve(__dirname, `./_fixtures/${fixture}`),
-    'utf8'
-  );
+function readFixture(fixture: string) {
+  return readFileSync(resolve(__dirname, `./_fixtures/${fixture}`), 'utf8');
 }
 
 const input01Content = readFixture('package-1.js');
@@ -20,10 +17,7 @@ describe('workers/branch/package-js', () => {
         currentValue: '0.1.19',
         newValue: '0.22.1',
       };
-      const testContent = meteorUpdater.updateDependency(
-        input01Content,
-        upgrade
-      );
+      const testContent = updateDependency(input01Content, upgrade);
       expect(testContent).toMatchSnapshot();
     });
     it('handles alternative quotes and white space', () => {
@@ -32,10 +26,7 @@ describe('workers/branch/package-js', () => {
         currentValue: '0.1.19',
         newValue: '0.22.1',
       };
-      const testContent = meteorUpdater.updateDependency(
-        input02Content,
-        upgrade
-      );
+      const testContent = updateDependency(input02Content, upgrade);
       expect(testContent).toMatchSnapshot();
     });
     it('handles the case where the desired version is already supported', () => {
@@ -44,11 +35,8 @@ describe('workers/branch/package-js', () => {
         currentValue: '0.2.0',
         newValue: '0.2.0',
       };
-      const testContent = meteorUpdater.updateDependency(
-        input01Content,
-        upgrade
-      );
-      testContent.should.equal(input01Content);
+      const testContent = updateDependency(input01Content, upgrade);
+      expect(testContent).toEqual(input01Content);
     });
   });
 });
diff --git a/test/manager/npm/__snapshots__/update.spec.js.snap b/test/manager/npm/__snapshots__/update.spec.ts.snap
similarity index 100%
rename from test/manager/npm/__snapshots__/update.spec.js.snap
rename to test/manager/npm/__snapshots__/update.spec.ts.snap
diff --git a/test/manager/npm/extract/__snapshots__/index.spec.js.snap b/test/manager/npm/extract/__snapshots__/index.spec.ts.snap
similarity index 100%
rename from test/manager/npm/extract/__snapshots__/index.spec.js.snap
rename to test/manager/npm/extract/__snapshots__/index.spec.ts.snap
diff --git a/test/manager/npm/extract/__snapshots__/locked-versions.spec.js.snap b/test/manager/npm/extract/__snapshots__/locked-versions.spec.ts.snap
similarity index 100%
rename from test/manager/npm/extract/__snapshots__/locked-versions.spec.js.snap
rename to test/manager/npm/extract/__snapshots__/locked-versions.spec.ts.snap
diff --git a/test/manager/npm/extract/__snapshots__/monorepo.spec.js.snap b/test/manager/npm/extract/__snapshots__/monorepo.spec.ts.snap
similarity index 98%
rename from test/manager/npm/extract/__snapshots__/monorepo.spec.js.snap
rename to test/manager/npm/extract/__snapshots__/monorepo.spec.ts.snap
index 6ed2ee7b2ee51ec19cb0b7d809400aa736341a3a..0da8b05c551d31764f284f5c0263e207964a6a8e 100644
--- a/test/manager/npm/extract/__snapshots__/monorepo.spec.js.snap
+++ b/test/manager/npm/extract/__snapshots__/monorepo.spec.ts.snap
@@ -100,7 +100,7 @@ Array [
     "npmLock": undefined,
     "packageFile": "packages/a/package.json",
     "packageJsonName": "@org/a",
-    "yarnLock": true,
+    "yarnLock": "yarn.lock",
   },
   Object {
     "internalPackages": Array [
diff --git a/test/manager/npm/extract/__snapshots__/npm.spec.js.snap b/test/manager/npm/extract/__snapshots__/npm.spec.ts.snap
similarity index 100%
rename from test/manager/npm/extract/__snapshots__/npm.spec.js.snap
rename to test/manager/npm/extract/__snapshots__/npm.spec.ts.snap
diff --git a/test/manager/npm/extract/__snapshots__/yarn.spec.js.snap b/test/manager/npm/extract/__snapshots__/yarn.spec.ts.snap
similarity index 100%
rename from test/manager/npm/extract/__snapshots__/yarn.spec.js.snap
rename to test/manager/npm/extract/__snapshots__/yarn.spec.ts.snap
diff --git a/test/manager/npm/extract/index.spec.js b/test/manager/npm/extract/index.spec.ts
similarity index 96%
rename from test/manager/npm/extract/index.spec.js
rename to test/manager/npm/extract/index.spec.ts
index 0fa99863b7144088fe44872240fc618fd93ba65a..e3e20b8484287f2bf45f642141739c547b1ecd05 100644
--- a/test/manager/npm/extract/index.spec.js
+++ b/test/manager/npm/extract/index.spec.ts
@@ -1,10 +1,10 @@
-const fs = require('fs');
-const path = require('path');
-const npmExtract = require('../../../../lib/manager/npm/extract');
-const defaultConfig = require('../../../../lib/config/defaults').getConfig();
+import fs from 'fs';
+import path from 'path';
+import * as npmExtract from '../../../../lib/manager/npm/extract';
+import { getConfig } from '../../../../lib/config/defaults';
 
-/** @type any */
-const platform = global.platform;
+const defaultConfig = getConfig();
+const platform: any = global.platform;
 
 function readFixture(fixture) {
   return fs.readFileSync(
diff --git a/test/manager/npm/extract/locked-versions.spec.js b/test/manager/npm/extract/locked-versions.spec.ts
similarity index 95%
rename from test/manager/npm/extract/locked-versions.spec.js
rename to test/manager/npm/extract/locked-versions.spec.ts
index 21401bf27d6c9a41b262725cfd0880212c80e427..3ec6d05d27a2480fd9e5f99aafd0b51879ea59e7 100644
--- a/test/manager/npm/extract/locked-versions.spec.js
+++ b/test/manager/npm/extract/locked-versions.spec.ts
@@ -1,6 +1,4 @@
-const {
-  getLockedVersions,
-} = require('../../../../lib/manager/npm/extract/locked-versions');
+import { getLockedVersions } from '../../../../lib/manager/npm/extract/locked-versions';
 
 /** @type any */
 const npm = require('../../../../lib/manager/npm/extract/npm');
diff --git a/test/manager/npm/extract/monorepo.spec.js b/test/manager/npm/extract/monorepo.spec.ts
similarity index 84%
rename from test/manager/npm/extract/monorepo.spec.js
rename to test/manager/npm/extract/monorepo.spec.ts
index b1dd7f4f37d251fd3b5d9420169ab42f959bf447..0eb257519a3d50269aadf5cf0706c5f8ce49f505 100644
--- a/test/manager/npm/extract/monorepo.spec.js
+++ b/test/manager/npm/extract/monorepo.spec.ts
@@ -1,6 +1,4 @@
-const {
-  detectMonorepos,
-} = require('../../../../lib/manager/npm/extract/monorepo');
+import { detectMonorepos } from '../../../../lib/manager/npm/extract/monorepo';
 
 describe('manager/npm/extract', () => {
   describe('.extractPackageFile()', () => {
@@ -23,7 +21,7 @@ describe('manager/npm/extract', () => {
       await detectMonorepos(packageFiles);
       expect(packageFiles).toMatchSnapshot();
       expect(packageFiles[1].lernaDir).toEqual('.');
-      expect(packageFiles[1].internalPackages).toEqual(['@org/b']);
+      expect((packageFiles[1] as any).internalPackages).toEqual(['@org/b']);
     });
     it('uses yarn workspaces package settings', async () => {
       const packageFiles = [
@@ -46,7 +44,7 @@ describe('manager/npm/extract', () => {
       await detectMonorepos(packageFiles);
       expect(packageFiles).toMatchSnapshot();
       expect(packageFiles[1].lernaDir).toEqual('.');
-      expect(packageFiles[1].internalPackages).toEqual(['@org/b']);
+      expect((packageFiles[1] as any).internalPackages).toEqual(['@org/b']);
     });
     it('uses yarn workspaces package settings', async () => {
       const packageFiles = [
@@ -57,7 +55,7 @@ describe('manager/npm/extract', () => {
         {
           packageFile: 'packages/a/package.json',
           packageJsonName: '@org/a',
-          yarnLock: true,
+          yarnLock: 'yarn.lock',
         },
         {
           packageFile: 'packages/b/package.json',
@@ -66,7 +64,7 @@ describe('manager/npm/extract', () => {
       ];
       await detectMonorepos(packageFiles);
       expect(packageFiles).toMatchSnapshot();
-      expect(packageFiles[1].internalPackages).toEqual(['@org/b']);
+      expect((packageFiles[1] as any).internalPackages).toEqual(['@org/b']);
     });
   });
 });
diff --git a/test/manager/npm/extract/npm.spec.js b/test/manager/npm/extract/npm.spec.ts
similarity index 61%
rename from test/manager/npm/extract/npm.spec.js
rename to test/manager/npm/extract/npm.spec.ts
index f3127623ccd3bd07dbd5fd72e94589556fe4f4aa..ccc7cd6209e10871eea44c16b4b1afa4bbd62077 100644
--- a/test/manager/npm/extract/npm.spec.js
+++ b/test/manager/npm/extract/npm.spec.ts
@@ -1,8 +1,7 @@
-const fs = require('fs');
-const { getNpmLock } = require('../../../../lib/manager/npm/extract/npm');
+import { readFileSync } from 'fs';
+import { getNpmLock } from '../../../../lib/manager/npm/extract/npm';
 
-/** @type any */
-const platform = global.platform;
+const platform: any = global.platform;
 
 describe('manager/npm/extract/npm', () => {
   describe('.getNpmLock()', () => {
@@ -12,7 +11,7 @@ describe('manager/npm/extract/npm', () => {
       expect(Object.keys(res)).toHaveLength(0);
     });
     it('extracts', async () => {
-      const plocktest1Lock = fs.readFileSync(
+      const plocktest1Lock = readFileSync(
         'test/config/npm/_fixtures/plocktest1/package-lock.json'
       );
       platform.getFile.mockReturnValueOnce(plocktest1Lock);
@@ -20,5 +19,10 @@ describe('manager/npm/extract/npm', () => {
       expect(res).toMatchSnapshot();
       expect(Object.keys(res)).toHaveLength(7);
     });
+    it('returns empty if no deps', async () => {
+      platform.getFile.mockResolvedValueOnce('{}');
+      const res = await getNpmLock('package.json');
+      expect(Object.keys(res)).toHaveLength(0);
+    });
   });
 });
diff --git a/test/manager/npm/extract/type.spec.js b/test/manager/npm/extract/type.spec.ts
similarity index 86%
rename from test/manager/npm/extract/type.spec.js
rename to test/manager/npm/extract/type.spec.ts
index 881eba25571c3286c068b6ffbaf61059b1853367..fffc6565eebbb5269816c767aaf2429ef9702231 100644
--- a/test/manager/npm/extract/type.spec.js
+++ b/test/manager/npm/extract/type.spec.ts
@@ -1,6 +1,4 @@
-const {
-  mightBeABrowserLibrary,
-} = require('../../../../lib/manager/npm/extract/type');
+import { mightBeABrowserLibrary } from '../../../../lib/manager/npm/extract/type';
 
 describe('manager/npm/extract/type', () => {
   describe('.mightBeABrowserLibrary()', () => {
diff --git a/test/manager/npm/extract/yarn.spec.js b/test/manager/npm/extract/yarn.spec.ts
similarity index 76%
rename from test/manager/npm/extract/yarn.spec.js
rename to test/manager/npm/extract/yarn.spec.ts
index 6e6c844648504074882deaa947da7f1a74bba08f..6103d22f0733ac58cc7574ef091e14d23a7e3739 100644
--- a/test/manager/npm/extract/yarn.spec.js
+++ b/test/manager/npm/extract/yarn.spec.ts
@@ -1,8 +1,7 @@
-const fs = require('fs');
-const { getYarnLock } = require('../../../../lib/manager/npm/extract/yarn');
+import { readFileSync } from 'fs';
+import { getYarnLock } from '../../../../lib/manager/npm/extract/yarn';
 
-/** @type any */
-const platform = global.platform;
+const platform: any = global.platform;
 
 describe('manager/npm/extract/yarn', () => {
   describe('.getYarnLock()', () => {
@@ -12,7 +11,7 @@ describe('manager/npm/extract/yarn', () => {
       expect(Object.keys(res)).toHaveLength(0);
     });
     it('extracts', async () => {
-      const plocktest1Lock = fs.readFileSync(
+      const plocktest1Lock = readFileSync(
         'test/config/npm/_fixtures/plocktest1/yarn.lock',
         'utf8'
       );
diff --git a/test/manager/npm/range.spec.js b/test/manager/npm/range.spec.ts
similarity index 63%
rename from test/manager/npm/range.spec.js
rename to test/manager/npm/range.spec.ts
index 5ffa9f9f186decba36337ba419b43cdbb3677ebd..fcf4314cd59b0688c12cb4c3ddab3f8fe525c5a6 100644
--- a/test/manager/npm/range.spec.js
+++ b/test/manager/npm/range.spec.ts
@@ -1,16 +1,20 @@
-const { getRangeStrategy } = require('../../../lib/manager/npm');
+import { getRangeStrategy } from '../../../lib/manager/npm';
+import { RangeConfig } from '../../../lib/manager/common';
 
 describe('getRangeStrategy', () => {
   it('returns same if not auto', () => {
-    const config = { rangeStrategy: 'widen' };
+    const config: RangeConfig = { rangeStrategy: 'widen' };
     expect(getRangeStrategy(config)).toEqual('widen');
   });
   it('pins devDependencies', () => {
-    const config = { rangeStrategy: 'auto', depType: 'devDependencies' };
+    const config: RangeConfig = {
+      rangeStrategy: 'auto',
+      depType: 'devDependencies',
+    };
     expect(getRangeStrategy(config)).toEqual('pin');
   });
   it('pins app dependencies', () => {
-    const config = {
+    const config: RangeConfig = {
       rangeStrategy: 'auto',
       depType: 'dependencies',
       packageJsonType: 'app',
@@ -18,11 +22,14 @@ describe('getRangeStrategy', () => {
     expect(getRangeStrategy(config)).toEqual('pin');
   });
   it('widens peerDependencies', () => {
-    const config = { rangeStrategy: 'auto', depType: 'peerDependencies' };
+    const config: RangeConfig = {
+      rangeStrategy: 'auto',
+      depType: 'peerDependencies',
+    };
     expect(getRangeStrategy(config)).toEqual('widen');
   });
   it('widens complex ranges', () => {
-    const config = {
+    const config: RangeConfig = {
       rangeStrategy: 'auto',
       depType: 'dependencies',
       currentValue: '^1.6.0 || ^2.0.0',
@@ -30,7 +37,7 @@ describe('getRangeStrategy', () => {
     expect(getRangeStrategy(config)).toEqual('widen');
   });
   it('widens complex bump', () => {
-    const config = {
+    const config: RangeConfig = {
       rangeStrategy: 'bump',
       depType: 'dependencies',
       currentValue: '^1.6.0 || ^2.0.0',
@@ -38,7 +45,10 @@ describe('getRangeStrategy', () => {
     expect(getRangeStrategy(config)).toEqual('widen');
   });
   it('defaults to replace', () => {
-    const config = { rangeStrategy: 'auto', depType: 'dependencies' };
+    const config: RangeConfig = {
+      rangeStrategy: 'auto',
+      depType: 'dependencies',
+    };
     expect(getRangeStrategy(config)).toEqual('replace');
   });
 });
diff --git a/test/manager/npm/update.spec.js b/test/manager/npm/update.spec.ts
similarity index 97%
rename from test/manager/npm/update.spec.js
rename to test/manager/npm/update.spec.ts
index 5f124f9de2d37ae92f87563f915fdbaa3f3325b4..da7cebc1f706a7d864b5ad5ce05c15dd6df15698 100644
--- a/test/manager/npm/update.spec.js
+++ b/test/manager/npm/update.spec.ts
@@ -1,7 +1,7 @@
-const fs = require('fs');
-const path = require('path');
-const semver = require('semver');
-const npmUpdater = require('../../../lib/manager/npm/update');
+import fs from 'fs';
+import path from 'path';
+import semver from 'semver';
+import * as npmUpdater from '../../../lib/manager/npm/update';
 
 function readFixture(fixture) {
   return fs.readFileSync(
@@ -192,7 +192,7 @@ describe('workers/branch/package-json', () => {
       semver.inc = jest.fn(() => {
         throw new Error('semver inc');
       });
-      const res = npmUpdater.bumpPackageVersion(content, '0.0.2', true);
+      const res = npmUpdater.bumpPackageVersion(content, '0.0.2', true as any);
       expect(res).toEqual(content);
     });
   });
diff --git a/test/manager/nuget/__snapshots__/extract.spec.js.snap b/test/manager/nuget/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/nuget/__snapshots__/extract.spec.js.snap
rename to test/manager/nuget/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/nuget/extract.spec.js b/test/manager/nuget/extract.spec.ts
similarity index 78%
rename from test/manager/nuget/extract.spec.js
rename to test/manager/nuget/extract.spec.ts
index d07d9e6b5ac69a5779ae5cb2b80e4f0551132563..959918f94f50df069c64715670a47949d02efbbf 100644
--- a/test/manager/nuget/extract.spec.js
+++ b/test/manager/nuget/extract.spec.ts
@@ -1,7 +1,7 @@
-const fs = require('fs');
-const { extractPackageFile } = require('../../../lib/manager/nuget/extract');
+import { readFileSync } from 'fs';
+import { extractPackageFile } from '../../../lib/manager/nuget/extract';
 
-const sample = fs.readFileSync(
+const sample = readFileSync(
   'test/datasource/nuget/_fixtures/sample.csproj',
   'utf8'
 );
diff --git a/test/manager/nuget/update.spec.js b/test/manager/nuget/update.spec.ts
similarity index 65%
rename from test/manager/nuget/update.spec.js
rename to test/manager/nuget/update.spec.ts
index 351a11da65bb2e24e98b1b9e9052e39d3e60274a..77550785acbfedc6211392ca56f84e3611ef0ace 100644
--- a/test/manager/nuget/update.spec.js
+++ b/test/manager/nuget/update.spec.ts
@@ -1,7 +1,7 @@
-const fs = require('fs');
-const nugetUpdater = require('../../../lib/manager/nuget/update');
+import { readFileSync } from 'fs';
+import { updateDependency } from '../../../lib/manager/nuget/update';
 
-const csProj = fs.readFileSync(
+const csProj = readFileSync(
   'test/datasource/nuget/_fixtures/sample.csproj',
   'utf8'
 );
@@ -13,7 +13,7 @@ describe('manager/nuget/update', () => {
         managerData: { lineNumber: 13 },
         newVersion: '5.0.0',
       };
-      const res = nugetUpdater.updateDependency(csProj, upgrade);
+      const res = updateDependency(csProj, upgrade);
       expect(res).not.toEqual(csProj);
     });
     it('keeps intact when same version', () => {
@@ -21,11 +21,11 @@ describe('manager/nuget/update', () => {
         managerData: { lineNumber: 13 },
         newVersion: '4.1.0',
       };
-      const res = nugetUpdater.updateDependency(csProj, upgrade);
+      const res = updateDependency(csProj, upgrade);
       expect(res).toEqual(csProj);
     });
     it('returns null on errors', () => {
-      const res = nugetUpdater.updateDependency(csProj, null);
+      const res = updateDependency(csProj, null);
       expect(res).toBeNull();
     });
   });
diff --git a/test/manager/nvm/__snapshots__/extract.spec.js.snap b/test/manager/nvm/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/nvm/__snapshots__/extract.spec.js.snap
rename to test/manager/nvm/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/nvm/__snapshots__/update.spec.js.snap b/test/manager/nvm/__snapshots__/update.spec.ts.snap
similarity index 100%
rename from test/manager/nvm/__snapshots__/update.spec.js.snap
rename to test/manager/nvm/__snapshots__/update.spec.ts.snap
diff --git a/test/manager/nvm/extract.spec.js b/test/manager/nvm/extract.spec.ts
similarity index 86%
rename from test/manager/nvm/extract.spec.js
rename to test/manager/nvm/extract.spec.ts
index e2c88ff6a53fd438b9a514b80900aef6d8083aad..72c24462facde82b92d9864f255cf6c28fdc7026 100644
--- a/test/manager/nvm/extract.spec.js
+++ b/test/manager/nvm/extract.spec.ts
@@ -1,4 +1,4 @@
-const { extractPackageFile } = require('../../../lib/manager/nvm/extract');
+import { extractPackageFile } from '../../../lib/manager/nvm/extract';
 
 describe('lib/manager/nvm/extract', () => {
   describe('extractPackageFile()', () => {
diff --git a/test/manager/ruby-version/update.spec.js b/test/manager/nvm/update.spec.ts
similarity index 76%
rename from test/manager/ruby-version/update.spec.js
rename to test/manager/nvm/update.spec.ts
index 3a4335866af02ee8e7c0962fff4400e67f2e1fad..93fd26b5e66b7230cf27479aa5f73c75987f3343 100644
--- a/test/manager/ruby-version/update.spec.js
+++ b/test/manager/nvm/update.spec.ts
@@ -1,6 +1,4 @@
-const {
-  updateDependency,
-} = require('../../../lib/manager/ruby-version/update');
+import { updateDependency } from '../../../lib/manager/nvm/update';
 
 describe('manager/nvm/update', () => {
   describe('updateDependency', () => {
diff --git a/test/manager/pip_requirements/__snapshots__/extract.spec.js.snap b/test/manager/pip_requirements/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/pip_requirements/__snapshots__/extract.spec.js.snap
rename to test/manager/pip_requirements/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/pip_requirements/__snapshots__/update.spec.js.snap b/test/manager/pip_requirements/__snapshots__/update.spec.ts.snap
similarity index 100%
rename from test/manager/pip_requirements/__snapshots__/update.spec.js.snap
rename to test/manager/pip_requirements/__snapshots__/update.spec.ts.snap
diff --git a/test/manager/pip_requirements/extract.spec.js b/test/manager/pip_requirements/extract.spec.ts
similarity index 89%
rename from test/manager/pip_requirements/extract.spec.js
rename to test/manager/pip_requirements/extract.spec.ts
index e191eb7cf76c9b539ecb2b8e4b853a911d212692..bbc50d8101f4480b58389510b2c1c93c2369a17a 100644
--- a/test/manager/pip_requirements/extract.spec.js
+++ b/test/manager/pip_requirements/extract.spec.ts
@@ -1,32 +1,30 @@
-const fs = require('fs');
-const {
-  extractPackageFile,
-} = require('../../../lib/manager/pip_requirements/extract');
+import { readFileSync } from 'fs';
+import { extractPackageFile } from '../../../lib/manager/pip_requirements/extract';
 
-const requirements1 = fs.readFileSync(
+const requirements1 = readFileSync(
   'test/manager/pip_requirements/_fixtures/requirements1.txt',
   'utf8'
 );
-const requirements2 = fs.readFileSync(
+const requirements2 = readFileSync(
   'test/manager/pip_requirements/_fixtures/requirements2.txt',
   'utf8'
 );
-const requirements3 = fs.readFileSync(
+const requirements3 = readFileSync(
   'test/manager/pip_requirements/_fixtures/requirements3.txt',
   'utf8'
 );
 
-const requirements4 = fs.readFileSync(
+const requirements4 = readFileSync(
   'test/manager/pip_requirements/_fixtures/requirements4.txt',
   'utf8'
 );
 
-const requirements5 = fs.readFileSync(
+const requirements5 = readFileSync(
   'test/manager/pip_requirements/_fixtures/requirements5.txt',
   'utf8'
 );
 
-const requirements6 = fs.readFileSync(
+const requirements6 = readFileSync(
   'test/manager/pip_requirements/_fixtures/requirements6.txt',
   'utf8'
 );
diff --git a/test/manager/pip_requirements/range.spec.js b/test/manager/pip_requirements/range.spec.js
deleted file mode 100644
index 0c8fea1f6e0a04c14122f1d6624a7cd88c3a91ed..0000000000000000000000000000000000000000
--- a/test/manager/pip_requirements/range.spec.js
+++ /dev/null
@@ -1,12 +0,0 @@
-const { getRangeStrategy } = require('../../../lib/manager/pip_requirements');
-
-describe('getRangeStrategy', () => {
-  it('returns same if not auto', () => {
-    const config = { rangeStrategy: 'widen' };
-    expect(getRangeStrategy(config)).toEqual('widen');
-  });
-  it('pins if auto', () => {
-    const config = { rangeStrategy: 'auto' };
-    expect(getRangeStrategy(config)).toEqual('pin');
-  });
-});
diff --git a/test/manager/pip_requirements/range.spec.ts b/test/manager/pip_requirements/range.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1aa41f835df3609e54b871d6254d656773452233
--- /dev/null
+++ b/test/manager/pip_requirements/range.spec.ts
@@ -0,0 +1,13 @@
+import { getRangeStrategy } from '../../../lib/manager/pip_requirements';
+import { RangeConfig } from '../../../lib/manager/common';
+
+describe('getRangeStrategy', () => {
+  it('returns same if not auto', () => {
+    const config: RangeConfig = { rangeStrategy: 'widen' };
+    expect(getRangeStrategy(config)).toEqual('widen');
+  });
+  it('pins if auto', () => {
+    const config: RangeConfig = { rangeStrategy: 'auto' };
+    expect(getRangeStrategy(config)).toEqual('pin');
+  });
+});
diff --git a/test/manager/pip_requirements/update.spec.js b/test/manager/pip_requirements/update.spec.ts
similarity index 90%
rename from test/manager/pip_requirements/update.spec.js
rename to test/manager/pip_requirements/update.spec.ts
index d2d00561134d5cbb44d850ab08c9fb692a69ceee..4a2d12ad00967dd60c9cbec6bb9572901bfebf33 100644
--- a/test/manager/pip_requirements/update.spec.js
+++ b/test/manager/pip_requirements/update.spec.ts
@@ -1,29 +1,27 @@
-const fs = require('fs');
-const {
-  updateDependency,
-} = require('../../../lib/manager/pip_requirements/update');
+import { readFileSync } from 'fs';
+import { updateDependency } from '../../../lib/manager/pip_requirements/update';
 
-const requirements = fs.readFileSync(
+const requirements = readFileSync(
   'test/manager/pip_requirements/_fixtures/requirements1.txt',
   'utf8'
 );
 
-const requirements3 = fs.readFileSync(
+const requirements3 = readFileSync(
   'test/manager/pip_requirements/_fixtures/requirements3.txt',
   'utf8'
 );
 
-const requirements4 = fs.readFileSync(
+const requirements4 = readFileSync(
   'test/manager/pip_requirements/_fixtures/requirements4.txt',
   'utf8'
 );
 
-const setupPy1 = fs.readFileSync(
+const setupPy1 = readFileSync(
   'test/manager/pip_setup/_fixtures/setup.py',
   'utf-8'
 );
 
-const setupPy2 = fs.readFileSync(
+const setupPy2 = readFileSync(
   'test/manager/pip_setup/_fixtures/setup-2.py',
   'utf-8'
 );
diff --git a/test/manager/pip_setup/__snapshots__/extract.spec.js.snap b/test/manager/pip_setup/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/pip_setup/__snapshots__/extract.spec.js.snap
rename to test/manager/pip_setup/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/pip_setup/extract.spec.js b/test/manager/pip_setup/extract.spec.ts
similarity index 91%
rename from test/manager/pip_setup/extract.spec.js
rename to test/manager/pip_setup/extract.spec.ts
index ab62c6f6fab521b6c6d3ef2716d83b3eb591f9e6..9841596cb4c150ca5541fba8b703318299cef1e7 100644
--- a/test/manager/pip_setup/extract.spec.js
+++ b/test/manager/pip_setup/extract.spec.ts
@@ -1,23 +1,22 @@
-const fs = require('fs');
-const tmp = require('tmp-promise');
-const { relative } = require('path');
-const { exec } = require('../../../lib/util/exec');
-const {
+import { readFileSync } from 'fs';
+import { file as _file } from 'tmp-promise';
+import { relative } from 'path';
+import { exec } from '../../../lib/util/exec';
+import {
   extractPackageFile,
   parsePythonVersion,
   getPythonAlias,
   pythonVersions,
-  // extractSetupFile,
-} = require('../../../lib/manager/pip_setup/extract');
+} from '../../../lib/manager/pip_setup/extract';
 
 const packageFile = 'test/manager/pip_setup/_fixtures/setup.py';
-const content = fs.readFileSync(packageFile, 'utf8');
+const content = readFileSync(packageFile, 'utf8');
 const config = {
   localDir: '.',
 };
 
 async function tmpFile() {
-  const file = await tmp.file({ postfix: '.py' });
+  const file = await _file({ postfix: '.py' });
   return relative('.', file.path);
 }
 
diff --git a/test/manager/pipenv/__snapshots__/artifacts.spec.js.snap b/test/manager/pipenv/__snapshots__/artifacts.spec.ts.snap
similarity index 100%
rename from test/manager/pipenv/__snapshots__/artifacts.spec.js.snap
rename to test/manager/pipenv/__snapshots__/artifacts.spec.ts.snap
diff --git a/test/manager/pipenv/__snapshots__/extract.spec.js.snap b/test/manager/pipenv/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/pipenv/__snapshots__/extract.spec.js.snap
rename to test/manager/pipenv/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/pipenv/__snapshots__/update.spec.js.snap b/test/manager/pipenv/__snapshots__/update.spec.ts.snap
similarity index 100%
rename from test/manager/pipenv/__snapshots__/update.spec.js.snap
rename to test/manager/pipenv/__snapshots__/update.spec.ts.snap
diff --git a/test/manager/pipenv/artifacts.spec.js b/test/manager/pipenv/artifacts.spec.ts
similarity index 89%
rename from test/manager/pipenv/artifacts.spec.js
rename to test/manager/pipenv/artifacts.spec.ts
index 0351652543621200bfd892368b9c97c5dedd1140..51f26782e4fe9cd6cb7a2a6c05d7843843697ae0 100644
--- a/test/manager/pipenv/artifacts.spec.js
+++ b/test/manager/pipenv/artifacts.spec.ts
@@ -1,15 +1,15 @@
+import _fs from 'fs-extra';
+import { exec as _exec } from '../../../lib/util/exec';
+import * as pipenv from '../../../lib/manager/pipenv/artifacts';
+
 jest.mock('fs-extra');
 jest.mock('../../../lib/util/exec');
 jest.mock('../../../lib/util/host-rules');
 
-/** @type any */
-const fs = require('fs-extra');
-/** @type any */
-const { exec } = require('../../../lib/util/exec');
-const pipenv = require('../../../lib/manager/pipenv/artifacts');
+const fs: any = _fs;
+const exec: any = _exec;
 
-/** @type any */
-const platform = global.platform;
+const platform: any = global.platform;
 
 const config = {
   localDir: '/tmp/github/some/repo',
diff --git a/test/manager/pipenv/extract.spec.js b/test/manager/pipenv/extract.spec.ts
similarity index 97%
rename from test/manager/pipenv/extract.spec.js
rename to test/manager/pipenv/extract.spec.ts
index eb95ac3238a39bd166999cd4b23b0dcb3eb0cc4a..e730c0916ea289350d983e944e8a2bd7995fb3dd 100644
--- a/test/manager/pipenv/extract.spec.js
+++ b/test/manager/pipenv/extract.spec.ts
@@ -1,5 +1,5 @@
-const fs = require('fs');
-const { extractPackageFile } = require('../../../lib/manager/pipenv/extract');
+import fs from 'fs';
+import { extractPackageFile } from '../../../lib/manager/pipenv/extract';
 
 const pipfile1 = fs.readFileSync(
   'test/manager/pipenv/_fixtures/Pipfile1',
diff --git a/test/manager/pipenv/update.spec.js b/test/manager/pipenv/update.spec.ts
similarity index 89%
rename from test/manager/pipenv/update.spec.js
rename to test/manager/pipenv/update.spec.ts
index f9f5c76b0eb9dd8cd43626c72b5f10f71b91f283..64ecd91cb581702296f3883647a7a0bba7498de3 100644
--- a/test/manager/pipenv/update.spec.js
+++ b/test/manager/pipenv/update.spec.ts
@@ -1,10 +1,7 @@
-const fs = require('fs');
-const { updateDependency } = require('../../../lib/manager/pipenv/update');
+import { readFileSync } from 'fs';
+import { updateDependency } from '../../../lib/manager/pipenv/update';
 
-const pipfile = fs.readFileSync(
-  'test/manager/pipenv/_fixtures/Pipfile1',
-  'utf8'
-);
+const pipfile = readFileSync('test/manager/pipenv/_fixtures/Pipfile1', 'utf8');
 
 describe('manager/pipenv/update', () => {
   describe('updateDependency', () => {
diff --git a/test/manager/poetry/__snapshots__/artifacts.spec.js.snap b/test/manager/poetry/__snapshots__/artifacts.spec.ts.snap
similarity index 100%
rename from test/manager/poetry/__snapshots__/artifacts.spec.js.snap
rename to test/manager/poetry/__snapshots__/artifacts.spec.ts.snap
diff --git a/test/manager/poetry/__snapshots__/extract.spec.js.snap b/test/manager/poetry/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/poetry/__snapshots__/extract.spec.js.snap
rename to test/manager/poetry/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/poetry/__snapshots__/update.spec.js.snap b/test/manager/poetry/__snapshots__/update.spec.ts.snap
similarity index 100%
rename from test/manager/poetry/__snapshots__/update.spec.js.snap
rename to test/manager/poetry/__snapshots__/update.spec.ts.snap
diff --git a/test/manager/poetry/artifacts.spec.js b/test/manager/poetry/artifacts.spec.ts
similarity index 53%
rename from test/manager/poetry/artifacts.spec.js
rename to test/manager/poetry/artifacts.spec.ts
index fe40806d7f9dfa715f6800f3dd087c92c85b5246..644d06bb40ae8cca0046dc636193b7e2411263dc 100644
--- a/test/manager/poetry/artifacts.spec.js
+++ b/test/manager/poetry/artifacts.spec.ts
@@ -1,14 +1,13 @@
+import _fs from 'fs-extra';
+import { exec as _exec } from '../../../lib/util/exec';
+import { updateArtifacts } from '../../../lib/manager/poetry/artifacts';
+
 jest.mock('fs-extra');
 jest.mock('../../../lib/util/exec');
 
-/** @type any */
-const fs = require('fs-extra');
-/** @type any */
-const { exec } = require('../../../lib/util/exec');
-const poetry = require('../../../lib/manager/poetry/artifacts');
-
-/** @type any */
-const platform = global.platform;
+const platform: any = global.platform;
+const exec: any = _exec;
+const fs: any = _fs;
 
 const config = {
   localDir: '/tmp/github/some/repo',
@@ -22,20 +21,13 @@ describe('.updateArtifacts()', () => {
     delete global.trustLevel;
   });
   it('returns null if no poetry.lock found', async () => {
-    const updatedDeps = [
-      {
-        depName: 'dep1',
-        currentValue: '1.2.3',
-      },
-    ];
+    const updatedDeps = ['dep1'];
     expect(
-      await poetry.updateArtifacts('pyproject.toml', updatedDeps, '', config)
+      await updateArtifacts('pyproject.toml', updatedDeps, '', config)
     ).toBeNull();
   });
   it('returns null if updatedDeps is empty', async () => {
-    expect(
-      await poetry.updateArtifacts('pyproject.toml', [], '', config)
-    ).toBeNull();
+    expect(await updateArtifacts('pyproject.toml', [], '', config)).toBeNull();
   });
   it('returns null if unchanged', async () => {
     platform.getFile.mockReturnValueOnce('Current poetry.lock');
@@ -44,14 +36,9 @@ describe('.updateArtifacts()', () => {
       stderror: '',
     });
     fs.readFile = jest.fn(() => 'Current poetry.lock');
-    const updatedDeps = [
-      {
-        depName: 'dep1',
-        currentValue: '1.2.3',
-      },
-    ];
+    const updatedDeps = ['dep1'];
     expect(
-      await poetry.updateArtifacts('pyproject.toml', updatedDeps, '', config)
+      await updateArtifacts('pyproject.toml', updatedDeps, '', config)
     ).toBeNull();
   });
   it('returns updated poetry.lock', async () => {
@@ -61,15 +48,10 @@ describe('.updateArtifacts()', () => {
       stderror: '',
     });
     fs.readFile = jest.fn(() => 'New poetry.lock');
-    const updatedDeps = [
-      {
-        depName: 'dep1',
-        currentValue: '1.2.3',
-      },
-    ];
+    const updatedDeps = ['dep1'];
     global.trustLevel = 'high';
     expect(
-      await poetry.updateArtifacts('pyproject.toml', updatedDeps, '{}', config)
+      await updateArtifacts('pyproject.toml', updatedDeps, '{}', config)
     ).not.toBeNull();
   });
   it('catches errors', async () => {
@@ -77,14 +59,9 @@ describe('.updateArtifacts()', () => {
     fs.outputFile = jest.fn(() => {
       throw new Error('not found');
     });
-    const updatedDeps = [
-      {
-        depName: 'dep1',
-        currentValue: '1.2.3',
-      },
-    ];
+    const updatedDeps = ['dep1'];
     expect(
-      await poetry.updateArtifacts('pyproject.toml', updatedDeps, '{}', config)
+      await updateArtifacts('pyproject.toml', updatedDeps, '{}', config)
     ).toMatchSnapshot();
   });
 });
diff --git a/test/manager/poetry/extract.spec.js b/test/manager/poetry/extract.spec.ts
similarity index 91%
rename from test/manager/poetry/extract.spec.js
rename to test/manager/poetry/extract.spec.ts
index b60af388ca68862195e166ab749b9b5f4c023a9b..17b792c08edff6ca0e3d96b30ecc692a9aac11c6 100644
--- a/test/manager/poetry/extract.spec.js
+++ b/test/manager/poetry/extract.spec.ts
@@ -1,27 +1,27 @@
-const fs = require('fs');
-const { extractPackageFile } = require('../../../lib/manager/poetry/extract');
+import { readFileSync } from 'fs';
+import { extractPackageFile } from '../../../lib/manager/poetry/extract';
 
-const pyproject1toml = fs.readFileSync(
+const pyproject1toml = readFileSync(
   'test/manager/poetry/_fixtures/pyproject.1.toml',
   'utf8'
 );
 
-const pyproject2toml = fs.readFileSync(
+const pyproject2toml = readFileSync(
   'test/manager/poetry/_fixtures/pyproject.2.toml',
   'utf8'
 );
 
-const pyproject3toml = fs.readFileSync(
+const pyproject3toml = readFileSync(
   'test/manager/poetry/_fixtures/pyproject.3.toml',
   'utf8'
 );
 
-const pyproject4toml = fs.readFileSync(
+const pyproject4toml = readFileSync(
   'test/manager/poetry/_fixtures/pyproject.4.toml',
   'utf8'
 );
 
-const pyproject5toml = fs.readFileSync(
+const pyproject5toml = readFileSync(
   'test/manager/poetry/_fixtures/pyproject.5.toml',
   'utf8'
 );
diff --git a/test/manager/poetry/update.spec.js b/test/manager/poetry/update.spec.ts
similarity index 96%
rename from test/manager/poetry/update.spec.js
rename to test/manager/poetry/update.spec.ts
index a937cfe7e17104f09ae5e6ca304f447cf0ec1fba..6166108ac1e928878cfb80096fdcf3ac54ae288c 100644
--- a/test/manager/poetry/update.spec.js
+++ b/test/manager/poetry/update.spec.ts
@@ -1,12 +1,12 @@
-const fs = require('fs');
-const { updateDependency } = require('../../../lib/manager/poetry/update');
+import { readFileSync } from 'fs';
+import { updateDependency } from '../../../lib/manager/poetry/update';
 
-const pyproject1toml = fs.readFileSync(
+const pyproject1toml = readFileSync(
   'test/manager/poetry/_fixtures/pyproject.1.toml',
   'utf8'
 );
 
-const pyproject2toml = fs.readFileSync(
+const pyproject2toml = readFileSync(
   'test/manager/poetry/_fixtures/pyproject.2.toml',
   'utf8'
 );
diff --git a/test/manager/pub/__snapshots__/extract.spec.js.snap b/test/manager/pub/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/pub/__snapshots__/extract.spec.js.snap
rename to test/manager/pub/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/pub/__snapshots__/update.spec.js.snap b/test/manager/pub/__snapshots__/update.spec.ts.snap
similarity index 100%
rename from test/manager/pub/__snapshots__/update.spec.js.snap
rename to test/manager/pub/__snapshots__/update.spec.ts.snap
diff --git a/test/manager/pub/extract.spec.js b/test/manager/pub/extract.spec.ts
similarity index 80%
rename from test/manager/pub/extract.spec.js
rename to test/manager/pub/extract.spec.ts
index 961676dc1b1a245d739e8e373dc2d352655542c4..be3ddbb4e452aacd3c88baac1453a5805a30c48d 100644
--- a/test/manager/pub/extract.spec.js
+++ b/test/manager/pub/extract.spec.ts
@@ -1,12 +1,12 @@
-const fs = require('fs');
-const { extractPackageFile } = require('../../../lib/manager/pub');
+import { readFileSync } from 'fs';
+import { extractPackageFile } from '../../../lib/manager/pub';
 
-const brokenYaml = fs.readFileSync(
+const brokenYaml = readFileSync(
   'test/manager/pub/_fixtures/update.yaml',
   'utf8'
 );
 
-const packageFile = fs.readFileSync(
+const packageFile = readFileSync(
   'test/manager/pub/_fixtures/extract.yaml',
   'utf8'
 );
diff --git a/test/manager/pub/update.spec.js b/test/manager/pub/update.spec.ts
similarity index 92%
rename from test/manager/pub/update.spec.js
rename to test/manager/pub/update.spec.ts
index 35fd8b036a504f3fb962424bac4fea21ebec3956..39d811fbd375056cae2fad6a448c55dd64040079 100644
--- a/test/manager/pub/update.spec.js
+++ b/test/manager/pub/update.spec.ts
@@ -1,7 +1,7 @@
-const fs = require('fs');
-const { updateDependency } = require('../../../lib/manager/pub');
+import { readFileSync } from 'fs';
+import { updateDependency } from '../../../lib/manager/pub';
 
-const fileContent = fs.readFileSync(
+const fileContent = readFileSync(
   'test/manager/pub/_fixtures/update.yaml',
   'utf8'
 );
diff --git a/test/manager/range.spec.js b/test/manager/range.spec.ts
similarity index 57%
rename from test/manager/range.spec.js
rename to test/manager/range.spec.ts
index 1f45419e2f4144c2700c75684a760d1b114d37e4..4d26d8efe65ff039f2904473e1501436861d6996 100644
--- a/test/manager/range.spec.js
+++ b/test/manager/range.spec.ts
@@ -1,12 +1,13 @@
-const { getRangeStrategy } = require('../../lib/manager');
+import { getRangeStrategy } from '../../lib/manager';
+import { RangeConfig } from '../../lib/manager/common';
 
 describe('getRangeStrategy', () => {
   it('returns same if not auto', () => {
-    const config = { manager: 'npm', rangeStrategy: 'widen' };
+    const config: RangeConfig = { manager: 'npm', rangeStrategy: 'widen' };
     expect(getRangeStrategy(config)).toEqual('widen');
   });
   it('returns manager strategy', () => {
-    const config = {
+    const config: RangeConfig = {
       manager: 'npm',
       rangeStrategy: 'auto',
       depType: 'dependencies',
@@ -15,11 +16,17 @@ describe('getRangeStrategy', () => {
     expect(getRangeStrategy(config)).toEqual('pin');
   });
   it('defaults to replace', () => {
-    const config = { manager: 'circleci', rangeStrategy: 'auto' };
+    const config: RangeConfig = {
+      manager: 'circleci',
+      rangeStrategy: 'auto',
+    };
     expect(getRangeStrategy(config)).toEqual('replace');
   });
   it('returns rangeStrategy if not auto', () => {
-    const config = { manager: 'circleci', rangeStrategy: 'future' };
+    const config: RangeConfig = {
+      manager: 'circleci',
+      rangeStrategy: 'future',
+    };
     expect(getRangeStrategy(config)).toEqual('future');
   });
 });
diff --git a/test/manager/ruby-version/__snapshots__/extract.spec.js.snap b/test/manager/ruby-version/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/ruby-version/__snapshots__/extract.spec.js.snap
rename to test/manager/ruby-version/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/ruby-version/__snapshots__/update.spec.js.snap b/test/manager/ruby-version/__snapshots__/update.spec.ts.snap
similarity index 100%
rename from test/manager/ruby-version/__snapshots__/update.spec.js.snap
rename to test/manager/ruby-version/__snapshots__/update.spec.ts.snap
diff --git a/test/manager/ruby-version/extract.spec.js b/test/manager/ruby-version/extract.spec.ts
similarity index 85%
rename from test/manager/ruby-version/extract.spec.js
rename to test/manager/ruby-version/extract.spec.ts
index bfd5126be46bd8034fbd9375c65a716ef4a62980..2f7788601c3e0bcc2373a33e40dde5b9347db4d7 100644
--- a/test/manager/ruby-version/extract.spec.js
+++ b/test/manager/ruby-version/extract.spec.ts
@@ -1,6 +1,4 @@
-const {
-  extractPackageFile,
-} = require('../../../lib/manager/ruby-version/extract');
+import { extractPackageFile } from '../../../lib/manager/ruby-version/extract';
 
 describe('lib/manager/ruby-version/extract', () => {
   describe('extractPackageFile()', () => {
diff --git a/test/manager/nvm/update.spec.js b/test/manager/ruby-version/update.spec.ts
similarity index 63%
rename from test/manager/nvm/update.spec.js
rename to test/manager/ruby-version/update.spec.ts
index b2c120ebefdb5b9696b46d76c4694f5993d64dc7..40dc7c078b82528c39e850a926cac9cf002bfbce 100644
--- a/test/manager/nvm/update.spec.js
+++ b/test/manager/ruby-version/update.spec.ts
@@ -1,4 +1,4 @@
-const nodefile = require('../../../lib/manager/nvm/update');
+import { updateDependency } from '../../../lib/manager/ruby-version/update';
 
 describe('manager/nvm/update', () => {
   describe('updateDependency', () => {
@@ -6,7 +6,7 @@ describe('manager/nvm/update', () => {
       const upgrade = {
         newValue: '8.9.1',
       };
-      const res = nodefile.updateDependency('8.9.0\n', upgrade);
+      const res = updateDependency('8.9.0\n', upgrade);
       expect(res).toMatchSnapshot();
     });
   });
diff --git a/test/manager/sbt/__snapshots__/extract.spec.js.snap b/test/manager/sbt/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/sbt/__snapshots__/extract.spec.js.snap
rename to test/manager/sbt/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/sbt/extract.spec.js b/test/manager/sbt/extract.spec.ts
similarity index 79%
rename from test/manager/sbt/extract.spec.js
rename to test/manager/sbt/extract.spec.ts
index 6118f88f4a3892326df4cd11fb3cb3536e0351ce..e13352031d6da6fdacfffad9707d1d66a5fc6e0f 100644
--- a/test/manager/sbt/extract.spec.js
+++ b/test/manager/sbt/extract.spec.ts
@@ -1,13 +1,10 @@
-const fs = require('fs');
-const path = require('path');
-const { extractPackageFile } = require('../../../lib/manager/sbt/extract');
+import { readFileSync } from 'fs';
+import { resolve } from 'path';
+import { extractPackageFile } from '../../../lib/manager/sbt/extract';
 
-const sbt = fs.readFileSync(
-  path.resolve(__dirname, `./_fixtures/sample.sbt`),
-  'utf8'
-);
-const sbtMissingScalaVersion = fs.readFileSync(
-  path.resolve(__dirname, `./_fixtures/missing-scala-version.sbt`),
+const sbt = readFileSync(resolve(__dirname, `./_fixtures/sample.sbt`), 'utf8');
+const sbtMissingScalaVersion = readFileSync(
+  resolve(__dirname, `./_fixtures/missing-scala-version.sbt`),
   'utf8'
 );
 
diff --git a/test/manager/sbt/update.spec.js b/test/manager/sbt/update.spec.ts
similarity index 74%
rename from test/manager/sbt/update.spec.js
rename to test/manager/sbt/update.spec.ts
index 2be448ec81b10d764d4b4a1bf244bf4d4d3dc2cb..01ee5206d8ebb11abef638c634fed42585fcbd59 100644
--- a/test/manager/sbt/update.spec.js
+++ b/test/manager/sbt/update.spec.ts
@@ -1,23 +1,24 @@
-const fs = require('fs');
-const path = require('path');
-const { extractPackageFile } = require('../../../lib/manager/sbt/extract');
-const { updateDependency } = require('../../../lib/manager/sbt/update');
+import { readFileSync } from 'fs';
+import { resolve } from 'path';
+import { extractPackageFile } from '../../../lib/manager/sbt/extract';
+import { updateDependency } from '../../../lib/manager/sbt/update';
+import { Upgrade } from '../../../lib/manager/common';
 
-const sbtPath = path.resolve(__dirname, `./_fixtures/sample.sbt`);
-const fileContent = fs.readFileSync(sbtPath, 'utf8');
+const sbtPath = resolve(__dirname, `./_fixtures/sample.sbt`);
+const fileContent = readFileSync(sbtPath, 'utf8');
 
 describe('lib/manager/terraform/extract', () => {
   describe('updateDependency()', () => {
     it('returns content untouched if versions are same', () => {
       const { deps } = extractPackageFile(fileContent);
-      const upgrade = deps.shift();
+      const upgrade: Upgrade = deps.shift();
       upgrade.newValue = upgrade.currentValue;
       const newFileContent = updateDependency(fileContent, upgrade);
       expect(newFileContent).toBe(fileContent);
     });
     it('returns null if content has been updated somewhere', () => {
       const { deps } = extractPackageFile(fileContent);
-      const upgrade = deps.shift();
+      const upgrade: Upgrade = deps.shift();
       upgrade.newValue = '0.1.1';
       const newFileContent = updateDependency(
         fileContent.replace('0.0.1', '0.1.0'),
diff --git a/test/manager/swift/__snapshots__/index.spec.js.snap b/test/manager/swift/__snapshots__/index.spec.ts.snap
similarity index 100%
rename from test/manager/swift/__snapshots__/index.spec.js.snap
rename to test/manager/swift/__snapshots__/index.spec.ts.snap
diff --git a/test/manager/swift/index.spec.js b/test/manager/swift/index.spec.ts
similarity index 96%
rename from test/manager/swift/index.spec.js
rename to test/manager/swift/index.spec.ts
index 15ab7c4bb9407e879518ffab2db7a62a326b652d..8ce0c6c76784bd11f85b1cd66d1815aaf1f6d912 100644
--- a/test/manager/swift/index.spec.js
+++ b/test/manager/swift/index.spec.ts
@@ -1,10 +1,10 @@
-const fs = require('fs');
-const path = require('path');
-const { extractPackageFile } = require('../../../lib/manager/swift/extract');
-const { updateDependency } = require('../../../lib/manager/swift/update');
+import { readFileSync } from 'fs';
+import { resolve } from 'path';
+import { extractPackageFile } from '../../../lib/manager/swift/extract';
+import { updateDependency } from '../../../lib/manager/swift/update';
 
-const pkgContent = fs.readFileSync(
-  path.resolve(__dirname, `./_fixtures/SamplePackage.swift`),
+const pkgContent = readFileSync(
+  resolve(__dirname, `./_fixtures/SamplePackage.swift`),
   'utf8'
 );
 
diff --git a/test/manager/terraform/__snapshots__/extract.spec.js.snap b/test/manager/terraform/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/terraform/__snapshots__/extract.spec.js.snap
rename to test/manager/terraform/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/terraform/extract.spec.js b/test/manager/terraform/extract.spec.ts
similarity index 76%
rename from test/manager/terraform/extract.spec.js
rename to test/manager/terraform/extract.spec.ts
index d4be1dd9f1374f8186fb2e36cb64043055bfe3fe..014fea46fd52d0f97c0b3b80c8212dfac0addea9 100644
--- a/test/manager/terraform/extract.spec.js
+++ b/test/manager/terraform/extract.spec.ts
@@ -1,9 +1,7 @@
-const fs = require('fs');
-const {
-  extractPackageFile,
-} = require('../../../lib/manager/terraform/extract');
+import { readFileSync } from 'fs';
+import { extractPackageFile } from '../../../lib/manager/terraform/extract';
 
-const tf1 = fs.readFileSync('test/datasource/terraform/_fixtures/1.tf', 'utf8');
+const tf1 = readFileSync('test/datasource/terraform/_fixtures/1.tf', 'utf8');
 const tf2 = `module "relative" {
   source = "../../modules/fe"
 }
diff --git a/test/manager/terraform/update.spec.js b/test/manager/terraform/update.spec.ts
similarity index 82%
rename from test/manager/terraform/update.spec.js
rename to test/manager/terraform/update.spec.ts
index 6fdab55761e2554f625a5135b524bf4410d79bee..fdf353c3ff0a6b2aa97dec50558ea5435cdc4fd9 100644
--- a/test/manager/terraform/update.spec.js
+++ b/test/manager/terraform/update.spec.ts
@@ -1,7 +1,7 @@
-const fs = require('fs');
-const tfUpdate = require('../../../lib/manager/terraform/update');
+import { readFileSync } from 'fs';
+import { updateDependency } from '../../../lib/manager/terraform/update';
 
-const tf1 = fs.readFileSync('test/datasource/terraform/_fixtures/1.tf', 'utf8');
+const tf1 = readFileSync('test/datasource/terraform/_fixtures/1.tf', 'utf8');
 
 describe('manager/terraform/update', () => {
   describe('updateDependency', () => {
@@ -13,7 +13,7 @@ describe('manager/terraform/update', () => {
         depNameShort: 'hashicorp/example',
         newValue: 'v1.0.1',
       };
-      const res = tfUpdate.updateDependency(tf1, upgrade);
+      const res = updateDependency(tf1, upgrade);
       expect(res).not.toEqual(tf1);
       expect(res.includes(upgrade.newValue)).toBe(true);
     });
@@ -25,7 +25,7 @@ describe('manager/terraform/update', () => {
         depNameShort: 'hashicorp/example',
         newValue: 'v1.0.0',
       };
-      const res = tfUpdate.updateDependency(tf1, upgrade);
+      const res = updateDependency(tf1, upgrade);
       expect(res).toEqual(tf1);
     });
     it('returns null if wrong line', () => {
@@ -36,7 +36,7 @@ describe('manager/terraform/update', () => {
         depNameShort: 'hashicorp/example',
         newValue: 'v1.0.0',
       };
-      const res = tfUpdate.updateDependency(tf1, upgrade);
+      const res = updateDependency(tf1, upgrade);
       expect(res).toBeNull();
     });
     it('updates github versions', () => {
@@ -51,7 +51,7 @@ describe('manager/terraform/update', () => {
         source:
           'github.com/tieto-cem/terraform-aws-ecs-task-definition//modules/container-definition?ref=v0.1.0',
       };
-      const res = tfUpdate.updateDependency(tf1, upgrade);
+      const res = updateDependency(tf1, upgrade);
       expect(res).not.toEqual(tf1);
       expect(res.includes(upgrade.newValue)).toBe(true);
     });
@@ -66,7 +66,7 @@ describe('manager/terraform/update', () => {
         source: 'hashicorp/consul/aws',
         newValue: '0.4.0',
       };
-      const res = tfUpdate.updateDependency(tf1, upgrade);
+      const res = updateDependency(tf1, upgrade);
       expect(res).toBeNull();
     });
     it('updates terraform versions', () => {
@@ -80,7 +80,7 @@ describe('manager/terraform/update', () => {
         source: 'hashicorp/consul/aws',
         newValue: '0.4.0',
       };
-      const res = tfUpdate.updateDependency(tf1, upgrade);
+      const res = updateDependency(tf1, upgrade);
       expect(res).not.toEqual(tf1);
       expect(res.includes(upgrade.newValue)).toBe(true);
     });
diff --git a/test/manager/travis/__snapshots__/extract.spec.js.snap b/test/manager/travis/__snapshots__/extract.spec.ts.snap
similarity index 100%
rename from test/manager/travis/__snapshots__/extract.spec.js.snap
rename to test/manager/travis/__snapshots__/extract.spec.ts.snap
diff --git a/test/manager/travis/__snapshots__/package.spec.js.snap b/test/manager/travis/__snapshots__/package.spec.ts.snap
similarity index 100%
rename from test/manager/travis/__snapshots__/package.spec.js.snap
rename to test/manager/travis/__snapshots__/package.spec.ts.snap
diff --git a/test/manager/travis/__snapshots__/update.spec.js.snap b/test/manager/travis/__snapshots__/update.spec.ts.snap
similarity index 100%
rename from test/manager/travis/__snapshots__/update.spec.js.snap
rename to test/manager/travis/__snapshots__/update.spec.ts.snap
diff --git a/test/manager/travis/extract.spec.js b/test/manager/travis/extract.spec.ts
similarity index 84%
rename from test/manager/travis/extract.spec.js
rename to test/manager/travis/extract.spec.ts
index 8798027fb01ee2d681b365efdd99d28bc14ce767..2721e90482d679758c1b7c58f43d216743de9a39 100644
--- a/test/manager/travis/extract.spec.js
+++ b/test/manager/travis/extract.spec.ts
@@ -1,4 +1,4 @@
-const { extractPackageFile } = require('../../../lib/manager/travis/extract');
+import { extractPackageFile } from '../../../lib/manager/travis/extract';
 
 describe('lib/manager/travis/extract', () => {
   describe('extractPackageFile()', () => {
diff --git a/test/manager/travis/package.spec.js b/test/manager/travis/package.spec.ts
similarity index 65%
rename from test/manager/travis/package.spec.js
rename to test/manager/travis/package.spec.ts
index a85168e47a70b2336d817884620710757c645c89..7129210bd72a8a17fe7d5acb1b6e3dff83fd61e4 100644
--- a/test/manager/travis/package.spec.js
+++ b/test/manager/travis/package.spec.ts
@@ -1,13 +1,16 @@
-const node = require('../../../lib/manager/travis/package');
-const defaultConfig = require('../../../lib/config/defaults').getConfig();
-/** @type any */
-const githubDatasource = require('../../../lib/datasource/github');
+import { getPackageUpdates } from '../../../lib/manager/travis/package';
+import { getPkgReleases as _getPkgReleases } from '../../../lib/datasource/github';
+import { getConfig } from '../../../lib/config/defaults';
+
+const defaultConfig = getConfig();
+const getPkgReleases: any = _getPkgReleases;
 
 jest.mock('../../../lib/datasource/github');
 
 describe('lib/manager/node/package', () => {
   describe('getPackageUpdates', () => {
-    let config;
+    // TODO: should be `PackageUpdateConfig`
+    let config: any;
     beforeEach(() => {
       config = {
         ...defaultConfig,
@@ -15,27 +18,27 @@ describe('lib/manager/node/package', () => {
     });
     it('returns empty if missing supportPolicy', async () => {
       config.currentValue = ['6', '8'];
-      expect(await node.getPackageUpdates(config)).toEqual([]);
+      expect(await getPackageUpdates(config)).toEqual([]);
     });
     it('returns empty if invalid supportPolicy', async () => {
       config.currentValue = ['6', '8'];
       config.supportPolicy = ['foo'];
-      expect(await node.getPackageUpdates(config)).toEqual([]);
+      expect(await getPackageUpdates(config)).toEqual([]);
     });
     it('returns empty if matching', async () => {
       config.currentValue = ['10'];
       config.supportPolicy = ['lts_active'];
-      expect(await node.getPackageUpdates(config)).toEqual([]);
+      expect(await getPackageUpdates(config)).toEqual([]);
     });
     it('returns result if needing updates', async () => {
       config.currentValue = ['6', '8', '10'];
       config.supportPolicy = ['lts'];
-      expect(await node.getPackageUpdates(config)).toMatchSnapshot();
+      expect(await getPackageUpdates(config)).toMatchSnapshot();
     });
     it('detects pinning', async () => {
       config.currentValue = ['6.1.0', '8.4.0', '10.0.0'];
       config.supportPolicy = ['lts'];
-      githubDatasource.getPkgReleases.mockReturnValueOnce({
+      getPkgReleases.mockReturnValueOnce({
         releases: [
           {
             version: '4.4.4',
@@ -60,7 +63,7 @@ describe('lib/manager/node/package', () => {
           },
         ],
       });
-      expect(await node.getPackageUpdates(config)).toMatchSnapshot();
+      expect(await getPackageUpdates(config)).toMatchSnapshot();
     });
   });
 });
diff --git a/test/manager/travis/update.spec.js b/test/manager/travis/update.spec.js
deleted file mode 100644
index b33c87eae9a118cd4c9ccd007983035645d2d403..0000000000000000000000000000000000000000
--- a/test/manager/travis/update.spec.js
+++ /dev/null
@@ -1,45 +0,0 @@
-const fs = require('fs');
-const path = require('path');
-const nodefile = require('../../../lib/manager/travis/update');
-
-const content = fs.readFileSync(
-  path.resolve('test/manager/travis/_fixtures/travis.yml'),
-  'utf8'
-);
-
-describe('manager/travis/update', () => {
-  describe('updateDependency', () => {
-    it('updates values', () => {
-      const upgrade = {
-        currentValue: ['8', '6', '4'],
-        newValue: [6, 8],
-      };
-      const res = nodefile.updateDependency(content, upgrade);
-      expect(res).toMatchSnapshot();
-    });
-    it('falls back to 2 spaces', () => {
-      const upgrade = {
-        currentValue: [8, 6, 4],
-        newValue: [6, 8],
-      };
-      const res = nodefile.updateDependency('hello: world', upgrade);
-      expect(res).toMatchSnapshot();
-    });
-    it('it uses double quotes', () => {
-      const upgrade = {
-        currentValue: ['6'],
-        newValue: [6, 8],
-      };
-      const res = nodefile.updateDependency('node_js:\n  - "6"\n', upgrade);
-      expect(res).toMatchSnapshot();
-    });
-    it('returns null if error', () => {
-      const upgrade = {
-        currentValue: [8, 6, 4],
-        newValue: '6',
-      };
-      const res = nodefile.updateDependency(content, upgrade);
-      expect(res).toBeNull();
-    });
-  });
-});
diff --git a/test/manager/travis/update.spec.ts b/test/manager/travis/update.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f09e94852c0057d514709e493d73679435e684c2
--- /dev/null
+++ b/test/manager/travis/update.spec.ts
@@ -0,0 +1,49 @@
+import { readFileSync } from 'fs';
+import { resolve } from 'path';
+import { updateDependency } from '../../../lib/manager/travis/update';
+
+const content = readFileSync(
+  resolve('test/manager/travis/_fixtures/travis.yml'),
+  'utf8'
+);
+
+describe('manager/travis/update', () => {
+  describe('updateDependency', () => {
+    it('updates values', () => {
+      // TODO: should be `Upgrade`
+      const upgrade: any = {
+        currentValue: ['8', '6', '4'],
+        newValue: [6, 8],
+      };
+      const res = updateDependency(content, upgrade);
+      expect(res).toMatchSnapshot();
+    });
+    it('falls back to 2 spaces', () => {
+      // TODO: should be `Upgrade`
+      const upgrade: any = {
+        currentValue: [8, 6, 4],
+        newValue: [6, 8],
+      };
+      const res = updateDependency('hello: world', upgrade);
+      expect(res).toMatchSnapshot();
+    });
+    it('it uses double quotes', () => {
+      // TODO: should be `Upgrade`
+      const upgrade: any = {
+        currentValue: ['6'],
+        newValue: [6, 8],
+      };
+      const res = updateDependency('node_js:\n  - "6"\n', upgrade);
+      expect(res).toMatchSnapshot();
+    });
+    it('returns null if error', () => {
+      // TODO: should be `Upgrade`
+      const upgrade: any = {
+        currentValue: [8, 6, 4],
+        newValue: '6',
+      };
+      const res = updateDependency(content, upgrade);
+      expect(res).toBeNull();
+    });
+  });
+});
diff --git a/test/workers/branch/get-updated.spec.js b/test/workers/branch/get-updated.spec.js
index 503c0bf8fa1cbfed6319b8a63eb1bcf87a17bcdb..72e3dfb7b31c9df889c21760f2ee93873b83db09 100644
--- a/test/workers/branch/get-updated.spec.js
+++ b/test/workers/branch/get-updated.spec.js
@@ -7,6 +7,9 @@ const {
 } = require('../../../lib/workers/branch/get-updated');
 const defaultConfig = require('../../../lib/config/defaults').getConfig();
 
+jest.mock('../../../lib/manager/composer');
+jest.mock('../../../lib/manager/npm');
+
 /** @type any */
 const platform = global.platform;
 
@@ -18,8 +21,6 @@ describe('workers/branch/get-updated', () => {
         ...defaultConfig,
         upgrades: [],
       };
-      composer.updateDependency = jest.fn();
-      composer.updateArtifacts = jest.fn();
       npm.updateDependency = jest.fn();
       platform.getFile.mockReturnValueOnce('existing content');
     });
diff --git a/test/workers/branch/lock-files/yarn.spec.js b/test/workers/branch/lock-files/yarn.spec.js
index 97dad7f1c21663e14fe76d8b3e632ec9948ec86d..77d0e1a6c7764e75c43865ba445ce75433568edd 100644
--- a/test/workers/branch/lock-files/yarn.spec.js
+++ b/test/workers/branch/lock-files/yarn.spec.js
@@ -24,6 +24,7 @@ describe('generateLockFile', () => {
   it('generates lock files', async () => {
     getInstalledPath.mockReturnValueOnce('node_modules/yarn');
     fs.readFile = jest.fn(() => 'package-lock-contents');
+    /** @type {NodeJS.ProcessEnv} */
     const env = {};
     const config = {
       postUpdateOptions: ['yarnDedupeFewer', 'yarnDedupeHighest'],
diff --git a/test/workers/repository/extract/manager-files.spec.js b/test/workers/repository/extract/manager-files.spec.js
index 259300fc657f913468a45f75b2b17eff6435cd2e..9246d56b47f137b3e01c6fb6df1cb3fcf13cd949 100644
--- a/test/workers/repository/extract/manager-files.spec.js
+++ b/test/workers/repository/extract/manager-files.spec.js
@@ -3,11 +3,13 @@ const {
 } = require('../../../../lib/workers/repository/extract/manager-files');
 /** @type any */
 const fileMatch = require('../../../../lib/workers/repository/extract/file-match');
+/** @type any */
 const npm = require('../../../../lib/manager/npm');
 /** @type any */
 const dockerfile = require('../../../../lib/manager/dockerfile');
 
 jest.mock('../../../../lib/workers/repository/extract/file-match');
+jest.mock('../../../../lib/manager/dockerfile');
 
 /** @type any */
 const platform = global.platform;
diff --git a/test/workers/repository/process/fetch.spec.js b/test/workers/repository/process/fetch.spec.js
index a722fb3a290eb82da4d82234899653e901c04e1b..056b2e8b8bdb523d4459fcba34d7b5c67fad6dab 100644
--- a/test/workers/repository/process/fetch.spec.js
+++ b/test/workers/repository/process/fetch.spec.js
@@ -1,10 +1,12 @@
-const {
-  fetchUpdates,
-} = require('../../../../lib/workers/repository/process/fetch');
+import { fetchUpdates } from '../../../../lib/workers/repository/process/fetch';
+import * as _npm from '../../../../lib/manager/npm';
+import { lookupUpdates as _lookupUpdates } from '../../../../lib/workers/repository/process/lookup';
 
-const npm = require('../../../../lib/manager/npm');
 /** @type any */
-const lookup = require('../../../../lib/workers/repository/process/lookup');
+const npm = _npm;
+
+/** @type any */
+const lookupUpdates = _lookupUpdates;
 
 jest.mock('../../../../lib/workers/repository/process/lookup');
 
@@ -73,7 +75,7 @@ describe('workers/repository/process/fetch', () => {
           },
         ],
       };
-      lookup.lookupUpdates.mockReturnValue(['a', 'b']);
+      lookupUpdates.mockReturnValue(['a', 'b']);
       npm.getPackageUpdates = jest.fn(() => ['a', 'b']);
       await fetchUpdates(config, packageFiles);
       expect(packageFiles).toMatchSnapshot();
diff --git a/yarn.lock b/yarn.lock
index c70dd10c93977dd92b4ed4cdd96abf7ce8e0b8ed..003d4f21708f9cedd16615a7e45c37888862e5da 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1100,6 +1100,11 @@
   dependencies:
     "@types/node" "*"
 
+"@types/chai@4.1.7":
+  version "4.1.7"
+  resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.7.tgz#1b8e33b61a8c09cbe1f85133071baa0dbf9fa71a"
+  integrity sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA==
+
 "@types/convert-hrtime@2.0.0":
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/@types/convert-hrtime/-/convert-hrtime-2.0.0.tgz#48d8215750e602a8ea439591c741cc927c116bb1"
@@ -1172,6 +1177,21 @@
   dependencies:
     "@types/jest-diff" "*"
 
+"@types/js-yaml@3.12.1":
+  version "3.12.1"
+  resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.1.tgz#5c6f4a1eabca84792fbd916f0cb40847f123c656"
+  integrity sha512-SGGAhXLHDx+PK4YLNcNGa6goPf9XRWQNAUUbffkwVGGXIxmDKWyGGL4inzq2sPmExu431Ekb9aEMn9BkPqEYFA==
+
+"@types/lodash@4.14.136":
+  version "4.14.136"
+  resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.136.tgz#413e85089046b865d960c9ff1d400e04c31ab60f"
+  integrity sha512-0GJhzBdvsW2RUccNHOBkabI8HZVdOXmXbXhuKlDEd5Vv12P7oAVGfomGp3Ne21o5D/qu1WmthlNKFaoZJJeErA==
+
+"@types/luxon@1.15.2":
+  version "1.15.2"
+  resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-1.15.2.tgz#528f11f7d6dc08cec0445d4bea8065a5bb6989b2"
+  integrity sha512-zHPoyVrLvNaiMRYdhmh88Rn489ZgAgbc6iLxR5Yi0VCNfeNYHcszbhJV2vDHLNrVGy35BPtWBRn4OP2F9BBvFw==
+
 "@types/minimatch@*":
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
@@ -1230,6 +1250,11 @@
   resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-2.3.5.tgz#9da44ed75571999b65c37b60c9b2b88db54c585d"
   integrity sha512-SCcK7mvGi3+ZNz833RRjFIxrn4gI1PPR3NtuIS+6vMkvmsGjosqTJwRt5bAEFLRz+wtJMWv8+uOnZf2hi2QXTg==
 
+"@types/xmldoc@1.1.4":
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/@types/xmldoc/-/xmldoc-1.1.4.tgz#5867d4e29739719c633bf16413c5a4a4c1c3c802"
+  integrity sha512-a/ONNCf9itbmzEz1ohx0Fv5TLJzXIPQTapxFu+DlYlDtn9UcAa1OhnrOOMwbU8125hFjrkJKL3qllD7vO5Bivw==
+
 "@types/yargs@^12.0.2", "@types/yargs@^12.0.9":
   version "12.0.12"
   resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-12.0.12.tgz#45dd1d0638e8c8f153e87d296907659296873916"