Skip to content
Snippets Groups Projects
Commit aae2519b authored by Michael Kriese's avatar Michael Kriese Committed by Rhys Arkins
Browse files

fix(ts): convert worker/repository/init to typescript (#4975)

parent 5cb01d61
No related branches found
No related tags found
No related merge requests found
Showing
with 166 additions and 148 deletions
......@@ -52,6 +52,10 @@ export interface RenovateConfig
description?: string[];
dryRun?: boolean;
errors?: ValidationMessage[];
/** TODO: Type? */
global?: Record<string, any>;
includeForks?: boolean;
isFork?: boolean;
onboarding?: boolean;
......
const npmApi = require('../../../datasource/npm');
const { platform } = require('../../../platform');
import * as npmApi from '../../../datasource/npm';
import { platform, RepoConfig } from '../../../platform';
import { RenovateConfig } from '../../../config';
async function getPlatformConfig(config) {
// TODO: fix types
export type WorkerPlatformConfig = RepoConfig &
RenovateConfig &
Record<string, any>;
// TODO: fix types
async function getPlatformConfig(config): Promise<WorkerPlatformConfig> {
const platformConfig = await platform.initRepo(config);
return {
...config,
......@@ -9,15 +16,14 @@ async function getPlatformConfig(config) {
};
}
async function initApis(input) {
let config = { ...input };
// TODO: fix types
export async function initApis(
input: RenovateConfig
): Promise<WorkerPlatformConfig> {
let config: WorkerPlatformConfig = { ...input } as never;
config = await getPlatformConfig(config);
npmApi.resetMemCache();
npmApi.setNpmrc(config.npmrc);
delete config.gitPrivateKey;
return config;
}
module.exports = {
initApis,
};
const { logger } = require('../../../logger');
const { platform } = require('../../../platform');
import { logger } from '../../../logger';
import { platform } from '../../../platform';
import { RenovateConfig } from '../../../config';
async function checkBaseBranch(config) {
export async function checkBaseBranch(
config: RenovateConfig
): Promise<RenovateConfig> {
logger.debug('checkBaseBranch()');
logger.debug(`config.repoIsOnboarded=${config.repoIsOnboarded}`);
let error = [];
......@@ -23,7 +26,3 @@ async function checkBaseBranch(config) {
}
return { ...config, errors: config.errors.concat(error) };
}
module.exports = {
checkBaseBranch,
};
const jsonValidator = require('json-dup-key-validator');
const JSON5 = require('json5');
const path = require('path');
import jsonValidator from 'json-dup-key-validator';
import JSON5 from 'json5';
import path from 'path';
const { logger } = require('../../../logger');
const { mergeChildConfig } = require('../../../config');
const { migrateAndValidate } = require('../../../config/migrate-validate');
const { decryptConfig } = require('../../../config/decrypt');
const presets = require('../../../config/presets');
const npmApi = require('../../../datasource/npm');
const { flattenPackageRules } = require('./flatten');
const hostRules = require('../../../util/host-rules');
const { configFileNames } = require('../../../config/app-strings');
const { platform } = require('../../../platform');
import { logger } from '../../../logger';
import { mergeChildConfig, RenovateConfig } from '../../../config';
import { migrateAndValidate } from '../../../config/migrate-validate';
import { decryptConfig } from '../../../config/decrypt';
import * as presets from '../../../config/presets';
import * as npmApi from '../../../datasource/npm';
import { flattenPackageRules } from './flatten';
import * as hostRules from '../../../util/host-rules';
import { configFileNames } from '../../../config/app-strings';
import { platform } from '../../../platform';
// Check for repository config
async function mergeRenovateConfig(config) {
export async function mergeRenovateConfig(
config: RenovateConfig
): Promise<RenovateConfig> {
let returnConfig = { ...config };
const fileList = await platform.getFileList();
async function detectConfigFile() {
async function detectConfigFile(): Promise<string | null> {
for (const fileName of configFileNames) {
if (fileName === 'package.json') {
try {
......@@ -180,7 +182,3 @@ async function mergeRenovateConfig(config) {
}
return returnConfig;
}
module.exports = {
mergeRenovateConfig,
};
const { logger } = require('../../../logger');
const { mergeChildConfig } = require('../../../config');
import { logger } from '../../../logger';
import { mergeChildConfig, PackageRule } from '../../../config';
function flattenPackageRules(packageRules) {
const res = [];
export function flattenPackageRules(
packageRules: PackageRule[]
): PackageRule[] {
const res: PackageRule[] = [];
if (!(packageRules && packageRules.length)) {
return res;
}
......@@ -20,7 +22,3 @@ function flattenPackageRules(packageRules) {
}
return res;
}
module.exports = {
flattenPackageRules,
};
const { logger } = require('../../../logger');
const { checkOnboardingBranch } = require('../onboarding/branch');
const { checkIfConfigured } = require('../configured');
const { initApis } = require('../init/apis');
const { checkBaseBranch } = require('./base');
const { mergeRenovateConfig } = require('./config');
const { detectSemanticCommits } = require('./semantic');
const { detectVulnerabilityAlerts } = require('./vulnerability');
const { platform } = require('../../../platform');
import { logger } from '../../../logger';
import { checkOnboardingBranch } from '../onboarding/branch';
import { checkIfConfigured } from '../configured';
import { initApis } from './apis';
import { checkBaseBranch } from './base';
import { mergeRenovateConfig } from './config';
import { detectSemanticCommits } from './semantic';
import { detectVulnerabilityAlerts } from './vulnerability';
import { platform } from '../../../platform';
import { RenovateConfig } from '../../../config';
async function initRepo(input) {
export async function initRepo(input: RenovateConfig): Promise<RenovateConfig> {
global.repoCache = {};
let config = {
let config: RenovateConfig = {
...input,
errors: [],
warnings: [],
......@@ -31,7 +32,3 @@ async function initRepo(input) {
}
return config;
}
module.exports = {
initRepo,
};
const conventionalCommitsDetector = require('conventional-commits-detector');
const { logger } = require('../../../logger');
const { platform } = require('../../../platform');
import conventionalCommitsDetector from 'conventional-commits-detector';
import { logger } from '../../../logger';
import { platform } from '../../../platform';
import { RenovateConfig } from '../../../config';
async function detectSemanticCommits(config) {
export async function detectSemanticCommits(
config: RenovateConfig
): Promise<boolean> {
logger.debug('detectSemanticCommits()');
logger.trace({ config });
if (config.semanticCommits !== null) {
......@@ -26,7 +29,3 @@ async function detectSemanticCommits(config) {
logger.debug('No semantic commits detected');
return false;
}
module.exports = {
detectSemanticCommits,
};
const { logger } = require('../../../logger');
const versioning = require('../../../versioning');
const { platform } = require('../../../platform');
import { logger } from '../../../logger';
import * as versioning from '../../../versioning';
import { platform } from '../../../platform';
import { RenovateConfig } from '../../../config';
module.exports = {
detectVulnerabilityAlerts,
};
async function detectVulnerabilityAlerts(input) {
export async function detectVulnerabilityAlerts(
input: RenovateConfig
): Promise<RenovateConfig> {
if (!(input && input.vulnerabilityAlerts)) {
return input;
}
......
import { platform as _platform } from '../lib/platform';
import { getConfig } from '../lib/config/defaults';
import { RenovateConfig as _RenovateConfig } from '../lib/config';
/**
* Simple wrapper for getting mocked version of a module
......@@ -11,4 +12,9 @@ export function mocked<T>(module: T): jest.Mocked<T> {
export const platform = mocked(_platform);
// Required because of isolatedModules
export type RenovateConfig = _RenovateConfig;
export const defaultConfig = getConfig();
export { getConfig };
const { initApis } = require('../../../../lib/workers/repository/init/apis');
import { initApis } from '../../../../lib/workers/repository/init/apis';
import { RenovateConfig, getConfig } from '../../../util';
jest.mock('../../../../lib/platform/github');
describe('workers/repository/init/apis', () => {
describe('initApis', () => {
/** @type any */
let config;
let config: RenovateConfig;
beforeEach(() => {
config = require('../../../config/config/_fixtures');
config = { ...getConfig() };
config.errors = [];
config.warnings = [];
config.token = 'some-token';
......
/** @type any */
let config;
import { checkBaseBranch } from '../../../../lib/workers/repository/init/base';
import { platform, getConfig, RenovateConfig } from '../../../util';
let config: RenovateConfig;
beforeEach(() => {
jest.resetAllMocks();
config = require('../../../config/config/_fixtures');
config = { ...getConfig() };
config.errors = [];
config.warnings = [];
});
const {
checkBaseBranch,
} = require('../../../../lib/workers/repository/init/base');
/** @type any */
const { platform } = require('../../../../lib/platform');
describe('workers/repository/init/base', () => {
describe('checkBaseBranch()', () => {
it('errors', async () => {
......@@ -23,7 +18,7 @@ describe('workers/repository/init/base', () => {
});
it('sets baseBranch', async () => {
config.baseBranch = 'ssome-base';
platform.branchExists.mockReturnValue(true);
platform.branchExists.mockResolvedValue(true);
const res = await checkBaseBranch(config);
expect(res.errors).toHaveLength(0);
expect(platform.setBaseBranch).toHaveBeenCalledTimes(1);
......
/** @type any */
let config;
import { mergeRenovateConfig } from '../../../../lib/workers/repository/init/config';
import * as _migrateAndValidate from '../../../../lib/config/migrate-validate';
import { platform, mocked, getConfig, RenovateConfig } from '../../../util';
const migrateAndValidate = mocked(_migrateAndValidate);
let config: RenovateConfig;
beforeEach(() => {
jest.resetAllMocks();
config = require('../../../config/config/_fixtures');
config = getConfig();
config.errors = [];
config.warnings = [];
});
const {
mergeRenovateConfig,
} = require('../../../../lib/workers/repository/init/config');
/** @type any */
const migrateValidate = require('../../../../lib/config/migrate-validate');
/** @type any */
const { platform } = require('../../../../lib/platform');
jest.mock('../../../../lib/config/migrate-validate');
describe('workers/repository/init/config', () => {
describe('mergeRenovateConfig()', () => {
beforeEach(() => {
migrateValidate.migrateAndValidate.mockReturnValue({
migrateAndValidate.migrateAndValidate.mockResolvedValue({
warnings: [],
errors: [],
});
});
it('returns config if not found', async () => {
platform.getFileList.mockReturnValue(['package.json']);
platform.getFile.mockReturnValue('{}');
platform.getFileList.mockResolvedValue(['package.json']);
platform.getFile.mockResolvedValue('{}');
const res = await mergeRenovateConfig(config);
expect(res).toMatchObject(config);
});
it('uses package.json config if found', async () => {
platform.getFileList.mockReturnValue(['package.json']);
platform.getFileList.mockResolvedValue(['package.json']);
const pJson = JSON.stringify({
name: 'something',
renovate: {
prHourlyLimit: 10,
},
});
platform.getFile.mockReturnValue(pJson);
platform.getFile.mockResolvedValue(pJson);
await mergeRenovateConfig(config);
});
it('returns error if cannot parse', async () => {
platform.getFileList.mockReturnValue(['package.json', 'renovate.json']);
platform.getFile.mockReturnValue('cannot parse');
platform.getFileList.mockResolvedValue(['package.json', 'renovate.json']);
platform.getFile.mockResolvedValue('cannot parse');
let e;
try {
await mergeRenovateConfig(config);
......@@ -57,8 +54,10 @@ describe('workers/repository/init/config', () => {
expect(e.validationMessage).toMatchSnapshot();
});
it('throws error if duplicate keys', async () => {
platform.getFileList.mockReturnValue(['package.json', '.renovaterc']);
platform.getFile.mockReturnValue('{ "enabled": true, "enabled": false }');
platform.getFileList.mockResolvedValue(['package.json', '.renovaterc']);
platform.getFile.mockResolvedValue(
'{ "enabled": true, "enabled": false }'
);
let e;
try {
await mergeRenovateConfig(config);
......@@ -71,38 +70,41 @@ describe('workers/repository/init/config', () => {
expect(e.validationMessage).toMatchSnapshot();
});
it('finds and parse renovate.json5', async () => {
platform.getFileList.mockReturnValue(['package.json', 'renovate.json5']);
platform.getFile.mockReturnValue(`{
platform.getFileList.mockResolvedValue([
'package.json',
'renovate.json5',
]);
platform.getFile.mockResolvedValue(`{
// this is json5 format
}`);
await mergeRenovateConfig(config);
});
it('finds .github/renovate.json', async () => {
platform.getFileList.mockReturnValue([
platform.getFileList.mockResolvedValue([
'package.json',
'.github/renovate.json',
]);
platform.getFile.mockReturnValue('{}');
platform.getFile.mockResolvedValue('{}');
await mergeRenovateConfig(config);
});
it('finds .renovaterc.json', async () => {
platform.getFileList.mockReturnValue([
platform.getFileList.mockResolvedValue([
'package.json',
'.renovaterc.json',
]);
platform.getFile.mockReturnValue('{}');
platform.getFile.mockResolvedValue('{}');
await mergeRenovateConfig(config);
});
it('throws error if misconfigured', async () => {
platform.getFileList.mockReturnValue([
platform.getFileList.mockResolvedValue([
'package.json',
'.renovaterc.json',
]);
platform.getFile.mockReturnValue('{}');
migrateValidate.migrateAndValidate.mockReturnValueOnce({
errors: [{}],
platform.getFile.mockResolvedValue('{}');
migrateAndValidate.migrateAndValidate.mockResolvedValueOnce({
errors: [{ depName: 'dep', message: 'test error' }],
});
let e;
let e: Error;
try {
await mergeRenovateConfig(config);
} catch (err) {
......
const {
flattenPackageRules,
} = require('../../../../lib/workers/repository/init/flatten');
import { flattenPackageRules } from '../../../../lib/workers/repository/init/flatten';
describe('workers/repository/init/flatten', () => {
describe('flattenPackageRules()', () => {
it('returns empty', () => {
expect(flattenPackageRules({})).toEqual([]);
expect(flattenPackageRules([])).toEqual([]);
});
it('flattens some and returns others', () => {
const packageRules = [
......
/** @type any */
const base = require('../../../../lib/workers/repository/init/base');
/** @type any */
const apis = require('../../../../lib/workers/repository/init/apis');
const { initRepo } = require('../../../../lib/workers/repository/init');
import * as _base from '../../../../lib/workers/repository/init/base';
import * as _apis from '../../../../lib/workers/repository/init/apis';
import { initRepo } from '../../../../lib/workers/repository/init';
import { mocked } from '../../../util';
jest.mock('../../../../lib/workers/repository/onboarding/branch');
jest.mock('../../../../lib/workers/repository/configured');
......@@ -11,11 +10,14 @@ jest.mock('../../../../lib/workers/repository/init/base');
jest.mock('../../../../lib/workers/repository/init/config');
jest.mock('../../../../lib/workers/repository/init/semantic');
const base = mocked(_base);
const apis = mocked(_apis);
describe('workers/repository/init', () => {
describe('initRepo', () => {
it('runs', async () => {
base.checkBaseBranch.mockReturnValue({});
apis.initApis.mockReturnValue({});
base.checkBaseBranch.mockResolvedValue({});
apis.initApis.mockResolvedValue({} as never);
await initRepo({});
});
});
......
/** @type any */
let config;
import { detectSemanticCommits } from '../../../../lib/workers/repository/init/semantic';
import { platform, getConfig, RenovateConfig } from '../../../util';
let config: RenovateConfig;
beforeEach(() => {
jest.resetAllMocks();
config = require('../../../config/config/_fixtures');
config = getConfig();
config.errors = [];
config.warnings = [];
});
const {
detectSemanticCommits,
} = require('../../../../lib/workers/repository/init/semantic');
/** @type any */
const { platform } = require('../../../../lib/platform');
describe('workers/repository/init/semantic', () => {
describe('detectSemanticCommits()', () => {
it('returns config if already set', async () => {
......@@ -23,13 +18,16 @@ describe('workers/repository/init/semantic', () => {
});
it('detects false if unknown', async () => {
config.semanticCommits = null;
platform.getCommitMessages.mockReturnValue(['foo', 'bar']);
platform.getCommitMessages.mockResolvedValue(['foo', 'bar']);
const res = await detectSemanticCommits(config);
expect(res).toBe(false);
});
it('detects true if known', async () => {
config.semanticCommits = null;
platform.getCommitMessages.mockReturnValue(['fix: foo', 'refactor: bar']);
platform.getCommitMessages.mockResolvedValue([
'fix: foo',
'refactor: bar',
]);
const res = await detectSemanticCommits(config);
expect(res).toBe(true);
});
......
let config;
import { detectVulnerabilityAlerts } from '../../../../lib/workers/repository/init/vulnerability';
import { platform, defaultConfig, RenovateConfig } from '../../../util';
let config: RenovateConfig;
beforeEach(() => {
jest.resetAllMocks();
config = JSON.parse(
JSON.stringify(require('../../../config/config/_fixtures'))
);
config = JSON.parse(JSON.stringify(defaultConfig));
});
const {
detectVulnerabilityAlerts,
} = require('../../../../lib/workers/repository/init/vulnerability');
/** @type any */
const { platform } = require('../../../../lib/platform');
describe('workers/repository/init/vulnerability', () => {
describe('detectVulnerabilityAlerts()', () => {
it('returns if alerts are missing', async () => {
......@@ -25,19 +19,19 @@ describe('workers/repository/init/vulnerability', () => {
});
it('returns if no alerts', async () => {
delete config.vulnerabilityAlerts.enabled;
platform.getVulnerabilityAlerts.mockReturnValue([]);
platform.getVulnerabilityAlerts.mockResolvedValue([]);
expect(await detectVulnerabilityAlerts(config)).toEqual(config);
});
it('throws if no alerts and vulnerabilityAlertsOnly', async () => {
config.vulnerabilityAlertsOnly = true;
platform.getVulnerabilityAlerts.mockReturnValue([]);
platform.getVulnerabilityAlerts.mockResolvedValue([]);
await expect(detectVulnerabilityAlerts(config)).rejects.toThrow(
/no-vulnerability-alerts/
);
});
it('returns alerts', async () => {
delete config.vulnerabilityAlerts.enabled;
platform.getVulnerabilityAlerts.mockReturnValue([
platform.getVulnerabilityAlerts.mockResolvedValue([
{},
{
dismissReason: null,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment