diff --git a/jest.config.ts b/jest.config.ts
index 6459ff6288ae05233a4da78947bf6f2faa001529..eef19f6292db38edf76e7999321117703add5c0d 100644
--- a/jest.config.ts
+++ b/jest.config.ts
@@ -26,7 +26,11 @@ const config: InitialOptionsTsJest = {
   },
   modulePathIgnorePatterns: ['<rootDir>/dist/', '/__fixtures__/'],
   reporters: ci ? ['default', 'jest-github-actions-reporter'] : ['default'],
-  setupFilesAfterEnv: ['jest-extended', '<rootDir>/test/setup.ts'],
+  setupFilesAfterEnv: [
+    'jest-extended',
+    'expect-more-jest',
+    '<rootDir>/test/setup.ts',
+  ],
   snapshotSerializers: ['<rootDir>/test/newline-snapshot-serializer.ts'],
   testEnvironment: 'node',
   testRunner: 'jest-circus/runner',
diff --git a/lib/config/massage.spec.ts b/lib/config/massage.spec.ts
index 3b1c7b2a777db59260b30f62e56c16de42921b44..ad95cb40417b53e66229b055dfbcbc633e37dff9 100644
--- a/lib/config/massage.spec.ts
+++ b/lib/config/massage.spec.ts
@@ -13,7 +13,7 @@ describe('config/massage', () => {
         schedule: 'before 5am' as never,
       };
       const res = massage.massageConfig(config);
-      expect(Array.isArray(res.schedule)).toBe(true);
+      expect(Array.isArray(res.schedule)).toBeTrue();
     });
     it('massages npmToken', () => {
       const config: RenovateConfig = {
diff --git a/lib/config/migration.spec.ts b/lib/config/migration.spec.ts
index 198addc4a4d8a860cbb824885c97a87e3924a5dd..f0bbd8a9fead6cd4a54c38a984638acafd48e17a 100644
--- a/lib/config/migration.spec.ts
+++ b/lib/config/migration.spec.ts
@@ -163,7 +163,7 @@ describe('config/migration', () => {
         parentConfig
       );
       expect(migratedConfig).toMatchSnapshot();
-      expect(isMigrated).toBe(true);
+      expect(isMigrated).toBeTrue();
       expect(migratedConfig.depTypes).not.toBeDefined();
       expect(migratedConfig.automerge).toEqual(false);
       expect(migratedConfig.packageRules).toHaveLength(9);
@@ -184,7 +184,7 @@ describe('config/migration', () => {
         parentConfig
       );
       expect(migratedConfig).toMatchSnapshot();
-      expect(isMigrated).toBe(true);
+      expect(isMigrated).toBeTrue();
       expect(migratedConfig.major.schedule).toHaveLength(2);
       expect(migratedConfig.major.schedule[0]).toEqual('after 10pm');
       expect(migratedConfig.major.schedule[1]).toEqual('before 7am');
@@ -206,7 +206,7 @@ describe('config/migration', () => {
         config,
         parentConfig
       );
-      expect(isMigrated).toBe(true);
+      expect(isMigrated).toBeTrue();
       expect(migratedConfig.schedule).toEqual('on friday');
     });
     it('migrates semantic prefix with no scope', () => {
@@ -218,7 +218,7 @@ describe('config/migration', () => {
         config,
         parentConfig
       );
-      expect(isMigrated).toBe(true);
+      expect(isMigrated).toBeTrue();
       expect(migratedConfig.semanticCommitScope).toBeNull();
     });
     it('does not migrate every weekday', () => {
@@ -230,7 +230,7 @@ describe('config/migration', () => {
         config,
         parentConfig
       );
-      expect(isMigrated).toBe(false);
+      expect(isMigrated).toBeFalse();
       expect(migratedConfig.schedule).toEqual(config.schedule);
     });
     it('does not migrate multi days', () => {
@@ -243,7 +243,7 @@ describe('config/migration', () => {
         parentConfig
       );
       expect(migratedConfig).toMatchSnapshot();
-      expect(isMigrated).toBe(false);
+      expect(isMigrated).toBeFalse();
       expect(migratedConfig.schedule).toEqual(config.schedule);
     });
     it('does not migrate hour range', () => {
@@ -256,7 +256,7 @@ describe('config/migration', () => {
         parentConfig
       );
       expect(migratedConfig.schedule).toEqual(config.schedule);
-      expect(isMigrated).toBe(false);
+      expect(isMigrated).toBeFalse();
     });
     it('migrates packages', () => {
       const config = {
@@ -272,7 +272,7 @@ describe('config/migration', () => {
         config,
         parentConfig
       );
-      expect(isMigrated).toBe(true);
+      expect(isMigrated).toBeTrue();
       expect(migratedConfig).toEqual({
         packageRules: [
           {
@@ -297,9 +297,9 @@ describe('config/migration', () => {
         config,
         parentConfig
       );
-      expect(isMigrated).toBe(true);
+      expect(isMigrated).toBeTrue();
       expect(migratedConfig).toMatchSnapshot();
-      expect(migratedConfig.packageRules[0].minor.automerge).toBe(false);
+      expect(migratedConfig.packageRules[0].minor.automerge).toBeFalse();
     });
     it('does not migrate config', () => {
       const config: TestRenovateConfig = {
@@ -308,7 +308,7 @@ describe('config/migration', () => {
       };
       const { isMigrated, migratedConfig } =
         configMigration.migrateConfig(config);
-      expect(isMigrated).toBe(false);
+      expect(isMigrated).toBeFalse();
       expect(migratedConfig).toMatchObject(config);
     });
     it('migrates subconfig', () => {
@@ -327,12 +327,12 @@ describe('config/migration', () => {
         config,
         defaultConfig
       );
-      expect(isMigrated).toBe(true);
+      expect(isMigrated).toBeTrue();
       expect(migratedConfig).toMatchSnapshot();
       expect(migratedConfig.lockFileMaintenance.packageRules).toHaveLength(1);
       expect(
         migratedConfig.lockFileMaintenance.packageRules[0].respectLatest
-      ).toBe(false);
+      ).toBeFalse();
     });
 
     it('migrates packageRules objects', () => {
@@ -348,7 +348,7 @@ describe('config/migration', () => {
         config,
         defaultConfig
       );
-      expect(isMigrated).toBe(true);
+      expect(isMigrated).toBeTrue();
       expect(migratedConfig).toMatchSnapshot();
       expect(migratedConfig.packageRules).toHaveLength(1);
     });
@@ -364,7 +364,7 @@ describe('config/migration', () => {
         defaultConfig
       );
       expect(migratedConfig).toMatchSnapshot();
-      expect(isMigrated).toBe(true);
+      expect(isMigrated).toBeTrue();
       expect(
         (migratedConfig.node as RenovateSharedConfig).enabled
       ).toBeUndefined();
@@ -390,7 +390,7 @@ describe('config/migration', () => {
         defaultConfig
       );
       expect(migratedConfig).toMatchSnapshot();
-      expect(isMigrated).toBe(true);
+      expect(isMigrated).toBeTrue();
       expect(migratedConfig.includePaths).toHaveLength(4);
       expect(migratedConfig.packageFiles).toBeUndefined();
       expect(migratedConfig.packageRules).toHaveLength(4);
@@ -420,7 +420,7 @@ describe('config/migration', () => {
         defaultConfig
       );
       expect(migratedConfig).toMatchSnapshot();
-      expect(isMigrated).toBe(true);
+      expect(isMigrated).toBeTrue();
       expect(migratedConfig.includePaths).toHaveLength(1);
       expect(migratedConfig.packageFiles).toBeUndefined();
       expect(migratedConfig.packageRules).toHaveLength(2);
@@ -454,7 +454,7 @@ describe('config/migration', () => {
         includePaths: ['test'],
         rebaseWhen: 'auto',
       });
-      expect(isMigrated).toBe(true);
+      expect(isMigrated).toBeTrue();
     });
     it('it migrates semanticCommits', () => {
       let config: TestRenovateConfig;
@@ -462,27 +462,27 @@ describe('config/migration', () => {
 
       config = { semanticCommits: true as never };
       res = configMigration.migrateConfig(config);
-      expect(res.isMigrated).toBe(true);
+      expect(res.isMigrated).toBeTrue();
       expect(res.migratedConfig).toMatchObject({ semanticCommits: 'enabled' });
 
       config = { semanticCommits: false as never };
       res = configMigration.migrateConfig(config);
-      expect(res.isMigrated).toBe(true);
+      expect(res.isMigrated).toBeTrue();
       expect(res.migratedConfig).toMatchObject({ semanticCommits: 'disabled' });
 
       config = { semanticCommits: null as never };
       res = configMigration.migrateConfig(config);
-      expect(res.isMigrated).toBe(true);
+      expect(res.isMigrated).toBeTrue();
       expect(res.migratedConfig).toMatchObject({ semanticCommits: 'auto' });
 
       config = { semanticCommits: 'enabled' };
       res = configMigration.migrateConfig(config);
-      expect(res.isMigrated).toBe(false);
+      expect(res.isMigrated).toBeFalse();
       expect(res.migratedConfig).toMatchObject({ semanticCommits: 'enabled' });
 
       config = { semanticCommits: 'disabled' };
       res = configMigration.migrateConfig(config);
-      expect(res.isMigrated).toBe(false);
+      expect(res.isMigrated).toBeFalse();
       expect(res.migratedConfig).toMatchObject({ semanticCommits: 'disabled' });
     });
 
@@ -492,17 +492,17 @@ describe('config/migration', () => {
 
       config = { extends: ':js-app' } as never;
       res = configMigration.migrateConfig(config);
-      expect(res.isMigrated).toBe(true);
+      expect(res.isMigrated).toBeTrue();
       expect(res.migratedConfig).toMatchObject({ extends: ['config:js-app'] });
 
       config = { extends: 'foo' } as never;
       res = configMigration.migrateConfig(config);
-      expect(res.isMigrated).toBe(true);
+      expect(res.isMigrated).toBeTrue();
       expect(res.migratedConfig).toMatchObject({ extends: ['foo'] });
 
       config = { extends: ['foo', ':js-app', 'bar'] } as never;
       res = configMigration.migrateConfig(config);
-      expect(res.isMigrated).toBe(true);
+      expect(res.isMigrated).toBeTrue();
       expect(res.migratedConfig).toMatchObject({
         extends: ['foo', 'config:js-app', 'bar'],
       });
@@ -514,28 +514,28 @@ describe('config/migration', () => {
 
       config = { unpublishSafe: true };
       res = configMigration.migrateConfig(config);
-      expect(res.isMigrated).toBe(true);
+      expect(res.isMigrated).toBeTrue();
       expect(res.migratedConfig).toMatchObject({
         extends: ['npm:unpublishSafe'],
       });
 
       config = { unpublishSafe: true, extends: 'foo' } as never;
       res = configMigration.migrateConfig(config);
-      expect(res.isMigrated).toBe(true);
+      expect(res.isMigrated).toBeTrue();
       expect(res.migratedConfig).toMatchObject({
         extends: ['foo', 'npm:unpublishSafe'],
       });
 
       config = { unpublishSafe: true, extends: [] };
       res = configMigration.migrateConfig(config);
-      expect(res.isMigrated).toBe(true);
+      expect(res.isMigrated).toBeTrue();
       expect(res.migratedConfig).toMatchObject({
         extends: ['npm:unpublishSafe'],
       });
 
       config = { unpublishSafe: true, extends: ['foo', 'bar'] };
       res = configMigration.migrateConfig(config);
-      expect(res.isMigrated).toBe(true);
+      expect(res.isMigrated).toBeTrue();
       expect(res.migratedConfig).toMatchObject({
         extends: ['foo', 'bar', 'npm:unpublishSafe'],
       });
@@ -545,7 +545,7 @@ describe('config/migration', () => {
         extends: ['foo', ':unpublishSafe', 'bar'],
       };
       res = configMigration.migrateConfig(config);
-      expect(res.isMigrated).toBe(true);
+      expect(res.isMigrated).toBeTrue();
       expect(res.migratedConfig).toMatchObject({
         extends: ['foo', 'npm:unpublishSafe', 'bar'],
       });
@@ -555,7 +555,7 @@ describe('config/migration', () => {
         extends: ['foo', 'default:unpublishSafe', 'bar'],
       };
       res = configMigration.migrateConfig(config);
-      expect(res.isMigrated).toBe(true);
+      expect(res.isMigrated).toBeTrue();
       expect(res.migratedConfig).toMatchObject({
         extends: ['foo', 'npm:unpublishSafe', 'bar'],
       });
@@ -565,7 +565,7 @@ describe('config/migration', () => {
         extends: ['foo', 'bar'],
       };
       res = configMigration.migrateConfig(config);
-      expect(res.isMigrated).toBe(true);
+      expect(res.isMigrated).toBeTrue();
       expect(res.migratedConfig).toMatchObject({
         extends: ['foo', 'bar'],
       });
@@ -575,7 +575,7 @@ describe('config/migration', () => {
         extends: ['foo', 'bar'],
       };
       res = configMigration.migrateConfig(config);
-      expect(res.isMigrated).toBe(true);
+      expect(res.isMigrated).toBeTrue();
       expect(res.migratedConfig).toMatchObject({
         extends: ['foo', 'bar', 'npm:unpublishSafe'],
       });
@@ -585,7 +585,7 @@ describe('config/migration', () => {
         extends: [':unpublishSafeDisabled'],
       };
       res = configMigration.migrateConfig(config);
-      expect(res.isMigrated).toBe(true);
+      expect(res.isMigrated).toBeTrue();
       expect(res.migratedConfig).toMatchObject({
         extends: [':unpublishSafeDisabled', 'npm:unpublishSafe'],
       });
@@ -599,7 +599,7 @@ describe('config/migration', () => {
         packageRules: { matchPackageNames: [] },
       } as never;
       res = configMigration.migrateConfig(config);
-      expect(res.isMigrated).toBe(true);
+      expect(res.isMigrated).toBeTrue();
       expect(res.migratedConfig.packageRules).toHaveLength(2);
 
       config = {
@@ -607,7 +607,7 @@ describe('config/migration', () => {
         packages: [{ matchPackagePatterns: ['*'] }],
       } as never;
       res = configMigration.migrateConfig(config);
-      expect(res.isMigrated).toBe(true);
+      expect(res.isMigrated).toBeTrue();
       expect(res.migratedConfig.packageRules).toHaveLength(2);
     });
     it('it migrates packageRules', () => {
@@ -633,7 +633,7 @@ describe('config/migration', () => {
         config,
         defaultConfig
       );
-      expect(isMigrated).toBe(true);
+      expect(isMigrated).toBeTrue();
       expect(migratedConfig).toEqual({
         packageRules: [
           {
@@ -681,7 +681,7 @@ describe('config/migration', () => {
       config,
       defaultConfig
     );
-    expect(isMigrated).toBe(true);
+    expect(isMigrated).toBeTrue();
     expect(migratedConfig).toMatchSnapshot();
     expect(migratedConfig.packageRules).toHaveLength(3);
   });
@@ -697,7 +697,7 @@ describe('config/migration', () => {
       config,
       defaultConfig
     );
-    expect(isMigrated).toBe(true);
+    expect(isMigrated).toBeTrue();
     expect(migratedConfig).toEqual({
       hostRules: [
         { matchHost: 'https://some.domain.com', token: '123test' },
@@ -720,7 +720,7 @@ describe('config/migration', () => {
       config,
       defaultConfig
     );
-    expect(isMigrated).toBe(true);
+    expect(isMigrated).toBeTrue();
     expect(migratedConfig).toEqual({ extends: ['local>org/renovate-config'] });
   });
 
@@ -732,21 +732,21 @@ describe('config/migration', () => {
       composerIgnorePlatformReqs: true,
     } as never;
     res = configMigration.migrateConfig(config);
-    expect(res.isMigrated).toBe(true);
+    expect(res.isMigrated).toBeTrue();
     expect(res.migratedConfig.composerIgnorePlatformReqs).toStrictEqual([]);
 
     config = {
       composerIgnorePlatformReqs: false,
     } as never;
     res = configMigration.migrateConfig(config);
-    expect(res.isMigrated).toBe(true);
+    expect(res.isMigrated).toBeTrue();
     expect(res.migratedConfig.composerIgnorePlatformReqs).toBeNull();
 
     config = {
       composerIgnorePlatformReqs: [],
     } as never;
     res = configMigration.migrateConfig(config);
-    expect(res.isMigrated).toBe(false);
+    expect(res.isMigrated).toBeFalse();
     expect(res.migratedConfig.composerIgnorePlatformReqs).toStrictEqual([]);
   });
 
@@ -770,7 +770,7 @@ describe('config/migration', () => {
       config,
       defaultConfig
     );
-    expect(isMigrated).toBe(true);
+    expect(isMigrated).toBeTrue();
     expect(migratedConfig).toMatchSnapshot();
   });
   it('migrates empty requiredStatusChecks', () => {
diff --git a/lib/config/presets/index.spec.ts b/lib/config/presets/index.spec.ts
index 73ef83ec01713ee96317cfb9e377e7a54c210e4d..64ffb67bc9b17e6e1bd6fbc4658b40f53005b1bb 100644
--- a/lib/config/presets/index.spec.ts
+++ b/lib/config/presets/index.spec.ts
@@ -224,7 +224,7 @@ describe('config/presets/index', () => {
       const res = await presets.resolveConfigPresets(config);
       expect(res).toMatchSnapshot();
       const rule = res.packageRules[0];
-      expect(rule.automerge).toBe(true);
+      expect(rule.automerge).toBeTrue();
       expect(rule.matchPackageNames).toHaveLength(4);
       expect(rule.matchPackagePatterns).toHaveLength(1);
       expect(rule.matchPackagePrefixes).toHaveLength(4);
@@ -234,7 +234,7 @@ describe('config/presets/index', () => {
       const res = await presets.resolveConfigPresets(config);
       expect(res).toMatchSnapshot();
       expect(res.automerge).not.toBeDefined();
-      expect(res.minor.automerge).toBe(true);
+      expect(res.minor.automerge).toBeTrue();
     });
 
     it('ignores presets', async () => {
@@ -243,7 +243,7 @@ describe('config/presets/index', () => {
         'config:base',
       ]);
       expect(config).toMatchObject(res);
-      expect(res).toEqual({});
+      expect(res).toBeEmptyObject();
     });
 
     it('resolves self-hosted presets without baseConfig', async () => {
diff --git a/lib/config/validation.spec.ts b/lib/config/validation.spec.ts
index 711db9971997802ee252355672c0e6797eccbf1c..eaa44fec3bf26d2161858701cd45373d90ad8d03 100644
--- a/lib/config/validation.spec.ts
+++ b/lib/config/validation.spec.ts
@@ -4,7 +4,7 @@ import * as configValidation from './validation';
 describe('config/validation', () => {
   describe('getParentName()', () => {
     it('ignores encrypted in root', () => {
-      expect(configValidation.getParentName('encrypted')).toEqual('');
+      expect(configValidation.getParentName('encrypted')).toBeEmptyString();
     });
     it('handles array types', () => {
       expect(configValidation.getParentName('hostRules[1]')).toEqual(
diff --git a/lib/datasource/github-releases/index.spec.ts b/lib/datasource/github-releases/index.spec.ts
index 2f03c8ed182ece69f3f9a0ec63576839ebb7b6ea..99f4a5381ebfa6cc10782c1c5330eb48df09c5bb 100644
--- a/lib/datasource/github-releases/index.spec.ts
+++ b/lib/datasource/github-releases/index.spec.ts
@@ -49,7 +49,7 @@ describe('datasource/github-releases/index', () => {
       ).toBeDefined();
       expect(
         res.releases.find((release) => release.version === '2.0.0').isStable
-      ).toBe(false);
+      ).toBeFalse();
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
     it('supports ghe', async () => {
diff --git a/lib/datasource/index.spec.ts b/lib/datasource/index.spec.ts
index 1d3f6fa3cdaa51e56a5fd3b3992fb2fa888a8f50..95a2a1b1e18db29c32ce74bca8d1d715c9bc599d 100644
--- a/lib/datasource/index.spec.ts
+++ b/lib/datasource/index.spec.ts
@@ -61,13 +61,13 @@ describe('datasource/index', () => {
 
     for (const dsName of dss.keys()) {
       const ds = dss.get(dsName);
-      expect(validateDatasource(ds, dsName)).toBe(true);
+      expect(validateDatasource(ds, dsName)).toBeTrue();
     }
   });
   it('returns if digests are supported', () => {
     expect(
       datasource.supportsDigests({ datasource: datasourceGithubTags.id })
-    ).toBe(true);
+    ).toBeTrue();
   });
   it('returns null for no datasource', async () => {
     expect(
diff --git a/lib/datasource/npm/index.spec.ts b/lib/datasource/npm/index.spec.ts
index 18bab6a112cf4c7b51a2bfca70fccbdb4784db99..d685608c9c46959239532c1b47589b9028818dd7 100644
--- a/lib/datasource/npm/index.spec.ts
+++ b/lib/datasource/npm/index.spec.ts
@@ -312,7 +312,7 @@ describe('datasource/npm/index', () => {
     setNpmrc(npmrcContent);
     setNpmrc(npmrcContent);
     setNpmrc();
-    expect(getNpmrc()).toEqual({});
+    expect(getNpmrc()).toBeEmptyObject();
   });
 
   it('should use default registry if missing from npmrc', async () => {
diff --git a/lib/datasource/npm/npmrc.spec.ts b/lib/datasource/npm/npmrc.spec.ts
index a013f823bff104d77793686e55ffc63a567d998c..6e70054cc249b9814f256ad08234ab6bf8e3226f 100644
--- a/lib/datasource/npm/npmrc.spec.ts
+++ b/lib/datasource/npm/npmrc.spec.ts
@@ -51,6 +51,6 @@ describe('datasource/npm/npmrc', () => {
   it('ignores localhost', () => {
     setNpmrc(`registry=http://localhost`);
     expect(sanitize.add).toHaveBeenCalledTimes(0);
-    expect(getNpmrc()).toEqual({});
+    expect(getNpmrc()).toBeEmptyObject();
   });
 });
diff --git a/lib/datasource/pypi/index.spec.ts b/lib/datasource/pypi/index.spec.ts
index 2171f67a900907afc34b98b84433af508c71a6c3..7cf65b23ebaed9e59bd5b5314039cadad94a6abd 100644
--- a/lib/datasource/pypi/index.spec.ts
+++ b/lib/datasource/pypi/index.spec.ts
@@ -94,7 +94,7 @@ describe('datasource/pypi/index', () => {
         datasource,
         depName: 'azure-cli-monitor',
       });
-      expect(res.isPrivate).toBe(true);
+      expect(res.isPrivate).toBeTrue();
     });
     it('supports multiple custom datasource urls', async () => {
       httpMock
@@ -273,7 +273,7 @@ describe('datasource/pypi/index', () => {
         constraints: { python: '2.7' },
         depName: 'dj-database-url',
       });
-      expect(res.isPrivate).toBe(true);
+      expect(res.isPrivate).toBeTrue();
     });
     it('process data from simple endpoint with hyphens replaced with underscores', async () => {
       httpMock
diff --git a/lib/logger/pretty-stdout.spec.ts b/lib/logger/pretty-stdout.spec.ts
index 67848e4320c4e9d474476726148dc574fac335a4..66e8729fd3543f95eb6dc729945eb3e970f96e83 100644
--- a/lib/logger/pretty-stdout.spec.ts
+++ b/lib/logger/pretty-stdout.spec.ts
@@ -12,16 +12,16 @@ jest.mock('chalk', () =>
 describe('logger/pretty-stdout', () => {
   describe('getMeta(rec)', () => {
     it('returns empty string if null rec', () => {
-      expect(prettyStdout.getMeta(null as any)).toEqual('');
+      expect(prettyStdout.getMeta(null as any)).toBeEmptyString();
     });
     it('returns empty string if empty rec', () => {
-      expect(prettyStdout.getMeta({} as any)).toEqual('');
+      expect(prettyStdout.getMeta({} as any)).toBeEmptyString();
     });
     it('returns empty string if no meta fields', () => {
       const rec = {
         foo: 'bar',
       };
-      expect(prettyStdout.getMeta(rec as any)).toEqual('');
+      expect(prettyStdout.getMeta(rec as any)).toBeEmptyString();
     });
     it('supports single meta', () => {
       const rec = {
@@ -46,17 +46,17 @@ describe('logger/pretty-stdout', () => {
   });
   describe('getDetails(rec)', () => {
     it('returns empty string if null rec', () => {
-      expect(prettyStdout.getDetails(null as any)).toEqual('');
+      expect(prettyStdout.getDetails(null as any)).toBeEmptyString();
     });
     it('returns empty string if empty rec', () => {
-      expect(prettyStdout.getDetails({} as any)).toEqual('');
+      expect(prettyStdout.getDetails({} as any)).toBeEmptyString();
     });
     it('returns empty string if all are meta fields', () => {
       const rec = {
         branch: 'bar',
         v: 0,
       };
-      expect(prettyStdout.getDetails(rec as any)).toEqual('');
+      expect(prettyStdout.getDetails(rec as any)).toBeEmptyString();
     });
     it('supports a config', () => {
       const rec = {
diff --git a/lib/manager/bundler/extract.spec.ts b/lib/manager/bundler/extract.spec.ts
index 7548328d5263a62bf9b99d572b60f881ed36996d..1eb4fef213271f0485ae8bb5de079bacbadee8a0 100644
--- a/lib/manager/bundler/extract.spec.ts
+++ b/lib/manager/bundler/extract.spec.ts
@@ -51,7 +51,7 @@ describe('manager/bundler/extract', () => {
               Object.prototype.hasOwnProperty.call(dep, 'lockedVersion') &&
               isValid(dep.lockedVersion)
           )
-      ).toBe(true);
+      ).toBeTrue();
       validateGems(railsGemfile, res);
     });
     it('parses sourceGroups', async () => {
@@ -69,7 +69,7 @@ describe('manager/bundler/extract', () => {
             Object.prototype.hasOwnProperty.call(dep, 'lockedVersion') &&
             isValid(dep.lockedVersion)
         )
-      ).toBe(true);
+      ).toBeTrue();
       validateGems(webPackerGemfile, res);
     });
     it('parse mastodon Gemfile', async () => {
@@ -86,7 +86,7 @@ describe('manager/bundler/extract', () => {
               Object.prototype.hasOwnProperty.call(dep, 'lockedVersion') &&
               isValid(dep.lockedVersion)
           )
-      ).toBe(true);
+      ).toBeTrue();
       validateGems(mastodonGemfile, res);
     });
     it('parse Ruby CI Gemfile', async () => {
@@ -99,7 +99,7 @@ describe('manager/bundler/extract', () => {
             Object.prototype.hasOwnProperty.call(dep, 'lockedVersion') &&
             isValid(dep.lockedVersion)
         )
-      ).toBe(true);
+      ).toBeTrue();
       validateGems(rubyCIGemfile, res);
     });
   });
@@ -113,7 +113,7 @@ describe('manager/bundler/extract', () => {
           Object.prototype.hasOwnProperty.call(dep, 'lockedVersion') &&
           isValid(dep.lockedVersion)
       )
-    ).toBe(true);
+    ).toBeTrue();
     validateGems(gitlabFossGemfile, res);
   });
 
diff --git a/lib/manager/bundler/host-rules.spec.ts b/lib/manager/bundler/host-rules.spec.ts
index 3aa78358a31f22d57e0eb86caadada06f57b337e..3a8c85b01a4fcead21894f082c9d7b60a484f199 100644
--- a/lib/manager/bundler/host-rules.spec.ts
+++ b/lib/manager/bundler/host-rules.spec.ts
@@ -42,21 +42,27 @@ describe('manager/bundler/host-rules', () => {
     it('returns an empty array if matchHost is missing', () => {
       delete hostRule.matchHost;
       add(hostRule);
-      expect(findAllAuthenticatable({ hostType: 'nuget' } as any)).toEqual([]);
+      expect(
+        findAllAuthenticatable({ hostType: 'nuget' } as any)
+      ).toBeEmptyArray();
     });
     it('returns an empty array if username is missing and password is present', () => {
       delete hostRule.username;
       delete hostRule.token;
 
       add(hostRule);
-      expect(findAllAuthenticatable({ hostType: 'nuget' } as any)).toEqual([]);
+      expect(
+        findAllAuthenticatable({ hostType: 'nuget' } as any)
+      ).toBeEmptyArray();
     });
     it('returns an empty array if password and token are missing', () => {
       delete hostRule.password;
       delete hostRule.token;
 
       add(hostRule);
-      expect(findAllAuthenticatable({ hostType: 'nuget' } as any)).toEqual([]);
+      expect(
+        findAllAuthenticatable({ hostType: 'nuget' } as any)
+      ).toBeEmptyArray();
     });
     it('returns the hostRule if using matchHost and password', () => {
       delete hostRule.token;
diff --git a/lib/manager/dockerfile/extract.spec.ts b/lib/manager/dockerfile/extract.spec.ts
index c7dc176ef2c42741078c472f66b2610617c6c032..ac320fe8035819210d1d8399bbcca1f17b54969a 100644
--- a/lib/manager/dockerfile/extract.spec.ts
+++ b/lib/manager/dockerfile/extract.spec.ts
@@ -439,7 +439,7 @@ describe('manager/dockerfile/extract', () => {
         res[1].depType === 'stage',
         res[0].depType === 'stage',
       ].every(Boolean);
-      expect(passed).toBe(true);
+      expect(passed).toBeTrue();
     });
 
     it('extracts images on adjacent lines', () => {
diff --git a/lib/manager/gitlabci/extract.spec.ts b/lib/manager/gitlabci/extract.spec.ts
index cc911594aeee1247d013452c9e523e7af4bec2f3..04c6ec92254344b54a2b5205f8ef51ece3695419 100644
--- a/lib/manager/gitlabci/extract.spec.ts
+++ b/lib/manager/gitlabci/extract.spec.ts
@@ -66,7 +66,7 @@ describe('manager/gitlabci/extract', () => {
       });
       expect(deps).toHaveLength(8);
 
-      expect(deps.some((dep) => dep.currentValue.includes("'"))).toBe(false);
+      expect(deps.some((dep) => dep.currentValue.includes("'"))).toBeFalse();
     });
 
     it('extracts multiple image lines with comments', async () => {
diff --git a/lib/manager/gradle-wrapper/artifacts-real.spec.ts b/lib/manager/gradle-wrapper/artifacts-real.spec.ts
index acb1e1debbd9eedcd8e0280bf9a058b202d91168..88fe508870ebd480442cb88e7b84cb8615e01966 100644
--- a/lib/manager/gradle-wrapper/artifacts-real.spec.ts
+++ b/lib/manager/gradle-wrapper/artifacts-real.spec.ts
@@ -127,7 +127,7 @@ describe('manager/gradle-wrapper/artifacts-real', () => {
         config,
       });
 
-      expect(res).toEqual([]);
+      expect(res).toBeEmptyArray();
 
       // 5.6.4 => 5.6.4 (updates execs)
       // 6.3 => (5.6.4) (downgrades execs)
diff --git a/lib/manager/gradle-wrapper/artifacts.spec.ts b/lib/manager/gradle-wrapper/artifacts.spec.ts
index bcd2199fa5f7313e8c0cfadcea930d178220f15d..a98cedc9d94fd3d88583979a2937865401f08b5a 100644
--- a/lib/manager/gradle-wrapper/artifacts.spec.ts
+++ b/lib/manager/gradle-wrapper/artifacts.spec.ts
@@ -123,7 +123,7 @@ describe('manager/gradle-wrapper/artifacts', () => {
     });
 
     expect(execSnapshots).toMatchSnapshot();
-    expect(res).toEqual([]);
+    expect(res).toBeEmptyArray();
   });
 
   it('updates distributionSha256Sum', async () => {
diff --git a/lib/manager/gradle/deep/index.spec.ts b/lib/manager/gradle/deep/index.spec.ts
index 36f4ee06d5b11e4c9187d06143e25be1f9958f32..06f3ab781808c15e648a1782a6831556d2ac3820 100644
--- a/lib/manager/gradle/deep/index.spec.ts
+++ b/lib/manager/gradle/deep/index.spec.ts
@@ -176,7 +176,7 @@ describe('manager/gradle/deep/index', () => {
       const dependencies = await extractAllPackageFiles(config, [
         'build.gradle',
       ]);
-      expect(dependencies).toEqual([]);
+      expect(dependencies).toBeEmptyArray();
       expect(execSnapshots).toMatchSnapshot();
     });
 
@@ -185,7 +185,7 @@ describe('manager/gradle/deep/index', () => {
       const dependencies = await extractAllPackageFiles(config, [
         'build.gradle',
       ]);
-      expect(dependencies).toEqual([]);
+      expect(dependencies).toBeEmptyArray();
       expect(execSnapshots).toMatchSnapshot();
     });
 
@@ -194,7 +194,7 @@ describe('manager/gradle/deep/index', () => {
       const dependencies = await extractAllPackageFiles(config, [
         'build.gradle',
       ]);
-      expect(dependencies).toEqual([]);
+      expect(dependencies).toBeEmptyArray();
       expect(execSnapshots).toMatchSnapshot();
     });
 
diff --git a/lib/manager/gradle/shallow/utils.spec.ts b/lib/manager/gradle/shallow/utils.spec.ts
index eb37b9132caa822302d4eaf39b31b01ac5070629..5dfa16dec5d2600cc5d347e0040f154e0ad8772b 100644
--- a/lib/manager/gradle/shallow/utils.spec.ts
+++ b/lib/manager/gradle/shallow/utils.spec.ts
@@ -33,16 +33,16 @@ describe('manager/gradle/shallow/utils', () => {
   });
 
   it('isDependencyString', () => {
-    expect(isDependencyString('foo:bar:1.2.3')).toBe(true);
-    expect(isDependencyString('foo.foo:bar.bar:1.2.3')).toBe(true);
-    expect(isDependencyString('foo:bar:baz:qux')).toBe(false);
-    expect(isDependencyString('foo.bar:baz:1.2.3')).toBe(true);
-    expect(isDependencyString('foo.bar:baz:1.2.+')).toBe(true);
-    expect(isDependencyString('foo.bar:baz:qux:quux')).toBe(false);
-    expect(isDependencyString("foo:bar:1.2.3'")).toBe(false);
-    expect(isDependencyString('foo:bar:1.2.3"')).toBe(false);
-    expect(isDependencyString('-Xep:ParameterName:OFF')).toBe(false);
-    expect(isDependencyString('foo$bar:baz:1.2.+')).toBe(false);
+    expect(isDependencyString('foo:bar:1.2.3')).toBeTrue();
+    expect(isDependencyString('foo.foo:bar.bar:1.2.3')).toBeTrue();
+    expect(isDependencyString('foo:bar:baz:qux')).toBeFalse();
+    expect(isDependencyString('foo.bar:baz:1.2.3')).toBeTrue();
+    expect(isDependencyString('foo.bar:baz:1.2.+')).toBeTrue();
+    expect(isDependencyString('foo.bar:baz:qux:quux')).toBeFalse();
+    expect(isDependencyString("foo:bar:1.2.3'")).toBeFalse();
+    expect(isDependencyString('foo:bar:1.2.3"')).toBeFalse();
+    expect(isDependencyString('-Xep:ParameterName:OFF')).toBeFalse();
+    expect(isDependencyString('foo$bar:baz:1.2.+')).toBeFalse();
   });
 
   it('parseDependencyString', () => {
@@ -70,7 +70,7 @@ describe('manager/gradle/shallow/utils', () => {
   });
 
   it('interpolateString', () => {
-    expect(interpolateString([], {})).toBe('');
+    expect(interpolateString([], {})).toBeEmptyString();
     expect(
       interpolateString(
         [
diff --git a/lib/manager/index.spec.ts b/lib/manager/index.spec.ts
index b3eaa34b18e60f382187234bbb71688bf0bf7d48..53da1cc52719f50e4052ec115e2275aaeb10dba2 100644
--- a/lib/manager/index.spec.ts
+++ b/lib/manager/index.spec.ts
@@ -41,7 +41,7 @@ describe('manager/index', () => {
 
     for (const name of mgrs.keys()) {
       const mgr = mgrs.get(name);
-      expect(validate(mgr)).toBe(true);
+      expect(validate(mgr)).toBeTrue();
     }
   });
 
diff --git a/lib/manager/leiningen/extract.spec.ts b/lib/manager/leiningen/extract.spec.ts
index 9b8d48df9075cb39b879aa5a5ba1ca81ef904d74..0c4b19bff0125328f69bc98d1a601539010b404c 100644
--- a/lib/manager/leiningen/extract.spec.ts
+++ b/lib/manager/leiningen/extract.spec.ts
@@ -18,9 +18,9 @@ describe('manager/leiningen/extract', () => {
     );
   });
   it('extractFromVectors', () => {
-    expect(extractFromVectors('')).toEqual([]);
-    expect(extractFromVectors('[]')).toEqual([]);
-    expect(extractFromVectors('[[]]')).toEqual([]);
+    expect(extractFromVectors('')).toBeEmptyArray();
+    expect(extractFromVectors('[]')).toBeEmptyArray();
+    expect(extractFromVectors('[[]]')).toBeEmptyArray();
     expect(extractFromVectors('[[foo/bar "1.2.3"]]')).toEqual([
       {
         datasource: ClojureDatasource.id,
diff --git a/lib/manager/maven/index.spec.ts b/lib/manager/maven/index.spec.ts
index 31da0fd898b48ab94fe84133149f754e0d8ca25b..fffedd425eb14936c55970dc41f7bab8dd27740d 100644
--- a/lib/manager/maven/index.spec.ts
+++ b/lib/manager/maven/index.spec.ts
@@ -20,13 +20,13 @@ describe('manager/maven/index', () => {
     it('should return empty if package has no content', async () => {
       fs.readLocalFile.mockResolvedValueOnce(null);
       const res = await extractAllPackageFiles({}, ['random.pom.xml']);
-      expect(res).toEqual([]);
+      expect(res).toBeEmptyArray();
     });
 
     it('should return empty for packages with invalid content', async () => {
       fs.readLocalFile.mockResolvedValueOnce('invalid content');
       const res = await extractAllPackageFiles({}, ['random.pom.xml']);
-      expect(res).toEqual([]);
+      expect(res).toBeEmptyArray();
     });
 
     it('should return package files info', async () => {
diff --git a/lib/manager/metadata.spec.ts b/lib/manager/metadata.spec.ts
index d5f2aaecc81d349615bcf318f41a6d5d13b755d6..3c1d271c436c8ced8c7025480909453a238ea826 100644
--- a/lib/manager/metadata.spec.ts
+++ b/lib/manager/metadata.spec.ts
@@ -29,6 +29,6 @@ describe('manager/metadata', () => {
 
     expect(
       res.some((line) => line.startsWith('# ') || line.startsWith('## '))
-    ).toBe(false);
+    ).toBeFalse();
   });
 });
diff --git a/lib/manager/npm/extract/monorepo.spec.ts b/lib/manager/npm/extract/monorepo.spec.ts
index 62121992b16529a118f609ea53c40f7a1705e071..19763b49b334ae37d76f1b423d6eec7b897143ab 100644
--- a/lib/manager/npm/extract/monorepo.spec.ts
+++ b/lib/manager/npm/extract/monorepo.spec.ts
@@ -55,7 +55,7 @@ describe('manager/npm/extract/monorepo', () => {
         packageFiles.some((packageFile) =>
           packageFile.deps?.some((dep) => dep.skipReason)
         )
-      ).toBe(true);
+      ).toBeTrue();
     });
 
     it('updates internal packages', async () => {
@@ -109,7 +109,7 @@ describe('manager/npm/extract/monorepo', () => {
         packageFiles.some((packageFile) =>
           packageFile.deps?.some((dep) => dep.skipReason)
         )
-      ).toBe(false);
+      ).toBeFalse();
     });
 
     it('uses yarn workspaces package settings with lerna', async () => {
diff --git a/lib/manager/npm/extract/pnpm.spec.ts b/lib/manager/npm/extract/pnpm.spec.ts
index 03fb0863ad7697959902eba4e8242b1361a15fed..d27216433f47adc292cd763a767bbbe98e7fc5c5 100644
--- a/lib/manager/npm/extract/pnpm.spec.ts
+++ b/lib/manager/npm/extract/pnpm.spec.ts
@@ -126,7 +126,7 @@ describe('manager/npm/extract/pnpm', () => {
       expect(packageFiles).toMatchSnapshot();
       expect(
         packageFiles.every((packageFile) => packageFile.pnpmShrinkwrap)
-      ).toBe(true);
+      ).toBeTrue();
     });
 
     it('skips when pnpm shrinkwrap file has already been provided', async () => {
diff --git a/lib/manager/npm/extract/type.spec.ts b/lib/manager/npm/extract/type.spec.ts
index 4d7901c307252e0e4c6527ce3d1ae6cf9c6b68d9..c265e5a02d340661a51b55f74b6d3198d673000a 100644
--- a/lib/manager/npm/extract/type.spec.ts
+++ b/lib/manager/npm/extract/type.spec.ts
@@ -4,15 +4,15 @@ describe('manager/npm/extract/type', () => {
   describe('.mightBeABrowserLibrary()', () => {
     it('is not a library if private', () => {
       const isLibrary = mightBeABrowserLibrary({ private: true });
-      expect(isLibrary).toBe(false);
+      expect(isLibrary).toBeFalse();
     });
     it('is not a library if no main', () => {
       const isLibrary = mightBeABrowserLibrary({});
-      expect(isLibrary).toBe(false);
+      expect(isLibrary).toBeFalse();
     });
     it('is a library if has a main', () => {
       const isLibrary = mightBeABrowserLibrary({ main: 'index.js ' });
-      expect(isLibrary).toBe(true);
+      expect(isLibrary).toBeTrue();
     });
   });
 });
diff --git a/lib/manager/npm/extract/yarn.spec.ts b/lib/manager/npm/extract/yarn.spec.ts
index 76ddd005c3f027b164bd6a51d6345e49feca38ec..94ae015d7baf553b5834d2598a3039f53560f1f3 100644
--- a/lib/manager/npm/extract/yarn.spec.ts
+++ b/lib/manager/npm/extract/yarn.spec.ts
@@ -8,7 +8,7 @@ describe('manager/npm/extract/yarn', () => {
     it('returns empty if exception parsing', async () => {
       fs.readLocalFile.mockResolvedValueOnce('abcd');
       const res = await getYarnLock('package.json');
-      expect(res.isYarn1).toBe(true);
+      expect(res.isYarn1).toBeTrue();
       expect(Object.keys(res.lockedVersions)).toHaveLength(0);
     });
 
@@ -16,7 +16,7 @@ describe('manager/npm/extract/yarn', () => {
       const plocktest1Lock = loadFixture('plocktest1/yarn.lock', '..');
       fs.readLocalFile.mockResolvedValueOnce(plocktest1Lock);
       const res = await getYarnLock('package.json');
-      expect(res.isYarn1).toBe(true);
+      expect(res.isYarn1).toBeTrue();
       expect(res.lockfileVersion).toBeUndefined();
       expect(res.lockedVersions).toMatchSnapshot();
       expect(Object.keys(res.lockedVersions)).toHaveLength(7);
@@ -26,7 +26,7 @@ describe('manager/npm/extract/yarn', () => {
       const plocktest1Lock = loadFixture('yarn2/yarn.lock', '..');
       fs.readLocalFile.mockResolvedValueOnce(plocktest1Lock);
       const res = await getYarnLock('package.json');
-      expect(res.isYarn1).toBe(false);
+      expect(res.isYarn1).toBeFalse();
       expect(res.lockfileVersion).toBe(NaN);
       expect(res.lockedVersions).toMatchSnapshot();
       expect(Object.keys(res.lockedVersions)).toHaveLength(8);
@@ -36,7 +36,7 @@ describe('manager/npm/extract/yarn', () => {
       const plocktest1Lock = loadFixture('yarn2.2/yarn.lock', '..');
       fs.readLocalFile.mockResolvedValueOnce(plocktest1Lock);
       const res = await getYarnLock('package.json');
-      expect(res.isYarn1).toBe(false);
+      expect(res.isYarn1).toBeFalse();
       expect(res.lockfileVersion).toBe(6);
       expect(res.lockedVersions).toMatchSnapshot();
       expect(Object.keys(res.lockedVersions)).toHaveLength(10);
diff --git a/lib/manager/npm/post-update/lerna.spec.ts b/lib/manager/npm/post-update/lerna.spec.ts
index 8ce00a043f1923a77683bea1cde4bebe63719fa9..511153de43b04dcb483689fdbacb645cf288f94a 100644
--- a/lib/manager/npm/post-update/lerna.spec.ts
+++ b/lib/manager/npm/post-update/lerna.spec.ts
@@ -34,7 +34,7 @@ describe('manager/npm/post-update/lerna', () => {
     });
     it('returns if no lernaClient', async () => {
       const res = await lernaHelper.generateLockFiles({}, 'some-dir', {}, {});
-      expect(res.error).toBe(false);
+      expect(res.error).toBeFalse();
     });
     it('returns if invalid lernaClient', async () => {
       const res = await lernaHelper.generateLockFiles(
@@ -43,7 +43,7 @@ describe('manager/npm/post-update/lerna', () => {
         {},
         {}
       );
-      expect(res.error).toBe(false);
+      expect(res.error).toBeFalse();
     });
     it('generates package-lock.json files', async () => {
       const execSnapshots = mockExecAll(exec);
@@ -55,7 +55,7 @@ describe('manager/npm/post-update/lerna', () => {
         {},
         skipInstalls
       );
-      expect(res.error).toBe(false);
+      expect(res.error).toBeFalse();
       expect(execSnapshots).toMatchSnapshot();
     });
     it('performs full npm install', async () => {
@@ -68,7 +68,7 @@ describe('manager/npm/post-update/lerna', () => {
         {},
         skipInstalls
       );
-      expect(res.error).toBe(false);
+      expect(res.error).toBeFalse();
       expect(execSnapshots).toMatchSnapshot();
     });
     it('generates yarn.lock files', async () => {
@@ -80,7 +80,7 @@ describe('manager/npm/post-update/lerna', () => {
         {}
       );
       expect(execSnapshots).toMatchSnapshot();
-      expect(res.error).toBe(false);
+      expect(res.error).toBeFalse();
     });
     it('defaults to latest if lerna version unspecified', async () => {
       const execSnapshots = mockExecAll(exec);
@@ -90,7 +90,7 @@ describe('manager/npm/post-update/lerna', () => {
         {},
         {}
       );
-      expect(res.error).toBe(false);
+      expect(res.error).toBeFalse();
       expect(execSnapshots).toMatchSnapshot();
     });
     it('allows scripts for trust level high', async () => {
@@ -102,7 +102,7 @@ describe('manager/npm/post-update/lerna', () => {
         { constraints: { npm: '^6.0.0' } },
         {}
       );
-      expect(res.error).toBe(false);
+      expect(res.error).toBeFalse();
       expect(execSnapshots).toMatchSnapshot();
     });
   });
diff --git a/lib/manager/npm/post-update/npm.spec.ts b/lib/manager/npm/post-update/npm.spec.ts
index 11a29496206faa8dee593fa9981cb4ae4b533161..59df6449c9dfe3fc97defb4ccbc542416611b524 100644
--- a/lib/manager/npm/post-update/npm.spec.ts
+++ b/lib/manager/npm/post-update/npm.spec.ts
@@ -158,7 +158,7 @@ describe('manager/npm/post-update/npm', () => {
       'package-lock.json'
     );
     expect(fs.readFile).toHaveBeenCalledTimes(1);
-    expect(res.error).toBe(true);
+    expect(res.error).toBeTrue();
     expect(res.lockFile).not.toBeDefined();
     expect(execSnapshots).toMatchSnapshot();
   });
diff --git a/lib/manager/npm/post-update/pnpm.spec.ts b/lib/manager/npm/post-update/pnpm.spec.ts
index fa9822cc634afc685e7577d826d83bc0d263fd4b..8162aff94c44fc10da8877d99427c4f56addb096 100644
--- a/lib/manager/npm/post-update/pnpm.spec.ts
+++ b/lib/manager/npm/post-update/pnpm.spec.ts
@@ -38,7 +38,7 @@ describe('manager/npm/post-update/pnpm', () => {
     }) as never;
     const res = await pnpmHelper.generateLockFile('some-dir', {}, config);
     expect(fs.readFile).toHaveBeenCalledTimes(1);
-    expect(res.error).toBe(true);
+    expect(res.error).toBeTrue();
     expect(res.lockFile).not.toBeDefined();
     expect(execSnapshots).toMatchSnapshot();
   });
diff --git a/lib/manager/npm/post-update/yarn.spec.ts b/lib/manager/npm/post-update/yarn.spec.ts
index b1a54229f28a03996318b2934df805e447754933..8383acc0ba01eb03a5a0dc7e74995c486070d4fc 100644
--- a/lib/manager/npm/post-update/yarn.spec.ts
+++ b/lib/manager/npm/post-update/yarn.spec.ts
@@ -216,7 +216,7 @@ describe('manager/npm/post-update/yarn', () => {
     });
     const res = await yarnHelper.generateLockFile('some-dir', {});
     expect(fs.readFile).toHaveBeenCalledTimes(2);
-    expect(res.error).toBe(true);
+    expect(res.error).toBeTrue();
     expect(res.lockFile).not.toBeDefined();
     expect(fixSnapshots(execSnapshots)).toMatchSnapshot();
   });
diff --git a/lib/manager/poetry/extract.spec.ts b/lib/manager/poetry/extract.spec.ts
index cf88773a4c931bc1cd69901abd1558ddd5d0d1a5..2b8981d29b91cea3c032f1ec70878111ecb962bb 100644
--- a/lib/manager/poetry/extract.spec.ts
+++ b/lib/manager/poetry/extract.spec.ts
@@ -92,7 +92,7 @@ describe('manager/poetry/extract', () => {
         '[tool.poetry.dependencies]\r\nflask = {git = "https://github.com/pallets/flask.git"}\r\nwerkzeug = ">=0.14"';
       const res = (await extractPackageFile(content, filename)).deps;
       expect(res[0].depName).toBe('flask');
-      expect(res[0].currentValue).toBe('');
+      expect(res[0].currentValue).toBeEmptyString();
       expect(res[0].skipReason).toBe('git-dependency');
       expect(res).toHaveLength(2);
     });
diff --git a/lib/platform/azure/index.spec.ts b/lib/platform/azure/index.spec.ts
index e343b700ad182e6171b8b730c9e4ef1828c32e1d..592b6d769245e97d3a9d7475d6c0bea7dcc975d5 100644
--- a/lib/platform/azure/index.spec.ts
+++ b/lib/platform/azure/index.spec.ts
@@ -172,7 +172,7 @@ describe('platform/azure/index', () => {
 
   describe('getRepoForceRebase', () => {
     it('should return false', async () => {
-      expect(await azure.getRepoForceRebase()).toBe(false);
+      expect(await azure.getRepoForceRebase()).toBeFalse();
     });
   });
 
@@ -1089,7 +1089,7 @@ describe('platform/azure/index', () => {
         '1',
         pullRequestIdMock
       );
-      expect(res).toBe(true);
+      expect(res).toBeTrue();
     });
     it('should return false if the PR does not update successfully', async () => {
       await initRepo({ repository: 'some/repo' });
@@ -1116,7 +1116,7 @@ describe('platform/azure/index', () => {
         branchName: branchNameMock,
         id: pullRequestIdMock,
       });
-      expect(res).toBe(false);
+      expect(res).toBeFalse();
     });
 
     it('should cache the mergeMethod for subsequent merges', async () => {
@@ -1176,7 +1176,7 @@ describe('platform/azure/index', () => {
       });
 
       expect(getPullRequestByIdMock).toHaveBeenCalledTimes(2);
-      expect(res).toBe(true);
+      expect(res).toBeTrue();
     });
 
     it('should log a warning after retrying if the PR has still not yet been set to completed', async () => {
@@ -1212,7 +1212,7 @@ describe('platform/azure/index', () => {
         expectedNumRetries + 1
       );
       expect(logger.warn).toHaveBeenCalled();
-      expect(res).toBe(true);
+      expect(res).toBeTrue();
     });
   });
 
diff --git a/lib/platform/bitbucket-server/index.spec.ts b/lib/platform/bitbucket-server/index.spec.ts
index 07d873bf29e97ce5d16dfc0b2061901ae46db90d..8b0d036d23998bac0c543b24d6303145cf1fc94c 100644
--- a/lib/platform/bitbucket-server/index.spec.ts
+++ b/lib/platform/bitbucket-server/index.spec.ts
@@ -410,7 +410,7 @@ describe('platform/bitbucket-server/index', () => {
               mergeConfig: null,
             });
           const actual = await bitbucket.getRepoForceRebase();
-          expect(actual).toBe(false);
+          expect(actual).toBeFalse();
           expect(httpMock.getTrace()).toMatchSnapshot();
         });
 
@@ -427,7 +427,7 @@ describe('platform/bitbucket-server/index', () => {
               },
             });
           const actual = await bitbucket.getRepoForceRebase();
-          expect(actual).toBe(false);
+          expect(actual).toBeFalse();
           expect(httpMock.getTrace()).toMatchSnapshot();
         });
 
@@ -448,7 +448,7 @@ describe('platform/bitbucket-server/index', () => {
                 },
               });
             const actual = await bitbucket.getRepoForceRebase();
-            expect(actual).toBe(true);
+            expect(actual).toBeTrue();
             expect(httpMock.getTrace()).toMatchSnapshot();
           }
         );
@@ -470,7 +470,7 @@ describe('platform/bitbucket-server/index', () => {
                 },
               });
             const actual = await bitbucket.getRepoForceRebase();
-            expect(actual).toBe(false);
+            expect(actual).toBeFalse();
             expect(httpMock.getTrace()).toMatchSnapshot();
           }
         );
@@ -677,7 +677,7 @@ describe('platform/bitbucket-server/index', () => {
             topic: 'topic',
             content: 'content',
           });
-          expect(res).toBe(false);
+          expect(res).toBeFalse();
           expect(httpMock.getTrace()).toMatchSnapshot();
         });
 
@@ -721,7 +721,7 @@ describe('platform/bitbucket-server/index', () => {
               topic: 'topic',
               content: 'content',
             })
-          ).toBe(true);
+          ).toBeTrue();
           expect(httpMock.getTrace()).toMatchSnapshot();
         });
 
@@ -765,7 +765,7 @@ describe('platform/bitbucket-server/index', () => {
               topic: null,
               content: 'content',
             })
-          ).toBe(true);
+          ).toBeTrue();
           expect(httpMock.getTrace()).toMatchSnapshot();
         });
 
@@ -815,7 +815,7 @@ describe('platform/bitbucket-server/index', () => {
               topic: 'some-subject',
               content: 'some\ncontent',
             })
-          ).toBe(true);
+          ).toBeTrue();
           expect(httpMock.getTrace()).toMatchSnapshot();
         });
 
@@ -859,7 +859,7 @@ describe('platform/bitbucket-server/index', () => {
               topic: null,
               content: 'some\ncontent',
             })
-          ).toBe(true);
+          ).toBeTrue();
           expect(httpMock.getTrace()).toMatchSnapshot();
         });
 
@@ -899,7 +899,7 @@ describe('platform/bitbucket-server/index', () => {
               topic: 'some-subject',
               content: 'blablabla',
             })
-          ).toBe(true);
+          ).toBeTrue();
           expect(httpMock.getTrace()).toMatchSnapshot();
         });
 
@@ -938,7 +938,7 @@ describe('platform/bitbucket-server/index', () => {
             topic: null,
             content: '!merge',
           });
-          expect(res).toBe(true);
+          expect(res).toBeTrue();
           expect(httpMock.getTrace()).toMatchSnapshot();
         });
       });
@@ -1597,7 +1597,7 @@ describe('platform/bitbucket-server/index', () => {
               branchName: 'branch',
               id: 5,
             })
-          ).toBe(true);
+          ).toBeTrue();
           expect(httpMock.getTrace()).toMatchSnapshot();
         });
 
@@ -1699,7 +1699,7 @@ describe('platform/bitbucket-server/index', () => {
               branchName: 'branch',
               id: 5,
             })
-          ).resolves.toBe(false);
+          ).resolves.toBeFalse();
           expect(httpMock.getTrace()).toMatchSnapshot();
         });
       });
diff --git a/lib/platform/bitbucket/comments.spec.ts b/lib/platform/bitbucket/comments.spec.ts
index 8b2b5f60c38465e25b8d722afb42a9d9118169c7..db2ad35ed53cb68e8df4c01a96cf9b207b15d1f9 100644
--- a/lib/platform/bitbucket/comments.spec.ts
+++ b/lib/platform/bitbucket/comments.spec.ts
@@ -27,7 +27,7 @@ describe('platform/bitbucket/comments', () => {
           topic: 'topic',
           content: 'content',
         })
-      ).toBe(false);
+      ).toBeFalse();
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
 
@@ -47,7 +47,7 @@ describe('platform/bitbucket/comments', () => {
           topic: 'topic',
           content: 'content',
         })
-      ).toBe(true);
+      ).toBeTrue();
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
 
@@ -72,7 +72,7 @@ describe('platform/bitbucket/comments', () => {
         topic: 'some-subject',
         content: 'some\ncontent',
       });
-      expect(res).toBe(true);
+      expect(res).toBeTrue();
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
 
@@ -96,7 +96,7 @@ describe('platform/bitbucket/comments', () => {
           topic: null,
           content: 'blablabla',
         })
-      ).toBe(true);
+      ).toBeTrue();
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
   });
diff --git a/lib/platform/bitbucket/index.spec.ts b/lib/platform/bitbucket/index.spec.ts
index 27b42e88955f9a018b7bead79bb75e3cec1dd1a8..2a59c36dedfc1dc84851990a3d70cabf81ba233c 100644
--- a/lib/platform/bitbucket/index.spec.ts
+++ b/lib/platform/bitbucket/index.spec.ts
@@ -151,7 +151,7 @@ describe('platform/bitbucket/index', () => {
   describe('getRepoForceRebase()', () => {
     it('always return false, since bitbucket does not support force rebase', async () => {
       const actual = await bitbucket.getRepoForceRebase();
-      expect(actual).toBe(false);
+      expect(actual).toBeFalse();
     });
   });
 
@@ -906,7 +906,7 @@ describe('platform/bitbucket/index', () => {
         id: 5,
         strategy: 'rebase',
       });
-      expect(httpMock.getTrace()).toEqual([]);
+      expect(httpMock.getTrace()).toBeEmptyArray();
     });
 
     it('posts Merge with fast-forward', async () => {
diff --git a/lib/platform/bitbucket/utils.spec.ts b/lib/platform/bitbucket/utils.spec.ts
index a110fcc34ec759b1e2794a458a187715f9540ddc..e33ead8098c9970a283faf87828baf199446738c 100644
--- a/lib/platform/bitbucket/utils.spec.ts
+++ b/lib/platform/bitbucket/utils.spec.ts
@@ -38,6 +38,6 @@ describe('platform/bitbucket/utils', () => {
   it('isConflicted', () => {
     expect(
       utils.isConflicted([{ chunks: [{ changes: [{ content: '+=======' }] }] }])
-    ).toBe(true);
+    ).toBeTrue();
   });
 });
diff --git a/lib/platform/github/index.spec.ts b/lib/platform/github/index.spec.ts
index 880532cf53ee4d769a0597632e412fcb93536605..7357d96f11872babec5485debe6079647f9af45f 100644
--- a/lib/platform/github/index.spec.ts
+++ b/lib/platform/github/index.spec.ts
@@ -427,7 +427,7 @@ describe('platform/github/index', () => {
           },
         });
       const res = await github.getRepoForceRebase();
-      expect(res).toBe(true);
+      expect(res).toBeTrue();
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
     it('should handle 404', async () => {
@@ -436,7 +436,7 @@ describe('platform/github/index', () => {
         .get('/repos/undefined/branches/undefined/protection')
         .reply(404);
       const res = await github.getRepoForceRebase();
-      expect(res).toBe(false);
+      expect(res).toBeFalse();
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
     it('should handle 403', async () => {
@@ -445,7 +445,7 @@ describe('platform/github/index', () => {
         .get('/repos/undefined/branches/undefined/protection')
         .reply(403);
       const res = await github.getRepoForceRebase();
-      expect(res).toBe(false);
+      expect(res).toBeFalse();
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
     it('should throw 401', async () => {
@@ -2237,7 +2237,7 @@ describe('platform/github/index', () => {
           branchName: '',
           id: pr.number,
         })
-      ).toBe(true);
+      ).toBeTrue();
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
     it('should handle merge error', async () => {
@@ -2258,7 +2258,7 @@ describe('platform/github/index', () => {
           branchName: '',
           id: pr.number,
         })
-      ).toBe(false);
+      ).toBeFalse();
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
   });
@@ -2311,7 +2311,7 @@ describe('platform/github/index', () => {
           branchName: '',
           id: pr.number,
         })
-      ).toBe(true);
+      ).toBeTrue();
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
     it('should try squash after rebase', async () => {
@@ -2355,7 +2355,7 @@ describe('platform/github/index', () => {
           branchName: '',
           id: pr.number,
         })
-      ).toBe(true);
+      ).toBeTrue();
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
     it('should give up', async () => {
@@ -2382,7 +2382,7 @@ describe('platform/github/index', () => {
           branchName: '',
           id: pr.number,
         })
-      ).toBe(false);
+      ).toBeFalse();
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
   });
diff --git a/lib/platform/gitlab/index.spec.ts b/lib/platform/gitlab/index.spec.ts
index ab77b04d6f296f5f728b553045a621f8c053f897..0c553faf91dc280a80567d8a34a26768f3a5cc40 100644
--- a/lib/platform/gitlab/index.spec.ts
+++ b/lib/platform/gitlab/index.spec.ts
@@ -377,7 +377,7 @@ describe('platform/gitlab/index', () => {
           merge_method: 'merge',
         }
       );
-      expect(await gitlab.getRepoForceRebase()).toBe(false);
+      expect(await gitlab.getRepoForceRebase()).toBeFalse();
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
 
@@ -392,7 +392,7 @@ describe('platform/gitlab/index', () => {
           merge_method: 'ff',
         }
       );
-      expect(await gitlab.getRepoForceRebase()).toBe(true);
+      expect(await gitlab.getRepoForceRebase()).toBeTrue();
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
   });
@@ -1633,7 +1633,7 @@ describe('platform/gitlab/index', () => {
         });
       const pr = await gitlab.getPr(12345);
       expect(pr).toMatchSnapshot();
-      expect(pr.hasAssignees).toBe(false);
+      expect(pr.hasAssignees).toBeFalse();
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
     it('removes draft prefix from returned title', async () => {
@@ -1707,7 +1707,7 @@ describe('platform/gitlab/index', () => {
         .reply(200, [{ status: 'success' }]);
       const pr = await gitlab.getPr(12345);
       expect(pr).toMatchSnapshot();
-      expect(pr.hasAssignees).toBe(true);
+      expect(pr.hasAssignees).toBeTrue();
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
     it('returns the PR with nonexisting branch', async () => {
@@ -1734,7 +1734,7 @@ describe('platform/gitlab/index', () => {
         });
       const pr = await gitlab.getPr(12345);
       expect(pr).toMatchSnapshot();
-      expect(pr.hasAssignees).toBe(true);
+      expect(pr.hasAssignees).toBeTrue();
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
   });
diff --git a/lib/platform/index.spec.ts b/lib/platform/index.spec.ts
index 082622207698756be41fd2d7058d8445c84cb16a..743153328408f37fe3bc847ef5de8d058a2281e8 100644
--- a/lib/platform/index.spec.ts
+++ b/lib/platform/index.spec.ts
@@ -31,7 +31,7 @@ describe('platform/index', () => {
 
     for (const name of platforms.keys()) {
       const value = platforms.get(name);
-      expect(validate(value, name)).toBe(true);
+      expect(validate(value, name)).toBeTrue();
     }
   });
 
diff --git a/lib/util/fs/index.spec.ts b/lib/util/fs/index.spec.ts
index 2add18ff78231ba337417ef9b3f646090bcd15de..1a7732410c5dfd13c0cb75b4207f1cd889dc793f 100644
--- a/lib/util/fs/index.spec.ts
+++ b/lib/util/fs/index.spec.ts
@@ -40,10 +40,10 @@ describe('util/fs/index', () => {
 
   describe('localPathExists', () => {
     it('returns true for file', async () => {
-      expect(await localPathExists(__filename)).toBe(true);
+      expect(await localPathExists(__filename)).toBeTrue();
     });
     it('returns true for directory', async () => {
-      expect(await localPathExists(getSubDirectory(__filename))).toBe(true);
+      expect(await localPathExists(getSubDirectory(__filename))).toBeTrue();
     });
     it('returns false', async () => {
       expect(await localPathExists(__filename.replace('.ts', '.txt'))).toBe(
diff --git a/lib/util/git/index.spec.ts b/lib/util/git/index.spec.ts
index 90424d68fc08c30a98c06205bf76d467b19e83d4..b2b27b4e31f8f7447c16328bb1a4dfa89c1b4415 100644
--- a/lib/util/git/index.spec.ts
+++ b/lib/util/git/index.spec.ts
@@ -124,10 +124,10 @@ describe('util/git/index', () => {
   });
   describe('branchExists(branchName)', () => {
     it('should return true if found', () => {
-      expect(git.branchExists('renovate/future_branch')).toBe(true);
+      expect(git.branchExists('renovate/future_branch')).toBeTrue();
     });
     it('should return false if not found', () => {
-      expect(git.branchExists('not_found')).toBe(false);
+      expect(git.branchExists('not_found')).toBeFalse();
     });
   });
   describe('getBranchList()', () => {
@@ -140,32 +140,32 @@ describe('util/git/index', () => {
   });
   describe('isBranchStale()', () => {
     it('should return false if same SHA as master', async () => {
-      expect(await git.isBranchStale('renovate/future_branch')).toBe(false);
+      expect(await git.isBranchStale('renovate/future_branch')).toBeFalse();
     });
     it('should return true if SHA different from master', async () => {
-      expect(await git.isBranchStale('renovate/past_branch')).toBe(true);
+      expect(await git.isBranchStale('renovate/past_branch')).toBeTrue();
     });
     it('should return result even if non-default and not under branchPrefix', async () => {
-      expect(await git.isBranchStale('develop')).toBe(true);
-      expect(await git.isBranchStale('develop')).toBe(true); // cache
+      expect(await git.isBranchStale('develop')).toBeTrue();
+      expect(await git.isBranchStale('develop')).toBeTrue(); // cache
     });
   });
   describe('isBranchModified()', () => {
     it('should return false when branch is not found', async () => {
-      expect(await git.isBranchModified('renovate/not_found')).toBe(false);
+      expect(await git.isBranchModified('renovate/not_found')).toBeFalse();
     });
     it('should return false when author matches', async () => {
-      expect(await git.isBranchModified('renovate/future_branch')).toBe(false);
-      expect(await git.isBranchModified('renovate/future_branch')).toBe(false);
+      expect(await git.isBranchModified('renovate/future_branch')).toBeFalse();
+      expect(await git.isBranchModified('renovate/future_branch')).toBeFalse();
     });
     it('should return false when author is ignored', async () => {
       git.setUserRepoConfig({
         gitIgnoredAuthors: ['custom@example.com'],
       });
-      expect(await git.isBranchModified('renovate/custom_author')).toBe(false);
+      expect(await git.isBranchModified('renovate/custom_author')).toBeFalse();
     });
     it('should return true when custom author is unknown', async () => {
-      expect(await git.isBranchModified('renovate/custom_author')).toBe(true);
+      expect(await git.isBranchModified('renovate/custom_author')).toBeTrue();
     });
   });
 
@@ -513,7 +513,7 @@ describe('util/git/index', () => {
       });
 
       git.setUserRepoConfig({ branchPrefix: 'renovate/' });
-      expect(git.branchExists('renovate/test')).toBe(true);
+      expect(git.branchExists('renovate/test')).toBeTrue();
 
       await git.initRepo({
         url: base.path,
@@ -523,7 +523,7 @@ describe('util/git/index', () => {
       await repo.commit('past message3', ['--amend']);
 
       git.setUserRepoConfig({ branchPrefix: 'renovate/' });
-      expect(git.branchExists('renovate/test')).toBe(true);
+      expect(git.branchExists('renovate/test')).toBeTrue();
     });
 
     it('should fail clone ssh submodule', async () => {
diff --git a/lib/util/html.spec.ts b/lib/util/html.spec.ts
index a78a70ae965554c23669f980338553db1e93afb7..6f3564f723ffd41fda5976bed9db2ca6ec738e32 100644
--- a/lib/util/html.spec.ts
+++ b/lib/util/html.spec.ts
@@ -7,7 +7,7 @@ describe('util/html', () => {
     const div = body.childNodes[0] as HTMLElement;
     expect(div.tagName).toBe('DIV');
     expect(div.textContent).toBe('Hello, world!');
-    expect(div instanceof HTMLElement).toBe(true);
+    expect(div instanceof HTMLElement).toBeTrue();
   });
   it('returns empty', () => {
     const body = parse('');
diff --git a/lib/util/http/index.spec.ts b/lib/util/http/index.spec.ts
index c42837687d107251345e86500f286d9e0d058f64..5a9c9f47cc9f23af41edf2092ce6ada25267a44e 100644
--- a/lib/util/http/index.spec.ts
+++ b/lib/util/http/index.spec.ts
@@ -21,14 +21,14 @@ describe('util/http/index', () => {
     httpMock.scope(baseUrl).get('/test').reply(200);
     // FIXME: explicit assert condition
     expect(await http.get('http://renovate.com/test')).toMatchSnapshot();
-    expect(httpMock.allUsed()).toBe(true);
+    expect(httpMock.allUsed()).toBeTrue();
   });
   it('returns 429 error', async () => {
     httpMock.scope(baseUrl).get('/test').reply(429);
     await expect(http.get('http://renovate.com/test')).rejects.toThrow(
       'Response code 429 (Too Many Requests)'
     );
-    expect(httpMock.allUsed()).toBe(true);
+    expect(httpMock.allUsed()).toBeTrue();
   });
   it('converts 404 error to ExternalHostError', async () => {
     httpMock.scope(baseUrl).get('/test').reply(404);
@@ -36,7 +36,7 @@ describe('util/http/index', () => {
     await expect(http.get('http://renovate.com/test')).rejects.toThrow(
       EXTERNAL_HOST_ERROR
     );
-    expect(httpMock.allUsed()).toBe(true);
+    expect(httpMock.allUsed()).toBeTrue();
   });
   it('disables hosts', async () => {
     hostRules.add({ matchHost: 'renovate.com', enabled: false });
@@ -50,7 +50,7 @@ describe('util/http/index', () => {
     await expect(http.get('http://renovate.com/test')).rejects.toThrow(
       'Response code 404 (Not Found)'
     );
-    expect(httpMock.allUsed()).toBe(true);
+    expect(httpMock.allUsed()).toBeTrue();
   });
   it('getJson', async () => {
     httpMock.scope(baseUrl).get('/').reply(200, '{ "test": true }');
@@ -63,7 +63,7 @@ describe('util/http/index', () => {
     expect(
       await http.postJson('http://renovate.com', { body: {}, baseUrl })
     ).toMatchSnapshot();
-    expect(httpMock.allUsed()).toBe(true);
+    expect(httpMock.allUsed()).toBeTrue();
   });
   it('putJson', async () => {
     httpMock.scope(baseUrl).put('/').reply(200, {});
@@ -71,7 +71,7 @@ describe('util/http/index', () => {
     expect(
       await http.putJson('http://renovate.com', { body: {}, baseUrl })
     ).toMatchSnapshot();
-    expect(httpMock.allUsed()).toBe(true);
+    expect(httpMock.allUsed()).toBeTrue();
   });
   it('patchJson', async () => {
     httpMock.scope(baseUrl).patch('/').reply(200, {});
@@ -79,7 +79,7 @@ describe('util/http/index', () => {
     expect(
       await http.patchJson('http://renovate.com', { body: {}, baseUrl })
     ).toMatchSnapshot();
-    expect(httpMock.allUsed()).toBe(true);
+    expect(httpMock.allUsed()).toBeTrue();
   });
   it('deleteJson', async () => {
     httpMock.scope(baseUrl).delete('/').reply(200, {});
@@ -87,7 +87,7 @@ describe('util/http/index', () => {
     expect(
       await http.deleteJson('http://renovate.com', { body: {}, baseUrl })
     ).toMatchSnapshot();
-    expect(httpMock.allUsed()).toBe(true);
+    expect(httpMock.allUsed()).toBeTrue();
   });
   it('headJson', async () => {
     httpMock.scope(baseUrl).head('/').reply(200, {});
@@ -95,7 +95,7 @@ describe('util/http/index', () => {
     expect(
       await http.headJson('http://renovate.com', { baseUrl })
     ).toMatchSnapshot();
-    expect(httpMock.allUsed()).toBe(true);
+    expect(httpMock.allUsed()).toBeTrue();
   });
 
   it('stream', async () => {
@@ -120,7 +120,7 @@ describe('util/http/index', () => {
     await done;
 
     expect(data).toBe('{}');
-    expect(httpMock.allUsed()).toBe(true);
+    expect(httpMock.allUsed()).toBeTrue();
   });
 
   it('retries', async () => {
@@ -135,7 +135,7 @@ describe('util/http/index', () => {
         .reply(200, undefined, { 'x-some-header': 'abc' });
       // FIXME: explicit assert condition
       expect(await http.head('http://renovate.com')).toMatchSnapshot();
-      expect(httpMock.allUsed()).toBe(true);
+      expect(httpMock.allUsed()).toBeTrue();
     } finally {
       process.env.NODE_ENV = NODE_ENV;
     }
diff --git a/lib/util/index.spec.ts b/lib/util/index.spec.ts
index 2f2e7e85840841be34b8d974fae0fa05b5bd19c6..5f541ec3d5fb36db00d6a0574d167dc5fcf3e81d 100644
--- a/lib/util/index.spec.ts
+++ b/lib/util/index.spec.ts
@@ -10,19 +10,19 @@ describe('util/index', () => {
       expect(sampleSize(array, undefined)).toEqual(array);
     });
     it('returns full array for null number', () => {
-      expect(sampleSize(array, null)).toEqual([]);
+      expect(sampleSize(array, null)).toBeEmptyArray();
     });
     it('returns full array for 0 number', () => {
-      expect(sampleSize(array, 0)).toEqual([]);
+      expect(sampleSize(array, 0)).toBeEmptyArray();
     });
     it('returns empty array for null array', () => {
-      expect(sampleSize(null, 1)).toEqual([]);
+      expect(sampleSize(null, 1)).toBeEmptyArray();
     });
     it('returns empty array for undefined array', () => {
-      expect(sampleSize(undefined, 1)).toEqual([]);
+      expect(sampleSize(undefined, 1)).toBeEmptyArray();
     });
     it('returns empty array for empty array', () => {
-      expect(sampleSize([], 1)).toEqual([]);
+      expect(sampleSize([], 1)).toBeEmptyArray();
     });
   });
 });
diff --git a/lib/util/merge-confidence/index.spec.ts b/lib/util/merge-confidence/index.spec.ts
index 35374a87eb8ef7950f4d4d041e8a8cd590d4e959..4f619bb22035432b3077b6554d25e820853f1453 100644
--- a/lib/util/merge-confidence/index.spec.ts
+++ b/lib/util/merge-confidence/index.spec.ts
@@ -10,33 +10,33 @@ import {
 describe('util/merge-confidence/index', () => {
   describe('isActiveConfidenceLevel()', () => {
     it('returns false if null', () => {
-      expect(isActiveConfidenceLevel(null)).toBe(false);
+      expect(isActiveConfidenceLevel(null)).toBeFalse();
     });
 
     it('returns false if low', () => {
-      expect(isActiveConfidenceLevel('low')).toBe(false);
+      expect(isActiveConfidenceLevel('low')).toBeFalse();
     });
 
     it('returns false if nonsense', () => {
-      expect(isActiveConfidenceLevel('nonsense')).toBe(false);
+      expect(isActiveConfidenceLevel('nonsense')).toBeFalse();
     });
 
     it('returns true if valid value (high)', () => {
-      expect(isActiveConfidenceLevel('high')).toBe(true);
+      expect(isActiveConfidenceLevel('high')).toBeTrue();
     });
   });
 
   describe('satisfiesConfidenceLevel()', () => {
     it('returns false if less', () => {
-      expect(satisfiesConfidenceLevel('low', 'high')).toBe(false);
+      expect(satisfiesConfidenceLevel('low', 'high')).toBeFalse();
     });
 
     it('returns true if equal', () => {
-      expect(satisfiesConfidenceLevel('high', 'high')).toBe(true);
+      expect(satisfiesConfidenceLevel('high', 'high')).toBeTrue();
     });
 
     it('returns true if more', () => {
-      expect(satisfiesConfidenceLevel('very high', 'high')).toBe(true);
+      expect(satisfiesConfidenceLevel('very high', 'high')).toBeTrue();
     });
   });
 
diff --git a/lib/util/package-rules.spec.ts b/lib/util/package-rules.spec.ts
index baf0d0dce31fc8e0d2e8e3b4758d0abdd2f010c7..79647e1c675ab2dc69cf738bdafd32d4827c9e64 100644
--- a/lib/util/package-rules.spec.ts
+++ b/lib/util/package-rules.spec.ts
@@ -158,9 +158,9 @@ describe('util/package-rules', () => {
       ],
     };
     const res = applyPackageRules(dep);
-    expect(res.enabled).toBe(true);
+    expect(res.enabled).toBeTrue();
     const res2 = applyPackageRules({ ...dep, depName: 'anything' });
-    expect(res2.enabled).toBe(false);
+    expect(res2.enabled).toBeFalse();
   });
   it('matches anything if missing inclusive rules', () => {
     const config: TestConfig = {
diff --git a/lib/util/url.spec.ts b/lib/util/url.spec.ts
index c4cabd2281111407fa2e0cefc841f68c41b92d27..a971b62713b703759bdf7fd824515614790c963c 100644
--- a/lib/util/url.spec.ts
+++ b/lib/util/url.spec.ts
@@ -54,12 +54,12 @@ describe('util/url', () => {
   });
 
   it('validates URLs', () => {
-    expect(validateUrl()).toBe(false);
-    expect(validateUrl(null)).toBe(false);
-    expect(validateUrl('foo')).toBe(false);
-    expect(validateUrl('ssh://github.com')).toBe(false);
-    expect(validateUrl('http://github.com')).toBe(true);
-    expect(validateUrl('https://github.com')).toBe(true);
+    expect(validateUrl()).toBeFalse();
+    expect(validateUrl(null)).toBeFalse();
+    expect(validateUrl('foo')).toBeFalse();
+    expect(validateUrl('ssh://github.com')).toBeFalse();
+    expect(validateUrl('http://github.com')).toBeTrue();
+    expect(validateUrl('https://github.com')).toBeTrue();
   });
 
   it('parses URL', () => {
diff --git a/lib/versioning/index.spec.ts b/lib/versioning/index.spec.ts
index 92097568612a070718263e6add0d148cb808df8f..87f63c9526bb52cba5c97ddb88cbfc85ab9adef6 100644
--- a/lib/versioning/index.spec.ts
+++ b/lib/versioning/index.spec.ts
@@ -37,7 +37,7 @@ describe('versioning/index', () => {
 
     for (const name of vers.keys()) {
       const ver = vers.get(name);
-      expect(validate(ver, name)).toBe(true);
+      expect(validate(ver, name)).toBeTrue();
     }
   });
 
diff --git a/lib/versioning/node/index.spec.ts b/lib/versioning/node/index.spec.ts
index 26c8929f2553e9b71170b5d743a3a4c8fcc53e22..f3fb3383717118590323a4140dd3725ff253a096 100644
--- a/lib/versioning/node/index.spec.ts
+++ b/lib/versioning/node/index.spec.ts
@@ -54,6 +54,6 @@ describe('versioning/node/index', () => {
   });
 
   it('isValid', () => {
-    expect(isValid === nodever.isValid).toBe(true);
+    expect(isValid === nodever.isValid).toBeTrue();
   });
 });
diff --git a/lib/workers/branch/reuse.spec.ts b/lib/workers/branch/reuse.spec.ts
index b860bbf8f90c5e975626379f5fb63535d48d0e6b..edcbd3ce94de8dbaeb68e083238866aa9b387252 100644
--- a/lib/workers/branch/reuse.spec.ts
+++ b/lib/workers/branch/reuse.spec.ts
@@ -26,13 +26,13 @@ describe('workers/branch/reuse', () => {
     it('returns false if branch does not exist', async () => {
       git.branchExists.mockReturnValueOnce(false);
       const res = await shouldReuseExistingBranch(config);
-      expect(res.reuseExistingBranch).toBe(false);
+      expect(res.reuseExistingBranch).toBeFalse();
     });
     it('returns true if no PR', async () => {
       git.branchExists.mockReturnValueOnce(true);
       platform.getBranchPr.mockReturnValue(null);
       const res = await shouldReuseExistingBranch(config);
-      expect(res.reuseExistingBranch).toBe(true);
+      expect(res.reuseExistingBranch).toBeTrue();
     });
     it('returns true if does not need rebasing', async () => {
       git.branchExists.mockReturnValueOnce(true);
@@ -41,7 +41,7 @@ describe('workers/branch/reuse', () => {
         isConflicted: false,
       });
       const res = await shouldReuseExistingBranch(config);
-      expect(res.reuseExistingBranch).toBe(true);
+      expect(res.reuseExistingBranch).toBeTrue();
     });
 
     it('returns false if does not need rebasing but has upgrades that need lockfile maintenance along with upgrades that do not', async () => {
@@ -96,7 +96,7 @@ describe('workers/branch/reuse', () => {
       });
       git.isBranchModified.mockResolvedValueOnce(true);
       const res = await shouldReuseExistingBranch(config);
-      expect(res.reuseExistingBranch).toBe(true);
+      expect(res.reuseExistingBranch).toBeTrue();
     });
     it('returns true if unmergeable and can rebase, but rebaseWhen is never', async () => {
       config.rebaseWhen = 'never';
@@ -107,7 +107,7 @@ describe('workers/branch/reuse', () => {
       });
       git.isBranchModified.mockResolvedValueOnce(false);
       const res = await shouldReuseExistingBranch(config);
-      expect(res.reuseExistingBranch).toBe(true);
+      expect(res.reuseExistingBranch).toBeTrue();
     });
     it('returns false if PR title rebase!', async () => {
       git.branchExists.mockReturnValueOnce(true);
@@ -116,7 +116,7 @@ describe('workers/branch/reuse', () => {
         title: 'rebase!Update foo to v4',
       });
       const res = await shouldReuseExistingBranch(config);
-      expect(res.reuseExistingBranch).toBe(false);
+      expect(res.reuseExistingBranch).toBeFalse();
     });
     it('returns false if PR body check rebase', async () => {
       git.branchExists.mockReturnValueOnce(true);
@@ -126,7 +126,7 @@ describe('workers/branch/reuse', () => {
         body: 'blah\nblah\n- [x] <!-- rebase-check -->foo\n',
       });
       const res = await shouldReuseExistingBranch(config);
-      expect(res.reuseExistingBranch).toBe(false);
+      expect(res.reuseExistingBranch).toBeFalse();
     });
     it('returns false if manual rebase by label', async () => {
       git.branchExists.mockReturnValueOnce(true);
@@ -135,7 +135,7 @@ describe('workers/branch/reuse', () => {
         labels: ['rebase'],
       });
       const res = await shouldReuseExistingBranch(config);
-      expect(res.reuseExistingBranch).toBe(false);
+      expect(res.reuseExistingBranch).toBeFalse();
     });
     it('returns false if unmergeable and can rebase', async () => {
       git.branchExists.mockReturnValueOnce(true);
@@ -145,14 +145,14 @@ describe('workers/branch/reuse', () => {
       });
       git.isBranchModified.mockResolvedValueOnce(false);
       const res = await shouldReuseExistingBranch(config);
-      expect(res.reuseExistingBranch).toBe(false);
+      expect(res.reuseExistingBranch).toBeFalse();
     });
     it('returns true if automerge branch and not stale', async () => {
       config.automerge = true;
       config.automergeType = 'branch';
       git.branchExists.mockReturnValueOnce(true);
       const res = await shouldReuseExistingBranch(config);
-      expect(res.reuseExistingBranch).toBe(true);
+      expect(res.reuseExistingBranch).toBeTrue();
     });
     it('returns false if automerge branch and stale', async () => {
       config.rebaseWhen = 'auto';
@@ -161,7 +161,7 @@ describe('workers/branch/reuse', () => {
       git.branchExists.mockReturnValueOnce(true);
       git.isBranchStale.mockResolvedValueOnce(true);
       const res = await shouldReuseExistingBranch(config);
-      expect(res.reuseExistingBranch).toBe(false);
+      expect(res.reuseExistingBranch).toBeFalse();
     });
     it('returns true if rebaseWhen=behind-base-branch but cannot rebase', async () => {
       config.rebaseWhen = 'behind-base-branch';
@@ -173,7 +173,7 @@ describe('workers/branch/reuse', () => {
       });
       git.isBranchModified.mockResolvedValueOnce(true);
       const res = await shouldReuseExistingBranch(config);
-      expect(res.reuseExistingBranch).toBe(true);
+      expect(res.reuseExistingBranch).toBeTrue();
     });
 
     it('returns false if automerge pr and stale', async () => {
@@ -183,7 +183,7 @@ describe('workers/branch/reuse', () => {
       git.branchExists.mockReturnValueOnce(true);
       git.isBranchStale.mockResolvedValueOnce(true);
       const res = await shouldReuseExistingBranch(config);
-      expect(res.reuseExistingBranch).toBe(false);
+      expect(res.reuseExistingBranch).toBeFalse();
     });
 
     it('returns false if getRepoForceRebase and stale', async () => {
@@ -192,7 +192,7 @@ describe('workers/branch/reuse', () => {
       git.branchExists.mockReturnValueOnce(true);
       git.isBranchStale.mockResolvedValueOnce(true);
       const res = await shouldReuseExistingBranch(config);
-      expect(res.reuseExistingBranch).toBe(false);
+      expect(res.reuseExistingBranch).toBeFalse();
     });
 
     it('returns true if automerge, rebaseWhen=never and stale', async () => {
@@ -200,7 +200,7 @@ describe('workers/branch/reuse', () => {
       config.automerge = true;
       git.branchExists.mockReturnValueOnce(true);
       const res = await shouldReuseExistingBranch(config);
-      expect(res.reuseExistingBranch).toBe(true);
+      expect(res.reuseExistingBranch).toBeTrue();
       expect(git.isBranchStale).not.toHaveBeenCalled();
       expect(git.isBranchModified).not.toHaveBeenCalled();
     });
@@ -211,7 +211,7 @@ describe('workers/branch/reuse', () => {
       git.branchExists.mockReturnValueOnce(true);
       git.isBranchStale.mockResolvedValueOnce(true);
       const res = await shouldReuseExistingBranch(config);
-      expect(res.reuseExistingBranch).toBe(true);
+      expect(res.reuseExistingBranch).toBeTrue();
     });
   });
 });
diff --git a/lib/workers/branch/schedule.spec.ts b/lib/workers/branch/schedule.spec.ts
index c6f17ab03f8ee204d9d21bd7378eb75af22a276e..bfe2a4f9c77e325c68601df837c690fe364524fb 100644
--- a/lib/workers/branch/schedule.spec.ts
+++ b/lib/workers/branch/schedule.spec.ts
@@ -5,10 +5,10 @@ import * as schedule from './schedule';
 describe('workers/branch/schedule', () => {
   describe('hasValidTimezone(schedule)', () => {
     it('returns false for invalid timezone', () => {
-      expect(schedule.hasValidTimezone('Asia')[0]).toBe(false);
+      expect(schedule.hasValidTimezone('Asia')[0]).toBeFalse();
     });
     it('returns true for valid timezone', () => {
-      expect(schedule.hasValidTimezone('Asia/Singapore')[0]).toBe(true);
+      expect(schedule.hasValidTimezone('Asia/Singapore')[0]).toBeTrue();
     });
   });
   describe('hasValidSchedule(schedule)', () => {
@@ -16,24 +16,24 @@ describe('workers/branch/schedule', () => {
       jest.resetAllMocks();
     });
     it('returns true for null', () => {
-      expect(schedule.hasValidSchedule(null)[0]).toBe(true);
+      expect(schedule.hasValidSchedule(null)[0]).toBeTrue();
     });
     it('returns true for at any time', () => {
-      expect(schedule.hasValidSchedule('at any time')[0]).toBe(true);
+      expect(schedule.hasValidSchedule('at any time')[0]).toBeTrue();
     });
     it('returns false for invalid schedule', () => {
-      expect(schedule.hasValidSchedule(['foo'])[0]).toBe(false);
+      expect(schedule.hasValidSchedule(['foo'])[0]).toBeFalse();
     });
     it('returns false if any schedule fails to parse', () => {
-      expect(schedule.hasValidSchedule(['after 5:00pm', 'foo'])[0]).toBe(false);
+      expect(schedule.hasValidSchedule(['after 5:00pm', 'foo'])[0]).toBeFalse();
     });
     it('returns false if using minutes', () => {
       expect(
         schedule.hasValidSchedule(['every 15 mins every weekday'])[0]
-      ).toBe(false);
+      ).toBeFalse();
     });
     it('returns false if schedules have no days or time range', () => {
-      expect(schedule.hasValidSchedule(['at 5:00pm'])[0]).toBe(false);
+      expect(schedule.hasValidSchedule(['at 5:00pm'])[0]).toBeFalse();
     });
     it('returns false if any schedule has no days or time range', () => {
       expect(schedule.hasValidSchedule(['at 5:00pm', 'on saturday'])[0]).toBe(
@@ -41,7 +41,7 @@ describe('workers/branch/schedule', () => {
       );
     });
     it('returns false for every xday', () => {
-      expect(schedule.hasValidSchedule(['every friday'])[0]).toBe(false);
+      expect(schedule.hasValidSchedule(['every friday'])[0]).toBeFalse();
     });
     it('returns true if schedule has days of week', () => {
       expect(schedule.hasValidSchedule(['on friday and saturday'])[0]).toBe(
@@ -51,43 +51,43 @@ describe('workers/branch/schedule', () => {
     it('returns true for multi day schedules', () => {
       expect(
         schedule.hasValidSchedule(['after 5:00pm on wednesday and thursday'])[0]
-      ).toBe(true);
+      ).toBeTrue();
     });
     it('returns true if schedule has a start time', () => {
-      expect(schedule.hasValidSchedule(['after 8:00pm'])[0]).toBe(true);
+      expect(schedule.hasValidSchedule(['after 8:00pm'])[0]).toBeTrue();
     });
     it('returns true for first day of the month', () => {
       expect(
         schedule.hasValidSchedule(['on the first day of the month'])[0]
-      ).toBe(true);
+      ).toBeTrue();
     });
     it('returns true for schedules longer than 1 month', () => {
-      expect(schedule.hasValidSchedule(['every 3 months'])[0]).toBe(true);
-      expect(schedule.hasValidSchedule(['every 6 months'])[0]).toBe(true);
-      expect(schedule.hasValidSchedule(['every 12 months'])[0]).toBe(true);
+      expect(schedule.hasValidSchedule(['every 3 months'])[0]).toBeTrue();
+      expect(schedule.hasValidSchedule(['every 6 months'])[0]).toBeTrue();
+      expect(schedule.hasValidSchedule(['every 12 months'])[0]).toBeTrue();
     });
     it('returns true if schedule has an end time', () => {
-      expect(schedule.hasValidSchedule(['before 6:00am'])[0]).toBe(true);
+      expect(schedule.hasValidSchedule(['before 6:00am'])[0]).toBeTrue();
     });
     it('returns true if schedule has a start and end time', () => {
       expect(
         schedule.hasValidSchedule(['after 11:00pm and before 6:00am'])[0]
-      ).toBe(true);
+      ).toBeTrue();
     });
     it('returns true if schedule has days and a start and end time', () => {
       expect(
         schedule.hasValidSchedule([
           'after 11:00pm and before 6:00am every weekday',
         ])[0]
-      ).toBe(true);
+      ).toBeTrue();
     });
     it('massages schedules', () => {
       expect(
         schedule.hasValidSchedule([
           'before 3am on the first day of the month',
         ])[0]
-      ).toBe(true);
-      expect(schedule.hasValidSchedule(['every month'])[0]).toBe(true);
+      ).toBeTrue();
+      expect(schedule.hasValidSchedule(['every month'])[0]).toBeTrue();
     });
     it('supports hours shorthand', () => {
       const [res] = schedule.hasValidSchedule([
@@ -100,7 +100,7 @@ describe('workers/branch/schedule', () => {
         'before 5am every weekday',
         'every weekend',
       ]);
-      expect(res).toBe(true);
+      expect(res).toBeTrue();
     });
   });
   describe('isScheduledNow(config)', () => {
@@ -112,48 +112,48 @@ describe('workers/branch/schedule', () => {
     });
     it('returns true if no schedule', () => {
       const res = schedule.isScheduledNow(config);
-      expect(res).toBe(true);
+      expect(res).toBeTrue();
     });
     it('returns true if at any time', () => {
       config.schedule = 'at any time' as never;
       const res = schedule.isScheduledNow(config);
-      expect(res).toBe(true);
+      expect(res).toBeTrue();
     });
     it('returns true if at any time array', () => {
       config.schedule = ['at any time'];
       const res = schedule.isScheduledNow(config);
-      expect(res).toBe(true);
+      expect(res).toBeTrue();
     });
     it('returns true if invalid schedule', () => {
       config.schedule = ['every 15 minutes'];
       const res = schedule.isScheduledNow(config);
-      expect(res).toBe(true);
+      expect(res).toBeTrue();
     });
     it('returns true if invalid timezone', () => {
       config.schedule = ['after 4:00pm'];
       config.timezone = 'Asia';
       const res = schedule.isScheduledNow(config);
-      expect(res).toBe(true);
+      expect(res).toBeTrue();
     });
     it('supports before hours true', () => {
       config.schedule = ['before 4:00pm'];
       const res = schedule.isScheduledNow(config);
-      expect(res).toBe(true);
+      expect(res).toBeTrue();
     });
     it('supports before hours false', () => {
       config.schedule = ['before 4:00am'];
       const res = schedule.isScheduledNow(config);
-      expect(res).toBe(false);
+      expect(res).toBeFalse();
     });
     it('massages string', () => {
       config.schedule = 'before 4:00am' as never;
       const res = schedule.isScheduledNow(config);
-      expect(res).toBe(false);
+      expect(res).toBeFalse();
     });
     it('supports outside hours', () => {
       config.schedule = ['after 4:00pm'];
       const res = schedule.isScheduledNow(config);
-      expect(res).toBe(false);
+      expect(res).toBeFalse();
     });
     describe('supports timezone', () => {
       const cases: [string, string, string, boolean][] = [
@@ -183,96 +183,96 @@ describe('workers/branch/schedule', () => {
     it('supports multiple schedules', () => {
       config.schedule = ['after 4:00pm', 'before 11:00am'];
       const res = schedule.isScheduledNow(config);
-      expect(res).toBe(true);
+      expect(res).toBeTrue();
     });
     it('supports day match', () => {
       config.schedule = ['on friday and saturday'];
       const res = schedule.isScheduledNow(config);
-      expect(res).toBe(true);
+      expect(res).toBeTrue();
     });
     it('supports day mismatch', () => {
       config.schedule = ['on monday and tuesday'];
       const res = schedule.isScheduledNow(config);
-      expect(res).toBe(false);
+      expect(res).toBeFalse();
     });
     it('supports every weekday', () => {
       config.schedule = ['every weekday'];
       const res = schedule.isScheduledNow(config);
-      expect(res).toBe(true);
+      expect(res).toBeTrue();
     });
     it('supports every weekend', () => {
       config.schedule = ['every weekend'];
       const res = schedule.isScheduledNow(config);
-      expect(res).toBe(false);
+      expect(res).toBeFalse();
     });
     it('supports every weekday with time', () => {
       config.schedule = ['before 11:00am every weekday'];
       const res = schedule.isScheduledNow(config);
-      expect(res).toBe(true);
+      expect(res).toBeTrue();
     });
     it('supports o every weekday', () => {
       config.schedule = ['before 11:00am on inevery weekday'];
       const res = schedule.isScheduledNow(config);
-      expect(res).toBe(true);
+      expect(res).toBeTrue();
     });
     it('rejects first day of the month', () => {
       config.schedule = ['before 11am on the first day of the month'];
       const res = schedule.isScheduledNow(config);
-      expect(res).toBe(false);
+      expect(res).toBeFalse();
     });
     it('approves first day of the month', () => {
       config.schedule = ['before 11am on the first day of the month'];
       mockDate.set('2017-10-01T05:26:06.000'); // Locally Sunday, 1 October 2017 05:26:06
       const res = schedule.isScheduledNow(config);
-      expect(res).toBe(true);
+      expect(res).toBeTrue();
     });
     it('approves valid weeks of year', () => {
       config.schedule = ['every 2 weeks of the year before 08:00 on Monday'];
       mockDate.set('2017-01-02T06:00:00.000'); // Locally Monday, 2 January 2017 6am (first Monday of the year)
       const res = schedule.isScheduledNow(config);
-      expect(res).toBe(true);
+      expect(res).toBeTrue();
     });
     it('rejects on weeks of year', () => {
       config.schedule = ['every 2 weeks of the year before 08:00 on Monday'];
       mockDate.set('2017-01-09T06:00:00.000'); // Locally Monday, 2 January 2017 6am (second Monday of the year)
       const res = schedule.isScheduledNow(config);
-      expect(res).toBe(false);
+      expect(res).toBeFalse();
     });
     it('approves on months of year', () => {
       config.schedule = ['of January'];
       mockDate.set('2017-01-02T06:00:00.000'); // Locally Monday, 2 January 2017 6am
       const res = schedule.isScheduledNow(config);
-      expect(res).toBe(true);
+      expect(res).toBeTrue();
     });
     it('rejects on months of year', () => {
       config.schedule = ['of January'];
       mockDate.set('2017-02-02T06:00:00.000'); // Locally Thursday, 2 February 2017 6am
       const res = schedule.isScheduledNow(config);
-      expect(res).toBe(false);
+      expect(res).toBeFalse();
     });
     it('approves schedule longer than 1 month', () => {
       config.schedule = ['every 3 months'];
       mockDate.set('2017-07-01T06:00:00.000'); // Locally Saturday, 1 July 2017 6am
       const res = schedule.isScheduledNow(config);
-      expect(res).toBe(true);
+      expect(res).toBeTrue();
     });
     it('rejects schedule longer than 1 month', () => {
       config.schedule = ['every 6 months'];
       mockDate.set('2017-02-01T06:00:00.000'); // Locally Thursday, 2 February 2017 6am
       const res = schedule.isScheduledNow(config);
-      expect(res).toBe(false);
+      expect(res).toBeFalse();
     });
     it('approves schedule longer than 1 month with day of month', () => {
       config.schedule = ['every 3 months on the first day of the month'];
       mockDate.set('2017-07-01T06:00:00.000'); // Locally Saturday, 1 July 2017 6am
       const res = schedule.isScheduledNow(config);
-      expect(res).toBe(true);
+      expect(res).toBeTrue();
     });
     it('rejects schedule longer than 1 month with day of month', () => {
       config.schedule = ['every 3 months on the first day of the month'];
       mockDate.set('2017-02-01T06:00:00.000'); // Locally Thursday, 2 February 2017 6am
       const res = schedule.isScheduledNow(config);
-      expect(res).toBe(false);
+      expect(res).toBeFalse();
     });
     it('supports weekday instances', () => {
       config.schedule = ['on Monday on the first day instance'];
diff --git a/lib/workers/global/config/parse/env.spec.ts b/lib/workers/global/config/parse/env.spec.ts
index 49ae1318c2d94edcdb1f937fbdc2893fbebae3e4..fdf3b573f78c00aea4d488a293b587656d0535dc 100644
--- a/lib/workers/global/config/parse/env.spec.ts
+++ b/lib/workers/global/config/parse/env.spec.ts
@@ -10,15 +10,15 @@ describe('workers/global/config/parse/env', () => {
     });
     it('supports boolean true', () => {
       const envParam: NodeJS.ProcessEnv = { RENOVATE_RECREATE_CLOSED: 'true' };
-      expect(env.getConfig(envParam).recreateClosed).toBe(true);
+      expect(env.getConfig(envParam).recreateClosed).toBeTrue();
     });
     it('supports boolean false', () => {
       const envParam: NodeJS.ProcessEnv = { RENOVATE_RECREATE_CLOSED: 'false' };
-      expect(env.getConfig(envParam).recreateClosed).toBe(false);
+      expect(env.getConfig(envParam).recreateClosed).toBeFalse();
     });
     it('supports boolean nonsense as false', () => {
       const envParam: NodeJS.ProcessEnv = { RENOVATE_RECREATE_CLOSED: 'foo' };
-      expect(env.getConfig(envParam).recreateClosed).toBe(false);
+      expect(env.getConfig(envParam).recreateClosed).toBeFalse();
     });
     delete process.env.RENOVATE_RECREATE_CLOSED;
     it('supports list single', () => {
@@ -266,7 +266,7 @@ describe('workers/global/config/parse/env', () => {
         RENOVATE_TOKEN: 'a',
       };
       const config = env.getConfig(envParam);
-      expect(config.enabled).toBe(false);
+      expect(config.enabled).toBeFalse();
       expect(config.token).toBe('a');
     });
     describe('malformed RENOVATE_CONFIG', () => {
diff --git a/lib/workers/global/limits.spec.ts b/lib/workers/global/limits.spec.ts
index 70513dd4ee0b8d3ff1f0bb06ebd962448e0ac957..db6764e50301c65dcffd7e4b72e8267e93aef5db 100644
--- a/lib/workers/global/limits.spec.ts
+++ b/lib/workers/global/limits.spec.ts
@@ -18,41 +18,41 @@ describe('workers/global/limits', () => {
   it('increments limited value', () => {
     setMaxLimit(Limit.Commits, 3);
 
-    expect(isLimitReached(Limit.Commits)).toBe(false);
+    expect(isLimitReached(Limit.Commits)).toBeFalse();
 
     incLimitedValue(Limit.Commits, 2);
-    expect(isLimitReached(Limit.Commits)).toBe(false);
+    expect(isLimitReached(Limit.Commits)).toBeFalse();
 
     incLimitedValue(Limit.Commits);
-    expect(isLimitReached(Limit.Commits)).toBe(true);
+    expect(isLimitReached(Limit.Commits)).toBeTrue();
 
     incLimitedValue(Limit.Commits);
-    expect(isLimitReached(Limit.Commits)).toBe(true);
+    expect(isLimitReached(Limit.Commits)).toBeTrue();
   });
 
   it('defaults to unlimited', () => {
-    expect(isLimitReached(Limit.Commits)).toBe(false);
+    expect(isLimitReached(Limit.Commits)).toBeFalse();
   });
 
   it('increments undefined', () => {
     incLimitedValue(Limit.Commits);
-    expect(isLimitReached(Limit.Commits)).toBe(false);
+    expect(isLimitReached(Limit.Commits)).toBeFalse();
   });
 
   it('resets counter', () => {
     setMaxLimit(Limit.Commits, 1);
     incLimitedValue(Limit.Commits);
-    expect(isLimitReached(Limit.Commits)).toBe(true);
+    expect(isLimitReached(Limit.Commits)).toBeTrue();
     setMaxLimit(Limit.Commits, 1);
-    expect(isLimitReached(Limit.Commits)).toBe(false);
+    expect(isLimitReached(Limit.Commits)).toBeFalse();
   });
 
   it('resets limit', () => {
     setMaxLimit(Limit.Commits, 1);
     incLimitedValue(Limit.Commits);
-    expect(isLimitReached(Limit.Commits)).toBe(true);
+    expect(isLimitReached(Limit.Commits)).toBeTrue();
     setMaxLimit(Limit.Commits, null);
-    expect(isLimitReached(Limit.Commits)).toBe(false);
+    expect(isLimitReached(Limit.Commits)).toBeFalse();
   });
 
   it('sets non-positive limit as reached', () => {
diff --git a/lib/workers/pr/changelog/release-notes.spec.ts b/lib/workers/pr/changelog/release-notes.spec.ts
index 9967a40d7936ac1268081fab4f401716ee083ff2..fbb145bc4c7122da3ab4527bb6914ac27b95b0e4 100644
--- a/lib/workers/pr/changelog/release-notes.spec.ts
+++ b/lib/workers/pr/changelog/release-notes.spec.ts
@@ -125,7 +125,7 @@ describe('workers/pr/changelog/release-notes', () => {
   describe('getReleaseList()', () => {
     it('should return empty array if no apiBaseUrl', async () => {
       const res = await getReleaseList({} as ChangeLogProject);
-      expect(res).toEqual([]);
+      expect(res).toBeEmptyArray();
     });
 
     it('should return release list for github repo', async () => {
diff --git a/lib/workers/pr/code-owners.spec.ts b/lib/workers/pr/code-owners.spec.ts
index 8832dfddbd9f4ddae4f24217cced4e86bd47c453..5c33cb228c0d953b3ea6abac202f38cf8a8e1c2a 100644
--- a/lib/workers/pr/code-owners.spec.ts
+++ b/lib/workers/pr/code-owners.spec.ts
@@ -45,7 +45,7 @@ describe('workers/pr/code-owners', () => {
       fs.readLocalFile.mockResolvedValueOnce(null);
       git.getBranchFiles.mockResolvedValueOnce(['package.json']);
       const codeOwners = await codeOwnersForPr(pr);
-      expect(codeOwners).toEqual([]);
+      expect(codeOwners).toBeEmptyArray();
     });
     it('returns empty array when no code owners match', async () => {
       fs.readLocalFile.mockResolvedValueOnce(
@@ -60,7 +60,7 @@ describe('workers/pr/code-owners', () => {
         throw new Error();
       });
       const codeOwners = await codeOwnersForPr(pr);
-      expect(codeOwners).toEqual([]);
+      expect(codeOwners).toBeEmptyArray();
     });
     const codeOwnerFilePaths = [
       'CODEOWNERS',
diff --git a/lib/workers/repository/onboarding/branch/index.spec.ts b/lib/workers/repository/onboarding/branch/index.spec.ts
index 035718e18022ffc326f34bc3fdd64d5e6b2e132a..a3c45516a9ae7739c15cf9f7c3fcab8d07631e3d 100644
--- a/lib/workers/repository/onboarding/branch/index.spec.ts
+++ b/lib/workers/repository/onboarding/branch/index.spec.ts
@@ -95,14 +95,14 @@ describe('workers/repository/onboarding/branch/index', () => {
       config.requireConfig = false;
       config.onboarding = false;
       const res = await checkOnboardingBranch(config);
-      expect(res.repoIsOnboarded).toBe(true);
+      expect(res.repoIsOnboarded).toBeTrue();
     });
     it('handles skipped onboarding, requireConfig=true, and a config file', async () => {
       config.requireConfig = true;
       config.onboarding = false;
       git.getFileList.mockResolvedValueOnce(['renovate.json']);
       const res = await checkOnboardingBranch(config);
-      expect(res.repoIsOnboarded).toBe(true);
+      expect(res.repoIsOnboarded).toBeTrue();
     });
     it('handles skipped onboarding, requireConfig=true, and no config file', async () => {
       config.requireConfig = true;
@@ -115,21 +115,21 @@ describe('workers/repository/onboarding/branch/index', () => {
     it('detects repo is onboarded via file', async () => {
       git.getFileList.mockResolvedValueOnce(['renovate.json']);
       const res = await checkOnboardingBranch(config);
-      expect(res.repoIsOnboarded).toBe(true);
+      expect(res.repoIsOnboarded).toBeTrue();
     });
 
     it('handles removed cached file name', async () => {
       cache.getCache.mockReturnValue({ configFileName: '.renovaterc' });
       git.getFileList.mockResolvedValueOnce(['renovate.json']);
       const res = await checkOnboardingBranch(config);
-      expect(res.repoIsOnboarded).toBe(true);
+      expect(res.repoIsOnboarded).toBeTrue();
     });
 
     it('handles cached file name', async () => {
       cache.getCache.mockReturnValue({ configFileName: '.renovaterc' });
       platform.getJsonFile.mockResolvedValueOnce({});
       const res = await checkOnboardingBranch(config);
-      expect(res.repoIsOnboarded).toBe(true);
+      expect(res.repoIsOnboarded).toBeTrue();
     });
 
     it('handles cached package.json', async () => {
@@ -137,20 +137,20 @@ describe('workers/repository/onboarding/branch/index', () => {
       platform.getJsonFile.mockResolvedValueOnce({ renovate: {} });
       fs.readLocalFile.mockResolvedValueOnce('{}');
       const res = await checkOnboardingBranch(config);
-      expect(res.repoIsOnboarded).toBe(true);
+      expect(res.repoIsOnboarded).toBeTrue();
     });
 
     it('detects repo is onboarded via package.json config', async () => {
       git.getFileList.mockResolvedValueOnce(['package.json']);
       fs.readLocalFile.mockResolvedValueOnce('{"renovate":{}}');
       const res = await checkOnboardingBranch(config);
-      expect(res.repoIsOnboarded).toBe(true);
+      expect(res.repoIsOnboarded).toBeTrue();
     });
     it('detects repo is onboarded via PR', async () => {
       config.requireConfig = false;
       platform.findPr.mockResolvedValueOnce(mock<Pr>());
       const res = await checkOnboardingBranch(config);
-      expect(res.repoIsOnboarded).toBe(true);
+      expect(res.repoIsOnboarded).toBeTrue();
     });
     it('throws if no required config', async () => {
       config.requireConfig = true;
@@ -170,7 +170,7 @@ describe('workers/repository/onboarding/branch/index', () => {
       platform.getBranchPr.mockResolvedValueOnce(mock<Pr>());
       rebase.rebaseOnboardingBranch.mockResolvedValueOnce('123test');
       const res = await checkOnboardingBranch(config);
-      expect(res.repoIsOnboarded).toBe(false);
+      expect(res.repoIsOnboarded).toBeFalse();
       expect(res.branchList).toEqual(['renovate/configure']);
       expect(git.checkoutBranch).toHaveBeenCalledTimes(1);
       expect(git.commitFiles).toHaveBeenCalledTimes(0);
diff --git a/lib/workers/repository/onboarding/pr/base-branch.spec.ts b/lib/workers/repository/onboarding/pr/base-branch.spec.ts
index bd0993b32d895f4c7476721dbfdf3db700af0e28..220da0b7c7731f0fab19cc70548a24daa4362b2c 100644
--- a/lib/workers/repository/onboarding/pr/base-branch.spec.ts
+++ b/lib/workers/repository/onboarding/pr/base-branch.spec.ts
@@ -11,7 +11,7 @@ describe('workers/repository/onboarding/pr/base-branch', () => {
     });
     it('returns empty if no baseBranch', () => {
       const res = getBaseBranchDesc(config);
-      expect(res).toEqual('');
+      expect(res).toBeEmptyString();
     });
     it('describes baseBranch', () => {
       config.baseBranches = ['some-branch'];
diff --git a/lib/workers/repository/process/lookup/filter-checks.spec.ts b/lib/workers/repository/process/lookup/filter-checks.spec.ts
index 7ab19a7a28573c42cd26e4064b0870fb3f6384d9..d9898d6204b79ed538691275bf78b0700686bfca 100644
--- a/lib/workers/repository/process/lookup/filter-checks.spec.ts
+++ b/lib/workers/repository/process/lookup/filter-checks.spec.ts
@@ -58,7 +58,7 @@ describe('workers/repository/process/lookup/filter-checks', () => {
         sortedReleases
       );
       expect(res).toMatchSnapshot();
-      expect(res.pendingChecks).toBe(false);
+      expect(res.pendingChecks).toBeFalse();
       expect(res.pendingReleases).toHaveLength(0);
       expect(res.release.version).toEqual('1.0.4');
     });
@@ -73,7 +73,7 @@ describe('workers/repository/process/lookup/filter-checks', () => {
         sortedReleases
       );
       expect(res).toMatchSnapshot();
-      expect(res.pendingChecks).toBe(false);
+      expect(res.pendingChecks).toBeFalse();
       expect(res.pendingReleases).toHaveLength(0);
       expect(res.release.version).toEqual('1.0.4');
     });
@@ -88,7 +88,7 @@ describe('workers/repository/process/lookup/filter-checks', () => {
         sortedReleases
       );
       expect(res).toMatchSnapshot();
-      expect(res.pendingChecks).toBe(true);
+      expect(res.pendingChecks).toBeTrue();
       expect(res.pendingReleases).toHaveLength(0);
       expect(res.release.version).toEqual('1.0.4');
     });
@@ -103,7 +103,7 @@ describe('workers/repository/process/lookup/filter-checks', () => {
         sortedReleases
       );
       expect(res).toMatchSnapshot();
-      expect(res.pendingChecks).toBe(false);
+      expect(res.pendingChecks).toBeFalse();
       expect(res.pendingReleases).toHaveLength(2);
       expect(res.release.version).toEqual('1.0.2');
     });
@@ -118,7 +118,7 @@ describe('workers/repository/process/lookup/filter-checks', () => {
         sortedReleases
       );
       expect(res).toMatchSnapshot();
-      expect(res.pendingChecks).toBe(false);
+      expect(res.pendingChecks).toBeFalse();
       expect(res.pendingReleases).toHaveLength(2);
       expect(res.release.version).toEqual('1.0.2');
     });
@@ -134,7 +134,7 @@ describe('workers/repository/process/lookup/filter-checks', () => {
         sortedReleases
       );
       expect(res).toMatchSnapshot();
-      expect(res.pendingChecks).toBe(false);
+      expect(res.pendingChecks).toBeFalse();
       expect(res.pendingReleases).toHaveLength(0);
       expect(res.release.version).toEqual('1.0.4');
     });
@@ -149,7 +149,7 @@ describe('workers/repository/process/lookup/filter-checks', () => {
         sortedReleases
       );
       expect(res).toMatchSnapshot();
-      expect(res.pendingChecks).toBe(false);
+      expect(res.pendingChecks).toBeFalse();
       expect(res.pendingReleases).toHaveLength(1);
       expect(res.release.version).toEqual('1.0.3');
     });
@@ -169,7 +169,7 @@ describe('workers/repository/process/lookup/filter-checks', () => {
         sortedReleases
       );
       expect(res).toMatchSnapshot();
-      expect(res.pendingChecks).toBe(false);
+      expect(res.pendingChecks).toBeFalse();
       expect(res.pendingReleases).toHaveLength(3);
       expect(res.release.version).toEqual('1.0.1');
     });
diff --git a/lib/workers/repository/process/lookup/index.spec.ts b/lib/workers/repository/process/lookup/index.spec.ts
index 52547b1c3252c63685bc01a1d768a0eef7a03b7c..b1db1cba7cc65bb99775370b3d3933a5fc6cd0c6 100644
--- a/lib/workers/repository/process/lookup/index.spec.ts
+++ b/lib/workers/repository/process/lookup/index.spec.ts
@@ -747,7 +747,7 @@ describe('workers/repository/process/lookup/index', () => {
       const res = await lookup.lookupUpdates(config);
       expect(res.updates).toHaveLength(1);
       expect(res.updates[0].newVersion).toEqual('1.4.6');
-      expect(res.updates[0].pendingChecks).toBe(true);
+      expect(res.updates[0].pendingChecks).toBeTrue();
     });
 
     it('should return pendingVersions', async () => {
diff --git a/lib/workers/repository/updates/branchify.spec.ts b/lib/workers/repository/updates/branchify.spec.ts
index 37ec32683888e4c4d7c01648c5f3fbf3a3516fda..fff5fe18cd7974ab2a3cd540cf7eac69e684c5de 100644
--- a/lib/workers/repository/updates/branchify.spec.ts
+++ b/lib/workers/repository/updates/branchify.spec.ts
@@ -23,7 +23,7 @@ describe('workers/repository/updates/branchify', () => {
     it('returns empty', async () => {
       flattenUpdates.mockResolvedValueOnce([]);
       const res = await branchifyUpgrades(config, {});
-      expect(res.branches).toEqual([]);
+      expect(res.branches).toBeEmptyArray();
     });
     it('returns one branch if one input', async () => {
       flattenUpdates.mockResolvedValueOnce([
diff --git a/lib/workers/repository/updates/generate.spec.ts b/lib/workers/repository/updates/generate.spec.ts
index bc6cdbd97f55d5b0d783955f87de71e908d11b4a..0a767cec1fc6f48cdbd20d7514461548fe867082 100644
--- a/lib/workers/repository/updates/generate.spec.ts
+++ b/lib/workers/repository/updates/generate.spec.ts
@@ -147,7 +147,7 @@ describe('workers/repository/updates/generate', () => {
       expect(res.foo).toBe(2);
       expect(res.groupName).toBeDefined();
       expect(res.releaseTimestamp).toEqual('2017-02-07T20:01:41+00:00');
-      expect(res.automerge).toBe(false);
+      expect(res.automerge).toBeFalse();
       expect(res.constraints).toEqual({
         foo: '1.0.0',
         bar: '2.0.0',
@@ -189,7 +189,7 @@ describe('workers/repository/updates/generate', () => {
       const res = generateBranchConfig(branch);
       expect(res.foo).toBe(2);
       expect(res.singleVersion).toBeUndefined();
-      expect(res.recreateClosed).toBe(true);
+      expect(res.recreateClosed).toBeTrue();
       expect(res.groupName).toBeDefined();
       expect(res.releaseTimestamp).toEqual('2017-02-08T20:01:41+00:00');
     });
@@ -227,7 +227,7 @@ describe('workers/repository/updates/generate', () => {
       const res = generateBranchConfig(branch);
       expect(res.foo).toBe(2);
       expect(res.singleVersion).toBeUndefined();
-      expect(res.recreateClosed).toBe(true);
+      expect(res.recreateClosed).toBeTrue();
       expect(res.groupName).toBeDefined();
     });
     it('fixes different messages', () => {
@@ -427,7 +427,7 @@ describe('workers/repository/updates/generate', () => {
         },
       ];
       const res = generateBranchConfig(branch);
-      expect(res.recreateClosed).toBe(false);
+      expect(res.recreateClosed).toBeFalse();
       expect(res.groupName).toBeUndefined();
       // FIXME: explicit assert condition
       expect(generateBranchConfig(branch)).toMatchSnapshot();
@@ -570,7 +570,7 @@ describe('workers/repository/updates/generate', () => {
         },
       ];
       const res = generateBranchConfig(branch);
-      expect(res.pendingChecks).toBe(true);
+      expect(res.pendingChecks).toBeTrue();
       expect(res.upgrades).toHaveLength(2);
     });
     it('filters pendingChecks', () => {
diff --git a/package.json b/package.json
index a34b366e4e241eacdf62f382a98de77250714709..4242c6840d8453a131085f67198da2772b39e542 100644
--- a/package.json
+++ b/package.json
@@ -250,6 +250,7 @@
     "eslint-plugin-import": "2.25.2",
     "eslint-plugin-jest": "24.7.0",
     "eslint-plugin-promise": "5.1.0",
+    "expect-more-jest": "5.4.0",
     "glob": "7.2.0",
     "graphql": "15.6.1",
     "husky": "7.0.2",
diff --git a/test/setup.ts b/test/setup.ts
index 2db5c830f2249dc40ec3c58c9de8a6da24dc0599..c08c2d79e468d870c686c73c0f1906e158e24905 100644
--- a/test/setup.ts
+++ b/test/setup.ts
@@ -1,5 +1,6 @@
 // Check for missing or pending http mocks
 import './http-mock';
+import 'expect-more-jest';
 
 jest.mock('../lib/platform', () => ({
   platform: jest.createMockFromModule('../lib/platform/github'),
diff --git a/yarn.lock b/yarn.lock
index cb60fda245b8c84ed17245332a59dcca28fdbae2..df2bed22bfb6fd4f96f275ae21293df72b13f767 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -988,7 +988,7 @@
   resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c"
   integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==
 
-"@isaacs/string-locale-compare@*", "@isaacs/string-locale-compare@^1.0.1":
+"@isaacs/string-locale-compare@^1.0.1", "@isaacs/string-locale-compare@^1.1.0":
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz#291c227e93fd407a96ecd59879a35809120e432b"
   integrity sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==
@@ -1214,7 +1214,7 @@
     "@types/yargs" "^15.0.0"
     chalk "^4.0.0"
 
-"@jest/types@^27.2.5":
+"@jest/types@^27.0.6", "@jest/types@^27.2.5":
   version "27.2.5"
   resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.2.5.tgz#420765c052605e75686982d24b061b4cbba22132"
   integrity sha512-nmuM4VuDtCZcY+eTpw+0nvstwReMsjPoj7ZR80/BbixulhLaiX+fbv8oeLW8WZlJMcsGQsTmMKT/iTZu1Uy/lQ==
@@ -1263,20 +1263,20 @@
     "@nodelib/fs.scandir" "2.1.5"
     fastq "^1.6.0"
 
-"@npmcli/arborist@*", "@npmcli/arborist@^3.0.0":
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-3.0.0.tgz#fcd2416dc153aefa1e3ca5436eacbf4de5f09662"
-  integrity sha512-zAmy3LwjQ81HKYA8Z4Uao8Re+ydiad2sDKI+PKe2loqDXnFolm69LIGmHp8+7BPWX1CAJCs1/XRNTLdXmuMZZw==
+"@npmcli/arborist@^2.3.0", "@npmcli/arborist@^2.5.0", "@npmcli/arborist@^2.9.0":
+  version "2.10.0"
+  resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-2.10.0.tgz#424c2d73a7ae59c960b0cc7f74fed043e4316c2c"
+  integrity sha512-CLnD+zXG9oijEEzViimz8fbOoFVb7hoypiaf7p6giJhvYtrxLAyY3cZAMPIFQvsG731+02eMDp3LqVBNo7BaZA==
   dependencies:
     "@isaacs/string-locale-compare" "^1.0.1"
     "@npmcli/installed-package-contents" "^1.0.7"
     "@npmcli/map-workspaces" "^1.0.2"
-    "@npmcli/metavuln-calculator" "^2.0.0"
+    "@npmcli/metavuln-calculator" "^1.1.0"
     "@npmcli/move-file" "^1.1.0"
     "@npmcli/name-from-folder" "^1.0.1"
     "@npmcli/node-gyp" "^1.0.1"
     "@npmcli/package-json" "^1.0.1"
-    "@npmcli/run-script" "^2.0.0"
+    "@npmcli/run-script" "^1.8.2"
     bin-links "^2.2.1"
     cacache "^15.0.3"
     common-ancestor-path "^1.0.1"
@@ -1288,7 +1288,7 @@
     npm-package-arg "^8.1.5"
     npm-pick-manifest "^6.1.0"
     npm-registry-fetch "^11.0.0"
-    pacote "^12.0.0"
+    pacote "^11.3.5"
     parse-conflict-json "^1.1.1"
     proc-log "^1.0.0"
     promise-all-reject-late "^1.0.0"
@@ -1301,12 +1301,17 @@
     treeverse "^1.0.4"
     walk-up-path "^1.0.0"
 
-"@npmcli/ci-detect@*", "@npmcli/ci-detect@^1.3.0":
+"@npmcli/ci-detect@^1.2.0":
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/@npmcli/ci-detect/-/ci-detect-1.4.0.tgz#18478bbaa900c37bfbd8a2006a6262c62e8b0fe1"
+  integrity sha512-3BGrt6FLjqM6br5AhWRKTr3u5GIVkjRYeAFrMp3HjnfICrg4xOrVRwFavKT6tsp++bq5dluL5t8ME/Nha/6c1Q==
+
+"@npmcli/ci-detect@^1.3.0":
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/@npmcli/ci-detect/-/ci-detect-1.3.0.tgz#6c1d2c625fb6ef1b9dea85ad0a5afcbef85ef22a"
   integrity sha512-oN3y7FAROHhrAt7Rr7PnTSwrHrZVRTS2ZbyxeQwSSYD0ifwM3YNgQqbaRmjcWoPyq77MjchusjJDspbzMmip1Q==
 
-"@npmcli/config@*":
+"@npmcli/config@^2.3.0":
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/@npmcli/config/-/config-2.3.0.tgz#364fbe942037e562a832a113206e14ccb651f7bc"
   integrity sha512-yjiC1xv7KTmUTqfRwN2ZL7BHV160ctGF0fLXmKkkMXj40UOvBe45Apwvt5JsFRtXSoHkUYy1ouzscziuWNzklg==
@@ -1354,7 +1359,7 @@
     npm-bundled "^1.1.1"
     npm-normalize-package-bin "^1.0.1"
 
-"@npmcli/map-workspaces@*", "@npmcli/map-workspaces@^1.0.2":
+"@npmcli/map-workspaces@^1.0.2", "@npmcli/map-workspaces@^1.0.4":
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-1.0.4.tgz#915708b55afa25e20bc2c14a766c124c2c5d4cab"
   integrity sha512-wVR8QxhyXsFcD/cORtJwGQodeeaDf0OxcHie8ema4VgFeqwYkFsDPnSrIRSytX8xR6nKPAH89WnwTcaU608b/Q==
@@ -1364,14 +1369,13 @@
     minimatch "^3.0.4"
     read-package-json-fast "^2.0.1"
 
-"@npmcli/metavuln-calculator@^2.0.0":
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/@npmcli/metavuln-calculator/-/metavuln-calculator-2.0.0.tgz#70937b8b5a5cad5c588c8a7b38c4a8bd6f62c84c"
-  integrity sha512-VVW+JhWCKRwCTE+0xvD6p3uV4WpqocNYYtzyvenqL/u1Q3Xx6fGTJ+6UoIoii07fbuEO9U3IIyuGY0CYHDv1sg==
+"@npmcli/metavuln-calculator@^1.1.0":
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/@npmcli/metavuln-calculator/-/metavuln-calculator-1.1.1.tgz#2f95ff3c6d88b366dd70de1c3f304267c631b458"
+  integrity sha512-9xe+ZZ1iGVaUovBVFI9h3qW+UuECUzhvZPxK9RaEA2mjU26o5D0JloGYWwLYvQELJNmBdQB6rrpuN8jni6LwzQ==
   dependencies:
     cacache "^15.0.5"
-    json-parse-even-better-errors "^2.3.1"
-    pacote "^12.0.0"
+    pacote "^11.1.11"
     semver "^7.3.2"
 
 "@npmcli/move-file@^1.0.1", "@npmcli/move-file@^1.1.0":
@@ -1392,7 +1396,7 @@
   resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz#a912e637418ffc5f2db375e93b85837691a43a33"
   integrity sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==
 
-"@npmcli/package-json@*", "@npmcli/package-json@^1.0.1":
+"@npmcli/package-json@^1.0.1":
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-1.0.1.tgz#1ed42f00febe5293c3502fd0ef785647355f6e89"
   integrity sha512-y6jnu76E9C23osz8gEMBayZmaZ69vFOIk8vR1FJL/wbEJ54+9aVG9rLTjQKSXfgYZEr50nw1txBBFfBZZe+bYg==
@@ -1406,17 +1410,7 @@
   dependencies:
     infer-owner "^1.0.4"
 
-"@npmcli/run-script@*", "@npmcli/run-script@^2.0.0":
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-2.0.0.tgz#9949c0cab415b17aaac279646db4f027d6f1e743"
-  integrity sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==
-  dependencies:
-    "@npmcli/node-gyp" "^1.0.2"
-    "@npmcli/promise-spawn" "^1.3.2"
-    node-gyp "^8.2.0"
-    read-package-json-fast "^2.0.1"
-
-"@npmcli/run-script@^1.8.2":
+"@npmcli/run-script@^1.8.2", "@npmcli/run-script@^1.8.3", "@npmcli/run-script@^1.8.4", "@npmcli/run-script@^1.8.6":
   version "1.8.6"
   resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-1.8.6.tgz#18314802a6660b0d4baa4c3afe7f1ad39d8c28b7"
   integrity sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g==
@@ -1529,7 +1523,6 @@
 
 "@renovate/eslint-plugin@https://github.com/renovatebot/eslint-plugin#v0.0.3":
   version "0.0.1"
-  uid c88253170ce9e9248bc0653197ed2ff1ecf41ac1
   resolved "https://github.com/renovatebot/eslint-plugin#c88253170ce9e9248bc0653197ed2ff1ecf41ac1"
 
 "@renovate/pep440@1.0.0":
@@ -2295,7 +2288,7 @@ abab@^2.0.3, abab@^2.0.5:
   resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a"
   integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==
 
-abbrev@*, abbrev@1:
+abbrev@1, abbrev@~1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
   integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
@@ -2428,12 +2421,12 @@ ansi-styles@^5.0.0:
   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b"
   integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
 
-ansicolors@*, ansicolors@~0.3.2:
+ansicolors@~0.3.2:
   version "0.3.2"
   resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979"
   integrity sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=
 
-ansistyles@*:
+ansistyles@~0.1.3:
   version "0.1.3"
   resolved "https://registry.yarnpkg.com/ansistyles/-/ansistyles-0.1.3.tgz#5de60415bda071bb37127854c864f41b23254539"
   integrity sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk=
@@ -2461,7 +2454,7 @@ aproba@^1.0.3:
   resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc"
   integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==
 
-archy@*:
+archy@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
   integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=
@@ -2895,7 +2888,7 @@ bunyan@1.8.15:
     mv "~2"
     safe-json-stringify "~1"
 
-cacache@*, cacache@15.3.0, cacache@^15.0.3, cacache@^15.0.5, cacache@^15.2.0:
+cacache@15.3.0, cacache@^15.0.3, cacache@^15.0.5, cacache@^15.2.0, cacache@^15.3.0:
   version "15.3.0"
   resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb"
   integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==
@@ -3002,7 +2995,7 @@ caseless@~0.12.0:
   resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
   integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
 
-chalk@*, chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0:
+chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2:
   version "4.1.2"
   resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
   integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
@@ -3052,7 +3045,7 @@ character-reference-invalid@^1.0.0:
   resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560"
   integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==
 
-chownr@*, chownr@^2.0.0:
+chownr@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
   integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
@@ -3099,15 +3092,15 @@ clean-stack@^2.0.0:
   resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
   integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
 
-cli-columns@*:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/cli-columns/-/cli-columns-4.0.0.tgz#9fe4d65975238d55218c41bd2ed296a7fa555646"
-  integrity sha512-XW2Vg+w+L9on9wtwKpyzluIPCWXjaBahI7mTcYjx+BVIYD9c3yqcv/yKC7CmdCZat4rq2yiE1UMSJC5ivKfMtQ==
+cli-columns@^3.1.2:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/cli-columns/-/cli-columns-3.1.2.tgz#6732d972979efc2ae444a1f08e08fa139c96a18e"
+  integrity sha1-ZzLZcpee/CrkRKHwjgj6E5yWoY4=
   dependencies:
-    string-width "^4.2.3"
-    strip-ansi "^6.0.1"
+    string-width "^2.0.0"
+    strip-ansi "^3.0.1"
 
-cli-table3@*, cli-table3@^0.6.0:
+cli-table3@^0.6.0:
   version "0.6.0"
   resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.0.tgz#b7b1bc65ca8e7b5cef9124e13dc2b21e2ce4faee"
   integrity sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==
@@ -3207,7 +3200,7 @@ colors@^1.1.2:
   resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
   integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
 
-columnify@*:
+columnify@~1.5.4:
   version "1.5.4"
   resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb"
   integrity sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=
@@ -4207,6 +4200,32 @@ expand-brackets@^2.1.4:
     snapdragon "^0.8.1"
     to-regex "^3.0.1"
 
+expect-more-jest@5.4.0:
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/expect-more-jest/-/expect-more-jest-5.4.0.tgz#643c7518d30593fa1639d51509a9faa34013de97"
+  integrity sha512-mbipCcBE5ryzcsuF3sIghMgcNfI9DXtlfoi0Ah0zRMFkKwH2WxUgp93YorQRMIusMohcfy9jR65GrzR6tVb2IQ==
+  dependencies:
+    expect "27.0.6"
+    expect-more "1.2.0"
+    jest-matcher-utils "27.0.6"
+
+expect-more@1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/expect-more/-/expect-more-1.2.0.tgz#cc7b3b6ad194ee54deaf601cf5c80449ed7a276d"
+  integrity sha512-AVnjc5oh2jgiJjOrjbiKxbwLlNA/zsl2044Nbd09H4+2KwThtSLYKhdOusLYOrcToFAa2uBOWR1ExCN4kOWgbQ==
+
+expect@27.0.6:
+  version "27.0.6"
+  resolved "https://registry.yarnpkg.com/expect/-/expect-27.0.6.tgz#a4d74fbe27222c718fff68ef49d78e26a8fd4c05"
+  integrity sha512-psNLt8j2kwg42jGBDSfAlU49CEZxejN1f1PlANWDZqIhBOVU/c2Pm888FcjWJzFewhIsNWfZJeLjUjtKGiPuSw==
+  dependencies:
+    "@jest/types" "^27.0.6"
+    ansi-styles "^5.0.0"
+    jest-get-type "^27.0.6"
+    jest-matcher-utils "^27.0.6"
+    jest-message-util "^27.0.6"
+    jest-regex-util "^27.0.6"
+
 expect@^24.1.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca"
@@ -4322,7 +4341,7 @@ fast-xml-parser@3.19.0:
   resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz#cb637ec3f3999f51406dd8ff0e6fc4d83e520d01"
   integrity sha512-4pXwmBplsCPv8FOY1WRakF970TjNGnGnfbOnLqjlYvMiF1SR3yOHyxMR/YCXpPTOspNF5gwudqktIP4VsWkvBg==
 
-fastest-levenshtein@*:
+fastest-levenshtein@^1.0.12:
   version "1.0.12"
   resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2"
   integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==
@@ -4653,7 +4672,7 @@ glob-parent@^5.1.2:
   dependencies:
     is-glob "^4.0.1"
 
-glob@*, glob@7.2.0, glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
+glob@7.2.0, glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0:
   version "7.2.0"
   resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
   integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
@@ -4737,7 +4756,7 @@ got@11.8.2, got@^11.7.0:
     p-cancelable "^2.0.0"
     responselike "^2.0.0"
 
-graceful-fs@*, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.6:
+graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.8:
   version "4.2.8"
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
   integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
@@ -4877,18 +4896,18 @@ hook-std@^2.0.0:
   resolved "https://registry.yarnpkg.com/hook-std/-/hook-std-2.0.0.tgz#ff9aafdebb6a989a354f729bb6445cf4a3a7077c"
   integrity sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g==
 
-hosted-git-info@*, hosted-git-info@^4.0.0, hosted-git-info@^4.0.1:
+hosted-git-info@^2.1.4:
+  version "2.8.9"
+  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
+  integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
+
+hosted-git-info@^4.0.0, hosted-git-info@^4.0.1, hosted-git-info@^4.0.2:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961"
   integrity sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==
   dependencies:
     lru-cache "^6.0.0"
 
-hosted-git-info@^2.1.4:
-  version "2.8.9"
-  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
-  integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
-
 html-encoding-sniffer@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3"
@@ -5056,7 +5075,7 @@ inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
   integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
 
-ini@*, ini@2.0.0, ini@^2.0.0:
+ini@2.0.0, ini@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5"
   integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==
@@ -5066,7 +5085,7 @@ ini@~1.3.0:
   resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
   integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
 
-init-package-json@*:
+init-package-json@^2.0.5:
   version "2.0.5"
   resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-2.0.5.tgz#78b85f3c36014db42d8f32117252504f68022646"
   integrity sha512-u1uGAtEFu3VA6HNl/yUWw57jmKEMx8SKOxHhxjGnOFUiIlFnohKDFg4ZrPpv9wWqk44nDxGJAtqjdQFm+9XXQA==
@@ -5187,7 +5206,7 @@ is-ci@^3.0.0:
   dependencies:
     ci-info "^3.1.1"
 
-is-cidr@*:
+is-cidr@^4.0.2:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-4.0.2.tgz#94c7585e4c6c77ceabf920f8cde51b8c0fda8814"
   integrity sha512-z4a1ENUajDbEl/Q6/pVBpTR1nBjjEE1X7qb7bmWYanNnPoKAvUCPFKeXV6Fe4mgTkWKBqiHIcwsI3SndiO5FeA==
@@ -5625,7 +5644,7 @@ jest-diff@^27.0.0:
     jest-get-type "^27.0.6"
     pretty-format "^27.2.5"
 
-jest-diff@^27.3.1:
+jest-diff@^27.0.6, jest-diff@^27.3.1:
   version "27.3.1"
   resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.3.1.tgz#d2775fea15411f5f5aeda2a5e02c2f36440f6d55"
   integrity sha512-PCeuAH4AWUo2O5+ksW4pL9v5xJAcIKPUPfIhZBcG1RKv/0+dvaWTQK1Nrau8d67dp65fOqbeMdoil+6PedyEPQ==
@@ -5776,6 +5795,16 @@ jest-leak-detector@^27.3.1:
     jest-get-type "^27.3.1"
     pretty-format "^27.3.1"
 
+jest-matcher-utils@27.0.6:
+  version "27.0.6"
+  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.0.6.tgz#2a8da1e86c620b39459f4352eaa255f0d43e39a9"
+  integrity sha512-OFgF2VCQx9vdPSYTHWJ9MzFCehs20TsyFi6bIHbk5V1u52zJOnvF0Y/65z3GLZHKRuTgVPY4Z6LVePNahaQ+tA==
+  dependencies:
+    chalk "^4.0.0"
+    jest-diff "^27.0.6"
+    jest-get-type "^27.0.6"
+    pretty-format "^27.0.6"
+
 jest-matcher-utils@^22.0.0:
   version "22.4.3"
   resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz#4632fe428ebc73ebc194d3c7b65d37b161f710ff"
@@ -5795,7 +5824,7 @@ jest-matcher-utils@^24.9.0:
     jest-get-type "^24.9.0"
     pretty-format "^24.9.0"
 
-jest-matcher-utils@^27.3.1:
+jest-matcher-utils@^27.0.6, jest-matcher-utils@^27.3.1:
   version "27.3.1"
   resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.3.1.tgz#257ad61e54a6d4044e080d85dbdc4a08811e9c1c"
   integrity sha512-hX8N7zXS4k+8bC1Aj0OWpGb7D3gIXxYvPNK1inP5xvE4ztbz3rc4AkI6jGVaerepBnfWB17FL5lWFJT3s7qo8w==
@@ -5819,7 +5848,7 @@ jest-message-util@^24.9.0:
     slash "^2.0.0"
     stack-utils "^1.0.1"
 
-jest-message-util@^27.3.1:
+jest-message-util@^27.0.6, jest-message-util@^27.3.1:
   version "27.3.1"
   resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.3.1.tgz#f7c25688ad3410ab10bcb862bcfe3152345c6436"
   integrity sha512-bh3JEmxsTZ/9rTm0jQrPElbY2+y48Rw2t47uMfByNyUVR+OfPh4anuyKsGqsNkXk/TI4JbLRZx+7p7Hdt6q1yg==
@@ -6165,7 +6194,7 @@ json-parse-better-errors@^1.0.1:
   resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
   integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
 
-json-parse-even-better-errors@*, json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1:
+json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1:
   version "2.3.1"
   resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
   integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
@@ -6291,7 +6320,7 @@ levn@~0.3.0:
     prelude-ls "~1.1.2"
     type-check "~0.3.2"
 
-libnpmaccess@*:
+libnpmaccess@^4.0.2:
   version "4.0.3"
   resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-4.0.3.tgz#dfb0e5b0a53c315a2610d300e46b4ddeb66e7eec"
   integrity sha512-sPeTSNImksm8O2b6/pf3ikv4N567ERYEpeKRPSmqlNt1dTZbvgpJIzg5vAhXHpw2ISBsELFRelk0jEahj1c6nQ==
@@ -6301,7 +6330,7 @@ libnpmaccess@*:
     npm-package-arg "^8.1.2"
     npm-registry-fetch "^11.0.0"
 
-libnpmdiff@*:
+libnpmdiff@^2.0.4:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/libnpmdiff/-/libnpmdiff-2.0.4.tgz#bb1687992b1a97a8ea4a32f58ad7c7f92de53b74"
   integrity sha512-q3zWePOJLHwsLEUjZw3Kyu/MJMYfl4tWCg78Vl6QGSfm4aXBUSVzMzjJ6jGiyarsT4d+1NH4B1gxfs62/+y9iQ==
@@ -6315,31 +6344,31 @@ libnpmdiff@*:
     pacote "^11.3.0"
     tar "^6.1.0"
 
-libnpmexec@*:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/libnpmexec/-/libnpmexec-3.0.0.tgz#ab1a32403363d837df97807cf142e6d1c768db3b"
-  integrity sha512-qyt0gSMSHeHIqb/a+vcryfw3VXfNNgle8jK9QVnrNQAyoDvyVQ6auyoB3ycqWPIl2swTEXPEVremSUaDzOiEgw==
+libnpmexec@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/libnpmexec/-/libnpmexec-2.0.1.tgz#729ae3e15a3ba225964ccf248117a75d311eeb73"
+  integrity sha512-4SqBB7eJvJWmUKNF42Q5qTOn20DRjEE4TgvEh2yneKlAiRlwlhuS9MNR45juWwmoURJlf2K43bozlVt7OZiIOw==
   dependencies:
-    "@npmcli/arborist" "^3.0.0"
+    "@npmcli/arborist" "^2.3.0"
     "@npmcli/ci-detect" "^1.3.0"
-    "@npmcli/run-script" "^2.0.0"
+    "@npmcli/run-script" "^1.8.4"
     chalk "^4.1.0"
     mkdirp-infer-owner "^2.0.0"
     npm-package-arg "^8.1.2"
-    pacote "^12.0.0"
+    pacote "^11.3.1"
     proc-log "^1.0.0"
     read "^1.0.7"
     read-package-json-fast "^2.0.2"
     walk-up-path "^1.0.0"
 
-libnpmfund@*:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/libnpmfund/-/libnpmfund-2.0.0.tgz#2e9f683d6456604e57d83f8cda7db02cfda5b7df"
-  integrity sha512-A89Mp+VcbVS2IzXlTJxcAEJEulVX7pvCB+NFqWKRIaqIncwGku1u8b0h8Qp9IUHrvzzzJiJxJmMYCXmlf6xFxw==
+libnpmfund@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/libnpmfund/-/libnpmfund-1.1.0.tgz#ee91313905b3194b900530efa339bc3f9fc4e5c4"
+  integrity sha512-Kfmh3pLS5/RGKG5WXEig8mjahPVOxkik6lsbH4iX0si1xxNi6eeUh/+nF1MD+2cgalsQif3O5qyr6mNz2ryJrQ==
   dependencies:
-    "@npmcli/arborist" "^3.0.0"
+    "@npmcli/arborist" "^2.5.0"
 
-libnpmhook@*:
+libnpmhook@^6.0.2:
   version "6.0.3"
   resolved "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-6.0.3.tgz#1d7f0d7e6a7932fbf7ce0881fdb0ed8bf8748a30"
   integrity sha512-3fmkZJibIybzmAvxJ65PeV3NzRc0m4xmYt6scui5msocThbEp4sKFT80FhgrCERYDjlUuFahU6zFNbJDHbQ++g==
@@ -6347,7 +6376,7 @@ libnpmhook@*:
     aproba "^2.0.0"
     npm-registry-fetch "^11.0.0"
 
-libnpmorg@*:
+libnpmorg@^2.0.2:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/libnpmorg/-/libnpmorg-2.0.3.tgz#4e605d4113dfa16792d75343824a0625c76703bc"
   integrity sha512-JSGl3HFeiRFUZOUlGdiNcUZOsUqkSYrg6KMzvPZ1WVZ478i47OnKSS0vkPmX45Pai5mTKuwIqBMcGWG7O8HfdA==
@@ -6355,16 +6384,16 @@ libnpmorg@*:
     aproba "^2.0.0"
     npm-registry-fetch "^11.0.0"
 
-libnpmpack@*:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/libnpmpack/-/libnpmpack-3.0.0.tgz#b1cdf182106bc0d25910e79bb5c9b6c23cd71670"
-  integrity sha512-W6lt4blkR9YXu/qOrFknfnKBajz/1GvAc5q1XcWTGuBJn2DYKDWHtA7x1fuMQdn7hKDBOPlZ/Aqll+ZvAnrM6g==
+libnpmpack@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/libnpmpack/-/libnpmpack-2.0.1.tgz#d3eac25cc8612f4e7cdeed4730eee339ba51c643"
+  integrity sha512-He4/jxOwlaQ7YG7sIC1+yNeXeUDQt8RLBvpI68R3RzPMZPa4/VpxhlDo8GtBOBDYoU8eq6v1wKL38sq58u4ibQ==
   dependencies:
-    "@npmcli/run-script" "^2.0.0"
+    "@npmcli/run-script" "^1.8.3"
     npm-package-arg "^8.1.0"
-    pacote "^12.0.0"
+    pacote "^11.2.6"
 
-libnpmpublish@*:
+libnpmpublish@^4.0.1:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-4.0.2.tgz#be77e8bf5956131bcb45e3caa6b96a842dec0794"
   integrity sha512-+AD7A2zbVeGRCFI2aO//oUmapCwy7GHqPXFJh3qpToSRNU+tXKJ2YFUgjt04LPPAf2dlEH95s6EhIHM1J7bmOw==
@@ -6375,14 +6404,14 @@ libnpmpublish@*:
     semver "^7.1.3"
     ssri "^8.0.1"
 
-libnpmsearch@*:
+libnpmsearch@^3.1.1:
   version "3.1.2"
   resolved "https://registry.yarnpkg.com/libnpmsearch/-/libnpmsearch-3.1.2.tgz#aee81b9e4768750d842b627a3051abc89fdc15f3"
   integrity sha512-BaQHBjMNnsPYk3Bl6AiOeVuFgp72jviShNBw5aHaHNKWqZxNi38iVNoXbo6bG/Ccc/m1To8s0GtMdtn6xZ1HAw==
   dependencies:
     npm-registry-fetch "^11.0.0"
 
-libnpmteam@*:
+libnpmteam@^2.0.3:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/libnpmteam/-/libnpmteam-2.0.4.tgz#9dbe2e18ae3cb97551ec07d2a2daf9944f3edc4c"
   integrity sha512-FPrVJWv820FZFXaflAEVTLRWZrerCvfe7ZHSMzJ/62EBlho2KFlYKjyNEsPW3JiV7TLSXi3vo8u0gMwIkXSMTw==
@@ -6390,13 +6419,13 @@ libnpmteam@*:
     aproba "^2.0.0"
     npm-registry-fetch "^11.0.0"
 
-libnpmversion@*:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/libnpmversion/-/libnpmversion-2.0.1.tgz#20b1425d88cd99c66806a54b458d2d654066b550"
-  integrity sha512-uFGtNTe/m0GOIBQCE4ryIsgGNJdeShW+qvYtKNLCCuiG7JY3YEslL/maFFZbaO4wlQa/oj1t0Bm9TyjahvtgQQ==
+libnpmversion@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/libnpmversion/-/libnpmversion-1.2.1.tgz#689aa7fe0159939b3cbbf323741d34976f4289e9"
+  integrity sha512-AA7x5CFgBFN+L4/JWobnY5t4OAHjQuPbAwUYJ7/NtHuyLut5meb+ne/aj0n7PWNiTGCJcRw/W6Zd2LoLT7EZuQ==
   dependencies:
     "@npmcli/git" "^2.0.7"
-    "@npmcli/run-script" "^2.0.0"
+    "@npmcli/run-script" "^1.8.4"
     json-parse-even-better-errors "^2.3.1"
     semver "^7.3.5"
     stringify-package "^1.0.1"
@@ -6539,13 +6568,13 @@ make-error@1.x, make-error@^1.1.1:
   resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
   integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
 
-make-fetch-happen@*, make-fetch-happen@^9.0.1:
-  version "9.1.0"
-  resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968"
-  integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==
+make-fetch-happen@^8.0.14:
+  version "8.0.14"
+  resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz#aaba73ae0ab5586ad8eaa68bd83332669393e222"
+  integrity sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ==
   dependencies:
     agentkeepalive "^4.1.3"
-    cacache "^15.2.0"
+    cacache "^15.0.5"
     http-cache-semantics "^4.1.0"
     http-proxy-agent "^4.0.1"
     https-proxy-agent "^5.0.0"
@@ -6556,18 +6585,17 @@ make-fetch-happen@*, make-fetch-happen@^9.0.1:
     minipass-fetch "^1.3.2"
     minipass-flush "^1.0.5"
     minipass-pipeline "^1.2.4"
-    negotiator "^0.6.2"
     promise-retry "^2.0.1"
-    socks-proxy-agent "^6.0.0"
+    socks-proxy-agent "^5.0.0"
     ssri "^8.0.0"
 
-make-fetch-happen@^8.0.14:
-  version "8.0.14"
-  resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz#aaba73ae0ab5586ad8eaa68bd83332669393e222"
-  integrity sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ==
+make-fetch-happen@^9.0.1, make-fetch-happen@^9.1.0:
+  version "9.1.0"
+  resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968"
+  integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==
   dependencies:
     agentkeepalive "^4.1.3"
-    cacache "^15.0.5"
+    cacache "^15.2.0"
     http-cache-semantics "^4.1.0"
     http-proxy-agent "^4.0.1"
     https-proxy-agent "^5.0.0"
@@ -6578,8 +6606,9 @@ make-fetch-happen@^8.0.14:
     minipass-fetch "^1.3.2"
     minipass-flush "^1.0.5"
     minipass-pipeline "^1.2.4"
+    negotiator "^0.6.2"
     promise-retry "^2.0.1"
-    socks-proxy-agent "^5.0.0"
+    socks-proxy-agent "^6.0.0"
     ssri "^8.0.0"
 
 makeerror@1.0.x:
@@ -6917,7 +6946,7 @@ minipass-json-stream@^1.0.1:
     jsonparse "^1.3.1"
     minipass "^3.0.0"
 
-minipass-pipeline@*, minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4:
+minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4:
   version "1.2.4"
   resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c"
   integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==
@@ -6931,7 +6960,7 @@ minipass-sized@^1.0.3:
   dependencies:
     minipass "^3.0.0"
 
-minipass@*, minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3:
+minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3:
   version "3.1.5"
   resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.5.tgz#71f6251b0a33a49c01b3cf97ff77eda030dff732"
   integrity sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==
@@ -6954,7 +6983,7 @@ mixin-deep@^1.2.0:
     for-in "^1.0.2"
     is-extendable "^1.0.1"
 
-mkdirp-infer-owner@*, mkdirp-infer-owner@^2.0.0:
+mkdirp-infer-owner@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz#55d3b368e7d89065c38f32fd38e638f0ab61d316"
   integrity sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==
@@ -6963,11 +6992,6 @@ mkdirp-infer-owner@*, mkdirp-infer-owner@^2.0.0:
     infer-owner "^1.0.4"
     mkdirp "^1.0.3"
 
-mkdirp@*, mkdirp@^1.0.3, mkdirp@^1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
-  integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
-
 mkdirp@^0.5.1, mkdirp@~0.5.1:
   version "0.5.5"
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
@@ -6975,6 +6999,11 @@ mkdirp@^0.5.1, mkdirp@~0.5.1:
   dependencies:
     minimist "^1.2.5"
 
+mkdirp@^1.0.3, mkdirp@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+  integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
 mockdate@3.0.5:
   version "3.0.5"
   resolved "https://registry.yarnpkg.com/mockdate/-/mockdate-3.0.5.tgz#789be686deb3149e7df2b663d2bc4392bc3284fb"
@@ -7000,11 +7029,6 @@ mri@^1.1.5:
   resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b"
   integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==
 
-ms@*, ms@^2.0.0, ms@^2.1.1:
-  version "2.1.3"
-  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
-  integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
-
 ms@2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@@ -7015,6 +7039,11 @@ ms@2.1.2:
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
   integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
 
+ms@^2.0.0, ms@^2.1.1, ms@^2.1.2:
+  version "2.1.3"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+  integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
 multimatch@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3"
@@ -7121,36 +7150,36 @@ node-fetch@^2.6.1:
   dependencies:
     whatwg-url "^5.0.0"
 
-node-gyp@*, node-gyp@^8.0.0, node-gyp@^8.2.0:
-  version "8.2.0"
-  resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.2.0.tgz#ef509ccdf5cef3b4d93df0690b90aa55ff8c7977"
-  integrity sha512-KG8SdcoAnw2d6augGwl1kOayALUrXW/P2uOAm2J2+nmW/HjZo7y+8TDg7LejxbekOOSv3kzhq+NSUYkIDAX8eA==
+node-gyp@^7.1.0, node-gyp@^7.1.2:
+  version "7.1.2"
+  resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-7.1.2.tgz#21a810aebb187120251c3bcec979af1587b188ae"
+  integrity sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==
   dependencies:
     env-paths "^2.2.0"
     glob "^7.1.4"
-    graceful-fs "^4.2.6"
-    make-fetch-happen "^8.0.14"
+    graceful-fs "^4.2.3"
     nopt "^5.0.0"
     npmlog "^4.1.2"
+    request "^2.88.2"
     rimraf "^3.0.2"
-    semver "^7.3.5"
-    tar "^6.1.2"
+    semver "^7.3.2"
+    tar "^6.0.2"
     which "^2.0.2"
 
-node-gyp@^7.1.0:
-  version "7.1.2"
-  resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-7.1.2.tgz#21a810aebb187120251c3bcec979af1587b188ae"
-  integrity sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==
+node-gyp@^8.0.0:
+  version "8.2.0"
+  resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.2.0.tgz#ef509ccdf5cef3b4d93df0690b90aa55ff8c7977"
+  integrity sha512-KG8SdcoAnw2d6augGwl1kOayALUrXW/P2uOAm2J2+nmW/HjZo7y+8TDg7LejxbekOOSv3kzhq+NSUYkIDAX8eA==
   dependencies:
     env-paths "^2.2.0"
     glob "^7.1.4"
-    graceful-fs "^4.2.3"
+    graceful-fs "^4.2.6"
+    make-fetch-happen "^8.0.14"
     nopt "^5.0.0"
     npmlog "^4.1.2"
-    request "^2.88.2"
     rimraf "^3.0.2"
-    semver "^7.3.2"
-    tar "^6.0.2"
+    semver "^7.3.5"
+    tar "^6.1.2"
     which "^2.0.2"
 
 node-html-parser@3.3.6:
@@ -7184,7 +7213,7 @@ node.extend@^2.0.0:
     has "^1.0.3"
     is "^3.2.1"
 
-nopt@*, nopt@^5.0.0:
+nopt@^5.0.0:
   version "5.0.0"
   resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88"
   integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==
@@ -7221,7 +7250,7 @@ normalize-url@^6.0.0, normalize-url@^6.0.1, normalize-url@^6.1.0:
   resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a"
   integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==
 
-npm-audit-report@*:
+npm-audit-report@^2.1.5:
   version "2.1.5"
   resolved "https://registry.yarnpkg.com/npm-audit-report/-/npm-audit-report-2.1.5.tgz#a5b8850abe2e8452fce976c8960dd432981737b5"
   integrity sha512-YB8qOoEmBhUH1UJgh1xFAv7Jg1d+xoNhsDYiFQlEFThEBui0W1vIz2ZK6FVg4WZjwEdl7uBQlm1jy3MUfyHeEw==
@@ -7235,7 +7264,7 @@ npm-bundled@^1.1.1:
   dependencies:
     npm-normalize-package-bin "^1.0.1"
 
-npm-install-checks@*, npm-install-checks@^4.0.0:
+npm-install-checks@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-4.0.0.tgz#a37facc763a2fde0497ef2c6d0ac7c3fbe00d7b4"
   integrity sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==
@@ -7247,7 +7276,7 @@ npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1:
   resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2"
   integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==
 
-npm-package-arg@*, npm-package-arg@^8.0.0, npm-package-arg@^8.0.1, npm-package-arg@^8.1.0, npm-package-arg@^8.1.1, npm-package-arg@^8.1.2, npm-package-arg@^8.1.5:
+npm-package-arg@^8.0.0, npm-package-arg@^8.0.1, npm-package-arg@^8.1.0, npm-package-arg@^8.1.1, npm-package-arg@^8.1.2, npm-package-arg@^8.1.5:
   version "8.1.5"
   resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.5.tgz#3369b2d5fe8fdc674baa7f1786514ddc15466e44"
   integrity sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==
@@ -7266,7 +7295,7 @@ npm-packlist@^2.1.4:
     npm-bundled "^1.1.1"
     npm-normalize-package-bin "^1.0.1"
 
-npm-pick-manifest@*, npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.0, npm-pick-manifest@^6.1.1:
+npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.0, npm-pick-manifest@^6.1.1:
   version "6.1.1"
   resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz#7b5484ca2c908565f43b7f27644f36bb816f5148"
   integrity sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==
@@ -7276,14 +7305,14 @@ npm-pick-manifest@*, npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.0, npm-pic
     npm-package-arg "^8.1.2"
     semver "^7.3.4"
 
-npm-profile@*:
+npm-profile@^5.0.3:
   version "5.0.4"
   resolved "https://registry.yarnpkg.com/npm-profile/-/npm-profile-5.0.4.tgz#73e5bd1d808edc2c382d7139049cc367ac43161b"
   integrity sha512-OKtU7yoAEBOnc8zJ+/uo5E4ugPp09sopo+6y1njPp+W99P8DvQon3BJYmpvyK2Bf1+3YV5LN1bvgXRoZ1LUJBA==
   dependencies:
     npm-registry-fetch "^11.0.0"
 
-npm-registry-fetch@*, npm-registry-fetch@^11.0.0:
+npm-registry-fetch@^11.0.0:
   version "11.0.0"
   resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz#68c1bb810c46542760d62a6a965f85a702d43a76"
   integrity sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==
@@ -7317,7 +7346,7 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1:
   dependencies:
     path-key "^3.0.0"
 
-npm-user-validate@*:
+npm-user-validate@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-1.0.1.tgz#31428fc5475fe8416023f178c0ab47935ad8c561"
   integrity sha512-uQwcd/tY+h1jnEaze6cdX/LrhWhoBxfSknxentoqmIuStxUExxjWd3ULMLFPiFUrZKbOVMowH6Jq2FRWfmhcEw==
@@ -7327,86 +7356,76 @@ npm@^7.0.0:
   resolved "https://registry.yarnpkg.com/npm/-/npm-7.24.2.tgz#861117af8241bea592289f22407230e5300e59ca"
   integrity sha512-120p116CE8VMMZ+hk8IAb1inCPk4Dj3VZw29/n2g6UI77urJKVYb7FZUDW8hY+EBnfsjI/2yrobBgFyzo7YpVQ==
   dependencies:
-    "@isaacs/string-locale-compare" "*"
-    "@npmcli/arborist" "*"
-    "@npmcli/ci-detect" "*"
-    "@npmcli/config" "*"
-    "@npmcli/map-workspaces" "*"
-    "@npmcli/package-json" "*"
-    "@npmcli/run-script" "*"
-    abbrev "*"
-    ansicolors "*"
-    ansistyles "*"
-    archy "*"
-    cacache "*"
-    chalk "*"
-    chownr "*"
-    cli-columns "*"
-    cli-table3 "*"
-    columnify "*"
-    fastest-levenshtein "*"
-    glob "*"
-    graceful-fs "*"
-    hosted-git-info "*"
-    ini "*"
-    init-package-json "*"
-    is-cidr "*"
-    json-parse-even-better-errors "*"
-    libnpmaccess "*"
-    libnpmdiff "*"
-    libnpmexec "*"
-    libnpmfund "*"
-    libnpmhook "*"
-    libnpmorg "*"
-    libnpmpack "*"
-    libnpmpublish "*"
-    libnpmsearch "*"
-    libnpmteam "*"
-    libnpmversion "*"
-    make-fetch-happen "*"
-    minipass "*"
-    minipass-pipeline "*"
-    mkdirp "*"
-    mkdirp-infer-owner "*"
-    ms "*"
-    node-gyp "*"
-    nopt "*"
-    npm-audit-report "*"
-    npm-install-checks "*"
-    npm-package-arg "*"
-    npm-pick-manifest "*"
-    npm-profile "*"
-    npm-registry-fetch "*"
-    npm-user-validate "*"
-    npmlog "*"
-    opener "*"
-    pacote "*"
-    parse-conflict-json "*"
-    qrcode-terminal "*"
-    read "*"
-    read-package-json "*"
-    read-package-json-fast "*"
-    readdir-scoped-modules "*"
-    rimraf "*"
-    semver "*"
-    ssri "*"
-    tar "*"
-    text-table "*"
-    tiny-relative-date "*"
-    treeverse "*"
-    validate-npm-package-name "*"
-    which "*"
-    write-file-atomic "*"
-
-npmlog@*:
-  version "5.0.1"
-  resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0"
-  integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==
-  dependencies:
-    are-we-there-yet "^2.0.0"
-    console-control-strings "^1.1.0"
-    gauge "^3.0.0"
-    set-blocking "^2.0.0"
+    "@isaacs/string-locale-compare" "^1.1.0"
+    "@npmcli/arborist" "^2.9.0"
+    "@npmcli/ci-detect" "^1.2.0"
+    "@npmcli/config" "^2.3.0"
+    "@npmcli/map-workspaces" "^1.0.4"
+    "@npmcli/package-json" "^1.0.1"
+    "@npmcli/run-script" "^1.8.6"
+    abbrev "~1.1.1"
+    ansicolors "~0.3.2"
+    ansistyles "~0.1.3"
+    archy "~1.0.0"
+    cacache "^15.3.0"
+    chalk "^4.1.2"
+    chownr "^2.0.0"
+    cli-columns "^3.1.2"
+    cli-table3 "^0.6.0"
+    columnify "~1.5.4"
+    fastest-levenshtein "^1.0.12"
+    glob "^7.2.0"
+    graceful-fs "^4.2.8"
+    hosted-git-info "^4.0.2"
+    ini "^2.0.0"
+    init-package-json "^2.0.5"
+    is-cidr "^4.0.2"
+    json-parse-even-better-errors "^2.3.1"
+    libnpmaccess "^4.0.2"
+    libnpmdiff "^2.0.4"
+    libnpmexec "^2.0.1"
+    libnpmfund "^1.1.0"
+    libnpmhook "^6.0.2"
+    libnpmorg "^2.0.2"
+    libnpmpack "^2.0.1"
+    libnpmpublish "^4.0.1"
+    libnpmsearch "^3.1.1"
+    libnpmteam "^2.0.3"
+    libnpmversion "^1.2.1"
+    make-fetch-happen "^9.1.0"
+    minipass "^3.1.3"
+    minipass-pipeline "^1.2.4"
+    mkdirp "^1.0.4"
+    mkdirp-infer-owner "^2.0.0"
+    ms "^2.1.2"
+    node-gyp "^7.1.2"
+    nopt "^5.0.0"
+    npm-audit-report "^2.1.5"
+    npm-install-checks "^4.0.0"
+    npm-package-arg "^8.1.5"
+    npm-pick-manifest "^6.1.1"
+    npm-profile "^5.0.3"
+    npm-registry-fetch "^11.0.0"
+    npm-user-validate "^1.0.1"
+    npmlog "^5.0.1"
+    opener "^1.5.2"
+    pacote "^11.3.5"
+    parse-conflict-json "^1.1.1"
+    qrcode-terminal "^0.12.0"
+    read "~1.0.7"
+    read-package-json "^4.1.1"
+    read-package-json-fast "^2.0.3"
+    readdir-scoped-modules "^1.1.0"
+    rimraf "^3.0.2"
+    semver "^7.3.5"
+    ssri "^8.0.1"
+    tar "^6.1.11"
+    text-table "~0.2.0"
+    tiny-relative-date "^1.3.0"
+    treeverse "^1.0.4"
+    validate-npm-package-name "~3.0.0"
+    which "^2.0.2"
+    write-file-atomic "^3.0.3"
 
 npmlog@^4.1.2:
   version "4.1.2"
@@ -7418,6 +7437,16 @@ npmlog@^4.1.2:
     gauge "~2.7.3"
     set-blocking "~2.0.0"
 
+npmlog@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0"
+  integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==
+  dependencies:
+    are-we-there-yet "^2.0.0"
+    console-control-strings "^1.1.0"
+    gauge "^3.0.0"
+    set-blocking "^2.0.0"
+
 nth-check@^2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2"
@@ -7527,7 +7556,7 @@ onetime@^5.1.0, onetime@^5.1.2:
   dependencies:
     mimic-fn "^2.1.0"
 
-opener@*:
+opener@^1.5.2:
   version "1.5.2"
   resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598"
   integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==
@@ -7689,32 +7718,7 @@ p-try@^2.0.0:
   resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
   integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
 
-pacote@*, pacote@^12.0.0:
-  version "12.0.0"
-  resolved "https://registry.yarnpkg.com/pacote/-/pacote-12.0.0.tgz#5bf4491f3301ffe459290b26a518bf536e8bcc52"
-  integrity sha512-5DnYqZU0w7GIskuc5yXii1kKpQS2fsaxCaI0FXRsMULXB06lXnZpRdV7JC1TTcQN5uy62h4VWS4WMPYGWu3MYg==
-  dependencies:
-    "@npmcli/git" "^2.1.0"
-    "@npmcli/installed-package-contents" "^1.0.6"
-    "@npmcli/promise-spawn" "^1.2.0"
-    "@npmcli/run-script" "^2.0.0"
-    cacache "^15.0.5"
-    chownr "^2.0.0"
-    fs-minipass "^2.1.0"
-    infer-owner "^1.0.4"
-    minipass "^3.1.3"
-    mkdirp "^1.0.3"
-    npm-package-arg "^8.0.1"
-    npm-packlist "^2.1.4"
-    npm-pick-manifest "^6.0.0"
-    npm-registry-fetch "^11.0.0"
-    promise-retry "^2.0.1"
-    read-package-json-fast "^2.0.1"
-    rimraf "^3.0.2"
-    ssri "^8.0.1"
-    tar "^6.1.0"
-
-pacote@^11.3.0:
+pacote@^11.1.11, pacote@^11.2.6, pacote@^11.3.0, pacote@^11.3.1, pacote@^11.3.5:
   version "11.3.5"
   resolved "https://registry.yarnpkg.com/pacote/-/pacote-11.3.5.tgz#73cf1fc3772b533f575e39efa96c50be8c3dc9d2"
   integrity sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg==
@@ -7746,7 +7750,7 @@ parent-module@^1.0.0:
   dependencies:
     callsites "^3.0.0"
 
-parse-conflict-json@*, parse-conflict-json@^1.1.1:
+parse-conflict-json@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/parse-conflict-json/-/parse-conflict-json-1.1.1.tgz#54ec175bde0f2d70abf6be79e0e042290b86701b"
   integrity sha512-4gySviBiW5TRl7XHvp1agcS7SOe0KZOjC//71dzZVWJrY9hCrgtvl5v3SyIxCZ4fZF47TxD9nfzmxcx76xmbUw==
@@ -7986,7 +7990,7 @@ pretty-format@^27.0.0, pretty-format@^27.2.5:
     ansi-styles "^5.0.0"
     react-is "^17.0.1"
 
-pretty-format@^27.3.1:
+pretty-format@^27.0.6, pretty-format@^27.3.1:
   version "27.3.1"
   resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.3.1.tgz#7e9486365ccdd4a502061fa761d3ab9ca1b78df5"
   integrity sha512-DR/c+pvFc52nLimLROYjnXPtolawm+uWDxr4FjuLDLUn+ktWnSN851KoHwHzzqq6rfCOjkzN8FLgDrSub6UDuA==
@@ -8116,7 +8120,7 @@ q@^1.5.1:
   resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
   integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
 
-qrcode-terminal@*:
+qrcode-terminal@^0.12.0:
   version "0.12.0"
   resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819"
   integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==
@@ -8192,7 +8196,7 @@ read-cmd-shim@^2.0.0:
   resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-2.0.0.tgz#4a50a71d6f0965364938e9038476f7eede3928d9"
   integrity sha512-HJpV9bQpkl6KwjxlJcBoqu9Ba0PQg8TqSNIOrulGt54a0uup0HtevreFHzYzkm0lpnleRdNBzXznKrgxglEHQw==
 
-read-package-json-fast@*, read-package-json-fast@^2.0.1, read-package-json-fast@^2.0.2:
+read-package-json-fast@^2.0.1, read-package-json-fast@^2.0.2, read-package-json-fast@^2.0.3:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz#323ca529630da82cb34b36cc0b996693c98c2b83"
   integrity sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==
@@ -8200,7 +8204,7 @@ read-package-json-fast@*, read-package-json-fast@^2.0.1, read-package-json-fast@
     json-parse-even-better-errors "^2.3.0"
     npm-normalize-package-bin "^1.0.1"
 
-read-package-json@*, read-package-json@^4.1.1:
+read-package-json@^4.1.1:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-4.1.1.tgz#153be72fce801578c1c86b8ef2b21188df1b9eea"
   integrity sha512-P82sbZJ3ldDrWCOSKxJT0r/CXMWR0OR3KRh55SgKo3p91GSIEEC32v3lSHAvO/UcH3/IoL7uqhOFBduAnwdldw==
@@ -8238,7 +8242,7 @@ read-pkg@^5.0.0, read-pkg@^5.2.0:
     parse-json "^5.0.0"
     type-fest "^0.6.0"
 
-read@*, read@1, read@^1.0.7, read@~1.0.1:
+read@1, read@^1.0.7, read@~1.0.1, read@~1.0.7:
   version "1.0.7"
   resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4"
   integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=
@@ -8267,7 +8271,7 @@ readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.6, readable
     string_decoder "~1.1.1"
     util-deprecate "~1.0.1"
 
-readdir-scoped-modules@*, readdir-scoped-modules@^1.1.0:
+readdir-scoped-modules@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309"
   integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==
@@ -8496,7 +8500,7 @@ reusify@^1.0.4:
   resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
   integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
 
-rimraf@*, rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2:
+rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
   integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
@@ -8631,18 +8635,18 @@ semver-utils@1.1.4:
   resolved "https://registry.yarnpkg.com/semver-utils/-/semver-utils-1.1.4.tgz#cf0405e669a57488913909fc1c3f29bf2a4871e2"
   integrity sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==
 
-semver@*, semver@7.3.5, semver@7.x, semver@^7.1.1, semver@^7.1.2, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5:
+"semver@2 || 3 || 4 || 5", semver@^5.5.0:
+  version "5.7.1"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+  integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+semver@7.3.5, semver@7.x, semver@^7.1.1, semver@^7.1.2, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5:
   version "7.3.5"
   resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
   integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
   dependencies:
     lru-cache "^6.0.0"
 
-"semver@2 || 3 || 4 || 5", semver@^5.5.0:
-  version "5.7.1"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
-  integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
-
 semver@^6.0.0, semver@^6.3.0:
   version "6.3.0"
   resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
@@ -8970,7 +8974,7 @@ sshpk@^1.7.0:
     safer-buffer "^2.0.2"
     tweetnacl "~0.14.0"
 
-ssri@*, ssri@^8.0.0, ssri@^8.0.1:
+ssri@^8.0.0, ssri@^8.0.1:
   version "8.0.1"
   resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af"
   integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==
@@ -9050,7 +9054,7 @@ string-width@^1.0.1:
     is-fullwidth-code-point "^1.0.0"
     strip-ansi "^3.0.0"
 
-"string-width@^1.0.1 || ^2.0.0", "string-width@^1.0.2 || 2":
+"string-width@^1.0.1 || ^2.0.0", "string-width@^1.0.2 || 2", string-width@^2.0.0:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
   integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
@@ -9228,7 +9232,7 @@ tar-stream@^2.0.1:
     inherits "^2.0.3"
     readable-stream "^3.1.1"
 
-tar@*, tar@^6.0.2, tar@^6.1.0, tar@^6.1.2:
+tar@^6.0.2, tar@^6.1.0, tar@^6.1.11, tar@^6.1.2:
   version "6.1.11"
   resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621"
   integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==
@@ -9278,7 +9282,7 @@ text-extensions@^1.0.0:
   resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26"
   integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==
 
-text-table@*, text-table@^0.2.0:
+text-table@^0.2.0, text-table@~0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
   integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
@@ -9315,7 +9319,7 @@ through@2, "through@>=2.2.7 <3":
   resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
   integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
 
-tiny-relative-date@*:
+tiny-relative-date@^1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07"
   integrity sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A==
@@ -9415,7 +9419,7 @@ treeify@^1.1.0:
   resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8"
   integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==
 
-treeverse@*, treeverse@^1.0.4:
+treeverse@^1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/treeverse/-/treeverse-1.0.4.tgz#a6b0ebf98a1bca6846ddc7ecbc900df08cb9cd5f"
   integrity sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==
@@ -9780,7 +9784,7 @@ validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4:
     spdx-correct "^3.0.0"
     spdx-expression-parse "^3.0.0"
 
-validate-npm-package-name@*, validate-npm-package-name@3.0.0, validate-npm-package-name@^3.0.0:
+validate-npm-package-name@3.0.0, validate-npm-package-name@^3.0.0, validate-npm-package-name@~3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e"
   integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34=
@@ -9902,13 +9906,6 @@ which-boxed-primitive@^1.0.2:
     is-string "^1.0.5"
     is-symbol "^1.0.3"
 
-which@*, which@^2.0.1, which@^2.0.2:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
-  integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
-  dependencies:
-    isexe "^2.0.0"
-
 which@^1.2.9:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
@@ -9916,6 +9913,13 @@ which@^1.2.9:
   dependencies:
     isexe "^2.0.0"
 
+which@^2.0.1, which@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+  integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+  dependencies:
+    isexe "^2.0.0"
+
 wide-align@^1.1.0, wide-align@^1.1.2:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
@@ -9947,7 +9951,7 @@ wrappy@1:
   resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
   integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
 
-write-file-atomic@*, write-file-atomic@^3.0.0, write-file-atomic@^3.0.3:
+write-file-atomic@^3.0.0, write-file-atomic@^3.0.3:
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
   integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==