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