renovate 44.33.0 → 44.33.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -114,6 +114,7 @@ async function huntRegistries(config, datasource, registryUrls) {
114
114
  async function mergeRegistries(config, datasource, registryUrls) {
115
115
  let combinedRes;
116
116
  let lastErr;
117
+ let externalHostError;
117
118
  let singleRegistry = true;
118
119
  const releaseVersioning = get$1(config.versioning);
119
120
  for (const registryUrl of registryUrls) try {
@@ -147,11 +148,19 @@ async function mergeRegistries(config, datasource, registryUrls) {
147
148
  if (tags) combinedRes.tags = tags;
148
149
  delete combinedRes.registryUrl;
149
150
  } catch (err) {
150
- if (err instanceof ExternalHostError) throw err;
151
+ if (err instanceof ExternalHostError) {
152
+ externalHostError = err;
153
+ logger.debug({
154
+ err,
155
+ registryUrl
156
+ }, "datasource merge: external host error from registry; continuing so releases from other registries are not discarded");
157
+ continue;
158
+ }
151
159
  lastErr = err;
152
160
  logger.trace({ err }, "datasource merge failure");
153
161
  }
154
162
  if (!combinedRes) {
163
+ if (externalHostError) throw externalHostError;
155
164
  if (lastErr) throw lastErr;
156
165
  return null;
157
166
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["datasources","packageCache.get","packageCache.set","versioning.get","memCache.get"],"sources":["../../../lib/modules/datasource/index.ts"],"sourcesContent":["import { ATTR_CODE_FUNCTION_NAME } from '@opentelemetry/semantic-conventions';\nimport {\n isFunction,\n isNonEmptyArray,\n isString,\n isTruthy,\n} from '@sindresorhus/is';\nimport { dequal } from 'dequal';\nimport { GlobalConfig } from '../../config/global.ts';\nimport { HOST_DISABLED } from '../../constants/error-messages.ts';\nimport { instrument } from '../../instrumentation/index.ts';\nimport {\n ATTR_RENOVATE_DATASOURCE,\n ATTR_RENOVATE_PACKAGE_NAME,\n ATTR_RENOVATE_REGISTRY_URL,\n} from '../../instrumentation/types.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport { coerceArray } from '../../util/array.ts';\nimport * as memCache from '../../util/cache/memory/index.ts';\nimport * as packageCache from '../../util/cache/package/index.ts';\nimport type { PackageCacheNamespace } from '../../util/cache/package/types.ts';\nimport { clone } from '../../util/clone.ts';\nimport { filterMap } from '../../util/filter-map.ts';\nimport { AsyncResult, Result } from '../../util/result.ts';\nimport { DatasourceCacheStats } from '../../util/stats.ts';\nimport { trimTrailingSlash } from '../../util/url.ts';\nimport * as versioning from '../versioning/index.ts';\nimport datasources from './api.ts';\nimport {\n applyConstraintsFiltering,\n applyExtractVersion,\n applyVersionCompatibility,\n filterValidVersions,\n getDatasourceFor,\n sortAndRemoveDuplicates,\n} from './common.ts';\nimport { addMetaData } from './metadata.ts';\nimport { setNpmrc } from './npm/index.ts';\nimport { resolveRegistryUrl } from './npm/npmrc.ts';\nimport type {\n DatasourceApi,\n DigestConfig,\n GetDigestInputConfig,\n GetPkgReleasesConfig,\n GetReleasesConfig,\n ReleaseResult,\n} from './types.ts';\n\nexport { isGetPkgReleasesConfig } from './common.ts';\nexport * from './types.ts';\n\nexport function getDatasources(): Map<string, DatasourceApi> {\n return datasources;\n}\nexport function getDatasourceList(): string[] {\n return Array.from(datasources.keys());\n}\n\ntype GetReleasesInternalConfig = GetReleasesConfig & GetPkgReleasesConfig;\n\n// TODO: fix error Type\nfunction logError(datasource: string, packageName: string, err: any): void {\n const { statusCode, code: errCode, url } = err;\n if (statusCode === 404) {\n logger.debug({ datasource, packageName, url }, 'Datasource 404');\n } else if (statusCode === 401 || statusCode === 403) {\n logger.debug({ datasource, packageName, url }, 'Datasource unauthorized');\n } else if (errCode) {\n logger.debug(\n { datasource, packageName, url, errCode },\n 'Datasource connection error',\n );\n } else {\n logger.debug({ datasource, packageName, err }, 'Datasource unknown error');\n }\n}\n\nasync function getRegistryReleases(\n datasource: DatasourceApi,\n config: GetReleasesConfig,\n registryUrl: string,\n): Promise<ReleaseResult | null> {\n const cacheNamespace: PackageCacheNamespace = `datasource-releases-${datasource.id}`;\n const cacheKey = `${registryUrl}:${config.packageName}`;\n\n const cacheEnabled = !!datasource.caching; // tells if `isPrivate` flag is supported in datasource result\n const cacheForced = GlobalConfig.get('cachePrivatePackages'); // tells if caching is forced via admin config\n\n if (cacheEnabled || cacheForced) {\n const cachedResult = await packageCache.get<ReleaseResult>(\n cacheNamespace,\n cacheKey,\n );\n\n if (cachedResult) {\n logger.trace({ cacheKey }, 'Returning cached datasource response');\n DatasourceCacheStats.hit(datasource.id, registryUrl, config.packageName);\n return cachedResult;\n }\n\n DatasourceCacheStats.miss(datasource.id, registryUrl, config.packageName);\n }\n\n const res = await instrument(\n 'getReleases',\n () => datasource.getReleases({ ...config, registryUrl }),\n {\n attributes: {\n [ATTR_CODE_FUNCTION_NAME]: 'getReleases',\n [ATTR_RENOVATE_DATASOURCE]: datasource.id,\n [ATTR_RENOVATE_REGISTRY_URL]: registryUrl,\n [ATTR_RENOVATE_PACKAGE_NAME]: config.packageName,\n },\n },\n );\n if (res?.releases.length) {\n res.registryUrl ??= registryUrl;\n }\n\n if (!res) {\n return null;\n }\n\n let cache = false;\n if (cacheForced) {\n cache = true;\n } else if (cacheEnabled && !res.isPrivate) {\n cache = true;\n }\n\n if (cache) {\n logger.trace({ cacheKey }, 'Caching datasource response');\n await packageCache.set(cacheNamespace, cacheKey, res, 15);\n DatasourceCacheStats.set(datasource.id, registryUrl, config.packageName);\n } else {\n DatasourceCacheStats.skip(datasource.id, registryUrl, config.packageName);\n }\n\n return res;\n}\n\nfunction firstRegistry(\n config: GetReleasesInternalConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n if (registryUrls.length > 1) {\n logger.warn(\n {\n datasource: datasource.id,\n packageName: config.packageName,\n registryUrls,\n },\n 'Excess registryUrls found for datasource lookup - using first configured only',\n );\n }\n const registryUrl = registryUrls[0];\n return getRegistryReleases(datasource, config, registryUrl);\n}\n\nasync function huntRegistries(\n config: GetReleasesInternalConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n let res: ReleaseResult | null = null;\n let caughtError: Error | undefined;\n for (const registryUrl of registryUrls) {\n try {\n res = await getRegistryReleases(datasource, config, registryUrl);\n if (res) {\n break;\n }\n } catch (err) {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n // We'll always save the last-thrown error\n caughtError = err;\n logger.trace({ err }, 'datasource hunt failure');\n }\n }\n if (res) {\n return res;\n }\n if (caughtError) {\n throw caughtError;\n }\n return null;\n}\n\nasync function mergeRegistries(\n config: GetReleasesInternalConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n let combinedRes: ReleaseResult | undefined;\n let lastErr: Error | undefined;\n let singleRegistry = true;\n const releaseVersioning = versioning.get(config.versioning);\n for (const registryUrl of registryUrls) {\n try {\n const res = await getRegistryReleases(datasource, config, registryUrl);\n if (!res) {\n continue;\n }\n\n if (!combinedRes) {\n // This is the first registry, so we can just use it and continue\n combinedRes = res;\n continue;\n }\n\n if (singleRegistry) {\n // This is the second registry\n // We need to move the registryUrl from the package level to the release level\n for (const release of coerceArray(combinedRes.releases)) {\n release.registryUrl ??= combinedRes.registryUrl;\n }\n singleRegistry = false;\n }\n\n const releases = coerceArray(res.releases);\n for (const release of releases) {\n // We have more than one registry, so we need to move the registryUrl\n // from the package level to the release level before merging\n release.registryUrl ??= res.registryUrl;\n }\n\n combinedRes.releases.push(...releases);\n\n // Merge the tags from the two results\n let tags = combinedRes.tags;\n if (tags) {\n if (res.tags) {\n // Both results had tags, so we need to compare them\n for (const tag of ['release', 'latest']) {\n const existingTag = combinedRes?.tags?.[tag];\n const newTag = res.tags?.[tag];\n if (isString(newTag) && releaseVersioning.isVersion(newTag)) {\n if (\n isString(existingTag) &&\n releaseVersioning.isVersion(existingTag)\n ) {\n // We need to compare them\n if (releaseVersioning.isGreaterThan(newTag, existingTag)) {\n // New tag is greater than the existing one\n tags[tag] = newTag;\n }\n } else {\n // Existing tag was not present or not a version\n // so we can just use the new one\n tags[tag] = newTag;\n }\n }\n }\n }\n } else {\n // Existing results had no tags, so we can just use the new ones\n tags = res.tags;\n }\n combinedRes = { ...res, ...combinedRes };\n if (tags) {\n combinedRes.tags = tags;\n }\n // Remove the registryUrl from the package level when more than one registry\n delete combinedRes.registryUrl;\n } catch (err) {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n\n lastErr = err;\n logger.trace({ err }, 'datasource merge failure');\n }\n }\n\n if (!combinedRes) {\n if (lastErr) {\n throw lastErr;\n }\n\n return null;\n }\n\n const seenVersions = new Set<string>();\n combinedRes.releases = filterMap(combinedRes.releases, (release) => {\n if (seenVersions.has(release.version)) {\n return null;\n }\n seenVersions.add(release.version);\n return release;\n });\n\n return combinedRes;\n}\n\nfunction massageRegistryUrls(registryUrls: string[]): string[] {\n return registryUrls.filter(isTruthy).map(trimTrailingSlash);\n}\n\nfunction resolveRegistryUrls(\n datasource: DatasourceApi,\n defaultRegistryUrls: string[] | undefined,\n registryUrls: string[] | undefined | null,\n additionalRegistryUrls: string[] | undefined,\n): string[] {\n if (!datasource.customRegistrySupport) {\n if (\n isNonEmptyArray(registryUrls) ||\n isNonEmptyArray(defaultRegistryUrls) ||\n isNonEmptyArray(additionalRegistryUrls)\n ) {\n logger.warn(\n {\n datasource: datasource.id,\n registryUrls,\n defaultRegistryUrls,\n additionalRegistryUrls,\n },\n 'Custom registries are not allowed for this datasource and will be ignored',\n );\n }\n return isFunction(datasource.defaultRegistryUrls)\n ? datasource.defaultRegistryUrls()\n : (datasource.defaultRegistryUrls ?? []);\n }\n const customUrls = registryUrls?.filter(isTruthy);\n let resolvedUrls: string[] = [];\n if (isNonEmptyArray(customUrls)) {\n resolvedUrls = [...customUrls];\n } else if (isNonEmptyArray(defaultRegistryUrls)) {\n resolvedUrls = [...defaultRegistryUrls];\n resolvedUrls = resolvedUrls.concat(additionalRegistryUrls ?? []);\n } else if (isFunction(datasource.defaultRegistryUrls)) {\n resolvedUrls = [...datasource.defaultRegistryUrls()];\n resolvedUrls = resolvedUrls.concat(additionalRegistryUrls ?? []);\n } else if (isNonEmptyArray(datasource.defaultRegistryUrls)) {\n resolvedUrls = [...datasource.defaultRegistryUrls];\n resolvedUrls = resolvedUrls.concat(additionalRegistryUrls ?? []);\n }\n return massageRegistryUrls(resolvedUrls);\n}\n\nfunction applyReplacements(\n config: GetReleasesInternalConfig,\n): Pick<ReleaseResult, 'replacementName' | 'replacementVersion'> | undefined {\n if (config.replacementName && config.replacementVersion) {\n return {\n replacementName: config.replacementName,\n replacementVersion: config.replacementVersion,\n };\n }\n return undefined;\n}\n\nasync function fetchReleases(\n config: GetReleasesInternalConfig,\n): Promise<ReleaseResult | null> {\n const { datasource: datasourceName } = config;\n let { registryUrls } = config;\n // istanbul ignore if: need test\n if (!datasourceName || getDatasourceFor(datasourceName) === undefined) {\n logger.warn({ datasource: datasourceName }, 'Unknown datasource');\n return null;\n }\n if (datasourceName === 'npm') {\n if (isString(config.npmrc)) {\n setNpmrc(config.npmrc);\n }\n if (!isNonEmptyArray(registryUrls)) {\n registryUrls = [resolveRegistryUrl(config.packageName)];\n }\n }\n const datasource = getDatasourceFor(datasourceName);\n // istanbul ignore if: needs test\n if (!datasource) {\n logger.warn({ datasource: datasourceName }, 'Unknown datasource');\n return null;\n }\n registryUrls = resolveRegistryUrls(\n datasource,\n config.defaultRegistryUrls,\n registryUrls,\n config.additionalRegistryUrls,\n );\n let dep: ReleaseResult | null = null;\n const registryStrategy =\n config.registryStrategy ?? datasource.registryStrategy ?? 'hunt';\n try {\n if (isNonEmptyArray(registryUrls)) {\n if (registryStrategy === 'first') {\n dep = await firstRegistry(config, datasource, registryUrls);\n } else if (registryStrategy === 'hunt') {\n dep = await huntRegistries(config, datasource, registryUrls);\n } else if (registryStrategy === 'merge') {\n dep = await mergeRegistries(config, datasource, registryUrls);\n }\n } else {\n dep = await instrument(\n 'getReleases',\n () => datasource.getReleases(config),\n {\n attributes: {\n [ATTR_CODE_FUNCTION_NAME]: 'getReleases',\n [ATTR_RENOVATE_DATASOURCE]: datasource.id,\n [ATTR_RENOVATE_REGISTRY_URL]: config.registryUrl ?? '',\n [ATTR_RENOVATE_PACKAGE_NAME]: config.packageName,\n },\n },\n );\n }\n } catch (err) {\n if (err.message === HOST_DISABLED || err.err?.message === HOST_DISABLED) {\n return null;\n }\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logError(datasource.id, config.packageName, err);\n }\n if (!dep || dequal(dep, { releases: [] })) {\n return null;\n }\n addMetaData(dep, datasourceName, config.packageName);\n dep = { ...dep, ...applyReplacements(config) };\n return dep;\n}\n\nfunction fetchCachedReleases(\n config: GetReleasesInternalConfig,\n): Promise<ReleaseResult | null> {\n const { datasource, packageName, registryUrls } = config;\n const cacheKey = `datasource-mem:releases:${datasource}:${packageName}:${config.registryStrategy}:${String(\n registryUrls,\n )}`;\n // By returning a Promise and reusing it, we should only fetch each package at most once\n const cachedResult = memCache.get<Promise<ReleaseResult | null>>(cacheKey);\n // istanbul ignore if\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n const promisedRes = fetchReleases(config);\n memCache.set(cacheKey, promisedRes);\n return promisedRes;\n}\n\nexport function getRawPkgReleases(\n config: GetPkgReleasesConfig,\n): AsyncResult<\n ReleaseResult,\n Error | 'no-datasource' | 'no-package-name' | 'no-result'\n> {\n if (!config.datasource) {\n logger.warn('No datasource found');\n return AsyncResult.err('no-datasource');\n }\n\n const packageName = config.packageName;\n if (!packageName) {\n logger.error({ config }, 'Datasource getReleases without packageName');\n return AsyncResult.err('no-package-name');\n }\n\n return Result.wrapNullable(fetchCachedReleases(config), 'no-result' as const)\n .catch((e) => {\n if (e instanceof ExternalHostError) {\n e.hostType = config.datasource;\n e.packageName = packageName;\n }\n return Result.err(e);\n })\n .transform(clone);\n}\n\nexport function applyDatasourceFilters(\n releaseResult: ReleaseResult,\n config: GetPkgReleasesConfig,\n): ReleaseResult {\n let res = releaseResult;\n res = applyExtractVersion(res, config.extractVersion);\n res = applyVersionCompatibility(\n res,\n config.versionCompatibility,\n config.currentCompatibility,\n );\n res = filterValidVersions(res, config);\n res = sortAndRemoveDuplicates(res, config);\n res = applyConstraintsFiltering(res, config);\n return res;\n}\n\nexport async function getPkgReleases(\n config: GetPkgReleasesConfig,\n): Promise<ReleaseResult | null> {\n const { val = null, err } = await getRawPkgReleases(config)\n .transform((res) => applyDatasourceFilters(res, config))\n .unwrap();\n\n if (err instanceof Error) {\n throw err;\n }\n\n return val;\n}\n\nexport function supportsDigests(datasource: string | undefined): boolean {\n const ds = !!datasource && getDatasourceFor(datasource);\n return !!ds && 'getDigest' in ds;\n}\n\nfunction getDigestConfig(\n datasource: DatasourceApi,\n config: GetDigestInputConfig,\n): DigestConfig {\n const { lookupName, currentValue, currentDigest } = config;\n const packageName = config.replacementName ?? config.packageName;\n // Prefer registryUrl from getReleases() lookup if it has been passed\n const registryUrl =\n config.registryUrl ??\n resolveRegistryUrls(\n datasource,\n config.defaultRegistryUrls,\n config.registryUrls,\n config.additionalRegistryUrls,\n )[0];\n return { lookupName, packageName, registryUrl, currentValue, currentDigest };\n}\n\nexport function getDigest(\n config: GetDigestInputConfig,\n value?: string,\n): Promise<string | null> {\n const datasource = getDatasourceFor(config.datasource);\n // istanbul ignore if: need test\n if (!datasource || !('getDigest' in datasource)) {\n return Promise.resolve(null);\n }\n const digestConfig = getDigestConfig(datasource, config);\n return datasource.getDigest!(digestConfig, value);\n}\n\nexport function getDefaultConfig(\n datasource: string,\n): Promise<Record<string, unknown>> {\n const loadedDatasource = getDatasourceFor(datasource);\n return Promise.resolve<Record<string, unknown>>(\n loadedDatasource?.defaultConfig ?? Object.create({}),\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["datasources","packageCache.get","packageCache.set","versioning.get","memCache.get"],"sources":["../../../lib/modules/datasource/index.ts"],"sourcesContent":["import { ATTR_CODE_FUNCTION_NAME } from '@opentelemetry/semantic-conventions';\nimport {\n isFunction,\n isNonEmptyArray,\n isString,\n isTruthy,\n} from '@sindresorhus/is';\nimport { dequal } from 'dequal';\nimport { GlobalConfig } from '../../config/global.ts';\nimport { HOST_DISABLED } from '../../constants/error-messages.ts';\nimport { instrument } from '../../instrumentation/index.ts';\nimport {\n ATTR_RENOVATE_DATASOURCE,\n ATTR_RENOVATE_PACKAGE_NAME,\n ATTR_RENOVATE_REGISTRY_URL,\n} from '../../instrumentation/types.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport { coerceArray } from '../../util/array.ts';\nimport * as memCache from '../../util/cache/memory/index.ts';\nimport * as packageCache from '../../util/cache/package/index.ts';\nimport type { PackageCacheNamespace } from '../../util/cache/package/types.ts';\nimport { clone } from '../../util/clone.ts';\nimport { filterMap } from '../../util/filter-map.ts';\nimport { AsyncResult, Result } from '../../util/result.ts';\nimport { DatasourceCacheStats } from '../../util/stats.ts';\nimport { trimTrailingSlash } from '../../util/url.ts';\nimport * as versioning from '../versioning/index.ts';\nimport datasources from './api.ts';\nimport {\n applyConstraintsFiltering,\n applyExtractVersion,\n applyVersionCompatibility,\n filterValidVersions,\n getDatasourceFor,\n sortAndRemoveDuplicates,\n} from './common.ts';\nimport { addMetaData } from './metadata.ts';\nimport { setNpmrc } from './npm/index.ts';\nimport { resolveRegistryUrl } from './npm/npmrc.ts';\nimport type {\n DatasourceApi,\n DigestConfig,\n GetDigestInputConfig,\n GetPkgReleasesConfig,\n GetReleasesConfig,\n ReleaseResult,\n} from './types.ts';\n\nexport { isGetPkgReleasesConfig } from './common.ts';\nexport * from './types.ts';\n\nexport function getDatasources(): Map<string, DatasourceApi> {\n return datasources;\n}\nexport function getDatasourceList(): string[] {\n return Array.from(datasources.keys());\n}\n\ntype GetReleasesInternalConfig = GetReleasesConfig & GetPkgReleasesConfig;\n\n// TODO: fix error Type\nfunction logError(datasource: string, packageName: string, err: any): void {\n const { statusCode, code: errCode, url } = err;\n if (statusCode === 404) {\n logger.debug({ datasource, packageName, url }, 'Datasource 404');\n } else if (statusCode === 401 || statusCode === 403) {\n logger.debug({ datasource, packageName, url }, 'Datasource unauthorized');\n } else if (errCode) {\n logger.debug(\n { datasource, packageName, url, errCode },\n 'Datasource connection error',\n );\n } else {\n logger.debug({ datasource, packageName, err }, 'Datasource unknown error');\n }\n}\n\nasync function getRegistryReleases(\n datasource: DatasourceApi,\n config: GetReleasesConfig,\n registryUrl: string,\n): Promise<ReleaseResult | null> {\n const cacheNamespace: PackageCacheNamespace = `datasource-releases-${datasource.id}`;\n const cacheKey = `${registryUrl}:${config.packageName}`;\n\n const cacheEnabled = !!datasource.caching; // tells if `isPrivate` flag is supported in datasource result\n const cacheForced = GlobalConfig.get('cachePrivatePackages'); // tells if caching is forced via admin config\n\n if (cacheEnabled || cacheForced) {\n const cachedResult = await packageCache.get<ReleaseResult>(\n cacheNamespace,\n cacheKey,\n );\n\n if (cachedResult) {\n logger.trace({ cacheKey }, 'Returning cached datasource response');\n DatasourceCacheStats.hit(datasource.id, registryUrl, config.packageName);\n return cachedResult;\n }\n\n DatasourceCacheStats.miss(datasource.id, registryUrl, config.packageName);\n }\n\n const res = await instrument(\n 'getReleases',\n () => datasource.getReleases({ ...config, registryUrl }),\n {\n attributes: {\n [ATTR_CODE_FUNCTION_NAME]: 'getReleases',\n [ATTR_RENOVATE_DATASOURCE]: datasource.id,\n [ATTR_RENOVATE_REGISTRY_URL]: registryUrl,\n [ATTR_RENOVATE_PACKAGE_NAME]: config.packageName,\n },\n },\n );\n if (res?.releases.length) {\n res.registryUrl ??= registryUrl;\n }\n\n if (!res) {\n return null;\n }\n\n let cache = false;\n if (cacheForced) {\n cache = true;\n } else if (cacheEnabled && !res.isPrivate) {\n cache = true;\n }\n\n if (cache) {\n logger.trace({ cacheKey }, 'Caching datasource response');\n await packageCache.set(cacheNamespace, cacheKey, res, 15);\n DatasourceCacheStats.set(datasource.id, registryUrl, config.packageName);\n } else {\n DatasourceCacheStats.skip(datasource.id, registryUrl, config.packageName);\n }\n\n return res;\n}\n\nfunction firstRegistry(\n config: GetReleasesInternalConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n if (registryUrls.length > 1) {\n logger.warn(\n {\n datasource: datasource.id,\n packageName: config.packageName,\n registryUrls,\n },\n 'Excess registryUrls found for datasource lookup - using first configured only',\n );\n }\n const registryUrl = registryUrls[0];\n return getRegistryReleases(datasource, config, registryUrl);\n}\n\nasync function huntRegistries(\n config: GetReleasesInternalConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n let res: ReleaseResult | null = null;\n let caughtError: Error | undefined;\n for (const registryUrl of registryUrls) {\n try {\n res = await getRegistryReleases(datasource, config, registryUrl);\n if (res) {\n break;\n }\n } catch (err) {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n // We'll always save the last-thrown error\n caughtError = err;\n logger.trace({ err }, 'datasource hunt failure');\n }\n }\n if (res) {\n return res;\n }\n if (caughtError) {\n throw caughtError;\n }\n return null;\n}\n\nasync function mergeRegistries(\n config: GetReleasesInternalConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n let combinedRes: ReleaseResult | undefined;\n let lastErr: Error | undefined;\n let externalHostError: ExternalHostError | undefined;\n let singleRegistry = true;\n const releaseVersioning = versioning.get(config.versioning);\n for (const registryUrl of registryUrls) {\n try {\n const res = await getRegistryReleases(datasource, config, registryUrl);\n if (!res) {\n continue;\n }\n\n if (!combinedRes) {\n // This is the first registry, so we can just use it and continue\n combinedRes = res;\n continue;\n }\n\n if (singleRegistry) {\n // This is the second registry\n // We need to move the registryUrl from the package level to the release level\n for (const release of coerceArray(combinedRes.releases)) {\n release.registryUrl ??= combinedRes.registryUrl;\n }\n singleRegistry = false;\n }\n\n const releases = coerceArray(res.releases);\n for (const release of releases) {\n // We have more than one registry, so we need to move the registryUrl\n // from the package level to the release level before merging\n release.registryUrl ??= res.registryUrl;\n }\n\n combinedRes.releases.push(...releases);\n\n // Merge the tags from the two results\n let tags = combinedRes.tags;\n if (tags) {\n if (res.tags) {\n // Both results had tags, so we need to compare them\n for (const tag of ['release', 'latest']) {\n const existingTag = combinedRes?.tags?.[tag];\n const newTag = res.tags?.[tag];\n if (isString(newTag) && releaseVersioning.isVersion(newTag)) {\n if (\n isString(existingTag) &&\n releaseVersioning.isVersion(existingTag)\n ) {\n // We need to compare them\n if (releaseVersioning.isGreaterThan(newTag, existingTag)) {\n // New tag is greater than the existing one\n tags[tag] = newTag;\n }\n } else {\n // Existing tag was not present or not a version\n // so we can just use the new one\n tags[tag] = newTag;\n }\n }\n }\n }\n } else {\n // Existing results had no tags, so we can just use the new ones\n tags = res.tags;\n }\n combinedRes = { ...res, ...combinedRes };\n if (tags) {\n combinedRes.tags = tags;\n }\n // Remove the registryUrl from the package level when more than one registry\n delete combinedRes.registryUrl;\n } catch (err) {\n if (err instanceof ExternalHostError) {\n // Don't abort the merge if another registry already returned releases;\n // a single rate-limited registry shouldn't discard results we have\n externalHostError = err;\n logger.debug(\n { err, registryUrl },\n 'datasource merge: external host error from registry; continuing so releases from other registries are not discarded',\n );\n continue;\n }\n\n lastErr = err;\n logger.trace({ err }, 'datasource merge failure');\n }\n }\n\n if (!combinedRes) {\n if (externalHostError) {\n throw externalHostError;\n }\n\n if (lastErr) {\n throw lastErr;\n }\n\n return null;\n }\n\n const seenVersions = new Set<string>();\n combinedRes.releases = filterMap(combinedRes.releases, (release) => {\n if (seenVersions.has(release.version)) {\n return null;\n }\n seenVersions.add(release.version);\n return release;\n });\n\n return combinedRes;\n}\n\nfunction massageRegistryUrls(registryUrls: string[]): string[] {\n return registryUrls.filter(isTruthy).map(trimTrailingSlash);\n}\n\nfunction resolveRegistryUrls(\n datasource: DatasourceApi,\n defaultRegistryUrls: string[] | undefined,\n registryUrls: string[] | undefined | null,\n additionalRegistryUrls: string[] | undefined,\n): string[] {\n if (!datasource.customRegistrySupport) {\n if (\n isNonEmptyArray(registryUrls) ||\n isNonEmptyArray(defaultRegistryUrls) ||\n isNonEmptyArray(additionalRegistryUrls)\n ) {\n logger.warn(\n {\n datasource: datasource.id,\n registryUrls,\n defaultRegistryUrls,\n additionalRegistryUrls,\n },\n 'Custom registries are not allowed for this datasource and will be ignored',\n );\n }\n return isFunction(datasource.defaultRegistryUrls)\n ? datasource.defaultRegistryUrls()\n : (datasource.defaultRegistryUrls ?? []);\n }\n const customUrls = registryUrls?.filter(isTruthy);\n let resolvedUrls: string[] = [];\n if (isNonEmptyArray(customUrls)) {\n resolvedUrls = [...customUrls];\n } else if (isNonEmptyArray(defaultRegistryUrls)) {\n resolvedUrls = [...defaultRegistryUrls];\n resolvedUrls = resolvedUrls.concat(additionalRegistryUrls ?? []);\n } else if (isFunction(datasource.defaultRegistryUrls)) {\n resolvedUrls = [...datasource.defaultRegistryUrls()];\n resolvedUrls = resolvedUrls.concat(additionalRegistryUrls ?? []);\n } else if (isNonEmptyArray(datasource.defaultRegistryUrls)) {\n resolvedUrls = [...datasource.defaultRegistryUrls];\n resolvedUrls = resolvedUrls.concat(additionalRegistryUrls ?? []);\n }\n return massageRegistryUrls(resolvedUrls);\n}\n\nfunction applyReplacements(\n config: GetReleasesInternalConfig,\n): Pick<ReleaseResult, 'replacementName' | 'replacementVersion'> | undefined {\n if (config.replacementName && config.replacementVersion) {\n return {\n replacementName: config.replacementName,\n replacementVersion: config.replacementVersion,\n };\n }\n return undefined;\n}\n\nasync function fetchReleases(\n config: GetReleasesInternalConfig,\n): Promise<ReleaseResult | null> {\n const { datasource: datasourceName } = config;\n let { registryUrls } = config;\n // istanbul ignore if: need test\n if (!datasourceName || getDatasourceFor(datasourceName) === undefined) {\n logger.warn({ datasource: datasourceName }, 'Unknown datasource');\n return null;\n }\n if (datasourceName === 'npm') {\n if (isString(config.npmrc)) {\n setNpmrc(config.npmrc);\n }\n if (!isNonEmptyArray(registryUrls)) {\n registryUrls = [resolveRegistryUrl(config.packageName)];\n }\n }\n const datasource = getDatasourceFor(datasourceName);\n // istanbul ignore if: needs test\n if (!datasource) {\n logger.warn({ datasource: datasourceName }, 'Unknown datasource');\n return null;\n }\n registryUrls = resolveRegistryUrls(\n datasource,\n config.defaultRegistryUrls,\n registryUrls,\n config.additionalRegistryUrls,\n );\n let dep: ReleaseResult | null = null;\n const registryStrategy =\n config.registryStrategy ?? datasource.registryStrategy ?? 'hunt';\n try {\n if (isNonEmptyArray(registryUrls)) {\n if (registryStrategy === 'first') {\n dep = await firstRegistry(config, datasource, registryUrls);\n } else if (registryStrategy === 'hunt') {\n dep = await huntRegistries(config, datasource, registryUrls);\n } else if (registryStrategy === 'merge') {\n dep = await mergeRegistries(config, datasource, registryUrls);\n }\n } else {\n dep = await instrument(\n 'getReleases',\n () => datasource.getReleases(config),\n {\n attributes: {\n [ATTR_CODE_FUNCTION_NAME]: 'getReleases',\n [ATTR_RENOVATE_DATASOURCE]: datasource.id,\n [ATTR_RENOVATE_REGISTRY_URL]: config.registryUrl ?? '',\n [ATTR_RENOVATE_PACKAGE_NAME]: config.packageName,\n },\n },\n );\n }\n } catch (err) {\n if (err.message === HOST_DISABLED || err.err?.message === HOST_DISABLED) {\n return null;\n }\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logError(datasource.id, config.packageName, err);\n }\n if (!dep || dequal(dep, { releases: [] })) {\n return null;\n }\n addMetaData(dep, datasourceName, config.packageName);\n dep = { ...dep, ...applyReplacements(config) };\n return dep;\n}\n\nfunction fetchCachedReleases(\n config: GetReleasesInternalConfig,\n): Promise<ReleaseResult | null> {\n const { datasource, packageName, registryUrls } = config;\n const cacheKey = `datasource-mem:releases:${datasource}:${packageName}:${config.registryStrategy}:${String(\n registryUrls,\n )}`;\n // By returning a Promise and reusing it, we should only fetch each package at most once\n const cachedResult = memCache.get<Promise<ReleaseResult | null>>(cacheKey);\n // istanbul ignore if\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n const promisedRes = fetchReleases(config);\n memCache.set(cacheKey, promisedRes);\n return promisedRes;\n}\n\nexport function getRawPkgReleases(\n config: GetPkgReleasesConfig,\n): AsyncResult<\n ReleaseResult,\n Error | 'no-datasource' | 'no-package-name' | 'no-result'\n> {\n if (!config.datasource) {\n logger.warn('No datasource found');\n return AsyncResult.err('no-datasource');\n }\n\n const packageName = config.packageName;\n if (!packageName) {\n logger.error({ config }, 'Datasource getReleases without packageName');\n return AsyncResult.err('no-package-name');\n }\n\n return Result.wrapNullable(fetchCachedReleases(config), 'no-result' as const)\n .catch((e) => {\n if (e instanceof ExternalHostError) {\n e.hostType = config.datasource;\n e.packageName = packageName;\n }\n return Result.err(e);\n })\n .transform(clone);\n}\n\nexport function applyDatasourceFilters(\n releaseResult: ReleaseResult,\n config: GetPkgReleasesConfig,\n): ReleaseResult {\n let res = releaseResult;\n res = applyExtractVersion(res, config.extractVersion);\n res = applyVersionCompatibility(\n res,\n config.versionCompatibility,\n config.currentCompatibility,\n );\n res = filterValidVersions(res, config);\n res = sortAndRemoveDuplicates(res, config);\n res = applyConstraintsFiltering(res, config);\n return res;\n}\n\nexport async function getPkgReleases(\n config: GetPkgReleasesConfig,\n): Promise<ReleaseResult | null> {\n const { val = null, err } = await getRawPkgReleases(config)\n .transform((res) => applyDatasourceFilters(res, config))\n .unwrap();\n\n if (err instanceof Error) {\n throw err;\n }\n\n return val;\n}\n\nexport function supportsDigests(datasource: string | undefined): boolean {\n const ds = !!datasource && getDatasourceFor(datasource);\n return !!ds && 'getDigest' in ds;\n}\n\nfunction getDigestConfig(\n datasource: DatasourceApi,\n config: GetDigestInputConfig,\n): DigestConfig {\n const { lookupName, currentValue, currentDigest } = config;\n const packageName = config.replacementName ?? config.packageName;\n // Prefer registryUrl from getReleases() lookup if it has been passed\n const registryUrl =\n config.registryUrl ??\n resolveRegistryUrls(\n datasource,\n config.defaultRegistryUrls,\n config.registryUrls,\n config.additionalRegistryUrls,\n )[0];\n return { lookupName, packageName, registryUrl, currentValue, currentDigest };\n}\n\nexport function getDigest(\n config: GetDigestInputConfig,\n value?: string,\n): Promise<string | null> {\n const datasource = getDatasourceFor(config.datasource);\n // istanbul ignore if: need test\n if (!datasource || !('getDigest' in datasource)) {\n return Promise.resolve(null);\n }\n const digestConfig = getDigestConfig(datasource, config);\n return datasource.getDigest!(digestConfig, value);\n}\n\nexport function getDefaultConfig(\n datasource: string,\n): Promise<Record<string, unknown>> {\n const loadedDatasource = getDatasourceFor(datasource);\n return Promise.resolve<Record<string, unknown>>(\n loadedDatasource?.defaultConfig ?? Object.create({}),\n );\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "renovate",
3
3
  "description": "Automated dependency updates. Flexible so you don't need to be.",
4
- "version": "44.33.0",
4
+ "version": "44.33.1",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "renovate": "dist/renovate.js",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$id": "https://docs.renovatebot.com/renovate-schema.json",
3
- "title": "JSON schema for Renovate 44.33.0 config files (https://renovatebot.com/)",
3
+ "title": "JSON schema for Renovate 44.33.1 config files (https://renovatebot.com/)",
4
4
  "$schema": "http://json-schema.org/draft-07/schema#",
5
- "x-renovate-version": "44.33.0",
5
+ "x-renovate-version": "44.33.1",
6
6
  "allowComments": true,
7
7
  "type": "object",
8
8
  "definitions": {