renovate 44.68.0 → 44.68.2
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.
|
@@ -77,8 +77,7 @@ var AwsMachineImageDatasource = class AwsMachineImageDatasource extends Datasour
|
|
|
77
77
|
if (newValueMatchingImages.length === 1 && newValueMatchingImages[0].Name) return newValueMatchingImages[0].Name;
|
|
78
78
|
return null;
|
|
79
79
|
}
|
|
80
|
-
return
|
|
81
|
-
/* v8 ignore next -- fallback when the AMI filter matches no image */ null;
|
|
80
|
+
return images.at(-1).Name ?? null;
|
|
82
81
|
}
|
|
83
82
|
getDigest(config, newValue) {
|
|
84
83
|
return withCache({
|
|
@@ -88,14 +87,14 @@ var AwsMachineImageDatasource = class AwsMachineImageDatasource extends Datasour
|
|
|
88
87
|
}, () => this._getDigest(config, newValue));
|
|
89
88
|
}
|
|
90
89
|
async _getReleases({ packageName: serializedAmiFilter }) {
|
|
91
|
-
const
|
|
92
|
-
if (!
|
|
93
|
-
return { releases:
|
|
94
|
-
version:
|
|
95
|
-
releaseTimestamp: asTimestamp(
|
|
96
|
-
isDeprecated: Date.parse(
|
|
97
|
-
newDigest:
|
|
98
|
-
}
|
|
90
|
+
const images = await this.getSortedAwsMachineImages(serializedAmiFilter);
|
|
91
|
+
if (!images.length || !images.at(-1).ImageId) return null;
|
|
92
|
+
return { releases: images.map((image) => ({
|
|
93
|
+
version: image.ImageId,
|
|
94
|
+
releaseTimestamp: asTimestamp(image.CreationDate),
|
|
95
|
+
isDeprecated: Date.parse(image.DeprecationTime ?? this.now.toString()) < this.now,
|
|
96
|
+
newDigest: image.Name
|
|
97
|
+
})) };
|
|
99
98
|
}
|
|
100
99
|
getReleases(config) {
|
|
101
100
|
return withCache({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["amazonMachineImageVersioning.id","hostRules.find"],"sources":["../../../../lib/modules/datasource/aws-machine-image/index.ts"],"sourcesContent":["import type { Filter, Image } from '@aws-sdk/client-ec2';\nimport { DescribeImagesCommand, EC2Client } from '@aws-sdk/client-ec2';\nimport { fromNodeProviderChain } from '@aws-sdk/credential-providers';\nimport { coerceArray } from '../../../util/array.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport * as amazonMachineImageVersioning from '../../versioning/aws-machine-image/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport type { AwsClientConfig, ParsedConfig } from './types.ts';\n\nexport class AwsMachineImageDatasource extends Datasource {\n static readonly id = 'aws-machine-image';\n\n override readonly defaultVersioning = amazonMachineImageVersioning.id;\n\n override readonly caching = true;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `CreationDate` field in the results.';\n\n override readonly defaultConfig = {\n // Because AMIs don't follow any versioning scheme, we override commitMessageExtra to remove the 'v'\n commitMessageExtra: 'to {{{newVersion}}}',\n prBodyColumns: ['Change', 'Image'],\n prBodyDefinitions: {\n Image: '```{{{newDigest}}}```',\n },\n digest: {\n // Because newDigestShort will allways be 'amazon-' we override to print the name of the AMI\n commitMessageExtra: 'to {{{newDigest}}}',\n prBodyColumns: ['Image'],\n prBodyDefinitions: {\n Image: '```{{{newDigest}}}```',\n },\n },\n };\n\n private readonly now: number;\n\n constructor() {\n super(AwsMachineImageDatasource.id);\n this.now = Date.now();\n }\n\n private isAmiFilter(config: Filter | AwsClientConfig): config is Filter {\n return 'Name' in config && 'Values' in config;\n }\n\n private getEC2Client(config: AwsClientConfig): EC2Client {\n const { profile, region } = config;\n const { password, token, username } = hostRules.find({\n hostType: AwsMachineImageDatasource.id,\n });\n return new EC2Client({\n region,\n credentials:\n username && password\n ? {\n accessKeyId: username,\n secretAccessKey: password,\n sessionToken: token,\n }\n : fromNodeProviderChain({ profile }),\n });\n }\n\n private getAmiFilterCommand(filter: Filter[]): DescribeImagesCommand {\n return new DescribeImagesCommand({\n Filters: filter,\n });\n }\n\n loadConfig(serializedAmiFilter: string): [Filter[], AwsClientConfig] {\n const parsedConfig: ParsedConfig = JSON.parse(serializedAmiFilter);\n const filters = [];\n let config = {};\n for (const elem of parsedConfig) {\n if (this.isAmiFilter(elem)) {\n // Separate actual AMI filters from aws client config\n filters.push(elem);\n } else {\n // merge config objects if there are multiple\n config = Object.assign(config, elem);\n }\n }\n return [filters, config];\n }\n\n private async _getSortedAwsMachineImages(\n serializedAmiFilter: string,\n ): Promise<Image[]> {\n const [amiFilter, clientConfig] = this.loadConfig(serializedAmiFilter);\n const amiFilterCmd = this.getAmiFilterCommand(amiFilter);\n const ec2Client = this.getEC2Client(clientConfig);\n const matchingImages = await ec2Client.send(amiFilterCmd);\n matchingImages.Images = coerceArray(matchingImages.Images);\n return matchingImages.Images.sort((image1, image2) => {\n const ts1 = image1.CreationDate\n ? Date.parse(image1.CreationDate)\n : /* v8 ignore next -- AWS SDK types CreationDate as optional, but EC2 always returns it for images */ 0; // TODO: add date coersion util\n\n const ts2 = image2.CreationDate\n ? Date.parse(image2.CreationDate)\n : /* v8 ignore next -- AWS SDK types CreationDate as optional, but EC2 always returns it for images */ 0; // TODO: add date coersion util\n return ts1 - ts2;\n });\n }\n\n getSortedAwsMachineImages(serializedAmiFilter: string): Promise<Image[]> {\n return withCache(\n {\n namespace: `datasource-${AwsMachineImageDatasource.id}`,\n key: `getSortedAwsMachineImages:${serializedAmiFilter}`,\n },\n () => this._getSortedAwsMachineImages(serializedAmiFilter),\n );\n }\n\n private async _getDigest(\n { packageName: serializedAmiFilter }: GetReleasesConfig,\n newValue?: string,\n ): Promise<string | null> {\n const images = await this.getSortedAwsMachineImages(serializedAmiFilter);\n if (images.length < 1) {\n return null;\n }\n\n if (newValue) {\n const newValueMatchingImages = images.filter(\n (image) => image.ImageId === newValue,\n );\n if (\n newValueMatchingImages.length === 1 &&\n newValueMatchingImages[0].Name\n ) {\n return newValueMatchingImages[0].Name;\n }\n return null;\n }\n\n
|
|
1
|
+
{"version":3,"file":"index.js","names":["amazonMachineImageVersioning.id","hostRules.find"],"sources":["../../../../lib/modules/datasource/aws-machine-image/index.ts"],"sourcesContent":["import type { Filter, Image } from '@aws-sdk/client-ec2';\nimport { DescribeImagesCommand, EC2Client } from '@aws-sdk/client-ec2';\nimport { fromNodeProviderChain } from '@aws-sdk/credential-providers';\nimport { coerceArray } from '../../../util/array.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport * as amazonMachineImageVersioning from '../../versioning/aws-machine-image/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport type { AwsClientConfig, ParsedConfig } from './types.ts';\n\nexport class AwsMachineImageDatasource extends Datasource {\n static readonly id = 'aws-machine-image';\n\n override readonly defaultVersioning = amazonMachineImageVersioning.id;\n\n override readonly caching = true;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `CreationDate` field in the results.';\n\n override readonly defaultConfig = {\n // Because AMIs don't follow any versioning scheme, we override commitMessageExtra to remove the 'v'\n commitMessageExtra: 'to {{{newVersion}}}',\n prBodyColumns: ['Change', 'Image'],\n prBodyDefinitions: {\n Image: '```{{{newDigest}}}```',\n },\n digest: {\n // Because newDigestShort will allways be 'amazon-' we override to print the name of the AMI\n commitMessageExtra: 'to {{{newDigest}}}',\n prBodyColumns: ['Image'],\n prBodyDefinitions: {\n Image: '```{{{newDigest}}}```',\n },\n },\n };\n\n private readonly now: number;\n\n constructor() {\n super(AwsMachineImageDatasource.id);\n this.now = Date.now();\n }\n\n private isAmiFilter(config: Filter | AwsClientConfig): config is Filter {\n return 'Name' in config && 'Values' in config;\n }\n\n private getEC2Client(config: AwsClientConfig): EC2Client {\n const { profile, region } = config;\n const { password, token, username } = hostRules.find({\n hostType: AwsMachineImageDatasource.id,\n });\n return new EC2Client({\n region,\n credentials:\n username && password\n ? {\n accessKeyId: username,\n secretAccessKey: password,\n sessionToken: token,\n }\n : fromNodeProviderChain({ profile }),\n });\n }\n\n private getAmiFilterCommand(filter: Filter[]): DescribeImagesCommand {\n return new DescribeImagesCommand({\n Filters: filter,\n });\n }\n\n loadConfig(serializedAmiFilter: string): [Filter[], AwsClientConfig] {\n const parsedConfig: ParsedConfig = JSON.parse(serializedAmiFilter);\n const filters = [];\n let config = {};\n for (const elem of parsedConfig) {\n if (this.isAmiFilter(elem)) {\n // Separate actual AMI filters from aws client config\n filters.push(elem);\n } else {\n // merge config objects if there are multiple\n config = Object.assign(config, elem);\n }\n }\n return [filters, config];\n }\n\n private async _getSortedAwsMachineImages(\n serializedAmiFilter: string,\n ): Promise<Image[]> {\n const [amiFilter, clientConfig] = this.loadConfig(serializedAmiFilter);\n const amiFilterCmd = this.getAmiFilterCommand(amiFilter);\n const ec2Client = this.getEC2Client(clientConfig);\n const matchingImages = await ec2Client.send(amiFilterCmd);\n matchingImages.Images = coerceArray(matchingImages.Images);\n return matchingImages.Images.sort((image1, image2) => {\n const ts1 = image1.CreationDate\n ? Date.parse(image1.CreationDate)\n : /* v8 ignore next -- AWS SDK types CreationDate as optional, but EC2 always returns it for images */ 0; // TODO: add date coersion util\n\n const ts2 = image2.CreationDate\n ? Date.parse(image2.CreationDate)\n : /* v8 ignore next -- AWS SDK types CreationDate as optional, but EC2 always returns it for images */ 0; // TODO: add date coersion util\n return ts1 - ts2;\n });\n }\n\n getSortedAwsMachineImages(serializedAmiFilter: string): Promise<Image[]> {\n return withCache(\n {\n namespace: `datasource-${AwsMachineImageDatasource.id}`,\n key: `getSortedAwsMachineImages:${serializedAmiFilter}`,\n },\n () => this._getSortedAwsMachineImages(serializedAmiFilter),\n );\n }\n\n private async _getDigest(\n { packageName: serializedAmiFilter }: GetReleasesConfig,\n newValue?: string,\n ): Promise<string | null> {\n const images = await this.getSortedAwsMachineImages(serializedAmiFilter);\n if (images.length < 1) {\n return null;\n }\n\n if (newValue) {\n const newValueMatchingImages = images.filter(\n (image) => image.ImageId === newValue,\n );\n if (\n newValueMatchingImages.length === 1 &&\n newValueMatchingImages[0].Name\n ) {\n return newValueMatchingImages[0].Name;\n }\n return null;\n }\n\n return images.at(-1)!.Name ?? null;\n }\n\n override getDigest(\n config: GetReleasesConfig,\n newValue?: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: `datasource-${AwsMachineImageDatasource.id}`,\n key: `getDigest:${config.packageName}:${newValue ?? ''}`,\n fallback: true,\n },\n () => this._getDigest(config, newValue),\n );\n }\n\n private async _getReleases({\n packageName: serializedAmiFilter,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const images = await this.getSortedAwsMachineImages(serializedAmiFilter);\n if (!images.length || !images.at(-1)!.ImageId) {\n return null;\n }\n return {\n releases: images.map((image) => ({\n version: image.ImageId!,\n releaseTimestamp: asTimestamp(image.CreationDate),\n isDeprecated:\n Date.parse(image.DeprecationTime ?? this.now.toString()) < this.now,\n newDigest: image.Name,\n })),\n };\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${AwsMachineImageDatasource.id}`,\n key: `getReleases:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import "../../constants/error-messages.js";
|
|
|
2
2
|
import { get, set } from "../../util/cache/memory/index.js";
|
|
3
3
|
import { GlobalConfig } from "../../config/global.js";
|
|
4
4
|
import { coerceArray } from "../../util/array.js";
|
|
5
|
+
import { safeStringify } from "../../util/stringify.js";
|
|
5
6
|
import { logger } from "../../logger/index.js";
|
|
6
7
|
import { clone } from "../../util/clone.js";
|
|
7
8
|
import { trimTrailingSlash } from "../../util/url.js";
|
|
@@ -118,7 +119,7 @@ async function mergeRegistries(config, datasource, registryUrls) {
|
|
|
118
119
|
let singleRegistry = true;
|
|
119
120
|
const releaseVersioning = get$1(config.versioning);
|
|
120
121
|
for (const registryUrl of registryUrls) try {
|
|
121
|
-
const res = await getRegistryReleases(datasource, config, registryUrl);
|
|
122
|
+
const res = clone(await getRegistryReleases(datasource, config, registryUrl));
|
|
122
123
|
if (!res) continue;
|
|
123
124
|
if (!combinedRes) {
|
|
124
125
|
combinedRes = res;
|
|
@@ -255,7 +256,11 @@ async function fetchReleases(config) {
|
|
|
255
256
|
}
|
|
256
257
|
function fetchCachedReleases(config) {
|
|
257
258
|
const { datasource, packageName, registryUrls } = config;
|
|
258
|
-
const cacheKey = `datasource-mem:releases:${datasource}:${packageName}:${config.registryStrategy}:${
|
|
259
|
+
const cacheKey = `datasource-mem:releases:${datasource}:${packageName}:${config.registryStrategy}:${safeStringify([
|
|
260
|
+
registryUrls,
|
|
261
|
+
config.defaultRegistryUrls,
|
|
262
|
+
config.additionalRegistryUrls
|
|
263
|
+
])}`;
|
|
259
264
|
const cachedResult = get(cacheKey);
|
|
260
265
|
// istanbul ignore if
|
|
261
266
|
if (cachedResult !== void 0) return cachedResult;
|
|
@@ -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 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 : coerceArray(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(coerceArray(additionalRegistryUrls));\n } else if (isFunction(datasource.defaultRegistryUrls)) {\n resolvedUrls = [...datasource.defaultRegistryUrls()];\n resolvedUrls = resolvedUrls.concat(coerceArray(additionalRegistryUrls));\n } else if (isNonEmptyArray(datasource.defaultRegistryUrls)) {\n resolvedUrls = [...datasource.defaultRegistryUrls];\n resolvedUrls = resolvedUrls.concat(coerceArray(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 { safeStringify } from '../../util/stringify.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 // Merging must not mutate responses shared by the package cache.\n const res = clone(\n await getRegistryReleases(datasource, config, registryUrl),\n );\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 : coerceArray(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(coerceArray(additionalRegistryUrls));\n } else if (isFunction(datasource.defaultRegistryUrls)) {\n resolvedUrls = [...datasource.defaultRegistryUrls()];\n resolvedUrls = resolvedUrls.concat(coerceArray(additionalRegistryUrls));\n } else if (isNonEmptyArray(datasource.defaultRegistryUrls)) {\n resolvedUrls = [...datasource.defaultRegistryUrls];\n resolvedUrls = resolvedUrls.concat(coerceArray(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}:${safeStringify(\n [registryUrls, config.defaultRegistryUrls, config.additionalRegistryUrls],\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
package/renovate-schema.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$id": "https://docs.renovatebot.com/renovate-schema.json",
|
|
3
|
-
"title": "JSON schema for Renovate 44.68.
|
|
3
|
+
"title": "JSON schema for Renovate 44.68.2 config files (https://renovatebot.com/)",
|
|
4
4
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
5
|
-
"x-renovate-version": "44.68.
|
|
5
|
+
"x-renovate-version": "44.68.2",
|
|
6
6
|
"allowComments": true,
|
|
7
7
|
"type": "object",
|
|
8
8
|
"definitions": {
|