diff --git a/.eslintrc.js b/.eslintrc.js
index 20d43c8b5fac46a54e15cfb0aa11d32140f502e2..00db94b2f096dab80f04cbab8d9957426d4a3b0a 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -111,7 +111,7 @@ module.exports = {
   },
   overrides: [
     {
-      files: ['**/*.spec.ts'],
+      files: ['**/*.spec.ts', 'test/**'],
       env: {
         jest: true,
       },
@@ -125,6 +125,8 @@ module.exports = {
         '@typescript-eslint/no-object-literal-type-assertion': 0,
         '@typescript-eslint/explicit-function-return-type': 0,
         '@typescript-eslint/unbound-method': 0,
+
+        'jest/valid-title': [0, { ignoreTypeOfDescribeName: true }],
       },
     },
     {
diff --git a/lib/config/__snapshots__/migration.spec.ts.snap b/lib/config/__snapshots__/migration.spec.ts.snap
index e7467aa783e7aaf9a7e20ac560bd81ef7cf16cbf..0f201826dcdc541eb2d8ce50fba0866b088c92a6 100644
--- a/lib/config/__snapshots__/migration.spec.ts.snap
+++ b/lib/config/__snapshots__/migration.spec.ts.snap
@@ -6,7 +6,31 @@ Object {
 }
 `;
 
-exports[`config/migration migrateConfig(config, parentConfig) it migrates config 1`] = `
+exports[`config/migration migrateConfig(config, parentConfig) migrates before and after schedules 1`] = `
+Object {
+  "major": Object {
+    "schedule": Array [
+      "after 10pm",
+      "before 7am",
+    ],
+  },
+  "minor": Object {
+    "schedule": Array [
+      "after 10pm every weekday",
+      "before 7am every weekday",
+    ],
+  },
+}
+`;
+
+exports[`config/migration migrateConfig(config, parentConfig) migrates before and after schedules 2`] = `
+Array [
+  "after 10pm every weekday",
+  "before 7am every weekday",
+]
+`;
+
+exports[`config/migration migrateConfig(config, parentConfig) migrates config 1`] = `
 Object {
   "additionalBranchPrefix": "{{parentDir}}-",
   "autodiscover": true,
@@ -164,7 +188,7 @@ Object {
 }
 `;
 
-exports[`config/migration migrateConfig(config, parentConfig) it migrates more packageFiles 1`] = `
+exports[`config/migration migrateConfig(config, parentConfig) migrates more packageFiles 1`] = `
 Object {
   "includePaths": Array [
     "package.json",
@@ -192,7 +216,7 @@ Object {
 }
 `;
 
-exports[`config/migration migrateConfig(config, parentConfig) it migrates node to travis 1`] = `
+exports[`config/migration migrateConfig(config, parentConfig) migrates node to travis 1`] = `
 Object {
   "node": Object {
     "automerge": false,
@@ -206,7 +230,7 @@ Object {
 }
 `;
 
-exports[`config/migration migrateConfig(config, parentConfig) it migrates packageFiles 1`] = `
+exports[`config/migration migrateConfig(config, parentConfig) migrates packageFiles 1`] = `
 Object {
   "includePaths": Array [
     "package.json",
@@ -249,7 +273,7 @@ Object {
 }
 `;
 
-exports[`config/migration migrateConfig(config, parentConfig) it migrates packages 1`] = `
+exports[`config/migration migrateConfig(config, parentConfig) migrates packages 1`] = `
 Object {
   "packageRules": Array [
     Object {
@@ -260,7 +284,7 @@ Object {
 }
 `;
 
-exports[`config/migration migrateConfig(config, parentConfig) it migrates subconfig 1`] = `
+exports[`config/migration migrateConfig(config, parentConfig) migrates subconfig 1`] = `
 Object {
   "lockFileMaintenance": Object {
     "packageRules": Array [
@@ -275,7 +299,7 @@ Object {
 }
 `;
 
-exports[`config/migration migrateConfig(config, parentConfig) it overrides existing automerge setting 1`] = `
+exports[`config/migration migrateConfig(config, parentConfig) overrides existing automerge setting 1`] = `
 Object {
   "major": Object {
     "automerge": false,
@@ -300,7 +324,7 @@ Object {
 }
 `;
 
-exports[`config/migration migrateConfig(config, parentConfig) it removes invalid configs 1`] = `
+exports[`config/migration migrateConfig(config, parentConfig) removes invalid configs 1`] = `
 Object {
   "baseBranches": Array [],
   "commitMessage": "test",
@@ -311,27 +335,3 @@ Object {
   "rebaseWhen": "auto",
 }
 `;
-
-exports[`config/migration migrateConfig(config, parentConfig) migrates before and after schedules 1`] = `
-Object {
-  "major": Object {
-    "schedule": Array [
-      "after 10pm",
-      "before 7am",
-    ],
-  },
-  "minor": Object {
-    "schedule": Array [
-      "after 10pm every weekday",
-      "before 7am every weekday",
-    ],
-  },
-}
-`;
-
-exports[`config/migration migrateConfig(config, parentConfig) migrates before and after schedules 2`] = `
-Array [
-  "after 10pm every weekday",
-  "before 7am every weekday",
-]
-`;
diff --git a/lib/config/migration.spec.ts b/lib/config/migration.spec.ts
index b904f26f04a302cd8a2d3c0265af07f62d068e02..b81057b142c8dd7c10edf13cd416606964529634 100644
--- a/lib/config/migration.spec.ts
+++ b/lib/config/migration.spec.ts
@@ -11,7 +11,7 @@ interface RenovateConfig extends _RenovateConfig {
 
 describe('config/migration', () => {
   describe('migrateConfig(config, parentConfig)', () => {
-    it('it migrates config', () => {
+    it('migrates config', () => {
       const config: RenovateConfig = {
         endpoints: [{}] as never,
         enabled: true,
@@ -230,7 +230,7 @@ describe('config/migration', () => {
       expect(migratedConfig.schedule).toEqual(config.schedule);
       expect(isMigrated).toBe(false);
     });
-    it('it migrates packages', () => {
+    it('migrates packages', () => {
       const config = {
         packages: [
           {
@@ -247,7 +247,7 @@ describe('config/migration', () => {
       expect(isMigrated).toBe(true);
       expect(migratedConfig).toMatchSnapshot();
     });
-    it('it overrides existing automerge setting', () => {
+    it('overrides existing automerge setting', () => {
       const config: RenovateConfig = {
         automerge: 'minor' as never,
         packages: [
@@ -266,7 +266,7 @@ describe('config/migration', () => {
       expect(migratedConfig).toMatchSnapshot();
       expect(migratedConfig.packageRules[0].minor.automerge).toBe(false);
     });
-    it('it does not migrate config', () => {
+    it('does not migrate config', () => {
       const config: RenovateConfig = {
         enabled: true,
         semanticCommits: true,
@@ -278,7 +278,7 @@ describe('config/migration', () => {
       expect(isMigrated).toBe(false);
       expect(migratedConfig).toMatchObject(config);
     });
-    it('it migrates subconfig', () => {
+    it('migrates subconfig', () => {
       const config: RenovateConfig = {
         lockFileMaintenance: {
           depTypes: [
@@ -301,7 +301,7 @@ describe('config/migration', () => {
         migratedConfig.lockFileMaintenance.packageRules[0].respectLatest
       ).toBe(false);
     });
-    it('it migrates node to travis', () => {
+    it('migrates node to travis', () => {
       const config: RenovateConfig = {
         node: {
           enabled: true,
@@ -325,7 +325,7 @@ describe('config/migration', () => {
         (migratedConfig.node as RenovateConfig).supportPolicy
       ).toBeDefined();
     });
-    it('it migrates packageFiles', () => {
+    it('migrates packageFiles', () => {
       const config: RenovateConfig = {
         packageFiles: [
           'package.json',
@@ -350,7 +350,7 @@ describe('config/migration', () => {
       expect(migratedConfig.packageRules[0].rangeStrategy).toBe('replace');
       expect(migratedConfig.packageRules[1].rangeStrategy).toBe('pin');
     });
-    it('it migrates more packageFiles', () => {
+    it('migrates more packageFiles', () => {
       const config: RenovateConfig = {
         packageFiles: [
           {
@@ -379,7 +379,7 @@ describe('config/migration', () => {
       expect(migratedConfig.packageRules).toHaveLength(2);
     });
 
-    it('it removes invalid configs', () => {
+    it('removes invalid configs', () => {
       const config: RenovateConfig = {
         pathRules: {},
         packageFiles: [{ packageFile: 'test' }],
diff --git a/lib/datasource/go/index.ts b/lib/datasource/go/index.ts
index ac0ba1309693e3004dadbaa412859f68ea6d2c90..75348d3634914f97cde61991605843580c2011e5 100644
--- a/lib/datasource/go/index.ts
+++ b/lib/datasource/go/index.ts
@@ -8,6 +8,7 @@ import * as gitlab from '../gitlab-tags';
 export const id = 'go';
 
 const http = new Http(id);
+const gitlabRegExp = /^(https:\/\/[^/]*gitlab.[^/]*)\/(.*)$/;
 
 interface DataSource {
   datasource: string;
@@ -54,9 +55,8 @@ async function getDatasource(goModule: string): Promise<DataSource | null> {
           .replace(/\/$/, ''),
       };
     }
-    if (goSourceUrl?.match('^https://[^/]*gitlab.[^/]*/.+')) {
-      const gitlabRegExp = /^(https:\/\/[^/]*gitlab.[^/]*)\/(.*)$/;
-      const gitlabRes = gitlabRegExp.exec(goSourceUrl);
+    const gitlabRes = gitlabRegExp.exec(goSourceUrl);
+    if (gitlabRes) {
       return {
         datasource: gitlab.id,
         registryUrl: gitlabRes[1],
diff --git a/lib/datasource/jenkins-plugins/get.ts b/lib/datasource/jenkins-plugins/get.ts
index 8605e8b6248fbc2376186a04b7db871bbfdd0e4d..7d9b1a14651bb376e468eb7dfdaf447af471cea2 100644
--- a/lib/datasource/jenkins-plugins/get.ts
+++ b/lib/datasource/jenkins-plugins/get.ts
@@ -130,6 +130,7 @@ async function getJenkinsUpdateCenterResponse<T>(
 
 async function updateJenkinsPluginCache<T>(
   cache: JenkinsCache<JenkinsCacheTypes>,
+  // eslint-disable-next-line @typescript-eslint/no-shadow
   callback: (resp: T, cache: JenkinsCache<any>) => void
 ): Promise<void> {
   const response = await getJenkinsUpdateCenterResponse<T>(cache);
diff --git a/lib/logger/index.ts b/lib/logger/index.ts
index bdf75289e447bec62a70196a7586ff7e9bfa6ebc..58257e4ca179240690c2a2fdcdd8b7f9fa738582 100644
--- a/lib/logger/index.ts
+++ b/lib/logger/index.ts
@@ -9,7 +9,7 @@ import { RenovateStream } from './pretty-stdout';
 import { ErrorStream, withSanitizer } from './utils';
 
 let logContext: string = process.env.LOG_CONTEXT || shortid.generate();
-let meta = {};
+let curMeta = {};
 
 export interface LogError {
   level: bunyan.LogLevel;
@@ -61,13 +61,13 @@ const logFactory = (level: bunyan.LogLevelString): any => {
   return (p1: any, p2: any): void => {
     if (p2) {
       // meta and msg provided
-      bunyanLogger[level]({ logContext, ...meta, ...p1 }, p2);
+      bunyanLogger[level]({ logContext, ...curMeta, ...p1 }, p2);
     } else if (is.string(p1)) {
       // only message provided
-      bunyanLogger[level]({ logContext, ...meta }, p1);
+      bunyanLogger[level]({ logContext, ...curMeta }, p1);
     } else {
       // only meta provided
-      bunyanLogger[level]({ logContext, ...meta, ...p1 });
+      bunyanLogger[level]({ logContext, ...curMeta, ...p1 });
     }
   };
 };
@@ -112,19 +112,19 @@ export function getContext(): any {
 
 // setMeta overrides existing meta, may remove fields if no longer existing
 export function setMeta(obj: Record<string, unknown>): void {
-  meta = { ...obj };
+  curMeta = { ...obj };
 }
 
 // addMeta overrides or adds fields but does not remove any
 export function addMeta(obj: Record<string, unknown>): void {
-  meta = { ...meta, ...obj };
+  curMeta = { ...curMeta, ...obj };
 }
 
 // removeMeta removes the provided fields from meta
 export function removeMeta(fields: string[]): void {
-  Object.keys(meta).forEach((key) => {
+  Object.keys(curMeta).forEach((key) => {
     if (fields.includes(key)) {
-      delete meta[key];
+      delete curMeta[key];
     }
   });
 }
diff --git a/lib/manager/kustomize/extract.spec.ts b/lib/manager/kustomize/extract.spec.ts
index b826040bd3eb044ed7a637adea94ce1255a9a2a7..24b1131f05428f33b6a5e05ba26c3e6b2ec0fbff 100644
--- a/lib/manager/kustomize/extract.spec.ts
+++ b/lib/manager/kustomize/extract.spec.ts
@@ -59,7 +59,7 @@ describe('manager/kustomize/extract', () => {
     expect(file).toBeNull();
   });
   describe('extractBase', () => {
-    it('should return null for a local base ', () => {
+    it('should return null for a local base', () => {
       const res = extractBase('./service-1');
       expect(res).toBeNull();
     });
diff --git a/lib/manager/nuget/extract.ts b/lib/manager/nuget/extract.ts
index 1273ec1cc4c61fe58ba0c38f52ebbbc89511a7c9..3f087d2fe23b1f489907db260b375b0995ab057d 100644
--- a/lib/manager/nuget/extract.ts
+++ b/lib/manager/nuget/extract.ts
@@ -104,8 +104,8 @@ function extractDepsFromXml(xmlNode: XmlDocument): PackageDependency[] {
         child.valueWithPath('Version') ||
         attr?.VersionOverride ||
         child.valueWithPath('VersionOverride');
-      const currentValue = version
-        ?.match(checkVersion)
+      const currentValue = checkVersion
+        ?.exec(version)
         ?.groups?.currentValue?.trim();
       if (depName && currentValue) {
         results.push({
diff --git a/lib/manager/poetry/extract.ts b/lib/manager/poetry/extract.ts
index 123abf719c20cf5822bd95ac61f4216fe37a6f65..917fd5285a1e49d25bf29a6b6276d5d7f4d9ab57 100644
--- a/lib/manager/poetry/extract.ts
+++ b/lib/manager/poetry/extract.ts
@@ -121,8 +121,8 @@ export function extractPackageFile(
     compatibility.poetry = pyprojectfile['build-system']?.requires.join(' ');
   }
 
-  if (is.nonEmptyString(pyprojectfile.tool?.poetry?.['dependencies']?.python)) {
-    compatibility.python = pyprojectfile.tool?.poetry?.['dependencies']?.python;
+  if (is.nonEmptyString(pyprojectfile.tool?.poetry?.dependencies?.python)) {
+    compatibility.python = pyprojectfile.tool?.poetry?.dependencies?.python;
   }
 
   return {
diff --git a/lib/manager/travis/__snapshots__/update.spec.ts.snap b/lib/manager/travis/__snapshots__/update.spec.ts.snap
index 195389bb7382f10837b14e95a88bee96b9c82fc2..f27b320ee151d41d7b5224d0a59785511679fe6a 100644
--- a/lib/manager/travis/__snapshots__/update.spec.ts.snap
+++ b/lib/manager/travis/__snapshots__/update.spec.ts.snap
@@ -2,13 +2,6 @@
 
 exports[`manager/travis/update updateDependency falls back to 2 spaces 1`] = `"hello: world"`;
 
-exports[`manager/travis/update updateDependency it uses double quotes 1`] = `
-"node_js:
-  - \\"6\\"
-  - \\"8\\"
-"
-`;
-
 exports[`manager/travis/update updateDependency updates values 1`] = `
 "dist: trusty
 language: node_js
@@ -32,3 +25,10 @@ notifications:
     on_success: never
 "
 `;
+
+exports[`manager/travis/update updateDependency uses double quotes 1`] = `
+"node_js:
+  - \\"6\\"
+  - \\"8\\"
+"
+`;
diff --git a/lib/manager/travis/update.spec.ts b/lib/manager/travis/update.spec.ts
index 8e91d243c822ed5734b92dac7daf90af9555c0d6..61ac24099d87c558b2a9ee847663b817ed8567fc 100644
--- a/lib/manager/travis/update.spec.ts
+++ b/lib/manager/travis/update.spec.ts
@@ -30,7 +30,7 @@ describe('manager/travis/update', () => {
       });
       expect(res).toMatchSnapshot();
     });
-    it('it uses double quotes', () => {
+    it('uses double quotes', () => {
       // TODO: should be `Upgrade`
       const upgrade: any = {
         currentValue: ['6'],
diff --git a/lib/platform/gitea/index.spec.ts b/lib/platform/gitea/index.spec.ts
index 7ef78ebc29dbcd97a290a51e6156bdd589db3044..bb80df56c22efafd66ee389553ade4b9af69dde3 100644
--- a/lib/platform/gitea/index.spec.ts
+++ b/lib/platform/gitea/index.spec.ts
@@ -1013,6 +1013,7 @@ describe('platform/gitea', () => {
       expect(helper.closeIssue).toHaveBeenCalledTimes(duplicates.length - 1);
       for (const issue of duplicates) {
         if (issue.number !== firstDuplicate.number) {
+          // eslint-disable-next-line jest/no-conditional-expect
           expect(helper.closeIssue).toHaveBeenCalledWith(
             mockRepo.full_name,
             issue.number
diff --git a/lib/versioning/docker/index.spec.ts b/lib/versioning/docker/index.spec.ts
index c8d55cd16b8c476754731a37fecc399137adf193..b2427778f94362d7ca8c33f9278aabb2c9f379ca 100644
--- a/lib/versioning/docker/index.spec.ts
+++ b/lib/versioning/docker/index.spec.ts
@@ -11,7 +11,7 @@ describe('docker.', () => {
       expect(docker.isValid('3')).toBe('3');
       expect(docker.isValid('foo')).toBeNull();
     });
-    it('it should return null if the version string looks like a git commit hash', () => {
+    it('should return null if the version string looks like a git commit hash', () => {
       [
         '0a1b2c3',
         '0a1b2c3d',
diff --git a/lib/versioning/loose/index.spec.ts b/lib/versioning/loose/index.spec.ts
index a5585f60d0e0d3f2437493136e23df1777239798..f75c2df566e122235a02abf33864919ae6853194 100644
--- a/lib/versioning/loose/index.spec.ts
+++ b/lib/versioning/loose/index.spec.ts
@@ -9,7 +9,7 @@ describe('loose.', () => {
     });
   });
   describe('isValid(version)', () => {
-    it('it must support varied precision, from 1 to 6 sections', () => {
+    it('must support varied precision, from 1 to 6 sections', () => {
       [
         'v1.4',
         '3.5.0',
@@ -29,7 +29,7 @@ describe('loose.', () => {
         expect(loose.isValid(version)).toBeNull();
       });
     });
-    it('it should return null if the version string looks like a git commit hash', () => {
+    it('should return null if the version string looks like a git commit hash', () => {
       [
         '0a1b2c3',
         '0a1b2c3d',
@@ -49,7 +49,7 @@ describe('loose.', () => {
     });
   });
   describe('isGreaterThan(version)', () => {
-    it('it should compare using release number than suffix', () => {
+    it('should compare using release number than suffix', () => {
       expect(loose.isGreaterThan('2.4.0', '2.4')).toBe(true);
       expect(loose.isGreaterThan('2.4.2', '2.4.1')).toBe(true);
       expect(loose.isGreaterThan('2.4.beta', '2.4.alpha')).toBe(true);
diff --git a/lib/versioning/maven/index.spec.ts b/lib/versioning/maven/index.spec.ts
index b401c53588542b36f482a0e382303e859d0bedaa..e10acd65474444dddd928c02fb43db641c6d929c 100644
--- a/lib/versioning/maven/index.spec.ts
+++ b/lib/versioning/maven/index.spec.ts
@@ -235,8 +235,10 @@ describe('versioning/maven/compare', () => {
       const fullRange = parseRange(rangeStr);
       expect(presetValue).toEqual(fullRange);
       if (fullRange === null) {
+        // eslint-disable-next-line jest/no-conditional-expect
         expect(presetValue).toBeNull();
       } else {
+        // eslint-disable-next-line jest/no-conditional-expect
         expect(rangeToStr(fullRange)).toEqual(rangeStr);
       }
     });
diff --git a/lib/versioning/versioning-metadata.spec.ts b/lib/versioning/versioning-metadata.spec.ts
index 0d2aea55c49d8d6d59cbeda5ae69b659a6cf9738..38d0b26e735d57841c319e4473cfea1dca655208 100644
--- a/lib/versioning/versioning-metadata.spec.ts
+++ b/lib/versioning/versioning-metadata.spec.ts
@@ -16,6 +16,7 @@ describe('versioning metadata', () => {
         // ignore missing file
       }
       if (readme) {
+        // eslint-disable-next-line jest/no-conditional-expect
         expect(RegExp(/(^|\n)#+ /).exec(readme)).toBeNull();
       }
     }
@@ -32,6 +33,7 @@ describe('versioning metadata', () => {
       expect(versioningObj.urls).toBeDefined();
       expect(versioningObj.supportsRanges).toBeDefined();
       if (versioningObj.supportsRanges === true) {
+        // eslint-disable-next-line jest/no-conditional-expect
         expect(versioningObj.supportedRangeStrategies).toBeDefined();
       }
     }
diff --git a/lib/workers/repository/dependency-dashboard.spec.ts b/lib/workers/repository/dependency-dashboard.spec.ts
index a14d71e874c117990c3c2b84a0e308ea6e5f7acd..08d2045db69e3df0cd378b5570371feb9a2ad545 100644
--- a/lib/workers/repository/dependency-dashboard.spec.ts
+++ b/lib/workers/repository/dependency-dashboard.spec.ts
@@ -24,7 +24,7 @@ beforeEach(() => {
 
 async function dryRun(
   branches: BranchConfig[],
-  // eslint-disable-next-line no-shadow
+  // eslint-disable-next-line @typescript-eslint/no-shadow
   platform: jest.Mocked<Platform>,
   ensureIssueClosingCalls = 0,
   ensureIssueCalls = 0,
diff --git a/package.json b/package.json
index 4fd7c1c03c24a06b4c0ff83b0beab32f63af66dd..a08934540d161e5586bd1eb94b332acc80605b02 100644
--- a/package.json
+++ b/package.json
@@ -219,18 +219,18 @@
     "@types/shelljs": "0.8.8",
     "@types/traverse": "0.6.32",
     "@types/xmldoc": "1.1.4",
-    "@typescript-eslint/eslint-plugin": "3.10.1",
-    "@typescript-eslint/parser": "3.10.1",
+    "@typescript-eslint/eslint-plugin": "4.0.1",
+    "@typescript-eslint/parser": "4.0.1",
     "aws-sdk-mock": "5.1.0",
     "babel-jest": "26.3.0",
     "babel-plugin-dynamic-import-node": "2.3.3",
     "conventional-changelog-conventionalcommits": "4.4.0",
     "cross-env": "7.0.2",
     "eslint": "7.8.1",
-    "eslint-config-airbnb-typescript": "8.0.2",
+    "eslint-config-airbnb-typescript": "10.0.0",
     "eslint-config-prettier": "6.11.0",
     "eslint-plugin-import": "2.22.0",
-    "eslint-plugin-jest": "23.20.0",
+    "eslint-plugin-jest": "24.0.0",
     "eslint-plugin-promise": "4.2.1",
     "glob": "7.1.6",
     "graphql": "15.3.0",
diff --git a/test/globals.ts b/test/globals.ts
index d8c3db8ff91a22fb159a127b8e86d53570f224a9..93060e0c7984fa4e0053db138d69db87faf298c5 100644
--- a/test/globals.ts
+++ b/test/globals.ts
@@ -2,7 +2,7 @@ import nock from 'nock';
 import 'jest-extended';
 
 jest.mock('../lib/platform', () => ({
-  platform: jest.genMockFromModule('../lib/platform/github'),
+  platform: jest.createMockFromModule('../lib/platform/github'),
   initPlatform: jest.fn(),
   getPlatformList: jest.fn(),
 }));
diff --git a/test/static-files.spec.ts b/test/static-files.spec.ts
index 3a9d945fbab41e2f30c5086ea0d3e74e12bbc465..c8db196f31ff238d366b9a1a9b81ef339da64325 100644
--- a/test/static-files.spec.ts
+++ b/test/static-files.spec.ts
@@ -21,6 +21,9 @@ async function getFiles(dir: string): Promise<string[]> {
 }
 
 describe('static-files', () => {
+  // workaround for github macos
+  jest.setTimeout(10 * 1000);
+
   it('has same static files in lib and dist', async () => {
     expect(await getFiles('dist')).toEqual(await getFiles('lib'));
   });
diff --git a/yarn.lock b/yarn.lock
index 456423cf99c95e88d51a8f69f96cd1e15e9afbe9..f6660a24bbc03c135965c474d77a08f958c71c74 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1572,11 +1572,6 @@
   resolved "https://registry.yarnpkg.com/@types/emscripten/-/emscripten-1.39.4.tgz#d61990c0cee72c4e475de737a140b51fe925a2c8"
   integrity sha512-k3LLVMFrdNA9UCvMDPWMbFrGPNb+GcPyw29ktJTo1RCN7RmxFG5XzPZcPKRlnLuLT/FRm8wp4ohvDwNY7GlROQ==
 
-"@types/eslint-visitor-keys@^1.0.0":
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d"
-  integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==
-
 "@types/eslint@7.2.2":
   version "7.2.2"
   resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.2.tgz#c88426b896efeb0b2732a92431ce8aa7ec0dee61"
@@ -1882,88 +1877,75 @@
   dependencies:
     "@types/yargs-parser" "*"
 
-"@typescript-eslint/eslint-plugin@3.10.1":
-  version "3.10.1"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.10.1.tgz#7e061338a1383f59edc204c605899f93dc2e2c8f"
-  integrity sha512-PQg0emRtzZFWq6PxBcdxRH3QIQiyFO3WCVpRL3fgj5oQS3CDs3AeAKfv4DxNhzn8ITdNJGJ4D3Qw8eAJf3lXeQ==
+"@typescript-eslint/eslint-plugin@4.0.1":
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.0.1.tgz#88bde9239e29d688315718552cf80a3490491017"
+  integrity sha512-pQZtXupCn11O4AwpYVUX4PDFfmIJl90ZgrEBg0CEcqlwvPiG0uY81fimr1oMFblZnpKAq6prrT9a59pj1x58rw==
   dependencies:
-    "@typescript-eslint/experimental-utils" "3.10.1"
+    "@typescript-eslint/experimental-utils" "4.0.1"
+    "@typescript-eslint/scope-manager" "4.0.1"
     debug "^4.1.1"
     functional-red-black-tree "^1.0.1"
     regexpp "^3.0.0"
     semver "^7.3.2"
     tsutils "^3.17.1"
 
-"@typescript-eslint/experimental-utils@3.10.1":
-  version "3.10.1"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz#e179ffc81a80ebcae2ea04e0332f8b251345a686"
-  integrity sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==
+"@typescript-eslint/experimental-utils@4.0.1", "@typescript-eslint/experimental-utils@^4.0.1":
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.0.1.tgz#7d9a3ab6821ad5274dad2186c1aa0d93afd696eb"
+  integrity sha512-gAqOjLiHoED79iYTt3F4uSHrYmg/GPz/zGezdB0jAdr6S6gwNiR/j7cTZ8nREKVzMVKLd9G3xbg1sV9GClW3sw==
   dependencies:
     "@types/json-schema" "^7.0.3"
-    "@typescript-eslint/types" "3.10.1"
-    "@typescript-eslint/typescript-estree" "3.10.1"
+    "@typescript-eslint/scope-manager" "4.0.1"
+    "@typescript-eslint/types" "4.0.1"
+    "@typescript-eslint/typescript-estree" "4.0.1"
     eslint-scope "^5.0.0"
     eslint-utils "^2.0.0"
 
-"@typescript-eslint/experimental-utils@^2.5.0":
-  version "2.34.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f"
-  integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==
+"@typescript-eslint/parser@4.0.1", "@typescript-eslint/parser@^4.0.1":
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.0.1.tgz#73772080db7a7a4534a35d719e006f503e664dc3"
+  integrity sha512-1+qLmXHNAWSQ7RB6fdSQszAiA7JTwzakj5cNYjBTUmpH2cqilxMZEIV+DRKjVZs8NzP3ALmKexB0w/ExjcK9Iw==
   dependencies:
-    "@types/json-schema" "^7.0.3"
-    "@typescript-eslint/typescript-estree" "2.34.0"
-    eslint-scope "^5.0.0"
-    eslint-utils "^2.0.0"
+    "@typescript-eslint/scope-manager" "4.0.1"
+    "@typescript-eslint/types" "4.0.1"
+    "@typescript-eslint/typescript-estree" "4.0.1"
+    debug "^4.1.1"
 
-"@typescript-eslint/parser@3.10.1", "@typescript-eslint/parser@^3.1.0":
-  version "3.10.1"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.10.1.tgz#1883858e83e8b442627e1ac6f408925211155467"
-  integrity sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw==
+"@typescript-eslint/scope-manager@4.0.1":
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.0.1.tgz#24d93c3000bdfcc5a157dc4d32b742405a8631b5"
+  integrity sha512-u3YEXVJ8jsj7QCJk3om0Y457fy2euEOkkzxIB/LKU3MdyI+FJ2gI0M4aKEaXzwCSfNDiZ13a3lDo5DVozc+XLQ==
   dependencies:
-    "@types/eslint-visitor-keys" "^1.0.0"
-    "@typescript-eslint/experimental-utils" "3.10.1"
-    "@typescript-eslint/types" "3.10.1"
-    "@typescript-eslint/typescript-estree" "3.10.1"
-    eslint-visitor-keys "^1.1.0"
+    "@typescript-eslint/types" "4.0.1"
+    "@typescript-eslint/visitor-keys" "4.0.1"
 
-"@typescript-eslint/types@3.10.1":
-  version "3.10.1"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727"
-  integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==
-
-"@typescript-eslint/typescript-estree@2.34.0":
-  version "2.34.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5"
-  integrity sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==
-  dependencies:
-    debug "^4.1.1"
-    eslint-visitor-keys "^1.1.0"
-    glob "^7.1.6"
-    is-glob "^4.0.1"
-    lodash "^4.17.15"
-    semver "^7.3.2"
-    tsutils "^3.17.1"
+"@typescript-eslint/types@4.0.1":
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.0.1.tgz#1cf72582f764931f085cb8230ff215980fe467b2"
+  integrity sha512-S+gD3fgbkZYW2rnbjugNMqibm9HpEjqZBZkTiI3PwbbNGWmAcxolWIUwZ0SKeG4Dy2ktpKKaI/6+HGYVH8Qrlg==
 
-"@typescript-eslint/typescript-estree@3.10.1":
-  version "3.10.1"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853"
-  integrity sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==
+"@typescript-eslint/typescript-estree@4.0.1":
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.0.1.tgz#29a43c7060641ec51c902d9f50ac7c5866ec479f"
+  integrity sha512-zGzleORFXrRWRJAMLTB2iJD1IZbCPkg4hsI8mGdpYlKaqzvKYSEWVAYh14eauaR+qIoZVWrXgYSXqLtTlxotiw==
   dependencies:
-    "@typescript-eslint/types" "3.10.1"
-    "@typescript-eslint/visitor-keys" "3.10.1"
+    "@typescript-eslint/types" "4.0.1"
+    "@typescript-eslint/visitor-keys" "4.0.1"
     debug "^4.1.1"
-    glob "^7.1.6"
+    globby "^11.0.1"
     is-glob "^4.0.1"
     lodash "^4.17.15"
     semver "^7.3.2"
     tsutils "^3.17.1"
 
-"@typescript-eslint/visitor-keys@3.10.1":
-  version "3.10.1"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931"
-  integrity sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==
+"@typescript-eslint/visitor-keys@4.0.1":
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.0.1.tgz#d4e8de62775f2a6db71c7e8539633680039fdd6c"
+  integrity sha512-yBSqd6FjnTzbg5RUy9J+9kJEyQjTI34JdGMJz+9ttlJzLCnGkBikxw+N5n2VDcc3CesbIEJ0MnZc5uRYnrEnCw==
   dependencies:
-    eslint-visitor-keys "^1.1.0"
+    "@typescript-eslint/types" "4.0.1"
+    eslint-visitor-keys "^2.0.0"
 
 "@yarnpkg/core@2.2.2":
   version "2.2.2"
@@ -3890,7 +3872,7 @@ escodegen@^1.14.1:
   optionalDependencies:
     source-map "~0.6.1"
 
-eslint-config-airbnb-base@^14.1.0, eslint-config-airbnb-base@^14.2.0:
+eslint-config-airbnb-base@^14.2.0:
   version "14.2.0"
   resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz#fe89c24b3f9dc8008c9c0d0d88c28f95ed65e9c4"
   integrity sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q==
@@ -3899,16 +3881,16 @@ eslint-config-airbnb-base@^14.1.0, eslint-config-airbnb-base@^14.2.0:
     object.assign "^4.1.0"
     object.entries "^1.1.2"
 
-eslint-config-airbnb-typescript@8.0.2:
-  version "8.0.2"
-  resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-8.0.2.tgz#465b17b0b1facdcca4fe23a5426bc27ab7b2b2f2"
-  integrity sha512-TCOftyCoIogJzzLGSg0Qlxd27qvf+1a3MHyN/PqynTqINS4iFy+SlXy/CrAN+6xkleGMSrvmPbm3pyFEku2+IQ==
+eslint-config-airbnb-typescript@10.0.0:
+  version "10.0.0"
+  resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-10.0.0.tgz#fb0b307de31ce9465d706e987590da0f0f594f81"
+  integrity sha512-me2QQj+MUc9+vsr44ZMgGdI2f7Brd7dWTl/+ly9r5RFsoSPkwzV/N4tTg5ZOrtA4Ay18urKPKmwLGe9TTIDxnw==
   dependencies:
-    "@typescript-eslint/parser" "^3.1.0"
-    eslint-config-airbnb "^18.1.0"
-    eslint-config-airbnb-base "^14.1.0"
+    "@typescript-eslint/parser" "^4.0.1"
+    eslint-config-airbnb "^18.2.0"
+    eslint-config-airbnb-base "^14.2.0"
 
-eslint-config-airbnb@^18.1.0:
+eslint-config-airbnb@^18.2.0:
   version "18.2.0"
   resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-18.2.0.tgz#8a82168713effce8fc08e10896a63f1235499dcd"
   integrity sha512-Fz4JIUKkrhO0du2cg5opdyPKQXOI2MvF8KUvN2710nJMT6jaRUpRE2swrJftAjVGL7T1otLM5ieo5RqS1v9Udg==
@@ -3959,12 +3941,12 @@ eslint-plugin-import@2.22.0:
     resolve "^1.17.0"
     tsconfig-paths "^3.9.0"
 
-eslint-plugin-jest@23.20.0:
-  version "23.20.0"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.20.0.tgz#e1d69c75f639e99d836642453c4e75ed22da4099"
-  integrity sha512-+6BGQt85OREevBDWCvhqj1yYA4+BFK4XnRZSGJionuEYmcglMZYLNNBBemwzbqUAckURaHdJSBcjHPyrtypZOw==
+eslint-plugin-jest@24.0.0:
+  version "24.0.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.0.0.tgz#6b1c460c529104c7d16d889e76fe708b281c4d14"
+  integrity sha512-a0G7hSDbuBCW4PNT6MVpAyfnGbUDOqxzOyhR6wT2BIBnR7MhvfAqd6KKfsTjX+Z3gxzIHiEsihzdClU4cSc6qQ==
   dependencies:
-    "@typescript-eslint/experimental-utils" "^2.5.0"
+    "@typescript-eslint/experimental-utils" "^4.0.1"
 
 eslint-plugin-promise@4.2.1:
   version "4.2.1"
@@ -3991,6 +3973,11 @@ eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0:
   resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
   integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
 
+eslint-visitor-keys@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8"
+  integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
+
 eslint@7.8.1:
   version "7.8.1"
   resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.8.1.tgz#e59de3573fb6a5be8ff526c791571646d124a8fa"