diff --git a/.eslintrc.js b/.eslintrc.js index fdbe786f1509f52d8c5ce9d719fbf61521006b75..dfeed5d012c14586b0ec10341fd48ae18dd36212 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -81,7 +81,8 @@ module.exports = { // TODO: fix lint '@typescript-eslint/no-explicit-any': 0, - '@typescript-eslint/no-non-null-assertion': 2, + // TODO: https://github.com/renovatebot/renovate/issues/7154 + '@typescript-eslint/no-non-null-assertion': 0, '@typescript-eslint/no-unused-vars': [ 2, { diff --git a/lib/modules/datasource/docker/index.ts b/lib/modules/datasource/docker/index.ts index b1fc62122a362718de4acb7a197e86a27e6e1473..797ddc635a5610c0ec1586410173f7020e721abf 100644 --- a/lib/modules/datasource/docker/index.ts +++ b/lib/modules/datasource/docker/index.ts @@ -90,7 +90,7 @@ export async function getAuthHeaders( { registryHost, dockerRepository }, `Using ecr auth for Docker registry` ); - const [, region] = ecrRegex.exec(registryHost); + const [, region] = ecrRegex.exec(registryHost) ?? []; const auth = await getECRAuthToken(region, opts); if (auth) { opts.headers = { authorization: `Basic ${auth}` }; @@ -132,7 +132,7 @@ export async function getAuthHeaders( { registryHost, dockerRepository, authenticateHeader }, `Invalid realm, testing direct auth` ); - return opts.headers; + return opts.headers ?? null; } const authUrl = `${authenticateHeader.params.realm}?service=${authenticateHeader.params.service}&scope=repository:${dockerRepository}:pull`; @@ -200,7 +200,7 @@ export async function getAuthHeaders( } async function getECRAuthToken( - region: string, + region: string | undefined, opts: HostRule ): Promise<string | null> { const config: ECRClientConfig = { region }; @@ -244,7 +244,7 @@ export function getRegistryRepository( } let dockerRepository = packageName.replace(registryEndingWithSlash, ''); const fullUrl = `${registryHost}/${dockerRepository}`; - const { origin, pathname } = parseUrl(fullUrl); + const { origin, pathname } = parseUrl(fullUrl)!; registryHost = origin; dockerRepository = pathname.substring(1); return { @@ -253,7 +253,7 @@ export function getRegistryRepository( }; } } - let registryHost: string; + let registryHost: string | undefined; const split = packageName.split('/'); if (split.length > 1 && (split[0].includes('.') || split[0].includes(':'))) { [registryHost] = split; @@ -299,11 +299,12 @@ export function extractDigestFromResponseBody( } export function isECRMaxResultsError(err: HttpError): boolean { + const resp = err.response as HttpResponse<any> | undefined; return !!( - err.response?.statusCode === 405 && - err.response?.headers?.['docker-distribution-api-version'] && + resp?.statusCode === 405 && + resp.headers?.['docker-distribution-api-version'] && // https://docs.aws.amazon.com/AmazonECR/latest/APIReference/API_DescribeRepositories.html#ECR-DescribeRepositories-request-maxResults - err.response.body?.['errors']?.[0]?.message?.includes( + resp.body?.['errors']?.[0]?.message?.includes( 'Member must have value less than or equal to 1000' ) ); @@ -336,12 +337,12 @@ export const defaultConfig = { }, }; -function findLatestStable(tags: string[]): string { +function findLatestStable(tags: string[]): string | null { const versions = tags .filter((v) => dockerVersioning.isValid(v) && dockerVersioning.isStable(v)) .sort((a, b) => dockerVersioning.sortVersions(a, b)); - return versions.pop() ?? tags.slice(-1).pop(); + return versions.pop() ?? tags.slice(-1).pop() ?? null; } export class DockerDatasource extends Datasource { @@ -361,7 +362,7 @@ export class DockerDatasource extends Datasource { dockerRepository: string, tag: string, mode: 'head' | 'get' = 'get' - ): Promise<HttpResponse> { + ): Promise<HttpResponse | null> { logger.debug( `getManifestResponse(${registryHost}, ${dockerRepository}, ${tag})` ); @@ -442,7 +443,7 @@ export class DockerDatasource extends Datasource { registry: string, dockerRepository: string, tag: string - ): Promise<string> { + ): Promise<string | null> { const manifestResponse = await this.getManifestResponse( registry, dockerRepository, @@ -653,17 +654,25 @@ export class DockerDatasource extends Datasource { `${registry}/api/v1/repository/${repository}/tag/?limit=${limit}&page=${page}&onlyActiveTags=true`; let page = 1; - let url = pageUrl(page); - do { - const res = await this.http.getJson<{ - tags: { name: string }[]; + let url: string | null = pageUrl(page); + while (url && page <= 20) { + interface QuayRestDockerTags { + tags: { + name: string; + }[]; has_additional: boolean; - }>(url, {}); + } + + // typescript issue :-/ + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + const res = (await this.http.getJson<QuayRestDockerTags>( + url + )) as HttpResponse<QuayRestDockerTags>; const pageTags = res.body.tags.map((tag) => tag.name); tags = tags.concat(pageTags); page += 1; url = res.body.has_additional ? pageUrl(page) : null; - } while (url && page < 20); + } return tags; } @@ -675,7 +684,9 @@ export class DockerDatasource extends Datasource { // AWS ECR limits the maximum number of results to 1000 // See https://docs.aws.amazon.com/AmazonECR/latest/APIReference/API_DescribeRepositories.html#ECR-DescribeRepositories-request-maxResults const limit = ecrRegex.test(registryHost) ? 1000 : 10000; - let url = `${registryHost}/${dockerRepository}/tags/list?n=${limit}`; + let url: + | string + | null = `${registryHost}/${dockerRepository}/tags/list?n=${limit}`; url = ensurePathPrefix(url, '/v2'); const headers = await getAuthHeaders( this.http, @@ -792,7 +803,8 @@ export class DockerDatasource extends Datasource { const newTag = newValue || 'latest'; const { registryHost, dockerRepository } = getRegistryRepository( packageName, - registryUrl + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + registryUrl! ); return `${registryHost}:${dockerRepository}:${newTag}`; }, @@ -803,13 +815,14 @@ export class DockerDatasource extends Datasource { ): Promise<string | null> { const { registryHost, dockerRepository } = getRegistryRepository( packageName, - registryUrl + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + registryUrl! ); logger.debug( `getDigest(${registryHost}, ${dockerRepository}, ${newValue})` ); const newTag = newValue || 'latest'; - let digest: string = null; + let digest: string | null = null; try { let manifestResponse = await this.getManifestResponse( registryHost, @@ -832,7 +845,8 @@ export class DockerDatasource extends Datasource { dockerRepository, newTag ); - digest = extractDigestFromResponseBody(manifestResponse); + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + digest = extractDigestFromResponseBody(manifestResponse!); } logger.debug({ digest }, 'Got docker digest'); } @@ -869,7 +883,8 @@ export class DockerDatasource extends Datasource { }: GetReleasesConfig): Promise<ReleaseResult | null> { const { registryHost, dockerRepository } = getRegistryRepository( packageName, - registryUrl + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + registryUrl! ); const tags = await this.getTags(registryHost, dockerRepository); if (!tags) { @@ -884,6 +899,11 @@ export class DockerDatasource extends Datasource { const latestTag = tags.includes('latest') ? 'latest' : findLatestStable(tags); + + // istanbul ignore if: needs test + if (!latestTag) { + return ret; + } const labels = await this.getLabels( registryHost, dockerRepository, diff --git a/lib/modules/datasource/galaxy-collection/index.ts b/lib/modules/datasource/galaxy-collection/index.ts index e01008cac00733d9a0274fd487bbd2853ac83eb1..be8fd108d308452fafc6d99c4ad85405ede00879 100644 --- a/lib/modules/datasource/galaxy-collection/index.ts +++ b/lib/modules/datasource/galaxy-collection/index.ts @@ -1,3 +1,4 @@ +import is from '@sindresorhus/is'; import pMap from 'p-map'; import { logger } from '../../../logger'; import { cache } from '../../../util/cache/package/decorator'; @@ -71,9 +72,9 @@ export class GalaxyCollectionDatasource extends Datasource { return release; }); - let newestVersionDetails: VersionsDetailResult; + let newestVersionDetails: VersionsDetailResult | undefined; // asynchronously get release details - const enrichedReleases: Release[] = await pMap( + const enrichedReleases: (Release | null)[] = await pMap( releases, (basicRelease) => this.http @@ -109,7 +110,7 @@ export class GalaxyCollectionDatasource extends Datasource { { concurrency: 5 } // allow 5 requests at maximum in parallel ); // filter failed versions - const filteredReleases = enrichedReleases.filter(Boolean); + const filteredReleases = enrichedReleases.filter(is.truthy); // extract base information which are only provided on the release from the newest release const result: ReleaseResult = { releases: filteredReleases, diff --git a/lib/modules/datasource/galaxy/index.ts b/lib/modules/datasource/galaxy/index.ts index a70e452f64e1cd1c81a693d1cb35beec6e68bdcd..3b9908b90c082b0a6e3c4437c30677661af3c7aa 100644 --- a/lib/modules/datasource/galaxy/index.ts +++ b/lib/modules/datasource/galaxy/index.ts @@ -37,7 +37,7 @@ export class GalaxyDatasource extends Datasource { projectName; const galaxyProjectUrl = registryUrl + userName + '/' + projectName; - let raw: HttpResponse<GalaxyResult> = null; + let raw: HttpResponse<GalaxyResult> | null = null; try { raw = await this.http.getJson<GalaxyResult>(galaxyAPIUrl); } catch (err) { diff --git a/lib/modules/datasource/git-refs/base.ts b/lib/modules/datasource/git-refs/base.ts index 952f6515bd6455ba1b40d927c051e1cfe70eb09b..d4d15e5dc931b013fc554c63c038f18c95e192c0 100644 --- a/lib/modules/datasource/git-refs/base.ts +++ b/lib/modules/datasource/git-refs/base.ts @@ -1,3 +1,4 @@ +import is from '@sindresorhus/is'; import simpleGit from 'simple-git'; import { logger } from '../../../logger'; import { cache } from '../../../util/cache/package/decorator'; @@ -38,7 +39,7 @@ export class GitDatasource { .map((line) => line.trim()) .map((line) => { let match = refMatch.exec(line); - if (match) { + if (match?.groups) { return { type: match.groups.type, value: match.groups.value, @@ -46,7 +47,7 @@ export class GitDatasource { }; } match = headMatch.exec(line); - if (match) { + if (match?.groups) { return { type: '', value: 'HEAD', @@ -56,7 +57,7 @@ export class GitDatasource { logger.trace(`malformed ref: ${line}`); return null; }) - .filter(Boolean) + .filter(is.truthy) .filter((ref) => ref.type !== 'pull' && !ref.value.endsWith('^{}')); return refs; diff --git a/lib/modules/datasource/git-refs/index.ts b/lib/modules/datasource/git-refs/index.ts index a2aaaceb6f4228fb497fdba8802c28f0059e5054..8f5ebd2d8110ae491023866dff850db0d3fcb356 100644 --- a/lib/modules/datasource/git-refs/index.ts +++ b/lib/modules/datasource/git-refs/index.ts @@ -24,11 +24,15 @@ export class GitRefsDatasource extends Datasource { override async getReleases({ packageName, }: GetReleasesConfig): Promise<ReleaseResult | null> { - const rawRefs: RawRefs[] = await GitDatasource.getRawRefs( + const rawRefs: RawRefs[] | null = await GitDatasource.getRawRefs( { packageName }, this.id ); + if (!rawRefs) { + return null; + } + const refs = rawRefs .filter((ref) => ref.type === 'tags' || ref.type === 'heads') .map((ref) => ref.value); @@ -44,7 +48,7 @@ export class GitRefsDatasource extends Datasource { releases: uniqueRefs.map((ref) => ({ version: ref, gitRef: ref, - newDigest: rawRefs.find((rawRef) => rawRef.value === ref).hash, + newDigest: rawRefs.find((rawRef) => rawRef.value === ref)?.hash, })), }; @@ -55,11 +59,17 @@ export class GitRefsDatasource extends Datasource { { packageName }: DigestConfig, newValue?: string ): Promise<string | null> { - const rawRefs: RawRefs[] = await GitDatasource.getRawRefs( + const rawRefs: RawRefs[] | null = await GitDatasource.getRawRefs( { packageName }, this.id ); - let ref: RawRefs; + + // istanbul ignore if + if (!rawRefs) { + return null; + } + + let ref: RawRefs | undefined; if (newValue) { ref = rawRefs.find( (rawRef) => diff --git a/lib/modules/datasource/git-tags/index.ts b/lib/modules/datasource/git-tags/index.ts index 6b2e1e669ba30ee297bf6e6fdc6a014d88601496..82dae616115da7a36e491148c3becf05f4223e37 100644 --- a/lib/modules/datasource/git-tags/index.ts +++ b/lib/modules/datasource/git-tags/index.ts @@ -51,7 +51,7 @@ export class GitTagsDatasource extends Datasource { ): Promise<string | null> { const rawRefs = await GitDatasource.getRawRefs({ packageName }, this.id); const findValue = newValue || 'HEAD'; - const ref = rawRefs.find((rawRef) => rawRef.value === findValue); + const ref = rawRefs?.find((rawRef) => rawRef.value === findValue); if (ref) { return ref.hash; } diff --git a/lib/modules/datasource/github-releases/common.ts b/lib/modules/datasource/github-releases/common.ts index 991392ebcb42bc998538d8050cde754062b15b71..b0164ca1e1cc745574dba6b4c474c442a51b4fa1 100644 --- a/lib/modules/datasource/github-releases/common.ts +++ b/lib/modules/datasource/github-releases/common.ts @@ -2,12 +2,12 @@ import { ensureTrailingSlash } from '../../../util/url'; const defaultSourceUrlBase = 'https://github.com/'; -export function getSourceUrlBase(registryUrl: string): string { +export function getSourceUrlBase(registryUrl: string | undefined): string { // default to GitHub.com if no GHE host is specified. return ensureTrailingSlash(registryUrl ?? defaultSourceUrlBase); } -export function getApiBaseUrl(registryUrl: string): string { +export function getApiBaseUrl(registryUrl: string | undefined): string { const sourceUrlBase = getSourceUrlBase(registryUrl); return sourceUrlBase === defaultSourceUrlBase ? `https://api.github.com/` diff --git a/lib/modules/datasource/github-releases/index.ts b/lib/modules/datasource/github-releases/index.ts index cb1812b6e519f4753fbc8f1bde43e165598fd834..63f8db6ea1f186a41a69d0f0a404317e7cb09612 100644 --- a/lib/modules/datasource/github-releases/index.ts +++ b/lib/modules/datasource/github-releases/index.ts @@ -105,7 +105,7 @@ export class GithubReleasesDatasource extends Datasource { async findDigestAsset( release: GithubRelease, digest: string - ): Promise<DigestAsset> { + ): Promise<DigestAsset | null> { const digestFile = await this.findDigestFile(release, digest); if (digestFile) { return digestFile; @@ -206,7 +206,7 @@ export class GithubReleasesDatasource extends Datasource { currentRelease, currentDigest ); - let newDigest: string; + let newDigest: string | null; if (!digestAsset || newValue === currentValue) { newDigest = currentDigest; } else { diff --git a/lib/modules/datasource/github-releases/test/index.ts b/lib/modules/datasource/github-releases/test/index.ts index ee59f5769c43efe1d528abeacebea05faf9b3d07..f2d9a4f7fd0ca2bb228a6d8c2f5ce37fe82dbec1 100644 --- a/lib/modules/datasource/github-releases/test/index.ts +++ b/lib/modules/datasource/github-releases/test/index.ts @@ -1,4 +1,5 @@ import * as httpMock from '../../../../../test/http-mock'; +import { partial } from '../../../../../test/util'; import type { GithubRelease } from '../types'; export class GitHubReleaseMocker { @@ -15,12 +16,12 @@ export class GitHubReleaseMocker { version: string, assets: { [key: string]: string } ): GithubRelease { - const releaseData = { + const releaseData = partial<GithubRelease>({ tag_name: version, published_at: '2020-03-09T11:00:00Z', prerelease: false, assets: [], - } as GithubRelease; + }); for (const assetFn of Object.keys(assets)) { const assetPath = `/repos/${this.packageName}/releases/download/${version}/${assetFn}`; const assetData = assets[assetFn]; diff --git a/lib/modules/datasource/github-tags/index.ts b/lib/modules/datasource/github-tags/index.ts index b0e6662ceba3f8dc72b7ab62407543286ec1f8fc..e54974d2d5c518097d3556b438a75691c7d16b9c 100644 --- a/lib/modules/datasource/github-tags/index.ts +++ b/lib/modules/datasource/github-tags/index.ts @@ -2,7 +2,12 @@ import { logger } from '../../../logger'; import { cache } from '../../../util/cache/package/decorator'; import { GithubReleasesDatasource } from '../github-releases'; import { getApiBaseUrl, getSourceUrl } from '../github-releases/common'; -import type { DigestConfig, GetReleasesConfig, ReleaseResult } from '../types'; +import type { + DigestConfig, + GetReleasesConfig, + Release, + ReleaseResult, +} from '../types'; import type { GitHubTag, TagResponse } from './types'; export class GithubTagsDatasource extends GithubReleasesDatasource { @@ -19,7 +24,7 @@ export class GithubTagsDatasource extends GithubReleasesDatasource { `${registryUrl}:${githubRepo}:tag-${tag}`, }) async getTagCommit( - registryUrl: string, + registryUrl: string | undefined, githubRepo: string, tag: string ): Promise<string | null> { @@ -52,7 +57,7 @@ export class GithubTagsDatasource extends GithubReleasesDatasource { `${registryUrl}:${githubRepo}:commit`, }) async getCommit( - registryUrl: string, + registryUrl: string | undefined, githubRepo: string ): Promise<string | null> { const apiBaseUrl = getApiBaseUrl(registryUrl); @@ -82,8 +87,10 @@ export class GithubTagsDatasource extends GithubReleasesDatasource { newValue?: string ): Promise<string | null> { return newValue - ? this.getTagCommit(registryUrl, repo, newValue) - : this.getCommit(registryUrl, repo); + ? // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + this.getTagCommit(registryUrl, repo!, newValue) + : // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + this.getCommit(registryUrl, repo!); } @cache({ @@ -120,18 +127,23 @@ export class GithubTagsDatasource extends GithubReleasesDatasource { ): Promise<ReleaseResult | null> { const tagsResult = await this.getTags(config); + // istanbul ignore if + if (!tagsResult) { + return null; + } + try { // Fetch additional data from releases endpoint when possible const releasesResult = await super.getReleases(config); - const releaseByVersion = {}; + type PartialRelease = Omit<Release, 'version'>; + + const releaseByVersion: Record<string, PartialRelease> = {}; releasesResult?.releases?.forEach((release) => { - const key = release.version; - const value = { ...release }; - delete value.version; - releaseByVersion[key] = value; + const { version, ...value } = release; + releaseByVersion[version] = value; }); - const mergedReleases = []; + const mergedReleases: Release[] = []; tagsResult.releases.forEach((tag) => { const release = releaseByVersion[tag.version]; mergedReleases.push({ ...release, ...tag }); diff --git a/lib/modules/versioning/distro.ts b/lib/modules/versioning/distro.ts index bb250a7b728a965ef9a8817bb9a63b04ca9f06dd..eba5d8af9682dd141017d9a9c5346b78daa6a6cf 100644 --- a/lib/modules/versioning/distro.ts +++ b/lib/modules/versioning/distro.ts @@ -31,7 +31,6 @@ export class DistroInfo { constructor(distroJsonKey: DistroDataFile) { this._distroInfo = JSON.parse( - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion dataFiles.get(distroJsonKey as DataFile)!.replace(/v([\d.]+)\b/gm, '$1') ); diff --git a/lib/modules/versioning/node/schedule.ts b/lib/modules/versioning/node/schedule.ts index 4b298c6169ee198dfc012a3f713c18b50733c114..b346b5af2ebb17241e9d778336c46fb08f9e9fc9 100644 --- a/lib/modules/versioning/node/schedule.ts +++ b/lib/modules/versioning/node/schedule.ts @@ -12,7 +12,6 @@ interface NodeJsSchedule { export type NodeJsData = Record<string, NodeJsSchedule>; const nodeSchedule: NodeJsData = JSON.parse( - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion dataFiles.get('data/node-js-schedule.json')! ); diff --git a/lib/util/emoji.ts b/lib/util/emoji.ts index 273816e9b9dac1708c588ad0986ff9960fc62b97..f5b9375afbb22aa9952692b4c54fc77c7c362fb8 100644 --- a/lib/util/emoji.ts +++ b/lib/util/emoji.ts @@ -20,7 +20,6 @@ const hexCodesByShort = new Map<string, string>(); function lazyInitMappings(): void { if (!mappingsInitialized) { const table: Record<string, string | string[]> = JSON.parse( - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion dataFiles.get('node_modules/emojibase-data/en/shortcodes/github.json')! ); for (const [hex, val] of Object.entries(table)) { diff --git a/lib/util/git/url.ts b/lib/util/git/url.ts index 9dff260a519083a272c336249f9ee659d1e54215..c6c44c19c370eccb9a1c45352909396347656215 100644 --- a/lib/util/git/url.ts +++ b/lib/util/git/url.ts @@ -6,7 +6,7 @@ import { regEx } from '../regex'; export function getHttpUrl(url: string, token?: string): string { const parsedUrl = GitUrlParse(url); - parsedUrl.token = token; + parsedUrl.token = token ?? ''; const protocol = regEx(/^https?$/).exec(parsedUrl.protocol) ? parsedUrl.protocol diff --git a/test/http-mock.ts b/test/http-mock.ts index a17672236a199aa51de5b13151ad079cf6ac94de..ad0edca9fe1d3de0edbc5618f52a46d1c409e63d 100644 --- a/test/http-mock.ts +++ b/test/http-mock.ts @@ -82,7 +82,7 @@ export function scope(basePath: BasePath, options?: nock.Options): nock.Scope { } export function getTrace(): RequestLogItem[] /* istanbul ignore next */ { - const errorLines = []; + const errorLines: string[] = []; if (missingLog.length) { errorLines.push('Missing mocks:'); errorLines.push(...missingLog); diff --git a/test/util.ts b/test/util.ts index 93412766fbb9b8724481c6c624ef5a307dd7278b..8ce8d7ebe297caf99294daf3b6ee89ce78daf87a 100644 --- a/test/util.ts +++ b/test/util.ts @@ -51,7 +51,7 @@ export const defaultConfig = getConfig(); export { getConfig }; function getCallerFileName(): string | null { - let result = null; + let result: string | null = null; const prepareStackTrace = Error.prepareStackTrace; const stackTraceLimit = Error.stackTraceLimit; @@ -64,7 +64,7 @@ function getCallerFileName(): string | null { const stack = err.stack as unknown as NodeJS.CallSite[]; - let currentFile = null; + let currentFile: string | null = null; for (const frame of stack) { const fileName = frame.getFileName(); if (!currentFile) { @@ -85,7 +85,7 @@ function getCallerFileName(): string | null { } export function getFixturePath(fixtureFile: string, fixtureRoot = '.'): string { - const callerDir = upath.dirname(getCallerFileName()); + const callerDir = upath.dirname(getCallerFileName()!); return upath.join(callerDir, fixtureRoot, '__fixtures__', fixtureFile); } diff --git a/tsconfig.strict.json b/tsconfig.strict.json index d613c4886a1482a3ce24d71c39d76a239c639310..d5884d441e520ad79674d6bff4cb8855c6f81855 100644 --- a/tsconfig.strict.json +++ b/tsconfig.strict.json @@ -38,24 +38,9 @@ "lib/config/utils.ts", "lib/config/validation-helpers/managers.ts", "lib/config/validation.ts", - "lib/modules/datasource/adoptium-java/index.ts", "lib/modules/datasource/api.ts", - "lib/modules/datasource/artifactory/index.ts", - "lib/modules/datasource/cdnjs/index.ts", "lib/modules/datasource/datasource.ts", - "lib/modules/datasource/docker/common.ts", - "lib/modules/datasource/docker/index.ts", - "lib/modules/datasource/docker/quay.ts", - "lib/modules/datasource/galaxy-collection/index.ts", - "lib/modules/datasource/galaxy/index.ts", - "lib/modules/datasource/git-refs/base.ts", - "lib/modules/datasource/git-refs/index.ts", - "lib/modules/datasource/git-tags/index.ts", - "lib/modules/datasource/github-releases/common.ts", - "lib/modules/datasource/github-releases/digest.ts", - "lib/modules/datasource/github-releases/index.ts", "lib/modules/datasource/github-releases/test/index.ts", - "lib/modules/datasource/github-tags/index.ts", "lib/modules/datasource/gitlab-packages/index.ts", "lib/modules/datasource/gitlab-releases/index.ts", "lib/modules/datasource/gitlab-tags/index.ts",