renovate 44.149.1 → 44.149.3
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.
- package/dist/config/options/index.js +1 -1
- package/dist/config/options/index.js.map +1 -1
- package/dist/config/presets/index.js +2 -1
- package/dist/config/presets/index.js.map +1 -1
- package/dist/global-config-option-defaults.generated.js +1 -1
- package/dist/global-config-option-defaults.generated.js.map +1 -1
- package/dist/modules/datasource/artifactory/index.js +2 -1
- package/dist/modules/datasource/artifactory/index.js.map +1 -1
- package/dist/modules/datasource/aws-eks-addon/index.js +6 -5
- package/dist/modules/datasource/aws-eks-addon/index.js.map +1 -1
- package/dist/modules/datasource/aws-machine-image/index.js +4 -3
- package/dist/modules/datasource/aws-machine-image/index.js.map +1 -1
- package/dist/modules/datasource/aws-rds/index.js +2 -1
- package/dist/modules/datasource/aws-rds/index.js.map +1 -1
- package/dist/modules/datasource/azure-bicep-resource/index.js +2 -1
- package/dist/modules/datasource/azure-bicep-resource/index.js.map +1 -1
- package/dist/modules/datasource/bazel/index.js +2 -1
- package/dist/modules/datasource/bazel/index.js.map +1 -1
- package/dist/modules/datasource/bitrise/index.js +2 -1
- package/dist/modules/datasource/bitrise/index.js.map +1 -1
- package/dist/modules/datasource/buildpacks-registry/index.js +2 -1
- package/dist/modules/datasource/buildpacks-registry/index.js.map +1 -1
- package/dist/modules/datasource/cdnjs/index.js +3 -2
- package/dist/modules/datasource/cdnjs/index.js.map +1 -1
- package/dist/modules/datasource/conan/index.js +3 -2
- package/dist/modules/datasource/conan/index.js.map +1 -1
- package/dist/modules/datasource/conda/index.js +2 -1
- package/dist/modules/datasource/conda/index.js.map +1 -1
- package/dist/modules/datasource/cpan/index.js +1 -1
- package/dist/modules/datasource/cpan/index.js.map +1 -1
- package/dist/modules/datasource/crate/index.js +17 -9
- package/dist/modules/datasource/crate/index.js.map +1 -1
- package/dist/modules/datasource/deb/index.js +3 -2
- package/dist/modules/datasource/deb/index.js.map +1 -1
- package/dist/modules/datasource/deno/index.js +4 -3
- package/dist/modules/datasource/deno/index.js.map +1 -1
- package/dist/modules/datasource/docker/index.js +9 -9
- package/dist/modules/datasource/docker/index.js.map +1 -1
- package/dist/modules/datasource/dotnet-version/index.js +2 -1
- package/dist/modules/datasource/dotnet-version/index.js.map +1 -1
- package/dist/modules/datasource/elm-package/index.js +2 -1
- package/dist/modules/datasource/elm-package/index.js.map +1 -1
- package/dist/modules/datasource/endoflife-date/index.js +2 -1
- package/dist/modules/datasource/endoflife-date/index.js.map +1 -1
- package/dist/modules/datasource/galaxy-collection/index.js +3 -2
- package/dist/modules/datasource/galaxy-collection/index.js.map +1 -1
- package/dist/modules/datasource/git-host-tags.js +6 -5
- package/dist/modules/datasource/git-host-tags.js.map +1 -1
- package/dist/modules/datasource/gitea-tags/base.js +5 -4
- package/dist/modules/datasource/gitea-tags/base.js.map +1 -1
- package/dist/modules/datasource/gitea-tags/util.js +2 -5
- package/dist/modules/datasource/gitea-tags/util.js.map +1 -1
- package/dist/modules/datasource/github-digest/index.js +3 -5
- package/dist/modules/datasource/github-digest/index.js.map +1 -1
- package/dist/modules/datasource/github-release-attachments/index.js +3 -2
- package/dist/modules/datasource/github-release-attachments/index.js.map +1 -1
- package/dist/modules/datasource/gitlab-packages/index.js +2 -1
- package/dist/modules/datasource/gitlab-packages/index.js.map +1 -1
- package/dist/modules/datasource/gitlab-releases/index.js +2 -1
- package/dist/modules/datasource/gitlab-releases/index.js.map +1 -1
- package/dist/modules/datasource/gitlab-tags/index.js +3 -2
- package/dist/modules/datasource/gitlab-tags/index.js.map +1 -1
- package/dist/modules/datasource/glasskube-packages/index.js +2 -1
- package/dist/modules/datasource/glasskube-packages/index.js.map +1 -1
- package/dist/modules/datasource/go/goproxy-parser.js +3 -2
- package/dist/modules/datasource/go/goproxy-parser.js.map +1 -1
- package/dist/modules/datasource/go/index.js +4 -3
- package/dist/modules/datasource/go/index.js.map +1 -1
- package/dist/modules/datasource/go/releases-goproxy.js +6 -3
- package/dist/modules/datasource/go/releases-goproxy.js.map +1 -1
- package/dist/modules/datasource/go/timestamp-cache.js +3 -1
- package/dist/modules/datasource/go/timestamp-cache.js.map +1 -1
- package/dist/modules/datasource/golang-version/index.js +1 -1
- package/dist/modules/datasource/golang-version/index.js.map +1 -1
- package/dist/modules/datasource/gradle-version/index.js +1 -1
- package/dist/modules/datasource/gradle-version/index.js.map +1 -1
- package/dist/modules/datasource/helm/index.js +2 -1
- package/dist/modules/datasource/helm/index.js.map +1 -1
- package/dist/modules/datasource/hermit/index.js +3 -2
- package/dist/modules/datasource/hermit/index.js.map +1 -1
- package/dist/modules/datasource/hex/index.js +3 -2
- package/dist/modules/datasource/hex/index.js.map +1 -1
- package/dist/modules/datasource/hexpm-bob/index.js +2 -1
- package/dist/modules/datasource/hexpm-bob/index.js.map +1 -1
- package/dist/modules/datasource/index.js +4 -3
- package/dist/modules/datasource/index.js.map +1 -1
- package/dist/modules/datasource/java-version/index.js +2 -1
- package/dist/modules/datasource/java-version/index.js.map +1 -1
- package/dist/modules/datasource/jsr/index.js +2 -1
- package/dist/modules/datasource/jsr/index.js.map +1 -1
- package/dist/modules/datasource/maven/index.js +2 -1
- package/dist/modules/datasource/maven/index.js.map +1 -1
- package/dist/modules/datasource/nextcloud/index.js +2 -1
- package/dist/modules/datasource/nextcloud/index.js.map +1 -1
- package/dist/modules/datasource/node-version/index.js +1 -1
- package/dist/modules/datasource/node-version/index.js.map +1 -1
- package/dist/modules/datasource/nuget/v3.js +3 -2
- package/dist/modules/datasource/nuget/v3.js.map +1 -1
- package/dist/modules/datasource/orb/index.js +2 -1
- package/dist/modules/datasource/orb/index.js.map +1 -1
- package/dist/modules/datasource/packagist/index.js +4 -3
- package/dist/modules/datasource/packagist/index.js.map +1 -1
- package/dist/modules/datasource/pod/index.js +2 -1
- package/dist/modules/datasource/pod/index.js.map +1 -1
- package/dist/modules/datasource/python-version/index.js +1 -1
- package/dist/modules/datasource/python-version/index.js.map +1 -1
- package/dist/modules/datasource/repology/index.js +2 -1
- package/dist/modules/datasource/repology/index.js.map +1 -1
- package/dist/modules/datasource/rpm/index.js +2 -1
- package/dist/modules/datasource/rpm/index.js.map +1 -1
- package/dist/modules/datasource/rubygems/index.js +2 -1
- package/dist/modules/datasource/rubygems/index.js.map +1 -1
- package/dist/modules/datasource/rubygems/metadata-cache.js +2 -1
- package/dist/modules/datasource/rubygems/metadata-cache.js.map +1 -1
- package/dist/modules/datasource/sbt-package/index.js +11 -10
- package/dist/modules/datasource/sbt-package/index.js.map +1 -1
- package/dist/modules/datasource/terraform-module/index.js +2 -1
- package/dist/modules/datasource/terraform-module/index.js.map +1 -1
- package/dist/modules/datasource/terraform-provider/index.js +6 -5
- package/dist/modules/datasource/terraform-provider/index.js.map +1 -1
- package/dist/modules/datasource/unity3d/index.js +2 -1
- package/dist/modules/datasource/unity3d/index.js.map +1 -1
- package/dist/modules/datasource/unity3d-packages/index.js +2 -1
- package/dist/modules/datasource/unity3d-packages/index.js.map +1 -1
- package/dist/modules/manager/bazel/parser.js +3 -1
- package/dist/modules/manager/bazel/parser.js.map +1 -1
- package/dist/modules/manager/github-actions/extract.js +2 -1
- package/dist/modules/manager/github-actions/extract.js.map +1 -1
- package/dist/modules/manager/terraform/lockfile/hash.js +2 -1
- package/dist/modules/manager/terraform/lockfile/hash.js.map +1 -1
- package/dist/modules/platform/bitbucket/pr-cache.js +3 -2
- package/dist/modules/platform/bitbucket/pr-cache.js.map +1 -1
- package/dist/modules/platform/bitbucket-server/pr-cache.js +3 -2
- package/dist/modules/platform/bitbucket-server/pr-cache.js.map +1 -1
- package/dist/modules/platform/gitea/pr-cache.js +7 -6
- package/dist/modules/platform/gitea/pr-cache.js.map +1 -1
- package/dist/modules/platform/gitlab/pr-cache.js +3 -2
- package/dist/modules/platform/gitlab/pr-cache.js.map +1 -1
- package/dist/util/cache/package/index.js +1 -1
- package/dist/util/cache/package/key.js +8 -1
- package/dist/util/cache/package/key.js.map +1 -1
- package/dist/util/cache/package/with-cache.js +2 -1
- package/dist/util/cache/package/with-cache.js.map +1 -1
- package/dist/util/exec/containerbase.js +2 -1
- package/dist/util/exec/containerbase.js.map +1 -1
- package/dist/util/github/graphql/cache-strategies/memory-cache-strategy.js +2 -1
- package/dist/util/github/graphql/cache-strategies/memory-cache-strategy.js.map +1 -1
- package/dist/util/github/graphql/datasource-fetcher.js +5 -8
- package/dist/util/github/graphql/datasource-fetcher.js.map +1 -1
- package/dist/util/http/cache/memory-http-cache-provider.js +2 -1
- package/dist/util/http/cache/memory-http-cache-provider.js.map +1 -1
- package/dist/util/http/cache/package-http-cache-provider.js +2 -1
- package/dist/util/http/cache/package-http-cache-provider.js.map +1 -1
- package/dist/util/jsonata.js +2 -1
- package/dist/util/jsonata.js.map +1 -1
- package/dist/util/merge-confidence/index.js +10 -7
- package/dist/util/merge-confidence/index.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/release-notes.js +4 -5
- package/dist/workers/repository/update/pr/changelog/release-notes.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/source.js +2 -1
- package/dist/workers/repository/update/pr/changelog/source.js.map +1 -1
- package/package.json +2 -2
- package/renovate-schema.json +2 -2
|
@@ -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 { isNonEmptyArray, isString, isTruthy } from '@sindresorhus/is';\nimport { dequal } from 'dequal';\nimport { GlobalConfig } from '../../config/global.ts';\nimport { HOST_BLOCKED, 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 RegistryUrlsConfig,\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\n/**\n * Projects the registry-level config onto the fields a datasource\n * implementation is allowed to see.\n */\nfunction toGetReleasesConfig(\n config: GetPkgReleasesConfig,\n registryUrl = config.registryUrl,\n): GetReleasesConfig {\n const {\n customDatasources,\n datasource,\n packageName,\n currentValue,\n constraints,\n constraintsVersioning,\n constraintsFiltering,\n } = config;\n return {\n customDatasources,\n datasource,\n packageName,\n registryUrl,\n currentValue,\n constraints,\n constraintsVersioning,\n constraintsFiltering,\n };\n}\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: GetPkgReleasesConfig,\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(toGetReleasesConfig(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: GetPkgReleasesConfig,\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: GetPkgReleasesConfig,\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: GetPkgReleasesConfig,\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 // v8 ignore else -- needs merged registries where only one carries 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 // v8 ignore else -- needs a merged registry whose tag is not a version\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 packageName: string,\n {\n defaultRegistryUrls,\n registryUrls,\n additionalRegistryUrls,\n }: RegistryUrlsConfig,\n): string[] {\n const customRegistrySupport = datasource.supportsCustomRegistry(packageName);\n const datasourceDefaultRegistryUrls =\n datasource.getDefaultRegistryUrls(packageName);\n\n if (!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 coerceArray(datasourceDefaultRegistryUrls);\n }\n const customUrls = registryUrls?.filter(isTruthy);\n if (isNonEmptyArray(customUrls)) {\n return massageRegistryUrls(customUrls);\n }\n const defaultUrls = isNonEmptyArray(defaultRegistryUrls)\n ? defaultRegistryUrls\n : datasourceDefaultRegistryUrls;\n if (!isNonEmptyArray(defaultUrls)) {\n return [];\n }\n return massageRegistryUrls([\n ...defaultUrls,\n ...coerceArray(additionalRegistryUrls),\n ]);\n}\n\nfunction applyReplacements(\n config: GetPkgReleasesConfig,\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: GetPkgReleasesConfig,\n): Promise<ReleaseResult | null> {\n const { datasource: datasourceName } = config;\n let registryUrlsConfig: RegistryUrlsConfig = 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 // v8 ignore else -- npm lookups here never arrive with explicit registryUrls\n if (!isNonEmptyArray(config.registryUrls)) {\n registryUrlsConfig = {\n ...config,\n registryUrls: [resolveRegistryUrl(config.packageName)],\n };\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 const registryUrls = resolveRegistryUrls(\n datasource,\n config.packageName,\n registryUrlsConfig,\n );\n let dep: ReleaseResult | null = null;\n const registryStrategy =\n config.registryStrategy ?? datasource.registryStrategy;\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 {\n // `merge` is the only remaining strategy\n dep = await mergeRegistries(config, datasource, registryUrls);\n }\n } else {\n dep = await instrument(\n 'getReleases',\n () => datasource.getReleases(toGetReleasesConfig(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 (\n [HOST_BLOCKED, HOST_DISABLED].includes(err.message) ||\n [HOST_BLOCKED, HOST_DISABLED].includes(err.err?.message)\n ) {\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: GetPkgReleasesConfig,\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(datasource, packageName, config)[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":";;;;;;;;;;;;;;;;;;;;;;;;;AAiDA,SAAgB,iBAA6C;CAC3D,OAAOA;AACT;AACA,SAAgB,oBAA8B;CAC5C,OAAO,MAAM,KAAKA,IAAY,KAAK,CAAC;AACtC;;;;;AAMA,SAAS,oBACP,QACA,cAAc,OAAO,aACF;CACnB,MAAM,EACJ,mBACA,YACA,aACA,cACA,aACA,uBACA,yBACE;CACJ,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF;AAGA,SAAS,SAAS,YAAoB,aAAqB,KAAgB;CACzE,MAAM,EAAE,YAAY,MAAM,SAAS,QAAQ;CAC3C,IAAI,eAAe,KACjB,OAAO,MAAM;EAAE;EAAY;EAAa;CAAI,GAAG,gBAAgB;MAC1D,IAAI,eAAe,OAAO,eAAe,KAC9C,OAAO,MAAM;EAAE;EAAY;EAAa;CAAI,GAAG,yBAAyB;MACnE,IAAI,SACT,OAAO,MACL;EAAE;EAAY;EAAa;EAAK;CAAQ,GACxC,6BACF;MAEA,OAAO,MAAM;EAAE;EAAY;EAAa;CAAI,GAAG,0BAA0B;AAE7E;AAEA,eAAe,oBACb,YACA,QACA,aAC+B;CAC/B,MAAM,iBAAwC,uBAAuB,WAAW;CAChF,MAAM,WAAW,GAAG,YAAY,GAAG,OAAO;CAE1C,MAAM,eAAe,CAAC,CAAC,WAAW;CAClC,MAAM,cAAc,aAAa,IAAI,sBAAsB;CAE3D,IAAI,gBAAgB,aAAa;EAC/B,MAAM,eAAe,MAAMC,MACzB,gBACA,QACF;EAEA,IAAI,cAAc;GAChB,OAAO,MAAM,EAAE,SAAS,GAAG,sCAAsC;GACjE,qBAAqB,IAAI,WAAW,IAAI,aAAa,OAAO,WAAW;GACvE,OAAO;EACT;EAEA,qBAAqB,KAAK,WAAW,IAAI,aAAa,OAAO,WAAW;CAC1E;CAEA,MAAM,MAAM,MAAM,WAChB,qBACM,WAAW,YAAY,oBAAoB,QAAQ,WAAW,CAAC,GACrE,EACE,YAAY;GACT,0BAA0B;GAC1B,2BAA2B,WAAW;GACtC,6BAA6B;GAC7B,6BAA6B,OAAO;CACvC,EACF,CACF;CACA,IAAI,KAAK,SAAS,QAChB,IAAI,gBAAgB;CAGtB,IAAI,CAAC,KACH,OAAO;CAGT,IAAI,QAAQ;CACZ,IAAI,aACF,QAAQ;MACH,IAAI,gBAAgB,CAAC,IAAI,WAC9B,QAAQ;CAGV,IAAI,OAAO;EACT,OAAO,MAAM,EAAE,SAAS,GAAG,6BAA6B;EACxD,MAAMC,MAAiB,gBAAgB,UAAU,KAAK,EAAE;EACxD,qBAAqB,IAAI,WAAW,IAAI,aAAa,OAAO,WAAW;CACzE,OACE,qBAAqB,KAAK,WAAW,IAAI,aAAa,OAAO,WAAW;CAG1E,OAAO;AACT;AAEA,SAAS,cACP,QACA,YACA,cAC+B;CAC/B,IAAI,aAAa,SAAS,GACxB,OAAO,KACL;EACE,YAAY,WAAW;EACvB,aAAa,OAAO;EACpB;CACF,GACA,+EACF;CAEF,MAAM,cAAc,aAAa;CACjC,OAAO,oBAAoB,YAAY,QAAQ,WAAW;AAC5D;AAEA,eAAe,eACb,QACA,YACA,cAC+B;CAC/B,IAAI,MAA4B;CAChC,IAAI;CACJ,KAAK,MAAM,eAAe,cACxB,IAAI;EACF,MAAM,MAAM,oBAAoB,YAAY,QAAQ,WAAW;EAC/D,IAAI,KACF;CAEJ,SAAS,KAAK;EACZ,IAAI,eAAe,mBACjB,MAAM;EAGR,cAAc;EACd,OAAO,MAAM,EAAE,IAAI,GAAG,yBAAyB;CACjD;CAEF,IAAI,KACF,OAAO;CAET,IAAI,aACF,MAAM;CAER,OAAO;AACT;AAEA,eAAe,gBACb,QACA,YACA,cAC+B;CAC/B,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI,iBAAiB;CACrB,MAAM,oBAAoBC,MAAe,OAAO,UAAU;CAC1D,KAAK,MAAM,eAAe,cACxB,IAAI;EAEF,MAAM,MAAM,MACV,MAAM,oBAAoB,YAAY,QAAQ,WAAW,CAC3D;EACA,IAAI,CAAC,KACH;EAGF,IAAI,CAAC,aAAa;GAEhB,cAAc;GACd;EACF;EAEA,IAAI,gBAAgB;GAGlB,KAAK,MAAM,WAAW,YAAY,YAAY,QAAQ,GACpD,QAAQ,gBAAgB,YAAY;GAEtC,iBAAiB;EACnB;EAEA,MAAM,WAAW,YAAY,IAAI,QAAQ;EACzC,KAAK,MAAM,WAAW,UAGpB,QAAQ,gBAAgB,IAAI;EAG9B,YAAY,SAAS,KAAK,GAAG,QAAQ;EAGrC,IAAI,OAAO,YAAY;EACvB,IAAI,MAEE;;OAAA,IAAI,MAEN,KAAK,MAAM,OAAO,CAAC,WAAW,QAAQ,GAAG;IACvC,MAAM,cAAc,aAAa,OAAO;IACxC,MAAM,SAAS,IAAI,OAAO;;IAE1B,IAAI,SAAS,MAAM,KAAK,kBAAkB,UAAU,MAAM,GAAG;KAC3D,IACE,SAAS,WAAW,KACpB,kBAAkB,UAAU,WAAW,GAGnC;UAAA,kBAAkB,cAAc,QAAQ,WAAW,GAErD,KAAK,OAAO;KAAA,OAKd,KAAK,OAAO;IAEhB;GACF;SAIF,OAAO,IAAI;EAEb,cAAc;GAAE,GAAG;GAAK,GAAG;EAAY;EACvC,IAAI,MACF,YAAY,OAAO;EAGrB,OAAO,YAAY;CACrB,SAAS,KAAK;EACZ,IAAI,eAAe,mBAAmB;GAGpC,oBAAoB;GACpB,OAAO,MACL;IAAE;IAAK;GAAY,GACnB,qHACF;GACA;EACF;EAEA,UAAU;EACV,OAAO,MAAM,EAAE,IAAI,GAAG,0BAA0B;CAClD;CAGF,IAAI,CAAC,aAAa;EAChB,IAAI,mBACF,MAAM;EAGR,IAAI,SACF,MAAM;EAGR,OAAO;CACT;CAEA,MAAM,+BAAe,IAAI,IAAY;CACrC,YAAY,WAAW,UAAU,YAAY,WAAW,YAAY;EAClE,IAAI,aAAa,IAAI,QAAQ,OAAO,GAClC,OAAO;EAET,aAAa,IAAI,QAAQ,OAAO;EAChC,OAAO;CACT,CAAC;CAED,OAAO;AACT;AAEA,SAAS,oBAAoB,cAAkC;CAC7D,OAAO,aAAa,OAAO,QAAQ,CAAC,CAAC,IAAI,iBAAiB;AAC5D;AAEA,SAAS,oBACP,YACA,aACA,EACE,qBACA,cACA,0BAEQ;CACV,MAAM,wBAAwB,WAAW,uBAAuB,WAAW;CAC3E,MAAM,gCACJ,WAAW,uBAAuB,WAAW;CAE/C,IAAI,CAAC,uBAAuB;EAC1B,IACE,gBAAgB,YAAY,KAC5B,gBAAgB,mBAAmB,KACnC,gBAAgB,sBAAsB,GAEtC,OAAO,KACL;GACE,YAAY,WAAW;GACvB;GACA;GACA;EACF,GACA,2EACF;EAEF,OAAO,YAAY,6BAA6B;CAClD;CACA,MAAM,aAAa,cAAc,OAAO,QAAQ;CAChD,IAAI,gBAAgB,UAAU,GAC5B,OAAO,oBAAoB,UAAU;CAEvC,MAAM,cAAc,gBAAgB,mBAAmB,IACnD,sBACA;CACJ,IAAI,CAAC,gBAAgB,WAAW,GAC9B,OAAO,CAAC;CAEV,OAAO,oBAAoB,CACzB,GAAG,aACH,GAAG,YAAY,sBAAsB,CACvC,CAAC;AACH;AAEA,SAAS,kBACP,QAC2E;CAC3E,IAAI,OAAO,mBAAmB,OAAO,oBACnC,OAAO;EACL,iBAAiB,OAAO;EACxB,oBAAoB,OAAO;CAC7B;AAGJ;AAEA,eAAe,cACb,QAC+B;CAC/B,MAAM,EAAE,YAAY,mBAAmB;CACvC,IAAI,qBAAyC;;CAE7C,IAAI,CAAC,kBAAkB,iBAAiB,cAAc,MAAM,KAAA,GAAW;EACrE,OAAO,KAAK,EAAE,YAAY,eAAe,GAAG,oBAAoB;EAChE,OAAO;CACT;CACA,IAAI,mBAAmB,OAAO;EAC5B,IAAI,SAAS,OAAO,KAAK,GACvB,SAAS,OAAO,KAAK;;EAGvB,IAAI,CAAC,gBAAgB,OAAO,YAAY,GACtC,qBAAqB;GACnB,GAAG;GACH,cAAc,CAAC,mBAAmB,OAAO,WAAW,CAAC;EACvD;CAEJ;CACA,MAAM,aAAa,iBAAiB,cAAc;;CAElD,IAAI,CAAC,YAAY;EACf,OAAO,KAAK,EAAE,YAAY,eAAe,GAAG,oBAAoB;EAChE,OAAO;CACT;CACA,MAAM,eAAe,oBACnB,YACA,OAAO,aACP,kBACF;CACA,IAAI,MAA4B;CAChC,MAAM,mBACJ,OAAO,oBAAoB,WAAW;CACxC,IAAI;EACF,IAAI,gBAAgB,YAAY,GAAG;GACjC,IAAI,qBAAqB,SACvB,MAAM,MAAM,cAAc,QAAQ,YAAY,YAAY;QACrD,IAAI,qBAAqB,QAC9B,MAAM,MAAM,eAAe,QAAQ,YAAY,YAAY;QAG3D,MAAM,MAAM,gBAAgB,QAAQ,YAAY,YAAY;EAEhE,OACE,MAAM,MAAM,WACV,qBACM,WAAW,YAAY,oBAAoB,MAAM,CAAC,GACxD,EACE,YAAY;IACT,0BAA0B;IAC1B,2BAA2B,WAAW;IACtC,6BAA6B,OAAO,eAAe;IACnD,6BAA6B,OAAO;EACvC,EACF,CACF;CAEJ,SAAS,KAAK;EACZ,IACE,CAAA,gBAAA,eAA4B,CAAC,CAAC,SAAS,IAAI,OAAO,KAClD,CAAA,gBAAA,eAA4B,CAAC,CAAC,SAAS,IAAI,KAAK,OAAO,GAEvD,OAAO;EAET,IAAI,eAAe,mBACjB,MAAM;EAER,SAAS,WAAW,IAAI,OAAO,aAAa,GAAG;CACjD;CACA,IAAI,CAAC,OAAO,OAAO,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC,GACtC,OAAO;CAET,YAAY,KAAK,gBAAgB,OAAO,WAAW;CACnD,MAAM;EAAE,GAAG;EAAK,GAAG,kBAAkB,MAAM;CAAE;CAC7C,OAAO;AACT;AAEA,SAAS,oBACP,QAC+B;CAC/B,MAAM,EAAE,YAAY,aAAa,iBAAiB;CAClD,MAAM,WAAW,2BAA2B,WAAW,GAAG,YAAY,GAAG,OAAO,iBAAiB,GAAG,cAClG;EAAC;EAAc,OAAO;EAAqB,OAAO;CAAsB,CAC1E;CAEA,MAAM,eAAeC,IAA4C,QAAQ;;CAEzE,IAAI,iBAAiB,KAAA,GACnB,OAAO;CAET,MAAM,cAAc,cAAc,MAAM;CACxC,IAAa,UAAU,WAAW;CAClC,OAAO;AACT;AAEA,SAAgB,kBACd,QAIA;CACA,IAAI,CAAC,OAAO,YAAY;EACtB,OAAO,KAAK,qBAAqB;EACjC,OAAO,YAAY,IAAI,eAAe;CACxC;CAEA,MAAM,cAAc,OAAO;CAC3B,IAAI,CAAC,aAAa;EAChB,OAAO,MAAM,EAAE,OAAO,GAAG,4CAA4C;EACrE,OAAO,YAAY,IAAI,iBAAiB;CAC1C;CAEA,OAAO,OAAO,aAAa,oBAAoB,MAAM,GAAG,WAAoB,CAAC,CAC1E,OAAO,MAAM;EACZ,IAAI,aAAa,mBAAmB;GAClC,EAAE,WAAW,OAAO;GACpB,EAAE,cAAc;EAClB;EACA,OAAO,OAAO,IAAI,CAAC;CACrB,CAAC,CAAC,CACD,UAAU,KAAK;AACpB;AAEA,SAAgB,uBACd,eACA,QACe;CACf,IAAI,MAAM;CACV,MAAM,oBAAoB,KAAK,OAAO,cAAc;CACpD,MAAM,0BACJ,KACA,OAAO,sBACP,OAAO,oBACT;CACA,MAAM,oBAAoB,KAAK,MAAM;CACrC,MAAM,wBAAwB,KAAK,MAAM;CACzC,MAAM,0BAA0B,KAAK,MAAM;CAC3C,OAAO;AACT;AAEA,eAAsB,eACpB,QAC+B;CAC/B,MAAM,EAAE,MAAM,MAAM,QAAQ,MAAM,kBAAkB,MAAM,CAAC,CACxD,WAAW,QAAQ,uBAAuB,KAAK,MAAM,CAAC,CAAC,CACvD,OAAO;CAEV,IAAI,eAAe,OACjB,MAAM;CAGR,OAAO;AACT;AAEA,SAAgB,gBAAgB,YAAyC;CACvE,MAAM,KAAK,CAAC,CAAC,cAAc,iBAAiB,UAAU;CACtD,OAAO,CAAC,CAAC,MAAM,eAAe;AAChC;AAEA,SAAS,gBACP,YACA,QACc;CACd,MAAM,EAAE,YAAY,cAAc,kBAAkB;CACpD,MAAM,cAAc,OAAO,mBAAmB,OAAO;CAKrD,OAAO;EAAE;EAAY;EAAa,aAFhC,OAAO,eACP,oBAAoB,YAAY,aAAa,MAAM,CAAC,CAAC;EACR;EAAc;CAAc;AAC7E;AAEA,SAAgB,UACd,QACA,OACwB;CACxB,MAAM,aAAa,iBAAiB,OAAO,UAAU;;CAErD,IAAI,CAAC,cAAc,EAAE,eAAe,aAClC,OAAO,QAAQ,QAAQ,IAAI;CAE7B,MAAM,eAAe,gBAAgB,YAAY,MAAM;CACvD,OAAO,WAAW,UAAW,cAAc,KAAK;AAClD;AAEA,SAAgB,iBACd,YACkC;CAClC,MAAM,mBAAmB,iBAAiB,UAAU;CACpD,OAAO,QAAQ,QACb,kBAAkB,iBAAiB,OAAO,OAAO,CAAC,CAAC,CACrD;AACF"}
|
|
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 { isNonEmptyArray, isString, isTruthy } from '@sindresorhus/is';\nimport { dequal } from 'dequal';\nimport { GlobalConfig } from '../../config/global.ts';\nimport { HOST_BLOCKED, 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 { buildCacheKey } from '../../util/cache/package/key.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 RegistryUrlsConfig,\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\n/**\n * Projects the registry-level config onto the fields a datasource\n * implementation is allowed to see.\n */\nfunction toGetReleasesConfig(\n config: GetPkgReleasesConfig,\n registryUrl = config.registryUrl,\n): GetReleasesConfig {\n const {\n customDatasources,\n datasource,\n packageName,\n currentValue,\n constraints,\n constraintsVersioning,\n constraintsFiltering,\n } = config;\n return {\n customDatasources,\n datasource,\n packageName,\n registryUrl,\n currentValue,\n constraints,\n constraintsVersioning,\n constraintsFiltering,\n };\n}\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: GetPkgReleasesConfig,\n registryUrl: string,\n): Promise<ReleaseResult | null> {\n const cacheNamespace: PackageCacheNamespace = `datasource-releases-${datasource.id}`;\n const cacheKey = buildCacheKey(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(toGetReleasesConfig(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: GetPkgReleasesConfig,\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: GetPkgReleasesConfig,\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: GetPkgReleasesConfig,\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 // v8 ignore else -- needs merged registries where only one carries 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 // v8 ignore else -- needs a merged registry whose tag is not a version\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 packageName: string,\n {\n defaultRegistryUrls,\n registryUrls,\n additionalRegistryUrls,\n }: RegistryUrlsConfig,\n): string[] {\n const customRegistrySupport = datasource.supportsCustomRegistry(packageName);\n const datasourceDefaultRegistryUrls =\n datasource.getDefaultRegistryUrls(packageName);\n\n if (!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 coerceArray(datasourceDefaultRegistryUrls);\n }\n const customUrls = registryUrls?.filter(isTruthy);\n if (isNonEmptyArray(customUrls)) {\n return massageRegistryUrls(customUrls);\n }\n const defaultUrls = isNonEmptyArray(defaultRegistryUrls)\n ? defaultRegistryUrls\n : datasourceDefaultRegistryUrls;\n if (!isNonEmptyArray(defaultUrls)) {\n return [];\n }\n return massageRegistryUrls([\n ...defaultUrls,\n ...coerceArray(additionalRegistryUrls),\n ]);\n}\n\nfunction applyReplacements(\n config: GetPkgReleasesConfig,\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: GetPkgReleasesConfig,\n): Promise<ReleaseResult | null> {\n const { datasource: datasourceName } = config;\n let registryUrlsConfig: RegistryUrlsConfig = 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 // v8 ignore else -- npm lookups here never arrive with explicit registryUrls\n if (!isNonEmptyArray(config.registryUrls)) {\n registryUrlsConfig = {\n ...config,\n registryUrls: [resolveRegistryUrl(config.packageName)],\n };\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 const registryUrls = resolveRegistryUrls(\n datasource,\n config.packageName,\n registryUrlsConfig,\n );\n let dep: ReleaseResult | null = null;\n const registryStrategy =\n config.registryStrategy ?? datasource.registryStrategy;\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 {\n // `merge` is the only remaining strategy\n dep = await mergeRegistries(config, datasource, registryUrls);\n }\n } else {\n dep = await instrument(\n 'getReleases',\n () => datasource.getReleases(toGetReleasesConfig(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 (\n [HOST_BLOCKED, HOST_DISABLED].includes(err.message) ||\n [HOST_BLOCKED, HOST_DISABLED].includes(err.err?.message)\n ) {\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: GetPkgReleasesConfig,\n): Promise<ReleaseResult | null> {\n const { datasource, packageName, registryUrls } = config;\n const cacheKey = buildCacheKey(\n 'datasource-mem',\n 'releases',\n datasource,\n packageName,\n config.registryStrategy,\n safeStringify([\n registryUrls,\n config.defaultRegistryUrls,\n config.additionalRegistryUrls,\n ]),\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(datasource, packageName, config)[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,4 +1,5 @@
|
|
|
1
1
|
import { logger } from "../../../logger/index.js";
|
|
2
|
+
import { buildCacheKey } from "../../../util/cache/package/key.js";
|
|
2
3
|
import { Datasource } from "../datasource.js";
|
|
3
4
|
import { datasource, parsePackage } from "./common.js";
|
|
4
5
|
import { adoptiumRegistryUrl, getAdoptiumReleases } from "./adoptium.js";
|
|
@@ -34,7 +35,7 @@ var JavaVersionDatasource = class extends Datasource {
|
|
|
34
35
|
}
|
|
35
36
|
getReleases(config) {
|
|
36
37
|
return this.cached({
|
|
37
|
-
key:
|
|
38
|
+
key: buildCacheKey(config.registryUrl, config.packageName),
|
|
38
39
|
cacheable: true,
|
|
39
40
|
fallback: true
|
|
40
41
|
}, () => this.fetchReleases(config));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/java-version/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { adoptiumRegistryUrl, getAdoptiumReleases } from './adoptium.ts';\nimport { datasource, parsePackage } from './common.ts';\nimport { getGraalvmReleases, graalvmRegistryUrl } from './graalvm.ts';\n\nexport class JavaVersionDatasource extends Datasource {\n static readonly id = datasource;\n\n constructor() {\n super(datasource);\n }\n\n override getDefaultRegistryUrls(packageName: string): string[] {\n return packageName.includes('oracle-graalvm')\n ? [graalvmRegistryUrl]\n : [adoptiumRegistryUrl];\n }\n\n override supportsCustomRegistry(packageName: string): boolean {\n return packageName.includes('oracle-graalvm');\n }\n\n private async fetchReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const pkgConfig = parsePackage(packageName);\n logger.trace(\n { registryUrl, packageName, pkgConfig },\n 'fetching java release',\n );\n\n try {\n if (pkgConfig.vendor === 'oracle-graalvm') {\n const effectiveRegistryUrl = registryUrl ?? graalvmRegistryUrl;\n return await getGraalvmReleases(\n this.http,\n pkgConfig,\n effectiveRegistryUrl,\n );\n }\n\n // Default to Adoptium\n return await getAdoptiumReleases(this.http, pkgConfig);\n } catch (err) {\n this.handleGenericErrors(err);\n }\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return this.cached(\n {\n key:
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/java-version/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { buildCacheKey } from '../../../util/cache/package/key.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { adoptiumRegistryUrl, getAdoptiumReleases } from './adoptium.ts';\nimport { datasource, parsePackage } from './common.ts';\nimport { getGraalvmReleases, graalvmRegistryUrl } from './graalvm.ts';\n\nexport class JavaVersionDatasource extends Datasource {\n static readonly id = datasource;\n\n constructor() {\n super(datasource);\n }\n\n override getDefaultRegistryUrls(packageName: string): string[] {\n return packageName.includes('oracle-graalvm')\n ? [graalvmRegistryUrl]\n : [adoptiumRegistryUrl];\n }\n\n override supportsCustomRegistry(packageName: string): boolean {\n return packageName.includes('oracle-graalvm');\n }\n\n private async fetchReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const pkgConfig = parsePackage(packageName);\n logger.trace(\n { registryUrl, packageName, pkgConfig },\n 'fetching java release',\n );\n\n try {\n if (pkgConfig.vendor === 'oracle-graalvm') {\n const effectiveRegistryUrl = registryUrl ?? graalvmRegistryUrl;\n return await getGraalvmReleases(\n this.http,\n pkgConfig,\n effectiveRegistryUrl,\n );\n }\n\n // Default to Adoptium\n return await getAdoptiumReleases(this.http, pkgConfig);\n } catch (err) {\n this.handleGenericErrors(err);\n }\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return this.cached(\n {\n key: buildCacheKey(config.registryUrl, config.packageName),\n cacheable: true,\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;AAQA,IAAa,wBAAb,cAA2C,WAAW;CACpD,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,UAAU;CAClB;CAEA,uBAAgC,aAA+B;EAC7D,OAAO,YAAY,SAAS,gBAAgB,IACxC,CAAC,kBAAkB,IACnB,CAAC,mBAAmB;CAC1B;CAEA,uBAAgC,aAA8B;EAC5D,OAAO,YAAY,SAAS,gBAAgB;CAC9C;CAEA,MAAc,cAAc,EAC1B,aACA,eACmD;EACnD,MAAM,YAAY,aAAa,WAAW;EAC1C,OAAO,MACL;GAAE;GAAa;GAAa;EAAU,GACtC,uBACF;EAEA,IAAI;GACF,IAAI,UAAU,WAAW,kBAAkB;IACzC,MAAM,uBAAuB,eAAA;IAC7B,OAAO,MAAM,mBACX,KAAK,MACL,WACA,oBACF;GACF;GAGA,OAAO,MAAM,oBAAoB,KAAK,MAAM,SAAS;EACvD,SAAS,KAAK;GACZ,KAAK,oBAAoB,GAAG;EAC9B;CACF;CAEA,YAAY,QAA0D;EACpE,OAAO,KAAK,OACV;GACE,KAAK,cAAc,OAAO,aAAa,OAAO,WAAW;GACzD,WAAW;GACX,UAAU;EACZ,SACM,KAAK,cAAc,MAAM,CACjC;CACF;AACF"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { logger } from "../../../logger/index.js";
|
|
2
2
|
import { joinUrlParts } from "../../../util/url.js";
|
|
3
|
+
import { buildCacheKey } from "../../../util/cache/package/key.js";
|
|
3
4
|
import { id } from "../../versioning/semver/index.js";
|
|
4
5
|
import { withCache } from "../../../util/cache/package/with-cache.js";
|
|
5
6
|
import { Datasource } from "../datasource.js";
|
|
@@ -43,7 +44,7 @@ var JsrDatasource = class JsrDatasource extends Datasource {
|
|
|
43
44
|
getReleases(config) {
|
|
44
45
|
return withCache({
|
|
45
46
|
namespace: `datasource-${JsrDatasource.id}`,
|
|
46
|
-
key:
|
|
47
|
+
key: buildCacheKey("getReleases", config.registryUrl, config.packageName),
|
|
47
48
|
cacheable: true,
|
|
48
49
|
fallback: true
|
|
49
50
|
}, () => this._getReleases(config));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["semverId"],"sources":["../../../../lib/modules/datasource/jsr/index.ts"],"sourcesContent":["import { isNull } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { id as semverId } from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { defaultRegistryUrls } from './common.ts';\nimport { JsrPackageMetadata } from './schema.ts';\nimport { extractJsrPackageName } from './util.ts';\n\nexport class JsrDatasource extends Datasource {\n static readonly id = 'jsr';\n\n // custom registry support is not yet supported\n // https://github.com/jsr-io/jsr/issues/203\n override supportsCustomRegistry(_packageName: string): boolean {\n return false;\n }\n\n // https://jsr.io/docs/using-packages#semver-resolution\n override readonly defaultVersioning = semverId;\n\n // use npm compatible registry api url due to returns\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return defaultRegistryUrls;\n }\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `createdAt` field in the results. For packages without explicit timestamps, defaults to 2025-09-18.';\n\n constructor() {\n super(JsrDatasource.id);\n }\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const validJsrPackageName = extractJsrPackageName(packageName);\n if (isNull(validJsrPackageName)) {\n logger.debug(`Could not extract packageName: \"${packageName}\"`);\n return null;\n }\n // construct a package metadata url\n // https://jsr.io/docs/api#package-metadata\n const packageInfoUrl = joinUrlParts(registryUrl, packageName, 'meta.json');\n\n const result: ReleaseResult = {\n homepage: joinUrlParts(registryUrl, packageName),\n registryUrl,\n releases: [],\n };\n\n const body = await this.fetchJson(packageInfoUrl, JsrPackageMetadata);\n result.releases.push(...body);\n\n return result.releases.length ? result : null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${JsrDatasource.id}`,\n
|
|
1
|
+
{"version":3,"file":"index.js","names":["semverId"],"sources":["../../../../lib/modules/datasource/jsr/index.ts"],"sourcesContent":["import { isNull } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { buildCacheKey } from '../../../util/cache/package/key.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { id as semverId } from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { defaultRegistryUrls } from './common.ts';\nimport { JsrPackageMetadata } from './schema.ts';\nimport { extractJsrPackageName } from './util.ts';\n\nexport class JsrDatasource extends Datasource {\n static readonly id = 'jsr';\n\n // custom registry support is not yet supported\n // https://github.com/jsr-io/jsr/issues/203\n override supportsCustomRegistry(_packageName: string): boolean {\n return false;\n }\n\n // https://jsr.io/docs/using-packages#semver-resolution\n override readonly defaultVersioning = semverId;\n\n // use npm compatible registry api url due to returns\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return defaultRegistryUrls;\n }\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `createdAt` field in the results. For packages without explicit timestamps, defaults to 2025-09-18.';\n\n constructor() {\n super(JsrDatasource.id);\n }\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const validJsrPackageName = extractJsrPackageName(packageName);\n if (isNull(validJsrPackageName)) {\n logger.debug(`Could not extract packageName: \"${packageName}\"`);\n return null;\n }\n // construct a package metadata url\n // https://jsr.io/docs/api#package-metadata\n const packageInfoUrl = joinUrlParts(registryUrl, packageName, 'meta.json');\n\n const result: ReleaseResult = {\n homepage: joinUrlParts(registryUrl, packageName),\n registryUrl,\n releases: [],\n };\n\n const body = await this.fetchJson(packageInfoUrl, JsrPackageMetadata);\n result.releases.push(...body);\n\n return result.releases.length ? result : null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${JsrDatasource.id}`,\n key: buildCacheKey(\n 'getReleases',\n config.registryUrl,\n config.packageName,\n ),\n cacheable: true,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;AAYA,IAAa,gBAAb,MAAa,sBAAsB,WAAW;CAC5C,OAAgB,KAAK;CAIrB,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CAGA,oBAAsCA;CAGtC,uBAAgC,cAAgC;EAC9D,OAAO;CACT;CAEA,0BAA4C;CAC5C,uBACE;CAEF,cAAc;EACZ,MAAM,cAAc,EAAE;CACxB;CAEA,MAAc,aAAa,EACzB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,sBAAsB,sBAAsB,WAAW;EAC7D,IAAI,OAAO,mBAAmB,GAAG;GAC/B,OAAO,MAAM,mCAAmC,YAAY,EAAE;GAC9D,OAAO;EACT;EAGA,MAAM,iBAAiB,aAAa,aAAa,aAAa,WAAW;EAEzE,MAAM,SAAwB;GAC5B,UAAU,aAAa,aAAa,WAAW;GAC/C;GACA,UAAU,CAAC;EACb;EAEA,MAAM,OAAO,MAAM,KAAK,UAAU,gBAAgB,kBAAkB;EACpE,OAAO,SAAS,KAAK,GAAG,IAAI;EAE5B,OAAO,OAAO,SAAS,SAAS,SAAS;CAC3C;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,cAAc;GACvC,KAAK,cACH,eACA,OAAO,aACP,OAAO,WACT;GACA,WAAW;GACX,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { logger } from "../../../logger/index.js";
|
|
2
2
|
import { ensureTrailingSlash } from "../../../util/url.js";
|
|
3
|
+
import { buildCacheKey } from "../../../util/cache/package/key.js";
|
|
3
4
|
import { compare } from "../../versioning/maven/compare.js";
|
|
4
5
|
import { api, id } from "../../versioning/maven/index.js";
|
|
5
6
|
import { get, set } from "../../../util/cache/package/index.js";
|
|
@@ -87,7 +88,7 @@ var MavenDatasource = class MavenDatasource extends Datasource {
|
|
|
87
88
|
}
|
|
88
89
|
async postprocessRelease({ packageName, registryUrl }, release) {
|
|
89
90
|
const { version, versionOrig } = release;
|
|
90
|
-
const cacheKey =
|
|
91
|
+
const cacheKey = buildCacheKey("postprocessRelease", registryUrl, packageName, versionOrig, version);
|
|
91
92
|
const cachedResult = await get("datasource-maven:postprocess-reject", cacheKey);
|
|
92
93
|
/* v8 ignore if: hard to test */
|
|
93
94
|
if (cachedResult) return cachedResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["mavenVersion","mavenVersioning.id","packageCache.get","packageCache.set"],"sources":["../../../../lib/modules/datasource/maven/index.ts"],"sourcesContent":["import type { XmlDocument } from 'xmldoc';\nimport { logger } from '../../../logger/index.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport type { Http } from '../../../util/http/index.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { compare } from '../../versioning/maven/compare.ts';\nimport mavenVersion, * as mavenVersioning from '../../versioning/maven/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n GetReleasesConfig,\n PostprocessReleaseConfig,\n PostprocessReleaseResult,\n RegistryStrategy,\n Release,\n ReleaseResult,\n} from '../types.ts';\nimport { MAVEN_CENTRAL_URLS, MAVEN_REPO } from './common.ts';\nimport type { MavenDependency, MetadataResults } from './types.ts';\nimport {\n createUrlForDependencyPom,\n downloadMaven,\n downloadMavenXml,\n getDependencyInfo,\n getDependencyParts,\n getMavenUrl,\n} from './util.ts';\n\nfunction getLatestSuitableVersion(releases: Release[]): string | null {\n /* v8 ignore next -- TODO: add test */\n if (!releases?.length) {\n return null;\n }\n const allVersions = releases.map(({ version }) => version);\n const stableVersions = allVersions.filter((x) => mavenVersion.isStable(x));\n const versions = stableVersions.length ? stableVersions : allVersions;\n return versions.reduce((latestVersion, version) =>\n compare(version, latestVersion) === 1\n ? version\n : /* istanbul ignore next: hard to test */ latestVersion,\n );\n}\n\nfunction extractVersions(metadata: XmlDocument): MetadataResults {\n const res: MetadataResults = {};\n const versions = metadata.descendantWithPath('versioning.versions');\n const elements = versions?.childrenNamed('version');\n if (!elements) {\n return res;\n }\n res.versions = elements.map((el) => el.val);\n const latest = metadata.descendantWithPath('versioning.latest');\n if (latest?.val) {\n res.tags ??= {};\n res.tags.latest = latest.val;\n }\n const release = metadata.descendantWithPath('versioning.release');\n if (release?.val) {\n res.tags ??= {};\n res.tags.release = release.val;\n }\n\n return res;\n}\n\nexport const defaultRegistryUrls = [MAVEN_REPO];\n\nexport class MavenDatasource extends Datasource {\n static id = 'maven';\n\n override readonly caching = true;\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return defaultRegistryUrls;\n }\n\n override readonly defaultVersioning: string = mavenVersioning.id;\n\n override readonly registryStrategy: RegistryStrategy = 'merge';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `Last-Modified` header or the `lastModified` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `scm` tags in the results.';\n\n constructor(id = MavenDatasource.id, http?: Http) {\n super(id, http);\n }\n\n async fetchVersionsFromMetadata(\n dependency: MavenDependency,\n repoUrl: string,\n ): Promise<MetadataResults> {\n const metadataUrl = getMavenUrl(dependency, repoUrl, 'maven-metadata.xml');\n const metadataXmlResult = await downloadMavenXml(this.http, metadataUrl);\n return metadataXmlResult\n .transform(({ data: metadata }) => extractVersions(metadata))\n .onError((err) => {\n logger.debug(\n `Maven: error fetching versions for \"${dependency.display}\": ${err.type}`,\n );\n })\n .unwrapOr({});\n }\n\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const dependency = getDependencyParts(packageName);\n const repoUrl = ensureTrailingSlash(registryUrl);\n\n if (\n // groupId\n (packageName.includes('.gradle.plugin:') ||\n // artifactId\n packageName.endsWith('.gradle.plugin')) &&\n MAVEN_CENTRAL_URLS.some((url) => repoUrl === ensureTrailingSlash(url))\n ) {\n logger.debug(\n `Maven: skipping Maven Central for suspected Gradle plugin \"${packageName}\"`,\n );\n return null;\n }\n\n logger.debug(`Looking up ${dependency.display} in repository ${repoUrl}`);\n\n const metadata = await this.fetchVersionsFromMetadata(dependency, repoUrl);\n if (!metadata.versions?.length) {\n return null;\n }\n const releases = metadata.versions.map((version) => ({ version }));\n\n logger.debug(\n `Found ${releases.length} new releases for ${dependency.display} in repository ${repoUrl}`,\n );\n\n const latestSuitableVersion = getLatestSuitableVersion(releases);\n const dependencyInfo =\n latestSuitableVersion &&\n (await getDependencyInfo(\n this.http,\n dependency,\n repoUrl,\n latestSuitableVersion,\n ));\n\n const result: ReleaseResult = {\n ...dependency,\n ...dependencyInfo,\n releases,\n };\n if (metadata.tags) {\n result.tags = metadata.tags;\n if (result.tags.latest) {\n logger.debug(`Setting respectLatest=false for maven ${packageName}`);\n result.respectLatest = false;\n }\n }\n\n if (!this.getDefaultRegistryUrls('').includes(registryUrl)) {\n result.isPrivate = true;\n }\n\n return result;\n }\n\n override async postprocessRelease(\n { packageName, registryUrl }: PostprocessReleaseConfig,\n release: Release,\n ): Promise<PostprocessReleaseResult> {\n const { version, versionOrig } = release;\n const cacheKey = versionOrig\n ? `postprocessRelease:${registryUrl}:${packageName}:${versionOrig}:${version}`\n : `postprocessRelease:${registryUrl}:${packageName}:${version}`;\n const cachedResult = await packageCache.get<PostprocessReleaseResult>(\n 'datasource-maven:postprocess-reject',\n cacheKey,\n );\n\n /* v8 ignore if: hard to test */\n if (cachedResult) {\n return cachedResult;\n }\n\n if (!packageName || !registryUrl) {\n return release;\n }\n\n const dependency = getDependencyParts(packageName);\n\n const pomUrl = await createUrlForDependencyPom(\n this.http,\n release.versionOrig ?? release.version,\n dependency,\n registryUrl,\n );\n\n const artifactUrl = getMavenUrl(dependency, registryUrl, pomUrl);\n const fetchResult = await downloadMaven(this.http, artifactUrl);\n const { val, err } = fetchResult.unwrap();\n\n if (err) {\n const result: PostprocessReleaseResult =\n err.type === 'not-found' ? 'reject' : release;\n if (result === 'reject') {\n await packageCache.set(\n 'datasource-maven:postprocess-reject',\n cacheKey,\n result,\n 24 * 60,\n );\n }\n return result;\n }\n\n if (val.lastModified) {\n release.releaseTimestamp = asTimestamp(val.lastModified);\n }\n\n return release;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["mavenVersion","mavenVersioning.id","packageCache.get","packageCache.set"],"sources":["../../../../lib/modules/datasource/maven/index.ts"],"sourcesContent":["import type { XmlDocument } from 'xmldoc';\nimport { logger } from '../../../logger/index.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { buildCacheKey } from '../../../util/cache/package/key.ts';\nimport type { Http } from '../../../util/http/index.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { compare } from '../../versioning/maven/compare.ts';\nimport mavenVersion, * as mavenVersioning from '../../versioning/maven/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n GetReleasesConfig,\n PostprocessReleaseConfig,\n PostprocessReleaseResult,\n RegistryStrategy,\n Release,\n ReleaseResult,\n} from '../types.ts';\nimport { MAVEN_CENTRAL_URLS, MAVEN_REPO } from './common.ts';\nimport type { MavenDependency, MetadataResults } from './types.ts';\nimport {\n createUrlForDependencyPom,\n downloadMaven,\n downloadMavenXml,\n getDependencyInfo,\n getDependencyParts,\n getMavenUrl,\n} from './util.ts';\n\nfunction getLatestSuitableVersion(releases: Release[]): string | null {\n /* v8 ignore next -- TODO: add test */\n if (!releases?.length) {\n return null;\n }\n const allVersions = releases.map(({ version }) => version);\n const stableVersions = allVersions.filter((x) => mavenVersion.isStable(x));\n const versions = stableVersions.length ? stableVersions : allVersions;\n return versions.reduce((latestVersion, version) =>\n compare(version, latestVersion) === 1\n ? version\n : /* istanbul ignore next: hard to test */ latestVersion,\n );\n}\n\nfunction extractVersions(metadata: XmlDocument): MetadataResults {\n const res: MetadataResults = {};\n const versions = metadata.descendantWithPath('versioning.versions');\n const elements = versions?.childrenNamed('version');\n if (!elements) {\n return res;\n }\n res.versions = elements.map((el) => el.val);\n const latest = metadata.descendantWithPath('versioning.latest');\n if (latest?.val) {\n res.tags ??= {};\n res.tags.latest = latest.val;\n }\n const release = metadata.descendantWithPath('versioning.release');\n if (release?.val) {\n res.tags ??= {};\n res.tags.release = release.val;\n }\n\n return res;\n}\n\nexport const defaultRegistryUrls = [MAVEN_REPO];\n\nexport class MavenDatasource extends Datasource {\n static id = 'maven';\n\n override readonly caching = true;\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return defaultRegistryUrls;\n }\n\n override readonly defaultVersioning: string = mavenVersioning.id;\n\n override readonly registryStrategy: RegistryStrategy = 'merge';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `Last-Modified` header or the `lastModified` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `scm` tags in the results.';\n\n constructor(id = MavenDatasource.id, http?: Http) {\n super(id, http);\n }\n\n async fetchVersionsFromMetadata(\n dependency: MavenDependency,\n repoUrl: string,\n ): Promise<MetadataResults> {\n const metadataUrl = getMavenUrl(dependency, repoUrl, 'maven-metadata.xml');\n const metadataXmlResult = await downloadMavenXml(this.http, metadataUrl);\n return metadataXmlResult\n .transform(({ data: metadata }) => extractVersions(metadata))\n .onError((err) => {\n logger.debug(\n `Maven: error fetching versions for \"${dependency.display}\": ${err.type}`,\n );\n })\n .unwrapOr({});\n }\n\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const dependency = getDependencyParts(packageName);\n const repoUrl = ensureTrailingSlash(registryUrl);\n\n if (\n // groupId\n (packageName.includes('.gradle.plugin:') ||\n // artifactId\n packageName.endsWith('.gradle.plugin')) &&\n MAVEN_CENTRAL_URLS.some((url) => repoUrl === ensureTrailingSlash(url))\n ) {\n logger.debug(\n `Maven: skipping Maven Central for suspected Gradle plugin \"${packageName}\"`,\n );\n return null;\n }\n\n logger.debug(`Looking up ${dependency.display} in repository ${repoUrl}`);\n\n const metadata = await this.fetchVersionsFromMetadata(dependency, repoUrl);\n if (!metadata.versions?.length) {\n return null;\n }\n const releases = metadata.versions.map((version) => ({ version }));\n\n logger.debug(\n `Found ${releases.length} new releases for ${dependency.display} in repository ${repoUrl}`,\n );\n\n const latestSuitableVersion = getLatestSuitableVersion(releases);\n const dependencyInfo =\n latestSuitableVersion &&\n (await getDependencyInfo(\n this.http,\n dependency,\n repoUrl,\n latestSuitableVersion,\n ));\n\n const result: ReleaseResult = {\n ...dependency,\n ...dependencyInfo,\n releases,\n };\n if (metadata.tags) {\n result.tags = metadata.tags;\n if (result.tags.latest) {\n logger.debug(`Setting respectLatest=false for maven ${packageName}`);\n result.respectLatest = false;\n }\n }\n\n if (!this.getDefaultRegistryUrls('').includes(registryUrl)) {\n result.isPrivate = true;\n }\n\n return result;\n }\n\n override async postprocessRelease(\n { packageName, registryUrl }: PostprocessReleaseConfig,\n release: Release,\n ): Promise<PostprocessReleaseResult> {\n const { version, versionOrig } = release;\n const cacheKey = buildCacheKey(\n 'postprocessRelease',\n registryUrl,\n packageName,\n versionOrig,\n version,\n );\n const cachedResult = await packageCache.get<PostprocessReleaseResult>(\n 'datasource-maven:postprocess-reject',\n cacheKey,\n );\n\n /* v8 ignore if: hard to test */\n if (cachedResult) {\n return cachedResult;\n }\n\n if (!packageName || !registryUrl) {\n return release;\n }\n\n const dependency = getDependencyParts(packageName);\n\n const pomUrl = await createUrlForDependencyPom(\n this.http,\n release.versionOrig ?? release.version,\n dependency,\n registryUrl,\n );\n\n const artifactUrl = getMavenUrl(dependency, registryUrl, pomUrl);\n const fetchResult = await downloadMaven(this.http, artifactUrl);\n const { val, err } = fetchResult.unwrap();\n\n if (err) {\n const result: PostprocessReleaseResult =\n err.type === 'not-found' ? 'reject' : release;\n if (result === 'reject') {\n await packageCache.set(\n 'datasource-maven:postprocess-reject',\n cacheKey,\n result,\n 24 * 60,\n );\n }\n return result;\n }\n\n if (val.lastModified) {\n release.releaseTimestamp = asTimestamp(val.lastModified);\n }\n\n return release;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { regEx } from "../../../util/regex.js";
|
|
2
|
+
import { buildCacheKey } from "../../../util/cache/package/key.js";
|
|
2
3
|
import { id } from "../../versioning/semver/index.js";
|
|
3
4
|
import { asTimestamp } from "../../../util/timestamp.js";
|
|
4
5
|
import { Datasource } from "../datasource.js";
|
|
@@ -37,7 +38,7 @@ var NextcloudDatasource = class NextcloudDatasource extends Datasource {
|
|
|
37
38
|
}
|
|
38
39
|
getReleases(config) {
|
|
39
40
|
return this.cached({
|
|
40
|
-
key:
|
|
41
|
+
key: buildCacheKey(config.registryUrl, config.packageName),
|
|
41
42
|
fallback: true
|
|
42
43
|
}, () => this.fetchReleases(config));
|
|
43
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["semver.id"],"sources":["../../../../lib/modules/datasource/nextcloud/index.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport * as semver from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { Applications } from './schema.ts';\n\nexport class NextcloudDatasource extends Datasource {\n static readonly id = 'nextcloud';\n\n private static readonly defaultTranslationLanguage = 'en';\n\n private static readonly sourceUrlRegex = regEx(\n /(?<prefix>.*github.com\\/nextcloud)(?<suffix>\\/.*)/,\n );\n\n override readonly defaultVersioning = semver.id;\n\n constructor() {\n super(NextcloudDatasource.id);\n }\n\n private async fetchReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n if (!registryUrl) {\n return null;\n }\n\n const response = await this.http.getJson(registryUrl, Applications);\n\n const application = response.body.find((a) => a.id === packageName);\n\n if (!application) {\n return null;\n }\n\n const sourceUrlMatches = NextcloudDatasource.sourceUrlRegex.exec(\n application.website,\n );\n\n const result: ReleaseResult = {\n releases: [],\n homepage: application.website,\n registryUrl,\n changelogUrl: sourceUrlMatches?.groups\n ? `${sourceUrlMatches.groups.prefix}-releases${sourceUrlMatches.groups.suffix}`\n : application.website,\n };\n\n if (sourceUrlMatches !== null) {\n result.sourceUrl = application.website;\n }\n\n for (const release of application.releases) {\n const translation =\n release.translations[NextcloudDatasource.defaultTranslationLanguage];\n\n const changelogContent = translation?.changelog ?? null;\n\n result.releases.push({\n version: release.version,\n releaseTimestamp: asTimestamp(release.created),\n changelogContent:\n changelogContent !== null && changelogContent.length > 0\n ? changelogContent\n : undefined,\n isStable: !release.isNightly,\n });\n }\n\n return result;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return this.cached(\n {\n key:
|
|
1
|
+
{"version":3,"file":"index.js","names":["semver.id"],"sources":["../../../../lib/modules/datasource/nextcloud/index.ts"],"sourcesContent":["import { buildCacheKey } from '../../../util/cache/package/key.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport * as semver from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { Applications } from './schema.ts';\n\nexport class NextcloudDatasource extends Datasource {\n static readonly id = 'nextcloud';\n\n private static readonly defaultTranslationLanguage = 'en';\n\n private static readonly sourceUrlRegex = regEx(\n /(?<prefix>.*github.com\\/nextcloud)(?<suffix>\\/.*)/,\n );\n\n override readonly defaultVersioning = semver.id;\n\n constructor() {\n super(NextcloudDatasource.id);\n }\n\n private async fetchReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n if (!registryUrl) {\n return null;\n }\n\n const response = await this.http.getJson(registryUrl, Applications);\n\n const application = response.body.find((a) => a.id === packageName);\n\n if (!application) {\n return null;\n }\n\n const sourceUrlMatches = NextcloudDatasource.sourceUrlRegex.exec(\n application.website,\n );\n\n const result: ReleaseResult = {\n releases: [],\n homepage: application.website,\n registryUrl,\n changelogUrl: sourceUrlMatches?.groups\n ? `${sourceUrlMatches.groups.prefix}-releases${sourceUrlMatches.groups.suffix}`\n : application.website,\n };\n\n if (sourceUrlMatches !== null) {\n result.sourceUrl = application.website;\n }\n\n for (const release of application.releases) {\n const translation =\n release.translations[NextcloudDatasource.defaultTranslationLanguage];\n\n const changelogContent = translation?.changelog ?? null;\n\n result.releases.push({\n version: release.version,\n releaseTimestamp: asTimestamp(release.created),\n changelogContent:\n changelogContent !== null && changelogContent.length > 0\n ? changelogContent\n : undefined,\n isStable: !release.isNightly,\n });\n }\n\n return result;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return this.cached(\n {\n key: buildCacheKey(config.registryUrl, config.packageName),\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;AAQA,IAAa,sBAAb,MAAa,4BAA4B,WAAW;CAClD,OAAgB,KAAK;CAErB,OAAwB,6BAA6B;CAErD,OAAwB,iBAAiB,MACvC,mDACF;CAEA,oBAAsCA;CAEtC,cAAc;EACZ,MAAM,oBAAoB,EAAE;CAC9B;CAEA,MAAc,cAAc,EAC1B,aACA,eACmD;EACnD,IAAI,CAAC,aACH,OAAO;EAKT,MAAM,eAAc,MAFG,KAAK,KAAK,QAAQ,aAAa,YAAY,EAAA,CAErC,KAAK,MAAM,MAAM,EAAE,OAAO,WAAW;EAElE,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,mBAAmB,oBAAoB,eAAe,KAC1D,YAAY,OACd;EAEA,MAAM,SAAwB;GAC5B,UAAU,CAAC;GACX,UAAU,YAAY;GACtB;GACA,cAAc,kBAAkB,SAC5B,GAAG,iBAAiB,OAAO,OAAO,WAAW,iBAAiB,OAAO,WACrE,YAAY;EAClB;EAEA,IAAI,qBAAqB,MACvB,OAAO,YAAY,YAAY;EAGjC,KAAK,MAAM,WAAW,YAAY,UAAU;GAI1C,MAAM,mBAFJ,QAAQ,aAAa,oBAAoB,2BAEP,EAAE,aAAa;GAEnD,OAAO,SAAS,KAAK;IACnB,SAAS,QAAQ;IACjB,kBAAkB,YAAY,QAAQ,OAAO;IAC7C,kBACE,qBAAqB,QAAQ,iBAAiB,SAAS,IACnD,mBACA,KAAA;IACN,UAAU,CAAC,QAAQ;GACrB,CAAC;EACH;EAEA,OAAO;CACT;CAEA,YAAY,QAA0D;EACpE,OAAO,KAAK,OACV;GACE,KAAK,cAAc,OAAO,aAAa,OAAO,WAAW;GACzD,UAAU;EACZ,SACM,KAAK,cAAc,MAAM,CACjC;CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["versioning"],"sources":["../../../../lib/modules/datasource/node-version/index.ts"],"sourcesContent":["import { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { id as versioning } from '../../versioning/node/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { datasource, defaultRegistryUrl } from './common.ts';\nimport { NodeReleases } from './schema.ts';\n\nexport class NodeVersionDatasource extends Datasource {\n static readonly id = datasource;\n\n constructor() {\n super(datasource);\n }\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return [defaultRegistryUrl];\n }\n\n override readonly defaultVersioning = versioning;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `date` field.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'We use the URL: https://github.com/nodejs/node';\n\n private async fetchReleases({\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n const result: ReleaseResult = {\n homepage: 'https://nodejs.org',\n sourceUrl: 'https://github.com/nodejs/node',\n registryUrl,\n releases: [],\n };\n const body = await this.fetchJson(\n joinUrlParts(registryUrl, 'index.json'),\n NodeReleases,\n );\n result.releases.push(\n ...body.map(({ version, date, lts }) => ({\n version,\n releaseTimestamp: asTimestamp(date),\n isStable: lts !== false,\n })),\n );\n\n return result.releases.length ? result : null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return this.cached(\n {\n
|
|
1
|
+
{"version":3,"file":"index.js","names":["versioning"],"sources":["../../../../lib/modules/datasource/node-version/index.ts"],"sourcesContent":["import { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { id as versioning } from '../../versioning/node/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { datasource, defaultRegistryUrl } from './common.ts';\nimport { NodeReleases } from './schema.ts';\n\nexport class NodeVersionDatasource extends Datasource {\n static readonly id = datasource;\n\n constructor() {\n super(datasource);\n }\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return [defaultRegistryUrl];\n }\n\n override readonly defaultVersioning = versioning;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `date` field.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'We use the URL: https://github.com/nodejs/node';\n\n private async fetchReleases({\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n const result: ReleaseResult = {\n homepage: 'https://nodejs.org',\n sourceUrl: 'https://github.com/nodejs/node',\n registryUrl,\n releases: [],\n };\n const body = await this.fetchJson(\n joinUrlParts(registryUrl, 'index.json'),\n NodeReleases,\n );\n result.releases.push(\n ...body.map(({ version, date, lts }) => ({\n version,\n releaseTimestamp: asTimestamp(date),\n isStable: lts !== false,\n })),\n );\n\n return result.releases.length ? result : null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return this.cached(\n {\n key: config.registryUrl!,\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;AAQA,IAAa,wBAAb,cAA2C,WAAW;CACpD,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,UAAU;CAClB;CAEA,uBAAgC,cAAgC;EAC9D,OAAO,CAAC,kBAAkB;CAC5B;CAEA,oBAAsCA;CAEtC,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,MAAc,cAAc,EAC1B,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAET,MAAM,SAAwB;GAC5B,UAAU;GACV,WAAW;GACX;GACA,UAAU,CAAC;EACb;EACA,MAAM,OAAO,MAAM,KAAK,UACtB,aAAa,aAAa,YAAY,GACtC,YACF;EACA,OAAO,SAAS,KACd,GAAG,KAAK,KAAK,EAAE,SAAS,MAAM,WAAW;GACvC;GACA,kBAAkB,YAAY,IAAI;GAClC,UAAU,QAAQ;EACpB,EAAE,CACJ;EAEA,OAAO,OAAO,SAAS,SAAS,SAAS;CAC3C;CAEA,YAAY,QAA0D;EACpE,OAAO,KAAK,OACV;GACE,KAAK,OAAO;GACZ,UAAU;EACZ,SACM,KAAK,cAAc,MAAM,CACjC;CACF;AACF"}
|
|
@@ -3,6 +3,7 @@ import { regEx } from "../../../util/regex.js";
|
|
|
3
3
|
import { coerceArray } from "../../../util/array.js";
|
|
4
4
|
import { logger } from "../../../logger/index.js";
|
|
5
5
|
import { ensureTrailingSlash } from "../../../util/url.js";
|
|
6
|
+
import { buildCacheKey } from "../../../util/cache/package/key.js";
|
|
6
7
|
import { ExternalHostError } from "../../../types/errors/external-host-error.js";
|
|
7
8
|
import { createCacheWriteStream, ensureCacheDir, pipeline, readCacheFile, rmCache } from "../../../util/fs/index.js";
|
|
8
9
|
import { api } from "../../versioning/nuget/index.js";
|
|
@@ -24,7 +25,7 @@ import AdmZip from "adm-zip";
|
|
|
24
25
|
var NugetV3Api = class NugetV3Api {
|
|
25
26
|
static cacheNamespace = "datasource-nuget-v3";
|
|
26
27
|
async getResourceUrl(http, url, resourceType = "RegistrationsBaseUrl") {
|
|
27
|
-
const resultCacheKey =
|
|
28
|
+
const resultCacheKey = buildCacheKey(url, resourceType);
|
|
28
29
|
const cachedResult = await get(NugetV3Api.cacheNamespace, resultCacheKey);
|
|
29
30
|
/* v8 ignore next -- TODO: add test */
|
|
30
31
|
if (cachedResult) return cachedResult;
|
|
@@ -184,7 +185,7 @@ var NugetV3Api = class NugetV3Api {
|
|
|
184
185
|
getSourceUrlFromNupkg(http, registryUrl, packageName, packageVersion, nupkgUrl) {
|
|
185
186
|
return withCache({
|
|
186
187
|
namespace: NugetV3Api.cacheNamespace,
|
|
187
|
-
key:
|
|
188
|
+
key: buildCacheKey("source-url", registryUrl, packageName),
|
|
188
189
|
ttlMinutes: 10080
|
|
189
190
|
}, () => this._getSourceUrlFromNupkg(http, registryUrl, packageName, packageVersion, nupkgUrl));
|
|
190
191
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v3.js","names":["packageCache.get","packageCache.set","p.all","versioning","HttpError","fs.createCacheWriteStream","fs.pipeline","fs.readCacheFile","fs.rmCache"],"sources":["../../../../lib/modules/datasource/nuget/v3.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport AdmZip from 'adm-zip';\nimport semver from 'semver';\nimport upath from 'upath';\nimport { XmlDocument } from 'xmldoc';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport * as fs from '../../../util/fs/index.ts';\nimport { ensureCacheDir } from '../../../util/fs/index.ts';\nimport { memCacheProvider } from '../../../util/http/cache/memory-http-cache-provider.ts';\nimport type { Http } from '../../../util/http/index.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport * as p from '../../../util/promises.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { api as versioning } from '../../versioning/nuget/index.ts';\nimport type { Release, ReleaseResult } from '../types.ts';\nimport { massageUrl, removeBuildMeta, sortNugetVersions } from './common.ts';\nimport type { CatalogEntry } from './schema.ts';\nimport {\n CatalogPage,\n PackageRegistration,\n ServicesIndexRaw,\n} from './schema.ts';\n\nexport class NugetV3Api {\n static readonly cacheNamespace = 'datasource-nuget-v3';\n\n async getResourceUrl(\n http: Http,\n url: string,\n resourceType = 'RegistrationsBaseUrl',\n ): Promise<string | null> {\n // https://learn.microsoft.com/nuget/api/service-index\n const resultCacheKey = `${url}:${resourceType}`;\n const cachedResult = await packageCache.get<string>(\n NugetV3Api.cacheNamespace,\n resultCacheKey,\n );\n\n /* v8 ignore next -- TODO: add test */\n if (cachedResult) {\n return cachedResult;\n }\n let servicesIndexRaw: ServicesIndexRaw | undefined;\n try {\n const responseCacheKey = url;\n servicesIndexRaw = await packageCache.get<ServicesIndexRaw>(\n NugetV3Api.cacheNamespace,\n responseCacheKey,\n );\n // v8 ignore else -- needs a primed package cache\n if (!servicesIndexRaw) {\n servicesIndexRaw = (\n await http.getJson(\n url,\n { cacheProvider: memCacheProvider },\n ServicesIndexRaw,\n )\n ).body;\n await packageCache.set(\n NugetV3Api.cacheNamespace,\n responseCacheKey,\n servicesIndexRaw,\n 3 * 24 * 60,\n );\n }\n\n const services = servicesIndexRaw.resources\n .map(({ '@id': serviceId, '@type': t }) => ({\n serviceId,\n type: t?.split('/')?.shift(),\n version: t?.split('/')?.pop(),\n }))\n .filter(\n ({ type, version }) => type === resourceType && semver.valid(version),\n )\n .sort((x, y) =>\n x.version && y.version\n ? semver.compare(x.version, y.version)\n : /* istanbul ignore next: hard to test */ 0,\n );\n\n if (services.length === 0) {\n await packageCache.set(\n NugetV3Api.cacheNamespace,\n resultCacheKey,\n null,\n 60,\n );\n logger.debug(\n { url, servicesIndexRaw },\n `no ${resourceType} services found`,\n );\n return null;\n }\n\n const { serviceId, version } = services.pop()!;\n\n // istanbul ignore if\n if (\n resourceType === 'RegistrationsBaseUrl' &&\n version &&\n !version.startsWith('3.0.0-') &&\n !semver.satisfies(version, '^3.0.0')\n ) {\n logger.warn(\n { url, version },\n `Nuget: Unknown version returned. Only v3 is supported`,\n );\n }\n\n await packageCache.set(\n NugetV3Api.cacheNamespace,\n resultCacheKey,\n serviceId,\n 60,\n );\n return serviceId;\n } catch (err) {\n // istanbul ignore if: not easy testable with nock\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n { err, url, servicesIndexRaw },\n `nuget registry failure: can't get ${resourceType}`,\n );\n return null;\n }\n }\n\n async getCatalogEntry(\n http: Http,\n catalogPage: CatalogPage,\n ): Promise<CatalogEntry[]> {\n let items = catalogPage.items;\n if (!items) {\n const url = catalogPage['@id'];\n if (!url) {\n return [];\n }\n const catalogPageFull = await http.getJson(url, CatalogPage);\n items = catalogPageFull.body.items;\n }\n return coerceArray(items).map(({ catalogEntry }) => catalogEntry);\n }\n\n async getReleases(\n http: Http,\n registryUrl: string,\n feedUrl: string,\n pkgName: string,\n ): Promise<ReleaseResult | null> {\n const baseUrl = feedUrl.replace(regEx(/\\/*$/), '');\n const url = `${baseUrl}/${pkgName.toLowerCase()}/index.json`;\n const packageRegistration = await http.getJson(url, PackageRegistration);\n const catalogPages = packageRegistration.body.items;\n const catalogPagesQueue = catalogPages.map(\n (page) => (): Promise<CatalogEntry[]> => this.getCatalogEntry(http, page),\n );\n const catalogEntries = (await p.all(catalogPagesQueue))\n .flat()\n .sort((a, b) => sortNugetVersions(a.version, b.version));\n\n let homepage: string | null = null;\n let latestStable: string | null = null;\n let nupkgUrl: string | null = null;\n const releases = catalogEntries.map(\n ({\n version,\n published,\n projectUrl,\n listed,\n packageContent,\n deprecation,\n }) => {\n const release: Release = { version: removeBuildMeta(version) };\n const releaseTimestamp = asTimestamp(published);\n if (releaseTimestamp) {\n release.releaseTimestamp = releaseTimestamp;\n }\n if (\n versioning.isValid(version) &&\n versioning.isStable(version) &&\n listed\n ) {\n latestStable = removeBuildMeta(version);\n homepage = projectUrl ? massageUrl(projectUrl) : homepage;\n nupkgUrl = massageUrl(packageContent);\n }\n\n if (listed === false || deprecation) {\n release.isDeprecated = true;\n }\n return release;\n },\n );\n\n if (!releases.length) {\n return null;\n }\n\n // istanbul ignore next: only happens when no stable version exists\n if (latestStable === null && catalogPages.length) {\n const last = catalogEntries.pop()!;\n latestStable = removeBuildMeta(last.version);\n homepage ??= last.projectUrl ?? null;\n nupkgUrl ??= massageUrl(last.packageContent);\n }\n\n const dep: ReleaseResult = {\n releases,\n };\n\n if (releases.every((release) => release.isDeprecated === true)) {\n dep.deprecationMessage = this.getDeprecationMessage(pkgName);\n }\n\n try {\n const packageBaseAddress = await this.getResourceUrl(\n http,\n registryUrl,\n 'PackageBaseAddress',\n );\n let shouldTryNupkg = false;\n if (isNonEmptyString(packageBaseAddress)) {\n const nuspecUrl = `${ensureTrailingSlash(\n packageBaseAddress,\n )}${pkgName.toLowerCase()}/${\n latestStable\n }/${pkgName.toLowerCase()}.nuspec`;\n try {\n const metaresult = await http.getText(nuspecUrl, {\n cacheProvider: memCacheProvider,\n });\n const nuspec = new XmlDocument(metaresult.body);\n const releaseNotes = nuspec.valueWithPath('metadata.releaseNotes');\n if (releaseNotes) {\n dep.changelogContent = releaseNotes;\n }\n const sourceUrl = nuspec.valueWithPath('metadata.repository@url');\n if (sourceUrl) {\n dep.sourceUrl = massageUrl(sourceUrl);\n }\n } catch (err) {\n /* v8 ignore else -- not easy testable with nock */\n if (err instanceof HttpError && err.response?.statusCode === 404) {\n shouldTryNupkg = true;\n logger.debug(\n { registryUrl, pkgName, pkgVersion: latestStable },\n `package manifest (.nuspec) not found`,\n );\n } else {\n throw err;\n }\n }\n } else {\n shouldTryNupkg = true;\n }\n\n if (!dep.sourceUrl && shouldTryNupkg && nupkgUrl) {\n const sourceUrl = await this.getSourceUrlFromNupkg(\n http,\n registryUrl,\n pkgName,\n latestStable,\n nupkgUrl,\n );\n if (sourceUrl) {\n dep.sourceUrl = massageUrl(sourceUrl);\n logger.debug(`Determined sourceUrl ${sourceUrl} from ${nupkgUrl}`);\n }\n }\n } catch (err) {\n // istanbul ignore if: not easy testable with nock\n if (err instanceof ExternalHostError) {\n throw err;\n }\n // ignore / silence 404. Seen on proget, if remote connector is used and package is not yet cached\n if (err instanceof HttpError && err.response?.statusCode === 404) {\n logger.debug(\n { registryUrl, pkgName, pkgVersion: latestStable },\n `package manifest (.nuspec) not found`,\n );\n } else {\n logger.debug(\n { err, registryUrl, pkgName, pkgVersion: latestStable },\n `Cannot obtain sourceUrl`,\n );\n }\n }\n\n if (homepage) {\n // only assign if not assigned\n dep.sourceUrl ??= homepage;\n dep.homepage ??= homepage;\n }\n\n return dep;\n }\n\n private async _getSourceUrlFromNupkg(\n http: Http,\n _registryUrl: string,\n packageName: string,\n packageVersion: string | null,\n nupkgUrl: string,\n ): Promise<string | null> {\n /* v8 ignore if -- specs enable RENOVATE_X_NUGET_DOWNLOAD_NUPKGS, so the disabled path is unexercised */\n if (!getEnv().RENOVATE_X_NUGET_DOWNLOAD_NUPKGS) {\n logger.once.debug('RENOVATE_X_NUGET_DOWNLOAD_NUPKGS is not set');\n return null;\n }\n const cacheDir = await ensureCacheDir('nuget');\n const nupkgFile = upath.join(\n cacheDir,\n `${packageName}.${packageVersion}.nupkg`,\n );\n const nupkgContentsDir = upath.join(\n cacheDir,\n `${packageName}.${packageVersion}`,\n );\n const readStream = http.stream(nupkgUrl);\n try {\n const writeStream = fs.createCacheWriteStream(nupkgFile);\n await fs.pipeline(readStream, writeStream);\n const zip = new AdmZip(nupkgFile);\n zip.extractAllTo(nupkgContentsDir);\n const nuspecFile = upath.join(nupkgContentsDir, `${packageName}.nuspec`);\n const nuspec = new XmlDocument(\n await fs.readCacheFile(nuspecFile, 'utf8'),\n );\n return nuspec.valueWithPath('metadata.repository@url') ?? null;\n } finally {\n await fs.rmCache(nupkgFile);\n await fs.rmCache(nupkgContentsDir);\n }\n }\n\n getSourceUrlFromNupkg(\n http: Http,\n registryUrl: string,\n packageName: string,\n packageVersion: string | null,\n nupkgUrl: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: NugetV3Api.cacheNamespace,\n key: `source-url:${registryUrl}:${packageName}`,\n ttlMinutes: 10080, // 1 week\n },\n () =>\n this._getSourceUrlFromNupkg(\n http,\n registryUrl,\n packageName,\n packageVersion,\n nupkgUrl,\n ),\n );\n }\n\n getDeprecationMessage(packageName: string): string {\n return `The package \\`${packageName}\\` is deprecated.`;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"v3.js","names":["packageCache.get","packageCache.set","p.all","versioning","HttpError","fs.createCacheWriteStream","fs.pipeline","fs.readCacheFile","fs.rmCache"],"sources":["../../../../lib/modules/datasource/nuget/v3.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport AdmZip from 'adm-zip';\nimport semver from 'semver';\nimport upath from 'upath';\nimport { XmlDocument } from 'xmldoc';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { buildCacheKey } from '../../../util/cache/package/key.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport * as fs from '../../../util/fs/index.ts';\nimport { ensureCacheDir } from '../../../util/fs/index.ts';\nimport { memCacheProvider } from '../../../util/http/cache/memory-http-cache-provider.ts';\nimport type { Http } from '../../../util/http/index.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport * as p from '../../../util/promises.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { api as versioning } from '../../versioning/nuget/index.ts';\nimport type { Release, ReleaseResult } from '../types.ts';\nimport { massageUrl, removeBuildMeta, sortNugetVersions } from './common.ts';\nimport type { CatalogEntry } from './schema.ts';\nimport {\n CatalogPage,\n PackageRegistration,\n ServicesIndexRaw,\n} from './schema.ts';\n\nexport class NugetV3Api {\n static readonly cacheNamespace = 'datasource-nuget-v3';\n\n async getResourceUrl(\n http: Http,\n url: string,\n resourceType = 'RegistrationsBaseUrl',\n ): Promise<string | null> {\n // https://learn.microsoft.com/nuget/api/service-index\n const resultCacheKey = buildCacheKey(url, resourceType);\n const cachedResult = await packageCache.get<string>(\n NugetV3Api.cacheNamespace,\n resultCacheKey,\n );\n\n /* v8 ignore next -- TODO: add test */\n if (cachedResult) {\n return cachedResult;\n }\n let servicesIndexRaw: ServicesIndexRaw | undefined;\n try {\n const responseCacheKey = url;\n servicesIndexRaw = await packageCache.get<ServicesIndexRaw>(\n NugetV3Api.cacheNamespace,\n responseCacheKey,\n );\n // v8 ignore else -- needs a primed package cache\n if (!servicesIndexRaw) {\n servicesIndexRaw = (\n await http.getJson(\n url,\n { cacheProvider: memCacheProvider },\n ServicesIndexRaw,\n )\n ).body;\n await packageCache.set(\n NugetV3Api.cacheNamespace,\n responseCacheKey,\n servicesIndexRaw,\n 3 * 24 * 60,\n );\n }\n\n const services = servicesIndexRaw.resources\n .map(({ '@id': serviceId, '@type': t }) => ({\n serviceId,\n type: t?.split('/')?.shift(),\n version: t?.split('/')?.pop(),\n }))\n .filter(\n ({ type, version }) => type === resourceType && semver.valid(version),\n )\n .sort((x, y) =>\n x.version && y.version\n ? semver.compare(x.version, y.version)\n : /* istanbul ignore next: hard to test */ 0,\n );\n\n if (services.length === 0) {\n await packageCache.set(\n NugetV3Api.cacheNamespace,\n resultCacheKey,\n null,\n 60,\n );\n logger.debug(\n { url, servicesIndexRaw },\n `no ${resourceType} services found`,\n );\n return null;\n }\n\n const { serviceId, version } = services.pop()!;\n\n // istanbul ignore if\n if (\n resourceType === 'RegistrationsBaseUrl' &&\n version &&\n !version.startsWith('3.0.0-') &&\n !semver.satisfies(version, '^3.0.0')\n ) {\n logger.warn(\n { url, version },\n `Nuget: Unknown version returned. Only v3 is supported`,\n );\n }\n\n await packageCache.set(\n NugetV3Api.cacheNamespace,\n resultCacheKey,\n serviceId,\n 60,\n );\n return serviceId;\n } catch (err) {\n // istanbul ignore if: not easy testable with nock\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n { err, url, servicesIndexRaw },\n `nuget registry failure: can't get ${resourceType}`,\n );\n return null;\n }\n }\n\n async getCatalogEntry(\n http: Http,\n catalogPage: CatalogPage,\n ): Promise<CatalogEntry[]> {\n let items = catalogPage.items;\n if (!items) {\n const url = catalogPage['@id'];\n if (!url) {\n return [];\n }\n const catalogPageFull = await http.getJson(url, CatalogPage);\n items = catalogPageFull.body.items;\n }\n return coerceArray(items).map(({ catalogEntry }) => catalogEntry);\n }\n\n async getReleases(\n http: Http,\n registryUrl: string,\n feedUrl: string,\n pkgName: string,\n ): Promise<ReleaseResult | null> {\n const baseUrl = feedUrl.replace(regEx(/\\/*$/), '');\n const url = `${baseUrl}/${pkgName.toLowerCase()}/index.json`;\n const packageRegistration = await http.getJson(url, PackageRegistration);\n const catalogPages = packageRegistration.body.items;\n const catalogPagesQueue = catalogPages.map(\n (page) => (): Promise<CatalogEntry[]> => this.getCatalogEntry(http, page),\n );\n const catalogEntries = (await p.all(catalogPagesQueue))\n .flat()\n .sort((a, b) => sortNugetVersions(a.version, b.version));\n\n let homepage: string | null = null;\n let latestStable: string | null = null;\n let nupkgUrl: string | null = null;\n const releases = catalogEntries.map(\n ({\n version,\n published,\n projectUrl,\n listed,\n packageContent,\n deprecation,\n }) => {\n const release: Release = { version: removeBuildMeta(version) };\n const releaseTimestamp = asTimestamp(published);\n if (releaseTimestamp) {\n release.releaseTimestamp = releaseTimestamp;\n }\n if (\n versioning.isValid(version) &&\n versioning.isStable(version) &&\n listed\n ) {\n latestStable = removeBuildMeta(version);\n homepage = projectUrl ? massageUrl(projectUrl) : homepage;\n nupkgUrl = massageUrl(packageContent);\n }\n\n if (listed === false || deprecation) {\n release.isDeprecated = true;\n }\n return release;\n },\n );\n\n if (!releases.length) {\n return null;\n }\n\n // istanbul ignore next: only happens when no stable version exists\n if (latestStable === null && catalogPages.length) {\n const last = catalogEntries.pop()!;\n latestStable = removeBuildMeta(last.version);\n homepage ??= last.projectUrl ?? null;\n nupkgUrl ??= massageUrl(last.packageContent);\n }\n\n const dep: ReleaseResult = {\n releases,\n };\n\n if (releases.every((release) => release.isDeprecated === true)) {\n dep.deprecationMessage = this.getDeprecationMessage(pkgName);\n }\n\n try {\n const packageBaseAddress = await this.getResourceUrl(\n http,\n registryUrl,\n 'PackageBaseAddress',\n );\n let shouldTryNupkg = false;\n if (isNonEmptyString(packageBaseAddress)) {\n const nuspecUrl = `${ensureTrailingSlash(\n packageBaseAddress,\n )}${pkgName.toLowerCase()}/${\n latestStable\n }/${pkgName.toLowerCase()}.nuspec`;\n try {\n const metaresult = await http.getText(nuspecUrl, {\n cacheProvider: memCacheProvider,\n });\n const nuspec = new XmlDocument(metaresult.body);\n const releaseNotes = nuspec.valueWithPath('metadata.releaseNotes');\n if (releaseNotes) {\n dep.changelogContent = releaseNotes;\n }\n const sourceUrl = nuspec.valueWithPath('metadata.repository@url');\n if (sourceUrl) {\n dep.sourceUrl = massageUrl(sourceUrl);\n }\n } catch (err) {\n /* v8 ignore else -- not easy testable with nock */\n if (err instanceof HttpError && err.response?.statusCode === 404) {\n shouldTryNupkg = true;\n logger.debug(\n { registryUrl, pkgName, pkgVersion: latestStable },\n `package manifest (.nuspec) not found`,\n );\n } else {\n throw err;\n }\n }\n } else {\n shouldTryNupkg = true;\n }\n\n if (!dep.sourceUrl && shouldTryNupkg && nupkgUrl) {\n const sourceUrl = await this.getSourceUrlFromNupkg(\n http,\n registryUrl,\n pkgName,\n latestStable,\n nupkgUrl,\n );\n if (sourceUrl) {\n dep.sourceUrl = massageUrl(sourceUrl);\n logger.debug(`Determined sourceUrl ${sourceUrl} from ${nupkgUrl}`);\n }\n }\n } catch (err) {\n // istanbul ignore if: not easy testable with nock\n if (err instanceof ExternalHostError) {\n throw err;\n }\n // ignore / silence 404. Seen on proget, if remote connector is used and package is not yet cached\n if (err instanceof HttpError && err.response?.statusCode === 404) {\n logger.debug(\n { registryUrl, pkgName, pkgVersion: latestStable },\n `package manifest (.nuspec) not found`,\n );\n } else {\n logger.debug(\n { err, registryUrl, pkgName, pkgVersion: latestStable },\n `Cannot obtain sourceUrl`,\n );\n }\n }\n\n if (homepage) {\n // only assign if not assigned\n dep.sourceUrl ??= homepage;\n dep.homepage ??= homepage;\n }\n\n return dep;\n }\n\n private async _getSourceUrlFromNupkg(\n http: Http,\n _registryUrl: string,\n packageName: string,\n packageVersion: string | null,\n nupkgUrl: string,\n ): Promise<string | null> {\n /* v8 ignore if -- specs enable RENOVATE_X_NUGET_DOWNLOAD_NUPKGS, so the disabled path is unexercised */\n if (!getEnv().RENOVATE_X_NUGET_DOWNLOAD_NUPKGS) {\n logger.once.debug('RENOVATE_X_NUGET_DOWNLOAD_NUPKGS is not set');\n return null;\n }\n const cacheDir = await ensureCacheDir('nuget');\n const nupkgFile = upath.join(\n cacheDir,\n `${packageName}.${packageVersion}.nupkg`,\n );\n const nupkgContentsDir = upath.join(\n cacheDir,\n `${packageName}.${packageVersion}`,\n );\n const readStream = http.stream(nupkgUrl);\n try {\n const writeStream = fs.createCacheWriteStream(nupkgFile);\n await fs.pipeline(readStream, writeStream);\n const zip = new AdmZip(nupkgFile);\n zip.extractAllTo(nupkgContentsDir);\n const nuspecFile = upath.join(nupkgContentsDir, `${packageName}.nuspec`);\n const nuspec = new XmlDocument(\n await fs.readCacheFile(nuspecFile, 'utf8'),\n );\n return nuspec.valueWithPath('metadata.repository@url') ?? null;\n } finally {\n await fs.rmCache(nupkgFile);\n await fs.rmCache(nupkgContentsDir);\n }\n }\n\n getSourceUrlFromNupkg(\n http: Http,\n registryUrl: string,\n packageName: string,\n packageVersion: string | null,\n nupkgUrl: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: NugetV3Api.cacheNamespace,\n key: buildCacheKey('source-url', registryUrl, packageName),\n ttlMinutes: 10080, // 1 week\n },\n () =>\n this._getSourceUrlFromNupkg(\n http,\n registryUrl,\n packageName,\n packageVersion,\n nupkgUrl,\n ),\n );\n }\n\n getDeprecationMessage(packageName: string): string {\n return `The package \\`${packageName}\\` is deprecated.`;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { logger } from "../../../logger/index.js";
|
|
2
2
|
import { getQueryString, joinUrlParts } from "../../../util/url.js";
|
|
3
|
+
import { buildCacheKey } from "../../../util/cache/package/key.js";
|
|
3
4
|
import { withCache } from "../../../util/cache/package/with-cache.js";
|
|
4
5
|
import { Datasource } from "../datasource.js";
|
|
5
6
|
import { OrbPackagesResponse } from "./schema.js";
|
|
@@ -38,7 +39,7 @@ var OrbDatasource = class OrbDatasource extends Datasource {
|
|
|
38
39
|
getReleases(config) {
|
|
39
40
|
return withCache({
|
|
40
41
|
namespace: `datasource-${OrbDatasource.id}`,
|
|
41
|
-
key:
|
|
42
|
+
key: buildCacheKey(config.registryUrl, config.packageName),
|
|
42
43
|
fallback: true
|
|
43
44
|
}, () => this._getReleases(config));
|
|
44
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/orb/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { getQueryString, joinUrlParts } from '../../../util/url.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { OrbPackagesResponse } from './schema.ts';\n\nexport class OrbDatasource extends Datasource {\n static readonly id = 'orb';\n\n constructor() {\n super(OrbDatasource.id);\n }\n\n override supportsCustomRegistry(_packageName: string): boolean {\n return true;\n }\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return ['https://circleci.com/'];\n }\n override readonly registryStrategy = 'hunt';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `created_at` field in the results.';\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n const url = `${joinUrlParts(\n registryUrl,\n 'api/v3/orb/packages',\n )}?${getQueryString({ 'filter[name]': packageName })}`;\n const body = await this.fetchJson(url, OrbPackagesResponse);\n const pkg = body.data[0];\n if (!pkg) {\n logger.debug({ packageName }, `Failed to look up orb ${packageName}`);\n return null;\n }\n\n // The homepage fallback uses the requested packageName, which the schema\n // has no access to, so it is built here rather than in the transform.\n const homepage = pkg.homeUrl?.length\n ? pkg.homeUrl\n : `https://circleci.com/developer/orbs/orb/${packageName}`;\n const dep = {\n homepage,\n isPrivate: pkg.isPrivate,\n releases: pkg.releases,\n };\n logger.trace({ dep }, 'dep');\n return dep;\n }\n\n override getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${OrbDatasource.id}`,\n key:
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/orb/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { buildCacheKey } from '../../../util/cache/package/key.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { getQueryString, joinUrlParts } from '../../../util/url.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { OrbPackagesResponse } from './schema.ts';\n\nexport class OrbDatasource extends Datasource {\n static readonly id = 'orb';\n\n constructor() {\n super(OrbDatasource.id);\n }\n\n override supportsCustomRegistry(_packageName: string): boolean {\n return true;\n }\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return ['https://circleci.com/'];\n }\n override readonly registryStrategy = 'hunt';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `created_at` field in the results.';\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n const url = `${joinUrlParts(\n registryUrl,\n 'api/v3/orb/packages',\n )}?${getQueryString({ 'filter[name]': packageName })}`;\n const body = await this.fetchJson(url, OrbPackagesResponse);\n const pkg = body.data[0];\n if (!pkg) {\n logger.debug({ packageName }, `Failed to look up orb ${packageName}`);\n return null;\n }\n\n // The homepage fallback uses the requested packageName, which the schema\n // has no access to, so it is built here rather than in the transform.\n const homepage = pkg.homeUrl?.length\n ? pkg.homeUrl\n : `https://circleci.com/developer/orbs/orb/${packageName}`;\n const dep = {\n homepage,\n isPrivate: pkg.isPrivate,\n releases: pkg.releases,\n };\n logger.trace({ dep }, 'dep');\n return dep;\n }\n\n override getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${OrbDatasource.id}`,\n key: buildCacheKey(config.registryUrl, config.packageName),\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;AAQA,IAAa,gBAAb,MAAa,sBAAsB,WAAW;CAC5C,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,cAAc,EAAE;CACxB;CAEA,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CAEA,uBAAgC,cAAgC;EAC9D,OAAO,CAAC,uBAAuB;CACjC;CACA,mBAAqC;CAErC,0BAA4C;CAC5C,uBACE;CAEF,MAAc,aAAa,EACzB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAET,MAAM,MAAM,GAAG,aACb,aACA,qBACF,EAAE,GAAG,eAAe,EAAE,gBAAgB,YAAY,CAAC;EAEnD,MAAM,OAAM,MADO,KAAK,UAAU,KAAK,mBAAmB,EAAA,CACzC,KAAK;EACtB,IAAI,CAAC,KAAK;GACR,OAAO,MAAM,EAAE,YAAY,GAAG,yBAAyB,aAAa;GACpE,OAAO;EACT;EAOA,MAAM,MAAM;GACV,UAJe,IAAI,SAAS,SAC1B,IAAI,UACJ,2CAA2C;GAG7C,WAAW,IAAI;GACf,UAAU,IAAI;EAChB;EACA,OAAO,MAAM,EAAE,IAAI,GAAG,KAAK;EAC3B,OAAO;CACT;CAEA,YACE,QAC+B;EAC/B,OAAO,UACL;GACE,WAAW,cAAc,cAAc;GACvC,KAAK,cAAc,OAAO,aAAa,OAAO,WAAW;GACzD,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { logger } from "../../../logger/index.js";
|
|
2
2
|
import { parseUrl, replaceUrlPath, resolveBaseUrl } from "../../../util/url.js";
|
|
3
3
|
import { find } from "../../../util/host-rules.js";
|
|
4
|
+
import { buildCacheKey } from "../../../util/cache/package/key.js";
|
|
4
5
|
import { ExternalHostError } from "../../../types/errors/external-host-error.js";
|
|
5
6
|
import { id } from "../../versioning/composer/index.js";
|
|
6
7
|
import { withCache } from "../../../util/cache/package/with-cache.js";
|
|
@@ -59,7 +60,7 @@ var PackagistDatasource = class PackagistDatasource extends Datasource {
|
|
|
59
60
|
getRegistryMeta(regUrl) {
|
|
60
61
|
return withCache({
|
|
61
62
|
namespace: `datasource-${PackagistDatasource.id}`,
|
|
62
|
-
key:
|
|
63
|
+
key: buildCacheKey("getRegistryMeta", regUrl)
|
|
63
64
|
}, () => this._getRegistryMeta(regUrl));
|
|
64
65
|
}
|
|
65
66
|
static isPrivatePackage(regUrl) {
|
|
@@ -77,7 +78,7 @@ var PackagistDatasource = class PackagistDatasource extends Datasource {
|
|
|
77
78
|
getPackagistFile(regUrl, regFile) {
|
|
78
79
|
return withCache({
|
|
79
80
|
namespace: `datasource-${PackagistDatasource.id}`,
|
|
80
|
-
key:
|
|
81
|
+
key: buildCacheKey("getPackagistFile", PackagistDatasource.getPackagistFileUrl(regUrl, regFile)),
|
|
81
82
|
ttlMinutes: 1440,
|
|
82
83
|
cacheable: !PackagistDatasource.isPrivatePackage(regUrl)
|
|
83
84
|
}, () => this._getPackagistFile(regUrl, regFile));
|
|
@@ -105,7 +106,7 @@ var PackagistDatasource = class PackagistDatasource extends Datasource {
|
|
|
105
106
|
packagistV2Lookup(registryUrl, metadataUrl, packageName) {
|
|
106
107
|
return withCache({
|
|
107
108
|
namespace: `datasource-${PackagistDatasource.id}`,
|
|
108
|
-
key:
|
|
109
|
+
key: buildCacheKey("packagistV2Lookup", registryUrl, metadataUrl, packageName),
|
|
109
110
|
ttlMinutes: 10
|
|
110
111
|
}, () => this._packagistV2Lookup(registryUrl, metadataUrl, packageName));
|
|
111
112
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["composerVersioning.id","hostRules.find","p.map"],"sources":["../../../../lib/modules/datasource/packagist/index.ts"],"sourcesContent":["import { isNumber, isObject } from '@sindresorhus/is';\nimport { z } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport type { HttpOptions } from '../../../util/http/types.ts';\nimport * as p from '../../../util/promises.ts';\nimport { parseUrl, replaceUrlPath, resolveBaseUrl } from '../../../util/url.ts';\nimport * as composerVersioning from '../../versioning/composer/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport type { RegistryFile } from './schema.ts';\nimport {\n PackagesResponse,\n PackagistFile,\n RegistryMeta,\n extractDepReleases,\n parsePackagesResponses,\n} from './schema.ts';\n\ninterface PackagistLookupError {\n code?: string;\n statusCode?: number;\n}\n\nfunction isDefaultPackagistHost(registryUrl: string): boolean {\n const url = parseUrl(registryUrl);\n\n /* v8 ignore if -- typescript strict null check */\n if (!url) {\n return false;\n }\n\n return ['repo.packagist.org', 'packagist.org'].includes(url.host);\n}\n\nfunction isTransientPackagistError(err: PackagistLookupError): boolean {\n const { code: errCode, statusCode } = err;\n\n if (errCode && ['ECONNRESET', 'ETIMEDOUT'].includes(errCode)) {\n return true;\n }\n\n if (!isNumber(statusCode)) {\n return false;\n }\n\n if (statusCode === 429 || (statusCode >= 500 && statusCode < 600)) {\n return true;\n }\n\n return false;\n}\n\nexport class PackagistDatasource extends Datasource {\n static readonly id = 'packagist';\n\n constructor() {\n super(PackagistDatasource.id);\n }\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return ['https://repo.packagist.org'];\n }\n\n override readonly defaultVersioning = composerVersioning.id;\n\n override readonly registryStrategy = 'hunt';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `time` field in the results.';\n // Note: this can be changed to 'release', as the source is present in each release but we remove it while processing\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from `source` field in the results.';\n\n // We calculate auth at this datasource layer so that we can know whether it's safe to cache or not\n private static getHostOpts(url: string): HttpOptions {\n const { username, password } = hostRules.find({\n hostType: PackagistDatasource.id,\n url,\n });\n return username && password ? { username, password } : {};\n }\n\n private async getJson<Schema extends z.ZodType<any, any, any>>(\n url: string,\n schema: Schema,\n ): Promise<z.infer<Schema>> {\n const opts = PackagistDatasource.getHostOpts(url);\n const { body } = await this.http.getJson(url, opts, schema);\n return body;\n }\n\n private async _getRegistryMeta(regUrl: string): Promise<RegistryMeta> {\n const url = resolveBaseUrl(regUrl, 'packages.json');\n const result = await this.getJson(url, RegistryMeta);\n return result;\n }\n\n getRegistryMeta(regUrl: string): Promise<RegistryMeta> {\n return withCache(\n {\n namespace: `datasource-${PackagistDatasource.id}`,\n key: `getRegistryMeta:${regUrl}`,\n },\n () => this._getRegistryMeta(regUrl),\n );\n }\n\n private static isPrivatePackage(regUrl: string): boolean {\n const opts = PackagistDatasource.getHostOpts(regUrl);\n return !!opts.password;\n }\n\n private static getPackagistFileUrl(\n regUrl: string,\n regFile: RegistryFile,\n ): string {\n const { key, hash } = regFile;\n const fileName = hash\n ? key.replace('%hash%', hash)\n : /* istanbul ignore next: hard to test */ key;\n const url = resolveBaseUrl(regUrl, fileName);\n return url;\n }\n\n private async _getPackagistFile(\n regUrl: string,\n regFile: RegistryFile,\n ): Promise<PackagistFile> {\n const url = PackagistDatasource.getPackagistFileUrl(regUrl, regFile);\n const packagistFile = await this.getJson(url, PackagistFile);\n return packagistFile;\n }\n\n getPackagistFile(\n regUrl: string,\n regFile: RegistryFile,\n ): Promise<PackagistFile> {\n return withCache(\n {\n namespace: `datasource-${PackagistDatasource.id}`,\n key: `getPackagistFile:${PackagistDatasource.getPackagistFileUrl(regUrl, regFile)}`,\n ttlMinutes: 1440,\n cacheable: !PackagistDatasource.isPrivatePackage(regUrl),\n },\n () => this._getPackagistFile(regUrl, regFile),\n );\n }\n\n async fetchProviderPackages(\n regUrl: string,\n meta: RegistryMeta,\n ): Promise<void> {\n await p.map(meta.files, async (file) => {\n const res = await this.getPackagistFile(regUrl, file);\n Object.assign(meta.providerPackages, res.providers);\n });\n }\n\n async fetchIncludesPackages(\n regUrl: string,\n meta: RegistryMeta,\n ): Promise<void> {\n await p.map(meta.includesFiles, async (file) => {\n const res = await this.getPackagistFile(regUrl, file);\n for (const [key, val] of Object.entries(res.packages)) {\n meta.includesPackages[key] = extractDepReleases(val);\n }\n });\n }\n\n private async _packagistV2Lookup(\n registryUrl: string,\n metadataUrl: string,\n packageName: string,\n ): Promise<ReleaseResult | null> {\n const pkgUrl = replaceUrlPath(\n registryUrl,\n metadataUrl.replace('%package%', packageName),\n );\n const pkgPromise = this.getJson(pkgUrl, z.unknown());\n\n const devUrl = replaceUrlPath(\n registryUrl,\n metadataUrl.replace('%package%', `${packageName}~dev`),\n );\n const devPromise = this.getJson(devUrl, z.unknown()).then(\n (x) => x,\n () => null,\n );\n\n const responses: NonNullable<unknown>[] = await Promise.all([\n pkgPromise,\n devPromise,\n ]).then((responses) => responses.filter(isObject));\n return parsePackagesResponses(packageName, responses);\n }\n\n packagistV2Lookup(\n registryUrl: string,\n metadataUrl: string,\n packageName: string,\n ): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${PackagistDatasource.id}`,\n key: `packagistV2Lookup:${registryUrl}:${metadataUrl}:${packageName}`,\n ttlMinutes: 10,\n },\n () => this._packagistV2Lookup(registryUrl, metadataUrl, packageName),\n );\n }\n\n public getPkgUrl(\n packageName: string,\n registryUrl: string,\n registryMeta: RegistryMeta,\n ): string | null {\n if (\n registryMeta.providersUrl &&\n packageName in registryMeta.providerPackages\n ) {\n let url = registryMeta.providersUrl.replace('%package%', packageName);\n const hash = registryMeta.providerPackages[packageName];\n if (hash) {\n url = url.replace('%hash%', hash);\n }\n return replaceUrlPath(registryUrl, url);\n }\n\n if (registryMeta.providersLazyUrl) {\n return replaceUrlPath(\n registryUrl,\n registryMeta.providersLazyUrl.replace('%package%', packageName),\n );\n }\n\n return null;\n }\n\n public override async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n logger.trace(`getReleases(${packageName})`);\n\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n try {\n const meta = await this.getRegistryMeta(registryUrl);\n\n if (\n meta.availablePackages &&\n !meta.availablePackages.includes(packageName)\n ) {\n return null;\n }\n\n if (meta.metadataUrl) {\n const packagistResult = await this.packagistV2Lookup(\n registryUrl,\n meta.metadataUrl,\n packageName,\n );\n return packagistResult;\n }\n\n if (meta.packages[packageName]) {\n const result = extractDepReleases(meta.packages[packageName]);\n return result;\n }\n\n await this.fetchIncludesPackages(registryUrl, meta);\n if (meta.includesPackages[packageName]) {\n return meta.includesPackages[packageName];\n }\n\n await this.fetchProviderPackages(registryUrl, meta);\n const pkgUrl = this.getPkgUrl(packageName, registryUrl, meta);\n if (!pkgUrl) {\n return null;\n }\n\n const pkgRes = await this.getJson(pkgUrl, PackagesResponse);\n const dep = extractDepReleases(pkgRes.packages[packageName]);\n logger.trace({ dep }, 'dep');\n return dep;\n } catch (err) /* istanbul ignore next */ {\n if (\n isDefaultPackagistHost(registryUrl) &&\n isTransientPackagistError(err)\n ) {\n throw new ExternalHostError(err);\n }\n throw err;\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["composerVersioning.id","hostRules.find","p.map"],"sources":["../../../../lib/modules/datasource/packagist/index.ts"],"sourcesContent":["import { isNumber, isObject } from '@sindresorhus/is';\nimport { z } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { buildCacheKey } from '../../../util/cache/package/key.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport type { HttpOptions } from '../../../util/http/types.ts';\nimport * as p from '../../../util/promises.ts';\nimport { parseUrl, replaceUrlPath, resolveBaseUrl } from '../../../util/url.ts';\nimport * as composerVersioning from '../../versioning/composer/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport type { RegistryFile } from './schema.ts';\nimport {\n PackagesResponse,\n PackagistFile,\n RegistryMeta,\n extractDepReleases,\n parsePackagesResponses,\n} from './schema.ts';\n\ninterface PackagistLookupError {\n code?: string;\n statusCode?: number;\n}\n\nfunction isDefaultPackagistHost(registryUrl: string): boolean {\n const url = parseUrl(registryUrl);\n\n /* v8 ignore if -- typescript strict null check */\n if (!url) {\n return false;\n }\n\n return ['repo.packagist.org', 'packagist.org'].includes(url.host);\n}\n\nfunction isTransientPackagistError(err: PackagistLookupError): boolean {\n const { code: errCode, statusCode } = err;\n\n if (errCode && ['ECONNRESET', 'ETIMEDOUT'].includes(errCode)) {\n return true;\n }\n\n if (!isNumber(statusCode)) {\n return false;\n }\n\n if (statusCode === 429 || (statusCode >= 500 && statusCode < 600)) {\n return true;\n }\n\n return false;\n}\n\nexport class PackagistDatasource extends Datasource {\n static readonly id = 'packagist';\n\n constructor() {\n super(PackagistDatasource.id);\n }\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return ['https://repo.packagist.org'];\n }\n\n override readonly defaultVersioning = composerVersioning.id;\n\n override readonly registryStrategy = 'hunt';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `time` field in the results.';\n // Note: this can be changed to 'release', as the source is present in each release but we remove it while processing\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from `source` field in the results.';\n\n // We calculate auth at this datasource layer so that we can know whether it's safe to cache or not\n private static getHostOpts(url: string): HttpOptions {\n const { username, password } = hostRules.find({\n hostType: PackagistDatasource.id,\n url,\n });\n return username && password ? { username, password } : {};\n }\n\n private async getJson<Schema extends z.ZodType<any, any, any>>(\n url: string,\n schema: Schema,\n ): Promise<z.infer<Schema>> {\n const opts = PackagistDatasource.getHostOpts(url);\n const { body } = await this.http.getJson(url, opts, schema);\n return body;\n }\n\n private async _getRegistryMeta(regUrl: string): Promise<RegistryMeta> {\n const url = resolveBaseUrl(regUrl, 'packages.json');\n const result = await this.getJson(url, RegistryMeta);\n return result;\n }\n\n getRegistryMeta(regUrl: string): Promise<RegistryMeta> {\n return withCache(\n {\n namespace: `datasource-${PackagistDatasource.id}`,\n key: buildCacheKey('getRegistryMeta', regUrl),\n },\n () => this._getRegistryMeta(regUrl),\n );\n }\n\n private static isPrivatePackage(regUrl: string): boolean {\n const opts = PackagistDatasource.getHostOpts(regUrl);\n return !!opts.password;\n }\n\n private static getPackagistFileUrl(\n regUrl: string,\n regFile: RegistryFile,\n ): string {\n const { key, hash } = regFile;\n const fileName = hash\n ? key.replace('%hash%', hash)\n : /* istanbul ignore next: hard to test */ key;\n const url = resolveBaseUrl(regUrl, fileName);\n return url;\n }\n\n private async _getPackagistFile(\n regUrl: string,\n regFile: RegistryFile,\n ): Promise<PackagistFile> {\n const url = PackagistDatasource.getPackagistFileUrl(regUrl, regFile);\n const packagistFile = await this.getJson(url, PackagistFile);\n return packagistFile;\n }\n\n getPackagistFile(\n regUrl: string,\n regFile: RegistryFile,\n ): Promise<PackagistFile> {\n return withCache(\n {\n namespace: `datasource-${PackagistDatasource.id}`,\n key: buildCacheKey(\n 'getPackagistFile',\n PackagistDatasource.getPackagistFileUrl(regUrl, regFile),\n ),\n ttlMinutes: 1440,\n cacheable: !PackagistDatasource.isPrivatePackage(regUrl),\n },\n () => this._getPackagistFile(regUrl, regFile),\n );\n }\n\n async fetchProviderPackages(\n regUrl: string,\n meta: RegistryMeta,\n ): Promise<void> {\n await p.map(meta.files, async (file) => {\n const res = await this.getPackagistFile(regUrl, file);\n Object.assign(meta.providerPackages, res.providers);\n });\n }\n\n async fetchIncludesPackages(\n regUrl: string,\n meta: RegistryMeta,\n ): Promise<void> {\n await p.map(meta.includesFiles, async (file) => {\n const res = await this.getPackagistFile(regUrl, file);\n for (const [key, val] of Object.entries(res.packages)) {\n meta.includesPackages[key] = extractDepReleases(val);\n }\n });\n }\n\n private async _packagistV2Lookup(\n registryUrl: string,\n metadataUrl: string,\n packageName: string,\n ): Promise<ReleaseResult | null> {\n const pkgUrl = replaceUrlPath(\n registryUrl,\n metadataUrl.replace('%package%', packageName),\n );\n const pkgPromise = this.getJson(pkgUrl, z.unknown());\n\n const devUrl = replaceUrlPath(\n registryUrl,\n metadataUrl.replace('%package%', `${packageName}~dev`),\n );\n const devPromise = this.getJson(devUrl, z.unknown()).then(\n (x) => x,\n () => null,\n );\n\n const responses: NonNullable<unknown>[] = await Promise.all([\n pkgPromise,\n devPromise,\n ]).then((responses) => responses.filter(isObject));\n return parsePackagesResponses(packageName, responses);\n }\n\n packagistV2Lookup(\n registryUrl: string,\n metadataUrl: string,\n packageName: string,\n ): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${PackagistDatasource.id}`,\n key: buildCacheKey(\n 'packagistV2Lookup',\n registryUrl,\n metadataUrl,\n packageName,\n ),\n ttlMinutes: 10,\n },\n () => this._packagistV2Lookup(registryUrl, metadataUrl, packageName),\n );\n }\n\n public getPkgUrl(\n packageName: string,\n registryUrl: string,\n registryMeta: RegistryMeta,\n ): string | null {\n if (\n registryMeta.providersUrl &&\n packageName in registryMeta.providerPackages\n ) {\n let url = registryMeta.providersUrl.replace('%package%', packageName);\n const hash = registryMeta.providerPackages[packageName];\n if (hash) {\n url = url.replace('%hash%', hash);\n }\n return replaceUrlPath(registryUrl, url);\n }\n\n if (registryMeta.providersLazyUrl) {\n return replaceUrlPath(\n registryUrl,\n registryMeta.providersLazyUrl.replace('%package%', packageName),\n );\n }\n\n return null;\n }\n\n public override async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n logger.trace(`getReleases(${packageName})`);\n\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n try {\n const meta = await this.getRegistryMeta(registryUrl);\n\n if (\n meta.availablePackages &&\n !meta.availablePackages.includes(packageName)\n ) {\n return null;\n }\n\n if (meta.metadataUrl) {\n const packagistResult = await this.packagistV2Lookup(\n registryUrl,\n meta.metadataUrl,\n packageName,\n );\n return packagistResult;\n }\n\n if (meta.packages[packageName]) {\n const result = extractDepReleases(meta.packages[packageName]);\n return result;\n }\n\n await this.fetchIncludesPackages(registryUrl, meta);\n if (meta.includesPackages[packageName]) {\n return meta.includesPackages[packageName];\n }\n\n await this.fetchProviderPackages(registryUrl, meta);\n const pkgUrl = this.getPkgUrl(packageName, registryUrl, meta);\n if (!pkgUrl) {\n return null;\n }\n\n const pkgRes = await this.getJson(pkgUrl, PackagesResponse);\n const dep = extractDepReleases(pkgRes.packages[packageName]);\n logger.trace({ dep }, 'dep');\n return dep;\n } catch (err) /* istanbul ignore next */ {\n if (\n isDefaultPackagistHost(registryUrl) &&\n isTransientPackagistError(err)\n ) {\n throw new ExternalHostError(err);\n }\n throw err;\n }\n }\n}\n"],"mappings":"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"}
|