renovate 40.0.0-next.17 → 40.0.0-next.19
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/decrypt.d.ts +3 -1
- package/dist/config/decrypt.js +54 -11
- package/dist/config/decrypt.js.map +1 -1
- package/dist/config/migrations/custom/rebase-stale-prs-migration.js +1 -1
- package/dist/config/migrations/custom/rebase-stale-prs-migration.js.map +1 -1
- package/dist/config/options/index.js +1 -1
- package/dist/config/options/index.js.map +1 -1
- package/dist/config/presets/gitlab/index.js +1 -1
- package/dist/config/presets/gitlab/index.js.map +1 -1
- package/dist/config/presets/http/index.js +1 -1
- package/dist/config/presets/http/index.js.map +1 -1
- package/dist/config/presets/internal/custom-managers.js +3 -4
- package/dist/config/presets/internal/custom-managers.js.map +1 -1
- package/dist/config/validation.js +1 -1
- package/dist/config/validation.js.map +1 -1
- package/dist/data/monorepo.json +2 -1
- package/dist/instrumentation/utils.js +1 -1
- package/dist/instrumentation/utils.js.map +1 -1
- package/dist/modules/datasource/artifactory/index.js +1 -1
- package/dist/modules/datasource/artifactory/index.js.map +1 -1
- package/dist/modules/datasource/azure-pipelines-tasks/index.js +11 -1
- package/dist/modules/datasource/azure-pipelines-tasks/index.js.map +1 -1
- package/dist/modules/datasource/azure-pipelines-tasks/schema.d.ts +16 -0
- package/dist/modules/datasource/azure-pipelines-tasks/schema.js +2 -0
- package/dist/modules/datasource/azure-pipelines-tasks/schema.js.map +1 -1
- package/dist/modules/datasource/crate/index.js +1 -1
- package/dist/modules/datasource/crate/index.js.map +1 -1
- package/dist/modules/datasource/custom/formats/html.js +1 -1
- package/dist/modules/datasource/custom/formats/html.js.map +1 -1
- package/dist/modules/datasource/custom/formats/yaml.js +1 -1
- package/dist/modules/datasource/custom/formats/yaml.js.map +1 -1
- package/dist/modules/datasource/deb/index.js +1 -1
- package/dist/modules/datasource/deb/index.js.map +1 -1
- package/dist/modules/datasource/docker/common.js +1 -1
- package/dist/modules/datasource/docker/common.js.map +1 -1
- package/dist/modules/datasource/docker/index.js +1 -1
- package/dist/modules/datasource/docker/index.js.map +1 -1
- package/dist/modules/datasource/github-release-attachments/index.js +2 -2
- package/dist/modules/datasource/github-release-attachments/index.js.map +1 -1
- package/dist/modules/datasource/go/base.js +1 -1
- package/dist/modules/datasource/go/base.js.map +1 -1
- package/dist/modules/datasource/go/releases-goproxy.js +1 -1
- package/dist/modules/datasource/go/releases-goproxy.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/hexpm-bob/index.js +1 -1
- package/dist/modules/datasource/hexpm-bob/index.js.map +1 -1
- package/dist/modules/datasource/maven/util.js +1 -1
- package/dist/modules/datasource/maven/util.js.map +1 -1
- package/dist/modules/datasource/nuget/v2.js +1 -1
- package/dist/modules/datasource/nuget/v2.js.map +1 -1
- package/dist/modules/datasource/nuget/v3.js +1 -1
- package/dist/modules/datasource/nuget/v3.js.map +1 -1
- package/dist/modules/datasource/pod/index.js +1 -1
- package/dist/modules/datasource/pod/index.js.map +1 -1
- package/dist/modules/datasource/pypi/index.js +1 -1
- package/dist/modules/datasource/pypi/index.js.map +1 -1
- package/dist/modules/datasource/ruby-version/index.js +1 -1
- package/dist/modules/datasource/ruby-version/index.js.map +1 -1
- package/dist/modules/datasource/rubygems/index.js +1 -1
- package/dist/modules/datasource/rubygems/index.js.map +1 -1
- package/dist/modules/datasource/rubygems/versions-endpoint-cache.js +2 -2
- package/dist/modules/datasource/rubygems/versions-endpoint-cache.js.map +1 -1
- package/dist/modules/datasource/terraform-provider/index.js +1 -1
- package/dist/modules/datasource/terraform-provider/index.js.map +1 -1
- package/dist/modules/manager/batect-wrapper/artifacts.js +1 -1
- package/dist/modules/manager/batect-wrapper/artifacts.js.map +1 -1
- package/dist/modules/manager/bazel/rules/git.js +7 -1
- package/dist/modules/manager/bazel/rules/git.js.map +1 -1
- package/dist/modules/manager/bundler/artifacts.js.map +1 -1
- package/dist/modules/manager/composer/utils.js +9 -6
- package/dist/modules/manager/composer/utils.js.map +1 -1
- package/dist/modules/manager/devbox/artifacts.d.ts +1 -1
- package/dist/modules/manager/devbox/artifacts.js +29 -11
- package/dist/modules/manager/devbox/artifacts.js.map +1 -1
- package/dist/modules/manager/fingerprint.generated.js +6 -6
- package/dist/modules/manager/fingerprint.generated.js.map +1 -1
- package/dist/modules/manager/gradle-wrapper/artifacts.js +1 -1
- package/dist/modules/manager/gradle-wrapper/artifacts.js.map +1 -1
- package/dist/modules/manager/maven/extract.js +3 -1
- package/dist/modules/manager/maven/extract.js.map +1 -1
- package/dist/modules/manager/mise/extract.js +1 -1
- package/dist/modules/manager/mise/extract.js.map +1 -1
- package/dist/modules/manager/pep621/utils.js +1 -2
- package/dist/modules/manager/pep621/utils.js.map +1 -1
- package/dist/modules/manager/poetry/artifacts.js +3 -4
- package/dist/modules/manager/poetry/artifacts.js.map +1 -1
- package/dist/modules/manager/poetry/extract.js +2 -2
- package/dist/modules/manager/poetry/extract.js.map +1 -1
- package/dist/modules/manager/terraform/lockfile/hash.d.ts +1 -1
- package/dist/modules/platform/bitbucket/index.js +1 -1
- package/dist/modules/platform/bitbucket/index.js.map +1 -1
- package/dist/modules/platform/gerrit/client.js +1 -1
- package/dist/modules/platform/gerrit/client.js.map +1 -1
- package/dist/modules/platform/github/common.d.ts +2 -0
- package/dist/modules/platform/github/common.js +16 -0
- package/dist/modules/platform/github/common.js.map +1 -1
- package/dist/modules/platform/github/index.d.ts +1 -1
- package/dist/modules/platform/github/index.js +6 -4
- package/dist/modules/platform/github/index.js.map +1 -1
- package/dist/modules/versioning/composer/index.js +10 -0
- package/dist/modules/versioning/composer/index.js.map +1 -1
- package/dist/modules/versioning/npm/index.js +2 -1
- package/dist/modules/versioning/npm/index.js.map +1 -1
- package/dist/modules/versioning/types.d.ts +4 -0
- package/dist/modules/versioning/types.js.map +1 -1
- package/dist/util/exec/containerbase.js +1 -1
- package/dist/util/exec/containerbase.js.map +1 -1
- package/dist/util/http/auth.js +0 -1
- package/dist/util/http/auth.js.map +1 -1
- package/dist/util/http/bitbucket-server.d.ts +5 -4
- package/dist/util/http/bitbucket-server.js +17 -20
- package/dist/util/http/bitbucket-server.js.map +1 -1
- package/dist/util/http/bitbucket.d.ts +6 -5
- package/dist/util/http/bitbucket.js +30 -31
- package/dist/util/http/bitbucket.js.map +1 -1
- package/dist/util/http/cache/abstract-http-cache-provider.js +1 -1
- package/dist/util/http/cache/abstract-http-cache-provider.js.map +1 -1
- package/dist/util/http/errors.d.ts +2 -0
- package/dist/util/http/errors.js +8 -0
- package/dist/util/http/errors.js.map +1 -0
- package/dist/util/http/gerrit.d.ts +6 -4
- package/dist/util/http/gerrit.js +11 -12
- package/dist/util/http/gerrit.js.map +1 -1
- package/dist/util/http/gitea.d.ts +5 -4
- package/dist/util/http/gitea.js +12 -13
- package/dist/util/http/gitea.js.map +1 -1
- package/dist/util/http/github.d.ts +14 -8
- package/dist/util/http/github.js +64 -60
- package/dist/util/http/github.js.map +1 -1
- package/dist/util/http/gitlab.d.ts +7 -5
- package/dist/util/http/gitlab.js +56 -46
- package/dist/util/http/gitlab.js.map +1 -1
- package/dist/util/http/got.d.ts +9 -0
- package/dist/util/http/got.js +54 -0
- package/dist/util/http/got.js.map +1 -0
- package/dist/util/http/host-rules.d.ts +2 -1
- package/dist/util/http/host-rules.js.map +1 -1
- package/dist/util/http/http.d.ts +93 -0
- package/dist/util/http/http.js +339 -0
- package/dist/util/http/http.js.map +1 -0
- package/dist/util/http/index.d.ts +6 -74
- package/dist/util/http/index.js +5 -359
- package/dist/util/http/index.js.map +1 -1
- package/dist/util/http/types.d.ts +9 -16
- package/dist/util/http/types.js.map +1 -1
- package/dist/util/toml.d.ts +1 -0
- package/dist/util/toml.js +6 -0
- package/dist/util/toml.js.map +1 -1
- package/dist/util/url.js +3 -8
- package/dist/util/url.js.map +1 -1
- package/dist/workers/global/config/parse/env.js +3 -2
- package/dist/workers/global/config/parse/env.js.map +1 -1
- package/dist/workers/global/config/parse/file.js +18 -8
- package/dist/workers/global/config/parse/file.js.map +1 -1
- package/dist/workers/global/config/parse/host-rules-from-env.js +6 -2
- package/dist/workers/global/config/parse/host-rules-from-env.js.map +1 -1
- package/dist/workers/repository/onboarding/pr/config-description.js +3 -1
- package/dist/workers/repository/onboarding/pr/config-description.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/bitbucket/index.js +1 -1
- package/dist/workers/repository/update/pr/changelog/bitbucket/index.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/gitlab/index.js +1 -1
- package/dist/workers/repository/update/pr/changelog/gitlab/index.js.map +1 -1
- package/package.json +30 -30
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/pypi/index.ts"],"names":[],"mappings":"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","sourcesContent":["import url from 'node:url';\nimport is from '@sindresorhus/is';\nimport changelogFilenameRegex from 'changelog-filename-regex';\nimport { logger } from '../../../logger';\nimport { coerceArray } from '../../../util/array';\nimport { parse } from '../../../util/html';\nimport type { OutgoingHttpHeaders } from '../../../util/http/types';\nimport { regEx } from '../../../util/regex';\nimport { asTimestamp } from '../../../util/timestamp';\nimport { ensureTrailingSlash, parseUrl } from '../../../util/url';\nimport * as pep440 from '../../versioning/pep440';\nimport { Datasource } from '../datasource';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types';\nimport { getGoogleAuthToken } from '../util';\nimport { isGitHubRepo, normalizePythonDepName } from './common';\nimport type { PypiJSON, PypiJSONRelease, Releases } from './types';\n\nexport class PypiDatasource extends Datasource {\n static readonly id = 'pypi';\n\n constructor() {\n super(PypiDatasource.id);\n }\n\n override readonly caching = true;\n\n override readonly customRegistrySupport = true;\n\n static readonly defaultURL =\n process.env.PIP_INDEX_URL ?? 'https://pypi.org/pypi/';\n override readonly defaultRegistryUrls = [PypiDatasource.defaultURL];\n\n override readonly defaultVersioning = pep440.id;\n\n override readonly registryStrategy = 'merge';\n\n override readonly releaseTimestampNote =\n 'The relase timestamp is determined from the `upload_time` field in the results.';\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `homepage` field if it is a github repository, else we use the `project_urls` field.';\n\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n let dependency: ReleaseResult | null = null;\n // TODO: null check (#22198)\n const hostUrl = ensureTrailingSlash(\n registryUrl!.replace('https://pypi.org/simple', 'https://pypi.org/pypi'),\n );\n const normalizedLookupName = normalizePythonDepName(packageName);\n\n // not all simple indexes use this identifier, but most do\n if (hostUrl.endsWith('/simple/') || hostUrl.endsWith('/+simple/')) {\n logger.trace(\n { packageName, hostUrl },\n 'Looking up pypi simple dependency',\n );\n dependency = await this.getSimpleDependency(\n normalizedLookupName,\n hostUrl,\n );\n } else {\n logger.trace({ packageName, hostUrl }, 'Looking up pypi api dependency');\n try {\n // we need to resolve early here so we can catch any 404s and fallback to a simple lookup\n dependency = await this.getDependency(normalizedLookupName, hostUrl);\n } catch (err) {\n // error contacting json-style api -- attempt to fallback to a simple-style api\n logger.trace(\n { packageName, hostUrl, err },\n 'Looking up pypi simple dependency via fallback',\n );\n dependency = await this.getSimpleDependency(\n normalizedLookupName,\n hostUrl,\n );\n }\n }\n return dependency;\n }\n\n private async getAuthHeaders(\n lookupUrl: string,\n ): Promise<OutgoingHttpHeaders> {\n const parsedUrl = parseUrl(lookupUrl);\n if (!parsedUrl) {\n logger.once.debug({ lookupUrl }, 'Failed to parse URL');\n return {};\n }\n if (parsedUrl.hostname.endsWith('.pkg.dev')) {\n const auth = await getGoogleAuthToken();\n if (auth) {\n return { authorization: `Basic ${auth}` };\n }\n logger.once.debug({ lookupUrl }, 'Could not get Google access token');\n return {};\n }\n return {};\n }\n\n private async getDependency(\n packageName: string,\n hostUrl: string,\n ): Promise<ReleaseResult | null> {\n const lookupUrl = url.resolve(\n hostUrl,\n `${normalizePythonDepName(packageName)}/json`,\n );\n const dependency: ReleaseResult = { releases: [] };\n logger.trace({ lookupUrl }, 'Pypi api got lookup');\n const headers = await this.getAuthHeaders(lookupUrl);\n const rep = await this.http.getJsonUnchecked<PypiJSON>(lookupUrl, {\n headers,\n });\n const dep = rep?.body;\n if (!dep) {\n logger.trace({ dependency: packageName }, 'pip package not found');\n return null;\n }\n if (rep.authorization) {\n dependency.isPrivate = true;\n }\n logger.trace({ lookupUrl }, 'Got pypi api result');\n\n if (dep.info?.home_page) {\n dependency.homepage = dep.info.home_page;\n if (isGitHubRepo(dep.info.home_page)) {\n dependency.sourceUrl = dep.info.home_page.replace(\n 'http://',\n 'https://',\n );\n }\n }\n\n if (dep.info?.project_urls) {\n for (const [name, projectUrl] of Object.entries(dep.info.project_urls)) {\n const lower = name.toLowerCase();\n\n if (\n !dependency.sourceUrl &&\n (lower.startsWith('repo') ||\n lower === 'code' ||\n lower === 'source' ||\n isGitHubRepo(projectUrl))\n ) {\n dependency.sourceUrl = projectUrl;\n }\n\n if (\n !dependency.changelogUrl &&\n ([\n 'changelog',\n 'change log',\n 'changes',\n 'release notes',\n 'news',\n \"what's new\",\n ].includes(lower) ||\n changelogFilenameRegex.exec(lower))\n ) {\n // from https://github.com/pypa/warehouse/blob/418c7511dc367fb410c71be139545d0134ccb0df/warehouse/templates/packaging/detail.html#L24\n dependency.changelogUrl = projectUrl;\n }\n }\n }\n\n if (dep.releases) {\n const versions = Object.keys(dep.releases);\n dependency.releases = versions.map((version) => {\n const releases = coerceArray(dep.releases?.[version]);\n const { upload_time: releaseTimestamp } = releases[0] || {};\n const isDeprecated = releases.some(({ yanked }) => yanked);\n const result: Release = {\n version,\n releaseTimestamp: asTimestamp(releaseTimestamp),\n };\n if (isDeprecated) {\n result.isDeprecated = isDeprecated;\n }\n // There may be multiple releases with different requires_python, so we return all in an array\n const pythonConstraints = releases\n .map(({ requires_python }) => requires_python)\n .filter(is.string);\n result.constraints = {\n python: Array.from(new Set(pythonConstraints)),\n };\n return result;\n });\n }\n return dependency;\n }\n\n private static extractVersionFromLinkText(\n text: string,\n packageName: string,\n ): string | null {\n // source packages\n const lcText = text.toLowerCase();\n const normalizedSrcText = normalizePythonDepName(text);\n const srcPrefix = `${packageName}-`;\n\n // source distribution format: `{name}-{version}.tar.gz` (https://packaging.python.org/en/latest/specifications/source-distribution-format/#source-distribution-file-name)\n // binary distribution: `{distribution}-{version}(-{build tag})?-{python tag}-{abi tag}-{platform tag}.whl` (https://packaging.python.org/en/latest/specifications/binary-distribution-format/#file-name-convention)\n // officially both `name` and `distribution` should be normalized and then the - replaced with _, but in reality this is not the case\n // We therefore normalize the name we have (replacing `_-.` with -) and then check if the text starts with the normalized name\n\n if (!normalizedSrcText.startsWith(srcPrefix)) {\n return null;\n }\n\n // strip off the prefix using the prefix length as we may have normalized the srcPrefix/packageName\n // We assume that neither the version nor the suffix contains multiple `-` like `0.1.2---rc1.tar.gz`\n // and use the difference in length to strip off the prefix in case the name contains double `--` characters\n const normalizedLengthDiff = lcText.length - normalizedSrcText.length;\n const res = lcText.slice(srcPrefix.length + normalizedLengthDiff);\n\n // source distribution\n const srcSuffixes = ['.tar.gz', '.tar.bz2', '.tar.xz', '.zip', '.tgz'];\n const srcSuffix = srcSuffixes.find((suffix) => lcText.endsWith(suffix));\n if (srcSuffix) {\n // strip off the suffix using character length\n return res.slice(0, -srcSuffix.length);\n }\n\n // binary distribution\n // for binary distributions the version is the first part after the removed distribution name\n const wheelSuffix = '.whl';\n if (lcText.endsWith(wheelSuffix) && lcText.split('-').length > 2) {\n return res.split('-')[0];\n }\n return null;\n }\n\n private static cleanSimpleHtml(html: string): string {\n return (\n html\n .replace(regEx(/<\\/?pre>/), '')\n // Certain simple repositories like artifactory don't escape > and <\n .replace(\n regEx(/data-requires-python=\"([^\"]*?)>([^\"]*?)\"/g),\n 'data-requires-python=\"$1>$2\"',\n )\n .replace(\n regEx(/data-requires-python=\"([^\"]*?)<([^\"]*?)\"/g),\n 'data-requires-python=\"$1<$2\"',\n )\n );\n }\n\n private async getSimpleDependency(\n packageName: string,\n hostUrl: string,\n ): Promise<ReleaseResult | null> {\n const lookupUrl = url.resolve(\n hostUrl,\n ensureTrailingSlash(normalizePythonDepName(packageName)),\n );\n const dependency: ReleaseResult = { releases: [] };\n const headers = await this.getAuthHeaders(lookupUrl);\n const response = await this.http.get(lookupUrl, { headers });\n const dep = response?.body;\n if (!dep) {\n logger.trace({ dependency: packageName }, 'pip package not found');\n return null;\n }\n if (response.authorization) {\n dependency.isPrivate = true;\n }\n const root = parse(PypiDatasource.cleanSimpleHtml(dep));\n const links = root.querySelectorAll('a');\n const releases: Releases = {};\n for (const link of Array.from(links)) {\n const version = PypiDatasource.extractVersionFromLinkText(\n link.text?.trim(),\n packageName,\n );\n if (version) {\n const release: PypiJSONRelease = {\n yanked: link.hasAttribute('data-yanked'),\n };\n const requiresPython = link.getAttribute('data-requires-python');\n if (requiresPython) {\n release.requires_python = requiresPython;\n }\n if (!releases[version]) {\n releases[version] = [];\n }\n releases[version].push(release);\n }\n }\n const versions = Object.keys(releases);\n dependency.releases = versions.map((version) => {\n const versionReleases = coerceArray(releases[version]);\n const isDeprecated = versionReleases.some(({ yanked }) => yanked);\n const result: Release = { version };\n if (isDeprecated) {\n result.isDeprecated = isDeprecated;\n }\n // There may be multiple releases with different requires_python, so we return all in an array\n result.constraints = {\n // TODO: string[] isn't allowed here\n python: versionReleases.map(\n ({ requires_python }) => requires_python,\n ) as any,\n };\n return result;\n });\n return dependency;\n }\n}\n"]}
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/pypi/index.ts"],"names":[],"mappings":"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","sourcesContent":["import url from 'node:url';\nimport is from '@sindresorhus/is';\nimport changelogFilenameRegex from 'changelog-filename-regex';\nimport { logger } from '../../../logger';\nimport { coerceArray } from '../../../util/array';\nimport { parse } from '../../../util/html';\nimport type { OutgoingHttpHeaders } from '../../../util/http/types';\nimport { regEx } from '../../../util/regex';\nimport { asTimestamp } from '../../../util/timestamp';\nimport { ensureTrailingSlash, parseUrl } from '../../../util/url';\nimport * as pep440 from '../../versioning/pep440';\nimport { Datasource } from '../datasource';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types';\nimport { getGoogleAuthToken } from '../util';\nimport { isGitHubRepo, normalizePythonDepName } from './common';\nimport type { PypiJSON, PypiJSONRelease, Releases } from './types';\n\nexport class PypiDatasource extends Datasource {\n static readonly id = 'pypi';\n\n constructor() {\n super(PypiDatasource.id);\n }\n\n override readonly caching = true;\n\n override readonly customRegistrySupport = true;\n\n static readonly defaultURL =\n process.env.PIP_INDEX_URL ?? 'https://pypi.org/pypi/';\n override readonly defaultRegistryUrls = [PypiDatasource.defaultURL];\n\n override readonly defaultVersioning = pep440.id;\n\n override readonly registryStrategy = 'merge';\n\n override readonly releaseTimestampNote =\n 'The relase timestamp is determined from the `upload_time` field in the results.';\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `homepage` field if it is a github repository, else we use the `project_urls` field.';\n\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n let dependency: ReleaseResult | null = null;\n // TODO: null check (#22198)\n const hostUrl = ensureTrailingSlash(\n registryUrl!.replace('https://pypi.org/simple', 'https://pypi.org/pypi'),\n );\n const normalizedLookupName = normalizePythonDepName(packageName);\n\n // not all simple indexes use this identifier, but most do\n if (hostUrl.endsWith('/simple/') || hostUrl.endsWith('/+simple/')) {\n logger.trace(\n { packageName, hostUrl },\n 'Looking up pypi simple dependency',\n );\n dependency = await this.getSimpleDependency(\n normalizedLookupName,\n hostUrl,\n );\n } else {\n logger.trace({ packageName, hostUrl }, 'Looking up pypi api dependency');\n try {\n // we need to resolve early here so we can catch any 404s and fallback to a simple lookup\n dependency = await this.getDependency(normalizedLookupName, hostUrl);\n } catch (err) {\n // error contacting json-style api -- attempt to fallback to a simple-style api\n logger.trace(\n { packageName, hostUrl, err },\n 'Looking up pypi simple dependency via fallback',\n );\n dependency = await this.getSimpleDependency(\n normalizedLookupName,\n hostUrl,\n );\n }\n }\n return dependency;\n }\n\n private async getAuthHeaders(\n lookupUrl: string,\n ): Promise<OutgoingHttpHeaders> {\n const parsedUrl = parseUrl(lookupUrl);\n if (!parsedUrl) {\n logger.once.debug({ lookupUrl }, 'Failed to parse URL');\n return {};\n }\n if (parsedUrl.hostname.endsWith('.pkg.dev')) {\n const auth = await getGoogleAuthToken();\n if (auth) {\n return { authorization: `Basic ${auth}` };\n }\n logger.once.debug({ lookupUrl }, 'Could not get Google access token');\n return {};\n }\n return {};\n }\n\n private async getDependency(\n packageName: string,\n hostUrl: string,\n ): Promise<ReleaseResult | null> {\n const lookupUrl = url.resolve(\n hostUrl,\n `${normalizePythonDepName(packageName)}/json`,\n );\n const dependency: ReleaseResult = { releases: [] };\n logger.trace({ lookupUrl }, 'Pypi api got lookup');\n const headers = await this.getAuthHeaders(lookupUrl);\n const rep = await this.http.getJsonUnchecked<PypiJSON>(lookupUrl, {\n headers,\n });\n const dep = rep?.body;\n if (!dep) {\n logger.trace({ dependency: packageName }, 'pip package not found');\n return null;\n }\n if (rep.authorization) {\n dependency.isPrivate = true;\n }\n logger.trace({ lookupUrl }, 'Got pypi api result');\n\n if (dep.info?.home_page) {\n dependency.homepage = dep.info.home_page;\n if (isGitHubRepo(dep.info.home_page)) {\n dependency.sourceUrl = dep.info.home_page.replace(\n 'http://',\n 'https://',\n );\n }\n }\n\n if (dep.info?.project_urls) {\n for (const [name, projectUrl] of Object.entries(dep.info.project_urls)) {\n const lower = name.toLowerCase();\n\n if (\n !dependency.sourceUrl &&\n (lower.startsWith('repo') ||\n lower === 'code' ||\n lower === 'source' ||\n isGitHubRepo(projectUrl))\n ) {\n dependency.sourceUrl = projectUrl;\n }\n\n if (\n !dependency.changelogUrl &&\n ([\n 'changelog',\n 'change log',\n 'changes',\n 'release notes',\n 'news',\n \"what's new\",\n ].includes(lower) ||\n changelogFilenameRegex.exec(lower))\n ) {\n // from https://github.com/pypa/warehouse/blob/418c7511dc367fb410c71be139545d0134ccb0df/warehouse/templates/packaging/detail.html#L24\n dependency.changelogUrl = projectUrl;\n }\n }\n }\n\n if (dep.releases) {\n const versions = Object.keys(dep.releases);\n dependency.releases = versions.map((version) => {\n const releases = coerceArray(dep.releases?.[version]);\n const { upload_time: releaseTimestamp } = releases[0] || {};\n const isDeprecated = releases.some(({ yanked }) => yanked);\n const result: Release = {\n version,\n releaseTimestamp: asTimestamp(releaseTimestamp),\n };\n if (isDeprecated) {\n result.isDeprecated = isDeprecated;\n }\n // There may be multiple releases with different requires_python, so we return all in an array\n const pythonConstraints = releases\n .map(({ requires_python }) => requires_python)\n .filter(is.string);\n result.constraints = {\n python: Array.from(new Set(pythonConstraints)),\n };\n return result;\n });\n }\n return dependency;\n }\n\n private static extractVersionFromLinkText(\n text: string,\n packageName: string,\n ): string | null {\n // source packages\n const lcText = text.toLowerCase();\n const normalizedSrcText = normalizePythonDepName(text);\n const srcPrefix = `${packageName}-`;\n\n // source distribution format: `{name}-{version}.tar.gz` (https://packaging.python.org/en/latest/specifications/source-distribution-format/#source-distribution-file-name)\n // binary distribution: `{distribution}-{version}(-{build tag})?-{python tag}-{abi tag}-{platform tag}.whl` (https://packaging.python.org/en/latest/specifications/binary-distribution-format/#file-name-convention)\n // officially both `name` and `distribution` should be normalized and then the - replaced with _, but in reality this is not the case\n // We therefore normalize the name we have (replacing `_-.` with -) and then check if the text starts with the normalized name\n\n if (!normalizedSrcText.startsWith(srcPrefix)) {\n return null;\n }\n\n // strip off the prefix using the prefix length as we may have normalized the srcPrefix/packageName\n // We assume that neither the version nor the suffix contains multiple `-` like `0.1.2---rc1.tar.gz`\n // and use the difference in length to strip off the prefix in case the name contains double `--` characters\n const normalizedLengthDiff = lcText.length - normalizedSrcText.length;\n const res = lcText.slice(srcPrefix.length + normalizedLengthDiff);\n\n // source distribution\n const srcSuffixes = ['.tar.gz', '.tar.bz2', '.tar.xz', '.zip', '.tgz'];\n const srcSuffix = srcSuffixes.find((suffix) => lcText.endsWith(suffix));\n if (srcSuffix) {\n // strip off the suffix using character length\n return res.slice(0, -srcSuffix.length);\n }\n\n // binary distribution\n // for binary distributions the version is the first part after the removed distribution name\n const wheelSuffix = '.whl';\n if (lcText.endsWith(wheelSuffix) && lcText.split('-').length > 2) {\n return res.split('-')[0];\n }\n return null;\n }\n\n private static cleanSimpleHtml(html: string): string {\n return (\n html\n .replace(regEx(/<\\/?pre>/), '')\n // Certain simple repositories like artifactory don't escape > and <\n .replace(\n regEx(/data-requires-python=\"([^\"]*?)>([^\"]*?)\"/g),\n 'data-requires-python=\"$1>$2\"',\n )\n .replace(\n regEx(/data-requires-python=\"([^\"]*?)<([^\"]*?)\"/g),\n 'data-requires-python=\"$1<$2\"',\n )\n );\n }\n\n private async getSimpleDependency(\n packageName: string,\n hostUrl: string,\n ): Promise<ReleaseResult | null> {\n const lookupUrl = url.resolve(\n hostUrl,\n ensureTrailingSlash(normalizePythonDepName(packageName)),\n );\n const dependency: ReleaseResult = { releases: [] };\n const headers = await this.getAuthHeaders(lookupUrl);\n const response = await this.http.getText(lookupUrl, { headers });\n const dep = response?.body;\n if (!dep) {\n logger.trace({ dependency: packageName }, 'pip package not found');\n return null;\n }\n if (response.authorization) {\n dependency.isPrivate = true;\n }\n const root = parse(PypiDatasource.cleanSimpleHtml(dep));\n const links = root.querySelectorAll('a');\n const releases: Releases = {};\n for (const link of Array.from(links)) {\n const version = PypiDatasource.extractVersionFromLinkText(\n link.text?.trim(),\n packageName,\n );\n if (version) {\n const release: PypiJSONRelease = {\n yanked: link.hasAttribute('data-yanked'),\n };\n const requiresPython = link.getAttribute('data-requires-python');\n if (requiresPython) {\n release.requires_python = requiresPython;\n }\n if (!releases[version]) {\n releases[version] = [];\n }\n releases[version].push(release);\n }\n }\n const versions = Object.keys(releases);\n dependency.releases = versions.map((version) => {\n const versionReleases = coerceArray(releases[version]);\n const isDeprecated = versionReleases.some(({ yanked }) => yanked);\n const result: Release = { version };\n if (isDeprecated) {\n result.isDeprecated = isDeprecated;\n }\n // There may be multiple releases with different requires_python, so we return all in an array\n result.constraints = {\n // TODO: string[] isn't allowed here\n python: versionReleases.map(\n ({ requires_python }) => requires_python,\n ) as any,\n };\n return result;\n });\n return dependency;\n }\n}\n"]}
|
@@ -30,7 +30,7 @@ class RubyVersionDatasource extends datasource_1.Datasource {
|
|
30
30
|
// TODO: types (#22198)
|
31
31
|
const rubyVersionsUrl = `${registryUrl}en/downloads/releases/`;
|
32
32
|
try {
|
33
|
-
const response = await this.http.
|
33
|
+
const response = await this.http.getText(rubyVersionsUrl);
|
34
34
|
const root = (0, html_1.parse)(response.body);
|
35
35
|
const rows = root.querySelector('.release-list')?.querySelectorAll('tr') ?? [];
|
36
36
|
rows.forEach((row) => {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/ruby-version/index.ts"],"names":[],"mappings":";;;;AAAA,4CAAyC;AACzC,mFAA8E;AAC9E,qEAA8D;AAC9D,6CAA2C;AAE3C,uDAAsD;AACtD,gDAA0E;AAC1E,8CAA2C;AAG3C,MAAa,qBAAsB,SAAQ,uBAAU;IACnD,MAAM,CAAU,EAAE,GAAG,cAAc,CAAC;IAEpC;QACE,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAEiB,mBAAmB,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAErD,qBAAqB,GAAG,KAAK,CAAC;IAE9B,iBAAiB,GAAG,SAAgB,CAAC;IAErC,uBAAuB,GAAG,IAAI,CAAC;IAC/B,oBAAoB,GACpC,mFAAmF,CAAC;IACpE,gBAAgB,GAAG,SAAS,CAAC;IAC7B,aAAa,GAC7B,+CAA+C,CAAC;IAG5C,AAAN,KAAK,CAAC,WAAW,CAAC,EAChB,WAAW,GACO;QAClB,MAAM,GAAG,GAAkB;YACzB,QAAQ,EAAE,2BAA2B;YACrC,SAAS,EAAE,8BAA8B;YACzC,QAAQ,EAAE,EAAE;SACb,CAAC;QACF,uBAAuB;QACvB,MAAM,eAAe,GAAG,GAAG,WAAW,wBAAwB,CAAC;QAC/D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/ruby-version/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { logger } from '../../../logger';\nimport { ExternalHostError } from '../../../types/errors/external-host-error';\nimport { cache } from '../../../util/cache/package/decorator';\nimport { parse } from '../../../util/html';\nimport type { HttpError } from '../../../util/http';\nimport { asTimestamp } from '../../../util/timestamp';\nimport { isVersion, id as rubyVersioningId } from '../../versioning/ruby';\nimport { Datasource } from '../datasource';\nimport type { GetReleasesConfig, ReleaseResult } from '../types';\n\nexport class RubyVersionDatasource extends Datasource {\n static readonly id = 'ruby-version';\n\n constructor() {\n super(RubyVersionDatasource.id);\n }\n\n override readonly defaultRegistryUrls = ['https://www.ruby-lang.org/'];\n\n override readonly customRegistrySupport = false;\n\n override readonly defaultVersioning = rubyVersioningId;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `release-list` table in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'We use the URL: https://github.com/ruby/ruby.';\n\n @cache({ namespace: `datasource-${RubyVersionDatasource.id}`, key: 'all' })\n async getReleases({\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const res: ReleaseResult = {\n homepage: 'https://www.ruby-lang.org',\n sourceUrl: 'https://github.com/ruby/ruby',\n releases: [],\n };\n // TODO: types (#22198)\n const rubyVersionsUrl = `${registryUrl}en/downloads/releases/`;\n try {\n const response = await this.http.getText(rubyVersionsUrl);\n\n const root = parse(response.body);\n const rows =\n root.querySelector('.release-list')?.querySelectorAll('tr') ?? [];\n rows.forEach((row) => {\n const tds = row.querySelectorAll('td');\n const columns: string[] = [];\n tds.forEach((td) => columns.push(td.innerHTML));\n if (columns.length) {\n const version = columns[0].replace('Ruby ', '');\n if (isVersion(version)) {\n const releaseTimestamp = asTimestamp(columns[1]);\n const changelogUrl = columns[2]\n .replace('<a href=\"', 'https://www.ruby-lang.org')\n .replace('\">more...</a>', '');\n res.releases.push({ version, releaseTimestamp, changelogUrl });\n }\n }\n });\n if (!res.releases.length) {\n logger.warn({ registryUrl }, 'Missing ruby releases');\n return null;\n }\n } catch (err) {\n this.handleGenericErrors(err);\n }\n\n return res;\n }\n\n override handleHttpErrors(err: HttpError): never | void {\n throw new ExternalHostError(err);\n }\n}\n"]}
|
@@ -71,7 +71,7 @@ class RubygemsDatasource extends datasource_1.Datasource {
|
|
71
71
|
}
|
72
72
|
getReleasesViaInfoEndpoint(registryUrl, packageName) {
|
73
73
|
const url = (0, url_1.joinUrlParts)(registryUrl, '/info', packageName);
|
74
|
-
return result_1.Result.wrap(this.http.
|
74
|
+
return result_1.Result.wrap(this.http.getText(url))
|
75
75
|
.transform(({ body }) => body)
|
76
76
|
.parse(schema_1.GemInfo);
|
77
77
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/rubygems/index.ts"],"names":[],"mappings":"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
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/rubygems/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Marshal } from '@qnighy/marshal';\nimport type { ZodError } from 'zod';\nimport { logger } from '../../../logger';\nimport { cache } from '../../../util/cache/package/decorator';\nimport { Http, HttpError } from '../../../util/http';\nimport { AsyncResult, Result } from '../../../util/result';\nimport { getQueryString, joinUrlParts, parseUrl } from '../../../util/url';\nimport * as rubyVersioning from '../../versioning/ruby';\nimport { Datasource } from '../datasource';\nimport type { GetReleasesConfig, ReleaseResult } from '../types';\nimport { getV1Releases } from './common';\nimport { MetadataCache } from './metadata-cache';\nimport { GemInfo, MarshalledVersionInfo } from './schema';\nimport { VersionsEndpointCache } from './versions-endpoint-cache';\n\nfunction unlessServerSide<\n T extends NonNullable<unknown>,\n E extends NonNullable<unknown>,\n>(err: E, cb: () => AsyncResult<T, E>): AsyncResult<T, E> {\n if (err instanceof HttpError && err.response?.statusCode) {\n const code = err.response.statusCode;\n if (code >= 500 && code <= 599) {\n return AsyncResult.err(err);\n }\n }\n return cb();\n}\n\nexport class RubygemsDatasource extends Datasource {\n static readonly id = 'rubygems';\n\n private metadataCache: MetadataCache;\n\n constructor() {\n super(RubygemsDatasource.id);\n this.http = new Http(RubygemsDatasource.id);\n this.versionsEndpointCache = new VersionsEndpointCache(this.http);\n this.metadataCache = new MetadataCache(this.http);\n }\n\n override readonly defaultRegistryUrls = ['https://rubygems.org'];\n\n override readonly defaultVersioning = rubyVersioning.id;\n\n override readonly registryStrategy = 'hunt';\n\n private readonly versionsEndpointCache: VersionsEndpointCache;\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 override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `source_code_uri` field in the results.';\n\n @cache({\n namespace: `datasource-${RubygemsDatasource.id}`,\n key: ({ packageName, registryUrl }: GetReleasesConfig) =>\n // TODO: types (#22198)\n `releases:${registryUrl!}:${packageName}`,\n cacheable: ({ registryUrl }: GetReleasesConfig) => {\n const registryHostname = parseUrl(registryUrl)?.hostname;\n return registryHostname === 'rubygems.org';\n },\n })\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n // istanbul ignore if\n if (!registryUrl) {\n return null;\n }\n\n const registryHostname = parseUrl(registryUrl)?.hostname;\n\n let result: AsyncResult<ReleaseResult, Error | string>;\n if (registryHostname === 'rubygems.org') {\n result = Result.wrap(\n this.versionsEndpointCache.getVersions(registryUrl, packageName),\n ).transform((versions) =>\n this.metadataCache.getRelease(registryUrl, packageName, versions),\n );\n } else if (\n registryHostname === 'rubygems.pkg.github.com' ||\n registryHostname === 'gitlab.com'\n ) {\n result = this.getReleasesViaDeprecatedAPI(registryUrl, packageName);\n } else {\n result = getV1Releases(this.http, registryUrl, packageName)\n .catch((err) =>\n unlessServerSide(err, () =>\n this.getReleasesViaInfoEndpoint(registryUrl, packageName),\n ),\n )\n .catch((err) =>\n unlessServerSide(err, () =>\n this.getReleasesViaDeprecatedAPI(registryUrl, packageName),\n ),\n );\n }\n\n const { val, err } = await result.unwrap();\n if (val) {\n return val;\n }\n\n if (err instanceof Error) {\n this.handleGenericErrors(err);\n }\n\n logger.debug({ packageName, registryUrl }, `Rubygems fetch error: ${err}`);\n return null;\n }\n\n private getReleasesViaInfoEndpoint(\n registryUrl: string,\n packageName: string,\n ): AsyncResult<ReleaseResult, Error | ZodError> {\n const url = joinUrlParts(registryUrl, '/info', packageName);\n return Result.wrap(this.http.getText(url))\n .transform(({ body }) => body)\n .parse(GemInfo);\n }\n\n private getReleasesViaDeprecatedAPI(\n registryUrl: string,\n packageName: string,\n ): AsyncResult<ReleaseResult, Error | ZodError> {\n const path = joinUrlParts(registryUrl, `/api/v1/dependencies`);\n const query = getQueryString({ gems: packageName });\n const url = `${path}?${query}`;\n const bufPromise = this.http.getBuffer(url);\n return Result.wrap(bufPromise).transform(({ body }) =>\n MarshalledVersionInfo.safeParse(Marshal.parse(body)),\n );\n }\n}\n"]}
|
@@ -146,7 +146,7 @@ class VersionsEndpointCache {
|
|
146
146
|
try {
|
147
147
|
const url = `${registryUrl}/versions`;
|
148
148
|
const opts = { headers: { 'Accept-Encoding': 'gzip' } };
|
149
|
-
const { body } = await this.http.
|
149
|
+
const { body } = await this.http.getText(url, opts);
|
150
150
|
return parseFullBody(body);
|
151
151
|
}
|
152
152
|
catch (err) {
|
@@ -166,7 +166,7 @@ class VersionsEndpointCache {
|
|
166
166
|
['Range']: `bytes=${startByte}-`,
|
167
167
|
},
|
168
168
|
};
|
169
|
-
const { statusCode, body } = await this.http.
|
169
|
+
const { statusCode, body } = await this.http.getText(url, opts);
|
170
170
|
/**
|
171
171
|
* Rubygems will return the full body instead of `416 Range Not Satisfiable`.
|
172
172
|
* In this case, status code will be 200 instead of 206.
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"versions-endpoint-cache.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/rubygems/versions-endpoint-cache.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod';\nimport { logger } from '../../../logger';\nimport { getElapsedMinutes } from '../../../util/date';\nimport type { Http } from '../../../util/http';\nimport { HttpError } from '../../../util/http';\nimport type { HttpOptions } from '../../../util/http/types';\nimport { newlineRegex } from '../../../util/regex';\nimport { Result } from '../../../util/result';\nimport { LooseArray } from '../../../util/schema-utils';\nimport { copystr } from '../../../util/string';\nimport { parseUrl } from '../../../util/url';\n\ntype PackageVersions = Map<string, string[]>;\n\ninterface VersionsEndpointData {\n packageVersions: PackageVersions;\n syncedAt: Date;\n contentLength: number;\n\n /**\n * Last 33 characters of the response (32 hex digits + newline)\n */\n contentTail: string;\n}\n\nfunction getContentTail(content: string): string {\n return content.slice(-33);\n}\n\nfunction getContentHead(content: string): string {\n return content.slice(0, 33);\n}\n\nfunction stripContentHead(content: string): string {\n return content.slice(33);\n}\n\nfunction reconcilePackageVersions(\n packageVersions: PackageVersions,\n versionLines: VersionLines,\n): PackageVersions {\n for (const line of versionLines) {\n const packageName = copystr(line.packageName);\n let versions = packageVersions.get(packageName) ?? [];\n\n const { deletedVersions, addedVersions } = line;\n\n if (deletedVersions.size > 0) {\n versions = versions.filter((v) => !deletedVersions.has(v));\n }\n\n if (addedVersions.length > 0) {\n const existingVersions = new Set(versions);\n for (const addedVersion of addedVersions) {\n if (!existingVersions.has(addedVersion)) {\n const version = copystr(addedVersion);\n versions.push(version);\n }\n }\n }\n\n packageVersions.set(packageName, versions);\n }\n\n return packageVersions;\n}\n\nfunction parseFullBody(body: string): VersionsEndpointResult {\n const packageVersions = reconcilePackageVersions(\n new Map<string, string[]>(),\n VersionLines.parse(body),\n );\n const syncedAt = new Date();\n const contentLength = body.length;\n const contentTail = getContentTail(body);\n\n return Result.ok({\n packageVersions,\n syncedAt,\n contentLength,\n contentTail,\n });\n}\n\ntype VersionsEndpointResult = Result<VersionsEndpointData, 'unsupported-api'>;\n\nexport const memCache = new Map<string, VersionsEndpointResult>();\n\nfunction cacheResult(\n registryUrl: string,\n result: VersionsEndpointResult,\n): void {\n const registryHostname = parseUrl(registryUrl)?.hostname;\n if (registryHostname === 'rubygems.org') {\n memCache.set(registryUrl, result);\n }\n}\n\nconst VersionLines = z\n .string()\n .transform((x) => x.split(newlineRegex))\n .pipe(\n LooseArray(\n z\n .string()\n .transform((line) => line.trim())\n .refine((line) => line.length > 0)\n .refine((line) => !line.startsWith('created_at:'))\n .refine((line) => line !== '---')\n .transform((line) => line.split(' '))\n .pipe(z.tuple([z.string(), z.string()]).rest(z.string()))\n .transform(([packageName, versions]) => {\n const deletedVersions = new Set<string>();\n const addedVersions: string[] = [];\n for (const version of versions.split(',')) {\n if (version.startsWith('-')) {\n deletedVersions.add(version.slice(1));\n } else {\n addedVersions.push(version);\n }\n }\n return { packageName, deletedVersions, addedVersions };\n }),\n ),\n );\ntype VersionLines = z.infer<typeof VersionLines>;\n\nfunction isStale(regCache: VersionsEndpointData): boolean {\n return getElapsedMinutes(regCache.syncedAt) >= 15;\n}\n\nexport type VersionsResult = Result<\n string[],\n 'unsupported-api' | 'package-not-found'\n>;\n\nexport class VersionsEndpointCache {\n constructor(private readonly http: Http) {}\n\n private cacheRequests = new Map<string, Promise<VersionsEndpointResult>>();\n\n /**\n * At any given time, there should only be one request for a given registryUrl.\n */\n private async getCache(registryUrl: string): Promise<VersionsEndpointResult> {\n const oldResult = memCache.get(registryUrl);\n if (!oldResult) {\n const newResult = await this.fullSync(registryUrl);\n cacheResult(registryUrl, newResult);\n return newResult;\n }\n\n const { val: data } = oldResult.unwrap();\n if (!data) {\n return oldResult;\n }\n\n if (isStale(data)) {\n memCache.delete(registryUrl); // If no error is thrown, we'll re-set the cache\n const newResult = await this.deltaSync(data, registryUrl);\n cacheResult(registryUrl, newResult);\n return newResult;\n }\n\n return oldResult;\n }\n\n async getVersions(\n registryUrl: string,\n packageName: string,\n ): Promise<VersionsResult> {\n /**\n * Ensure that only one request for a given registryUrl is in flight at a time.\n */\n let cacheRequest = this.cacheRequests.get(registryUrl);\n if (!cacheRequest) {\n cacheRequest = this.getCache(registryUrl);\n this.cacheRequests.set(registryUrl, cacheRequest);\n }\n let cachedResult: VersionsEndpointResult;\n try {\n cachedResult = await cacheRequest;\n } finally {\n this.cacheRequests.delete(registryUrl);\n }\n\n const { val: cachedData } = cachedResult.unwrap();\n if (!cachedData) {\n logger.debug(\n { packageName, registryUrl },\n 'Rubygems: endpoint not supported',\n );\n return Result.err('unsupported-api');\n }\n\n const versions = cachedData.packageVersions.get(packageName);\n if (!versions?.length) {\n logger.debug(\n { packageName, registryUrl },\n 'Rubygems: versions not found',\n );\n return Result.err('package-not-found');\n }\n\n return Result.ok(versions);\n }\n\n private async fullSync(registryUrl: string): Promise<VersionsEndpointResult> {\n try {\n const url = `${registryUrl}/versions`;\n const opts: HttpOptions = { headers: { 'Accept-Encoding': 'gzip' } };\n const { body } = await this.http.get(url, opts);\n return parseFullBody(body);\n } catch (err) {\n if (err instanceof HttpError && err.response?.statusCode === 404) {\n return Result.err('unsupported-api');\n }\n\n throw err;\n }\n }\n\n private async deltaSync(\n oldCache: VersionsEndpointData,\n registryUrl: string,\n ): Promise<VersionsEndpointResult> {\n try {\n const url = `${registryUrl}/versions`;\n const startByte = oldCache.contentLength - oldCache.contentTail.length;\n const opts: HttpOptions = {\n headers: {\n ['Accept-Encoding']: 'deflate, compress, br', // Note: `gzip` usage breaks http client, when used with `Range` header\n ['Range']: `bytes=${startByte}-`,\n },\n };\n const { statusCode, body } = await this.http.get(url, opts);\n\n /**\n * Rubygems will return the full body instead of `416 Range Not Satisfiable`.\n * In this case, status code will be 200 instead of 206.\n */\n if (statusCode === 200) {\n return parseFullBody(body);\n }\n\n /**\n * We request data in range that overlaps previously fetched data.\n * If the head of the response doesn't match the tail of the previous response,\n * it means that the data we have is no longer valid.\n * In this case we start over with a full sync.\n */\n const contentHead = getContentHead(body);\n if (contentHead !== oldCache.contentTail) {\n return this.fullSync(registryUrl);\n }\n\n /**\n * Update the cache with the new data.\n */\n const delta = stripContentHead(body);\n const packageVersions = reconcilePackageVersions(\n oldCache.packageVersions,\n VersionLines.parse(delta),\n );\n const syncedAt = new Date();\n const contentLength = oldCache.contentLength + delta.length;\n const contentTail = getContentTail(body);\n\n return Result.ok({\n packageVersions,\n syncedAt,\n contentLength,\n contentTail,\n });\n } catch (err) {\n if (err instanceof HttpError) {\n const responseStatus = err.response?.statusCode;\n\n /**\n * In case of `416 Range Not Satisfiable` we do a full sync.\n * This is unlikely to happen in real life, but anyway.\n */\n if (responseStatus === 416) {\n return this.fullSync(registryUrl);\n }\n\n /**\n * If the endpoint is not supported, we stop trying.\n * This is unlikely to happen in real life, but still.\n */\n if (responseStatus === 404) {\n return Result.err('unsupported-api');\n }\n }\n\n throw err;\n }\n }\n}\n"]}
|
1
|
+
{"version":3,"file":"versions-endpoint-cache.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/rubygems/versions-endpoint-cache.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod';\nimport { logger } from '../../../logger';\nimport { getElapsedMinutes } from '../../../util/date';\nimport type { Http } from '../../../util/http';\nimport { HttpError } from '../../../util/http';\nimport type { HttpOptions } from '../../../util/http/types';\nimport { newlineRegex } from '../../../util/regex';\nimport { Result } from '../../../util/result';\nimport { LooseArray } from '../../../util/schema-utils';\nimport { copystr } from '../../../util/string';\nimport { parseUrl } from '../../../util/url';\n\ntype PackageVersions = Map<string, string[]>;\n\ninterface VersionsEndpointData {\n packageVersions: PackageVersions;\n syncedAt: Date;\n contentLength: number;\n\n /**\n * Last 33 characters of the response (32 hex digits + newline)\n */\n contentTail: string;\n}\n\nfunction getContentTail(content: string): string {\n return content.slice(-33);\n}\n\nfunction getContentHead(content: string): string {\n return content.slice(0, 33);\n}\n\nfunction stripContentHead(content: string): string {\n return content.slice(33);\n}\n\nfunction reconcilePackageVersions(\n packageVersions: PackageVersions,\n versionLines: VersionLines,\n): PackageVersions {\n for (const line of versionLines) {\n const packageName = copystr(line.packageName);\n let versions = packageVersions.get(packageName) ?? [];\n\n const { deletedVersions, addedVersions } = line;\n\n if (deletedVersions.size > 0) {\n versions = versions.filter((v) => !deletedVersions.has(v));\n }\n\n if (addedVersions.length > 0) {\n const existingVersions = new Set(versions);\n for (const addedVersion of addedVersions) {\n if (!existingVersions.has(addedVersion)) {\n const version = copystr(addedVersion);\n versions.push(version);\n }\n }\n }\n\n packageVersions.set(packageName, versions);\n }\n\n return packageVersions;\n}\n\nfunction parseFullBody(body: string): VersionsEndpointResult {\n const packageVersions = reconcilePackageVersions(\n new Map<string, string[]>(),\n VersionLines.parse(body),\n );\n const syncedAt = new Date();\n const contentLength = body.length;\n const contentTail = getContentTail(body);\n\n return Result.ok({\n packageVersions,\n syncedAt,\n contentLength,\n contentTail,\n });\n}\n\ntype VersionsEndpointResult = Result<VersionsEndpointData, 'unsupported-api'>;\n\nexport const memCache = new Map<string, VersionsEndpointResult>();\n\nfunction cacheResult(\n registryUrl: string,\n result: VersionsEndpointResult,\n): void {\n const registryHostname = parseUrl(registryUrl)?.hostname;\n if (registryHostname === 'rubygems.org') {\n memCache.set(registryUrl, result);\n }\n}\n\nconst VersionLines = z\n .string()\n .transform((x) => x.split(newlineRegex))\n .pipe(\n LooseArray(\n z\n .string()\n .transform((line) => line.trim())\n .refine((line) => line.length > 0)\n .refine((line) => !line.startsWith('created_at:'))\n .refine((line) => line !== '---')\n .transform((line) => line.split(' '))\n .pipe(z.tuple([z.string(), z.string()]).rest(z.string()))\n .transform(([packageName, versions]) => {\n const deletedVersions = new Set<string>();\n const addedVersions: string[] = [];\n for (const version of versions.split(',')) {\n if (version.startsWith('-')) {\n deletedVersions.add(version.slice(1));\n } else {\n addedVersions.push(version);\n }\n }\n return { packageName, deletedVersions, addedVersions };\n }),\n ),\n );\ntype VersionLines = z.infer<typeof VersionLines>;\n\nfunction isStale(regCache: VersionsEndpointData): boolean {\n return getElapsedMinutes(regCache.syncedAt) >= 15;\n}\n\nexport type VersionsResult = Result<\n string[],\n 'unsupported-api' | 'package-not-found'\n>;\n\nexport class VersionsEndpointCache {\n constructor(private readonly http: Http) {}\n\n private cacheRequests = new Map<string, Promise<VersionsEndpointResult>>();\n\n /**\n * At any given time, there should only be one request for a given registryUrl.\n */\n private async getCache(registryUrl: string): Promise<VersionsEndpointResult> {\n const oldResult = memCache.get(registryUrl);\n if (!oldResult) {\n const newResult = await this.fullSync(registryUrl);\n cacheResult(registryUrl, newResult);\n return newResult;\n }\n\n const { val: data } = oldResult.unwrap();\n if (!data) {\n return oldResult;\n }\n\n if (isStale(data)) {\n memCache.delete(registryUrl); // If no error is thrown, we'll re-set the cache\n const newResult = await this.deltaSync(data, registryUrl);\n cacheResult(registryUrl, newResult);\n return newResult;\n }\n\n return oldResult;\n }\n\n async getVersions(\n registryUrl: string,\n packageName: string,\n ): Promise<VersionsResult> {\n /**\n * Ensure that only one request for a given registryUrl is in flight at a time.\n */\n let cacheRequest = this.cacheRequests.get(registryUrl);\n if (!cacheRequest) {\n cacheRequest = this.getCache(registryUrl);\n this.cacheRequests.set(registryUrl, cacheRequest);\n }\n let cachedResult: VersionsEndpointResult;\n try {\n cachedResult = await cacheRequest;\n } finally {\n this.cacheRequests.delete(registryUrl);\n }\n\n const { val: cachedData } = cachedResult.unwrap();\n if (!cachedData) {\n logger.debug(\n { packageName, registryUrl },\n 'Rubygems: endpoint not supported',\n );\n return Result.err('unsupported-api');\n }\n\n const versions = cachedData.packageVersions.get(packageName);\n if (!versions?.length) {\n logger.debug(\n { packageName, registryUrl },\n 'Rubygems: versions not found',\n );\n return Result.err('package-not-found');\n }\n\n return Result.ok(versions);\n }\n\n private async fullSync(registryUrl: string): Promise<VersionsEndpointResult> {\n try {\n const url = `${registryUrl}/versions`;\n const opts: HttpOptions = { headers: { 'Accept-Encoding': 'gzip' } };\n const { body } = await this.http.getText(url, opts);\n return parseFullBody(body);\n } catch (err) {\n if (err instanceof HttpError && err.response?.statusCode === 404) {\n return Result.err('unsupported-api');\n }\n\n throw err;\n }\n }\n\n private async deltaSync(\n oldCache: VersionsEndpointData,\n registryUrl: string,\n ): Promise<VersionsEndpointResult> {\n try {\n const url = `${registryUrl}/versions`;\n const startByte = oldCache.contentLength - oldCache.contentTail.length;\n const opts: HttpOptions = {\n headers: {\n ['Accept-Encoding']: 'deflate, compress, br', // Note: `gzip` usage breaks http client, when used with `Range` header\n ['Range']: `bytes=${startByte}-`,\n },\n };\n const { statusCode, body } = await this.http.getText(url, opts);\n\n /**\n * Rubygems will return the full body instead of `416 Range Not Satisfiable`.\n * In this case, status code will be 200 instead of 206.\n */\n if (statusCode === 200) {\n return parseFullBody(body);\n }\n\n /**\n * We request data in range that overlaps previously fetched data.\n * If the head of the response doesn't match the tail of the previous response,\n * it means that the data we have is no longer valid.\n * In this case we start over with a full sync.\n */\n const contentHead = getContentHead(body);\n if (contentHead !== oldCache.contentTail) {\n return this.fullSync(registryUrl);\n }\n\n /**\n * Update the cache with the new data.\n */\n const delta = stripContentHead(body);\n const packageVersions = reconcilePackageVersions(\n oldCache.packageVersions,\n VersionLines.parse(delta),\n );\n const syncedAt = new Date();\n const contentLength = oldCache.contentLength + delta.length;\n const contentTail = getContentTail(body);\n\n return Result.ok({\n packageVersions,\n syncedAt,\n contentLength,\n contentTail,\n });\n } catch (err) {\n if (err instanceof HttpError) {\n const responseStatus = err.response?.statusCode;\n\n /**\n * In case of `416 Range Not Satisfiable` we do a full sync.\n * This is unlikely to happen in real life, but anyway.\n */\n if (responseStatus === 416) {\n return this.fullSync(registryUrl);\n }\n\n /**\n * If the endpoint is not supported, we stop trying.\n * This is unlikely to happen in real life, but still.\n */\n if (responseStatus === 404) {\n return Result.err('unsupported-api');\n }\n }\n\n throw err;\n }\n }\n}\n"]}
|
@@ -173,7 +173,7 @@ class TerraformProviderDatasource extends base_1.TerraformDatasource {
|
|
173
173
|
// The hashes are formatted as the result of sha256sum in plain text, each line: <hash>\t<filename>
|
174
174
|
let rawHashData;
|
175
175
|
try {
|
176
|
-
rawHashData = (await this.http.
|
176
|
+
rawHashData = (await this.http.getText(zipHashUrl)).body;
|
177
177
|
}
|
178
178
|
catch (err) {
|
179
179
|
/* istanbul ignore next */
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/terraform-provider/index.ts"],"names":[],"mappings":"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","sourcesContent":["// TODO: types (#22198)\nimport is from '@sindresorhus/is';\nimport { logger } from '../../../logger';\nimport { ExternalHostError } from '../../../types/errors/external-host-error';\nimport { cache } from '../../../util/cache/package/decorator';\nimport * as p from '../../../util/promises';\nimport { regEx } from '../../../util/regex';\nimport { asTimestamp } from '../../../util/timestamp';\nimport { joinUrlParts } from '../../../util/url';\nimport * as hashicorpVersioning from '../../versioning/hashicorp';\nimport { TerraformDatasource } from '../terraform-module/base';\nimport type { ServiceDiscoveryResult } from '../terraform-module/types';\nimport { createSDBackendURL } from '../terraform-module/utils';\nimport type { GetReleasesConfig, ReleaseResult } from '../types';\nimport type {\n TerraformBuild,\n TerraformProvider,\n TerraformProviderReleaseBackend,\n TerraformProviderVersions,\n TerraformRegistryBuildResponse,\n TerraformRegistryVersions,\n VersionDetailResponse,\n} from './types';\n\nexport class TerraformProviderDatasource extends TerraformDatasource {\n static override readonly id = 'terraform-provider';\n\n static readonly defaultRegistryUrls = [\n 'https://registry.terraform.io',\n 'https://releases.hashicorp.com',\n ];\n\n static repositoryRegex = regEx(/^hashicorp\\/(?<packageName>\\S+)$/);\n\n constructor() {\n super(TerraformProviderDatasource.id);\n }\n\n override readonly defaultRegistryUrls =\n TerraformProviderDatasource.defaultRegistryUrls;\n\n override readonly defaultVersioning = hashicorpVersioning.id;\n\n override readonly registryStrategy = 'hunt';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is only supported for the latest version, and is determined from the `published_at` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the the `source` field in the results.';\n\n @cache({\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: (getReleasesConfig: GetReleasesConfig) => {\n const url = getReleasesConfig.registryUrl;\n const repo = TerraformProviderDatasource.getRepository(getReleasesConfig);\n return `getReleases:${url}/${repo}`;\n },\n })\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n // istanbul ignore if\n if (!registryUrl) {\n return null;\n }\n logger.trace(\n `terraform-provider.getDependencies() packageName: ${packageName}`,\n );\n\n if (registryUrl === this.defaultRegistryUrls[1]) {\n return await this.queryReleaseBackend(packageName, registryUrl);\n }\n const repository = TerraformProviderDatasource.getRepository({\n packageName,\n });\n const serviceDiscovery =\n await this.getTerraformServiceDiscoveryResult(registryUrl);\n\n if (registryUrl === this.defaultRegistryUrls[0]) {\n return await this.queryRegistryExtendedApi(\n serviceDiscovery,\n registryUrl,\n repository,\n );\n }\n\n return await this.queryRegistryVersions(\n serviceDiscovery,\n registryUrl,\n repository,\n );\n }\n\n private static getRepository({ packageName }: GetReleasesConfig): string {\n return packageName.includes('/') ? packageName : `hashicorp/${packageName}`;\n }\n\n /**\n * this uses the api that terraform registry has in addition to the base api\n * this endpoint provides more information, such as release date\n * this api is undocumented.\n */\n private async queryRegistryExtendedApi(\n serviceDiscovery: ServiceDiscoveryResult,\n registryUrl: string,\n repository: string,\n ): Promise<ReleaseResult> {\n const backendURL = createSDBackendURL(\n registryUrl,\n 'providers.v1',\n serviceDiscovery,\n repository,\n );\n const res = (\n await this.http.getJsonUnchecked<TerraformProvider>(backendURL)\n ).body;\n const dep: ReleaseResult = {\n releases: res.versions.map((version) => ({\n version,\n })),\n };\n if (res.source) {\n dep.sourceUrl = res.source;\n }\n // set published date for latest release\n const latestVersion = dep.releases.find(\n (release) => res.version === release.version,\n );\n // istanbul ignore else\n if (latestVersion) {\n latestVersion.releaseTimestamp = asTimestamp(res.published_at);\n }\n dep.homepage = `${registryUrl}/providers/${repository}`;\n return dep;\n }\n\n /**\n * this version uses the Provider Registry Protocol that all registries are required to implement\n * https://www.terraform.io/internals/provider-registry-protocol\n */\n private async queryRegistryVersions(\n serviceDiscovery: ServiceDiscoveryResult,\n registryUrl: string,\n repository: string,\n ): Promise<ReleaseResult> {\n const backendURL = createSDBackendURL(\n registryUrl,\n 'providers.v1',\n serviceDiscovery,\n `${repository}/versions`,\n );\n const res = (\n await this.http.getJsonUnchecked<TerraformProviderVersions>(backendURL)\n ).body;\n const dep: ReleaseResult = {\n releases: res.versions.map(({ version }) => ({\n version,\n })),\n };\n return dep;\n }\n\n private async queryReleaseBackend(\n packageName: string,\n registryURL: string,\n ): Promise<ReleaseResult | null> {\n const hashicorpPackage = packageName.replace('hashicorp/', '');\n const backendLookUpName = `terraform-provider-${hashicorpPackage}`;\n const backendURL = joinUrlParts(\n registryURL,\n backendLookUpName,\n `index.json`,\n );\n const res = (\n await this.http.getJsonUnchecked<TerraformProviderReleaseBackend>(\n backendURL,\n )\n ).body;\n\n const dep: ReleaseResult = {\n releases: Object.keys(res.versions).map((version) => ({\n version,\n })),\n sourceUrl: joinUrlParts(\n 'https://github.com/terraform-providers',\n backendLookUpName,\n ),\n };\n return dep;\n }\n\n @cache({\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: (registryURL: string, repository: string, version: string) =>\n `getBuilds:${registryURL}/${repository}/${version}`,\n })\n async getBuilds(\n registryURL: string,\n repository: string,\n version: string,\n ): Promise<TerraformBuild[] | null> {\n if (registryURL === TerraformProviderDatasource.defaultRegistryUrls[1]) {\n // check if registryURL === secondary backend\n const repositoryRegexResult =\n TerraformProviderDatasource.repositoryRegex.exec(repository)?.groups;\n if (!repositoryRegexResult) {\n // non hashicorp builds are not supported with releases.hashicorp.com\n return null;\n }\n const packageName = repositoryRegexResult.packageName;\n const backendLookUpName = `terraform-provider-${packageName}`;\n let versionReleaseBackend: VersionDetailResponse;\n try {\n versionReleaseBackend = await this.getReleaseBackendIndex(\n backendLookUpName,\n version,\n );\n } catch (err) {\n /* istanbul ignore next */\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n { err, backendLookUpName, version },\n `Failed to retrieve builds for ${backendLookUpName} ${version}`,\n );\n return null;\n }\n return versionReleaseBackend.builds;\n }\n\n // check public or private Terraform registry\n const serviceDiscovery =\n await this.getTerraformServiceDiscoveryResult(registryURL);\n if (!serviceDiscovery) {\n logger.trace(`Failed to retrieve service discovery from ${registryURL}`);\n return null;\n }\n const backendURL = createSDBackendURL(\n registryURL,\n 'providers.v1',\n serviceDiscovery,\n repository,\n );\n const versionsResponse = (\n await this.http.getJsonUnchecked<TerraformRegistryVersions>(\n `${backendURL}/versions`,\n )\n ).body;\n if (!versionsResponse.versions) {\n logger.trace(`Failed to retrieve version list for ${backendURL}`);\n return null;\n }\n const builds = versionsResponse.versions.find(\n (value) => value.version === version,\n );\n if (!builds) {\n logger.trace(\n `No builds found for ${repository}:${version} on ${registryURL}`,\n );\n return null;\n }\n const result = await p.map(\n builds.platforms,\n async (platform) => {\n const buildURL = `${backendURL}/${version}/download/${platform.os}/${platform.arch}`;\n try {\n const res = (\n await this.http.getJsonUnchecked<TerraformRegistryBuildResponse>(\n buildURL,\n )\n ).body;\n const newBuild: TerraformBuild = {\n name: repository,\n url: res.download_url,\n version,\n ...res,\n };\n return newBuild;\n } catch (err) {\n /* istanbul ignore next */\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug({ err, url: buildURL }, 'Failed to retrieve build');\n return null;\n }\n },\n { concurrency: 4 },\n );\n\n const filteredResult = result.filter(is.truthy);\n return filteredResult.length === result.length ? filteredResult : null;\n }\n\n @cache({\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: (zipHashUrl: string) => `getZipHashes:${zipHashUrl}`,\n })\n async getZipHashes(zipHashUrl: string): Promise<string[] | undefined> {\n // The hashes are formatted as the result of sha256sum in plain text, each line: <hash>\\t<filename>\n let rawHashData: string;\n try {\n rawHashData = (await this.http.get(zipHashUrl)).body;\n } catch (err) {\n /* istanbul ignore next */\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n { err, zipHashUrl },\n `Failed to retrieve zip hashes from ${zipHashUrl}`,\n );\n return undefined;\n }\n\n return rawHashData\n .trimEnd()\n .split('\\n')\n .map((line) => line.split(/\\s/)[0]);\n }\n\n @cache({\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: (backendLookUpName: string, version: string) =>\n `getReleaseBackendIndex:${backendLookUpName}/${version}`,\n })\n async getReleaseBackendIndex(\n backendLookUpName: string,\n version: string,\n ): Promise<VersionDetailResponse> {\n return (\n await this.http.getJsonUnchecked<VersionDetailResponse>(\n `${TerraformProviderDatasource.defaultRegistryUrls[1]}/${backendLookUpName}/${version}/index.json`,\n )\n ).body;\n }\n}\n"]}
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/terraform-provider/index.ts"],"names":[],"mappings":"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","sourcesContent":["// TODO: types (#22198)\nimport is from '@sindresorhus/is';\nimport { logger } from '../../../logger';\nimport { ExternalHostError } from '../../../types/errors/external-host-error';\nimport { cache } from '../../../util/cache/package/decorator';\nimport * as p from '../../../util/promises';\nimport { regEx } from '../../../util/regex';\nimport { asTimestamp } from '../../../util/timestamp';\nimport { joinUrlParts } from '../../../util/url';\nimport * as hashicorpVersioning from '../../versioning/hashicorp';\nimport { TerraformDatasource } from '../terraform-module/base';\nimport type { ServiceDiscoveryResult } from '../terraform-module/types';\nimport { createSDBackendURL } from '../terraform-module/utils';\nimport type { GetReleasesConfig, ReleaseResult } from '../types';\nimport type {\n TerraformBuild,\n TerraformProvider,\n TerraformProviderReleaseBackend,\n TerraformProviderVersions,\n TerraformRegistryBuildResponse,\n TerraformRegistryVersions,\n VersionDetailResponse,\n} from './types';\n\nexport class TerraformProviderDatasource extends TerraformDatasource {\n static override readonly id = 'terraform-provider';\n\n static readonly defaultRegistryUrls = [\n 'https://registry.terraform.io',\n 'https://releases.hashicorp.com',\n ];\n\n static repositoryRegex = regEx(/^hashicorp\\/(?<packageName>\\S+)$/);\n\n constructor() {\n super(TerraformProviderDatasource.id);\n }\n\n override readonly defaultRegistryUrls =\n TerraformProviderDatasource.defaultRegistryUrls;\n\n override readonly defaultVersioning = hashicorpVersioning.id;\n\n override readonly registryStrategy = 'hunt';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is only supported for the latest version, and is determined from the `published_at` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the the `source` field in the results.';\n\n @cache({\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: (getReleasesConfig: GetReleasesConfig) => {\n const url = getReleasesConfig.registryUrl;\n const repo = TerraformProviderDatasource.getRepository(getReleasesConfig);\n return `getReleases:${url}/${repo}`;\n },\n })\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n // istanbul ignore if\n if (!registryUrl) {\n return null;\n }\n logger.trace(\n `terraform-provider.getDependencies() packageName: ${packageName}`,\n );\n\n if (registryUrl === this.defaultRegistryUrls[1]) {\n return await this.queryReleaseBackend(packageName, registryUrl);\n }\n const repository = TerraformProviderDatasource.getRepository({\n packageName,\n });\n const serviceDiscovery =\n await this.getTerraformServiceDiscoveryResult(registryUrl);\n\n if (registryUrl === this.defaultRegistryUrls[0]) {\n return await this.queryRegistryExtendedApi(\n serviceDiscovery,\n registryUrl,\n repository,\n );\n }\n\n return await this.queryRegistryVersions(\n serviceDiscovery,\n registryUrl,\n repository,\n );\n }\n\n private static getRepository({ packageName }: GetReleasesConfig): string {\n return packageName.includes('/') ? packageName : `hashicorp/${packageName}`;\n }\n\n /**\n * this uses the api that terraform registry has in addition to the base api\n * this endpoint provides more information, such as release date\n * this api is undocumented.\n */\n private async queryRegistryExtendedApi(\n serviceDiscovery: ServiceDiscoveryResult,\n registryUrl: string,\n repository: string,\n ): Promise<ReleaseResult> {\n const backendURL = createSDBackendURL(\n registryUrl,\n 'providers.v1',\n serviceDiscovery,\n repository,\n );\n const res = (\n await this.http.getJsonUnchecked<TerraformProvider>(backendURL)\n ).body;\n const dep: ReleaseResult = {\n releases: res.versions.map((version) => ({\n version,\n })),\n };\n if (res.source) {\n dep.sourceUrl = res.source;\n }\n // set published date for latest release\n const latestVersion = dep.releases.find(\n (release) => res.version === release.version,\n );\n // istanbul ignore else\n if (latestVersion) {\n latestVersion.releaseTimestamp = asTimestamp(res.published_at);\n }\n dep.homepage = `${registryUrl}/providers/${repository}`;\n return dep;\n }\n\n /**\n * this version uses the Provider Registry Protocol that all registries are required to implement\n * https://www.terraform.io/internals/provider-registry-protocol\n */\n private async queryRegistryVersions(\n serviceDiscovery: ServiceDiscoveryResult,\n registryUrl: string,\n repository: string,\n ): Promise<ReleaseResult> {\n const backendURL = createSDBackendURL(\n registryUrl,\n 'providers.v1',\n serviceDiscovery,\n `${repository}/versions`,\n );\n const res = (\n await this.http.getJsonUnchecked<TerraformProviderVersions>(backendURL)\n ).body;\n const dep: ReleaseResult = {\n releases: res.versions.map(({ version }) => ({\n version,\n })),\n };\n return dep;\n }\n\n private async queryReleaseBackend(\n packageName: string,\n registryURL: string,\n ): Promise<ReleaseResult | null> {\n const hashicorpPackage = packageName.replace('hashicorp/', '');\n const backendLookUpName = `terraform-provider-${hashicorpPackage}`;\n const backendURL = joinUrlParts(\n registryURL,\n backendLookUpName,\n `index.json`,\n );\n const res = (\n await this.http.getJsonUnchecked<TerraformProviderReleaseBackend>(\n backendURL,\n )\n ).body;\n\n const dep: ReleaseResult = {\n releases: Object.keys(res.versions).map((version) => ({\n version,\n })),\n sourceUrl: joinUrlParts(\n 'https://github.com/terraform-providers',\n backendLookUpName,\n ),\n };\n return dep;\n }\n\n @cache({\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: (registryURL: string, repository: string, version: string) =>\n `getBuilds:${registryURL}/${repository}/${version}`,\n })\n async getBuilds(\n registryURL: string,\n repository: string,\n version: string,\n ): Promise<TerraformBuild[] | null> {\n if (registryURL === TerraformProviderDatasource.defaultRegistryUrls[1]) {\n // check if registryURL === secondary backend\n const repositoryRegexResult =\n TerraformProviderDatasource.repositoryRegex.exec(repository)?.groups;\n if (!repositoryRegexResult) {\n // non hashicorp builds are not supported with releases.hashicorp.com\n return null;\n }\n const packageName = repositoryRegexResult.packageName;\n const backendLookUpName = `terraform-provider-${packageName}`;\n let versionReleaseBackend: VersionDetailResponse;\n try {\n versionReleaseBackend = await this.getReleaseBackendIndex(\n backendLookUpName,\n version,\n );\n } catch (err) {\n /* istanbul ignore next */\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n { err, backendLookUpName, version },\n `Failed to retrieve builds for ${backendLookUpName} ${version}`,\n );\n return null;\n }\n return versionReleaseBackend.builds;\n }\n\n // check public or private Terraform registry\n const serviceDiscovery =\n await this.getTerraformServiceDiscoveryResult(registryURL);\n if (!serviceDiscovery) {\n logger.trace(`Failed to retrieve service discovery from ${registryURL}`);\n return null;\n }\n const backendURL = createSDBackendURL(\n registryURL,\n 'providers.v1',\n serviceDiscovery,\n repository,\n );\n const versionsResponse = (\n await this.http.getJsonUnchecked<TerraformRegistryVersions>(\n `${backendURL}/versions`,\n )\n ).body;\n if (!versionsResponse.versions) {\n logger.trace(`Failed to retrieve version list for ${backendURL}`);\n return null;\n }\n const builds = versionsResponse.versions.find(\n (value) => value.version === version,\n );\n if (!builds) {\n logger.trace(\n `No builds found for ${repository}:${version} on ${registryURL}`,\n );\n return null;\n }\n const result = await p.map(\n builds.platforms,\n async (platform) => {\n const buildURL = `${backendURL}/${version}/download/${platform.os}/${platform.arch}`;\n try {\n const res = (\n await this.http.getJsonUnchecked<TerraformRegistryBuildResponse>(\n buildURL,\n )\n ).body;\n const newBuild: TerraformBuild = {\n name: repository,\n url: res.download_url,\n version,\n ...res,\n };\n return newBuild;\n } catch (err) {\n /* istanbul ignore next */\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug({ err, url: buildURL }, 'Failed to retrieve build');\n return null;\n }\n },\n { concurrency: 4 },\n );\n\n const filteredResult = result.filter(is.truthy);\n return filteredResult.length === result.length ? filteredResult : null;\n }\n\n @cache({\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: (zipHashUrl: string) => `getZipHashes:${zipHashUrl}`,\n })\n async getZipHashes(zipHashUrl: string): Promise<string[] | undefined> {\n // The hashes are formatted as the result of sha256sum in plain text, each line: <hash>\\t<filename>\n let rawHashData: string;\n try {\n rawHashData = (await this.http.getText(zipHashUrl)).body;\n } catch (err) {\n /* istanbul ignore next */\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n { err, zipHashUrl },\n `Failed to retrieve zip hashes from ${zipHashUrl}`,\n );\n return undefined;\n }\n\n return rawHashData\n .trimEnd()\n .split('\\n')\n .map((line) => line.split(/\\s/)[0]);\n }\n\n @cache({\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: (backendLookUpName: string, version: string) =>\n `getReleaseBackendIndex:${backendLookUpName}/${version}`,\n })\n async getReleaseBackendIndex(\n backendLookUpName: string,\n version: string,\n ): Promise<VersionDetailResponse> {\n return (\n await this.http.getJsonUnchecked<VersionDetailResponse>(\n `${TerraformProviderDatasource.defaultRegistryUrls[1]}/${backendLookUpName}/${version}/index.json`,\n )\n ).body;\n }\n}\n"]}
|
@@ -7,7 +7,7 @@ const http = new http_1.Http('batect-wrapper');
|
|
7
7
|
async function updateArtifact(path, fileName, version) {
|
8
8
|
const url = `https://github.com/batect/batect/releases/download/${version}/${fileName}`;
|
9
9
|
try {
|
10
|
-
const response = await http.
|
10
|
+
const response = await http.getText(url);
|
11
11
|
const contents = response.body;
|
12
12
|
return {
|
13
13
|
file: { type: 'addition', path, contents },
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../../../lib/modules/manager/batect-wrapper/artifacts.ts"],"names":[],"mappings":";;AAgCA,0CAcC;AA9CD,4CAAyC;AACzC,6CAA0C;AAG1C,MAAM,IAAI,GAAG,IAAI,WAAI,CAAC,gBAAgB,CAAC,CAAC;AAExC,KAAK,UAAU,cAAc,CAC3B,IAAY,EACZ,QAAgB,EAChB,OAAe;IAEf,MAAM,GAAG,GAAG,sDAAsD,OAAO,IAAI,QAAQ,EAAE,CAAC;IAExF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,
|
1
|
+
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../../../lib/modules/manager/batect-wrapper/artifacts.ts"],"names":[],"mappings":";;AAgCA,0CAcC;AA9CD,4CAAyC;AACzC,6CAA0C;AAG1C,MAAM,IAAI,GAAG,IAAI,WAAI,CAAC,gBAAgB,CAAC,CAAC;AAExC,KAAK,UAAU,cAAc,CAC3B,IAAY,EACZ,QAAgB,EAChB,OAAe;IAEf,MAAM,GAAG,GAAG,sDAAsD,OAAO,IAAI,QAAQ,EAAE,CAAC;IAExF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC;QAE/B,OAAO;YACL,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC3C,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,gBAAgB,GAAW,GAAG,CAAC,QAAQ,EAAE,CAAC;QAEhD,OAAO;YACL,aAAa,EAAE;gBACb,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,YAAY,GAAG,YAAY,gBAAgB,EAAE;aACtD;SACF,CAAC;IACJ,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,eAAe,CAAC,EACpC,eAAe,EACf,MAAM,GACS;IACf,MAAM,OAAO,GAAG,MAAM,CAAC,UAAW,CAAC;IAEnC,eAAM,CAAC,KAAK,CACV,uCAAuC,eAAe,OAAO,OAAO,EAAE,CACvE,CAAC;IAEF,OAAO;QACL,MAAM,cAAc,CAAC,eAAe,EAAE,QAAQ,EAAE,OAAO,CAAC;QACxD,MAAM,cAAc,CAAC,GAAG,eAAe,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC;KACtE,CAAC;AACJ,CAAC","sourcesContent":["import { logger } from '../../../logger';\nimport { Http } from '../../../util/http';\nimport type { UpdateArtifact, UpdateArtifactsResult } from '../types';\n\nconst http = new Http('batect-wrapper');\n\nasync function updateArtifact(\n path: string,\n fileName: string,\n version: string,\n): Promise<UpdateArtifactsResult> {\n const url = `https://github.com/batect/batect/releases/download/${version}/${fileName}`;\n\n try {\n const response = await http.getText(url);\n const contents = response.body;\n\n return {\n file: { type: 'addition', path, contents },\n };\n } catch (err) {\n const errorDescription: string = err.toString();\n\n return {\n artifactError: {\n lockFile: path,\n stderr: `HTTP GET ${url} failed: ${errorDescription}`,\n },\n };\n }\n}\n\nexport async function updateArtifacts({\n packageFileName,\n config,\n}: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> {\n const version = config.newVersion!;\n\n logger.debug(\n `Updating Batect wrapper scripts for ${packageFileName} to ${version}`,\n );\n\n return [\n await updateArtifact(packageFileName, 'batect', version),\n await updateArtifact(`${packageFileName}.cmd`, 'batect.cmd', version),\n ];\n}\n"]}
|
@@ -7,6 +7,7 @@ const zod_1 = require("zod");
|
|
7
7
|
const logger_1 = require("../../../../logger");
|
8
8
|
const regex_1 = require("../../../../util/regex");
|
9
9
|
const github_releases_1 = require("../../../datasource/github-releases");
|
10
|
+
const github_tags_1 = require("../../../datasource/github-tags");
|
10
11
|
const githubUrlRegex = (0, regex_1.regEx)(/^https:\/\/github\.com\/(?<packageName>[^/]+\/[^/]+)/);
|
11
12
|
function githubPackageName(input) {
|
12
13
|
// istanbul ignore if
|
@@ -38,8 +39,13 @@ exports.GitTarget = zod_1.z
|
|
38
39
|
}
|
39
40
|
const githubPackage = githubPackageName(remote);
|
40
41
|
if (githubPackage) {
|
41
|
-
dep.datasource = github_releases_1.GithubReleasesDatasource.id;
|
42
42
|
dep.packageName = githubPackage;
|
43
|
+
if (dep.currentValue) {
|
44
|
+
dep.datasource = github_releases_1.GithubReleasesDatasource.id;
|
45
|
+
}
|
46
|
+
else {
|
47
|
+
dep.datasource = github_tags_1.GithubTagsDatasource.id;
|
48
|
+
}
|
43
49
|
}
|
44
50
|
if (!dep.datasource) {
|
45
51
|
dep.skipReason = 'unsupported-datasource';
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../../../../lib/modules/manager/bazel/rules/git.ts"],"names":[],"mappings":";;;;AAAA,sFAAiD;AACjD,6BAAwB;AACxB,+CAA4C;AAC5C,kDAA+C;AAC/C,yEAA+E;
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../../../../lib/modules/manager/bazel/rules/git.ts"],"names":[],"mappings":";;;;AAAA,sFAAiD;AACjD,6BAAwB;AACxB,+CAA4C;AAC5C,kDAA+C;AAC/C,yEAA+E;AAC/E,iEAAuE;AAGvE,MAAM,cAAc,GAAG,IAAA,aAAK,EAC1B,sDAAsD,CACvD,CAAC;AAEF,SAAS,iBAAiB,CAAC,KAAa;IACtC,qBAAqB;IACrB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAClC,eAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,qCAAqC,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,IAAA,6BAAc,EAAC,KAAK,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC;AAC3E,CAAC;AAEY,QAAA,QAAQ,GAAG,CAAC,gBAAgB,EAAE,iBAAiB,CAAU,CAAC;AAE1D,QAAA,SAAS,GAAG,OAAC;KACvB,MAAM,CAAC;IACN,IAAI,EAAE,OAAC,CAAC,IAAI,CAAC,gBAAQ,CAAC;IACtB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE;CACnB,CAAC;KACD,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC;KAC9C,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAuB,EAAE;IACtE,MAAM,GAAG,GAAsB;QAC7B,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,IAAI;KACd,CAAC;IAEF,IAAI,GAAG,EAAE,CAAC;QACR,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC;IACzB,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,GAAG,CAAC,aAAa,GAAG,MAAM,CAAC;IAC7B,CAAC;IAED,MAAM,aAAa,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAChD,IAAI,aAAa,EAAE,CAAC;QAClB,GAAG,CAAC,WAAW,GAAG,aAAa,CAAC;QAChC,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;YACrB,GAAG,CAAC,UAAU,GAAG,0CAAwB,CAAC,EAAE,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,UAAU,GAAG,kCAAoB,CAAC,EAAE,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QACpB,GAAG,CAAC,UAAU,GAAG,wBAAwB,CAAC;IAC5C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,CAAC;AACf,CAAC,CAAC,CAAC","sourcesContent":["import parseGithubUrl from 'github-url-from-git';\nimport { z } from 'zod';\nimport { logger } from '../../../../logger';\nimport { regEx } from '../../../../util/regex';\nimport { GithubReleasesDatasource } from '../../../datasource/github-releases';\nimport { GithubTagsDatasource } from '../../../datasource/github-tags';\nimport type { PackageDependency } from '../../types';\n\nconst githubUrlRegex = regEx(\n /^https:\\/\\/github\\.com\\/(?<packageName>[^/]+\\/[^/]+)/,\n);\n\nfunction githubPackageName(input: string): string | undefined {\n // istanbul ignore if\n if (!input.startsWith('https://')) {\n logger.once.info({ url: input }, `Bazel: non-https git_repository URL`);\n }\n return parseGithubUrl(input)?.match(githubUrlRegex)?.groups?.packageName;\n}\n\nexport const gitRules = ['git_repository', '_git_repository'] as const;\n\nexport const GitTarget = z\n .object({\n rule: z.enum(gitRules),\n name: z.string(),\n tag: z.string().optional(),\n commit: z.string().optional(),\n remote: z.string(),\n })\n .refine(({ tag, commit }) => !!tag || !!commit)\n .transform(({ rule, name, tag, commit, remote }): PackageDependency[] => {\n const dep: PackageDependency = {\n depType: rule,\n depName: name,\n };\n\n if (tag) {\n dep.currentValue = tag;\n }\n\n if (commit) {\n dep.currentDigest = commit;\n }\n\n const githubPackage = githubPackageName(remote);\n if (githubPackage) {\n dep.packageName = githubPackage;\n if (dep.currentValue) {\n dep.datasource = GithubReleasesDatasource.id;\n } else {\n dep.datasource = GithubTagsDatasource.id;\n }\n }\n\n if (!dep.datasource) {\n dep.skipReason = 'unsupported-datasource';\n }\n\n return [dep];\n });\n"]}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../../../lib/modules/manager/bundler/artifacts.ts"],"names":[],"mappings":"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","sourcesContent":["import is from '@sindresorhus/is';\nimport { quote } from 'shlex';\nimport {\n BUNDLER_INVALID_CREDENTIALS,\n TEMPORARY_ERROR,\n} from '../../../constants/error-messages';\nimport { logger } from '../../../logger';\nimport type { HostRule } from '../../../types';\nimport * as memCache from '../../../util/cache/memory';\nimport { exec } from '../../../util/exec';\nimport type { ExecOptions } from '../../../util/exec/types';\nimport {\n ensureCacheDir,\n readLocalFile,\n writeLocalFile,\n} from '../../../util/fs';\nimport { getRepoStatus } from '../../../util/git';\nimport { newlineRegex, regEx } from '../../../util/regex';\nimport type { UpdateArtifact, UpdateArtifactsResult } from '../types';\nimport {\n getBundlerConstraint,\n getLockFilePath,\n getRubyConstraint,\n} from './common';\nimport {\n findAllAuthenticatable,\n getAuthenticationHeaderValue,\n} from './host-rules';\n\nconst hostConfigVariablePrefix = 'BUNDLE_';\n\nfunction buildBundleHostVariable(hostRule: HostRule): Record<string, string> {\n // istanbul ignore if: doesn't happen in practice\n if (!hostRule.resolvedHost) {\n return {};\n }\n const varName = hostConfigVariablePrefix.concat(\n hostRule.resolvedHost\n .toUpperCase()\n .split('.')\n .join('__')\n .split('-')\n .join('___'),\n );\n return {\n [varName]: `${getAuthenticationHeaderValue(hostRule)}`,\n };\n}\n\nconst resolvedPkgRegex = regEx(\n /(?<pkg>\\S+)(?:\\s*\\([^)]+\\)\\s*)? was resolved to/,\n);\n\nfunction getResolvedPackages(input: string): string[] {\n const lines = input.split(newlineRegex);\n const result: string[] = [];\n for (const line of lines) {\n const resolveMatchGroups = line.match(resolvedPkgRegex)?.groups;\n if (resolveMatchGroups) {\n const { pkg } = resolveMatchGroups;\n result.push(pkg);\n }\n }\n\n return [...new Set(result)];\n}\n\nexport async function updateArtifacts(\n updateArtifact: UpdateArtifact,\n recursionLimit = 10,\n): Promise<UpdateArtifactsResult[] | null> {\n const { packageFileName, updatedDeps, newPackageFileContent, config } =\n updateArtifact;\n logger.debug(`bundler.updateArtifacts(${packageFileName})`);\n const existingError = memCache.get<string>('bundlerArtifactsError');\n // istanbul ignore if\n if (existingError) {\n logger.debug('Aborting Bundler artifacts due to previous failed attempt');\n throw new Error(existingError);\n }\n const lockFileName = await getLockFilePath(packageFileName);\n const existingLockFileContent = await readLocalFile(lockFileName, 'utf8');\n if (!existingLockFileContent) {\n logger.debug('No Gemfile.lock found');\n return null;\n }\n\n const updatedDepNames = updatedDeps\n .map(({ depName }) => depName)\n .filter(is.nonEmptyStringAndNotWhitespace);\n\n try {\n await writeLocalFile(packageFileName, newPackageFileContent);\n\n const commands: string[] = [];\n\n if (config.isLockFileMaintenance) {\n commands.push('bundler lock --update');\n } else {\n const bundlerUpgraded = updatedDeps\n .map((dep) => dep.depName)\n .includes('bundler');\n if (bundlerUpgraded) {\n commands.push('bundler lock --update --bundler');\n }\n\n const updateTypes = {\n patch: '--patch ',\n minor: '--minor ',\n major: '',\n };\n for (const [updateType, updateArg] of Object.entries(updateTypes)) {\n const deps = updatedDeps\n .filter((dep) => (dep.updateType ?? 'major') === updateType)\n .map((dep) => dep.depName)\n .filter(is.string)\n .filter((dep) => dep !== 'ruby' && dep !== 'bundler');\n let additionalArgs = '';\n if (config.postUpdateOptions?.includes('bundlerConservative')) {\n additionalArgs = '--conservative ';\n }\n if (deps.length) {\n const cmd = `bundler lock ${updateArg}${additionalArgs}--update ${deps\n .map(quote)\n .join(' ')}`;\n commands.push(cmd);\n }\n }\n\n const rubyUpgraded = updatedDeps\n .map((dep) => dep.depName)\n .includes('ruby');\n if (rubyUpgraded) {\n commands.push('bundler lock');\n }\n }\n\n const bundlerHostRules = findAllAuthenticatable({\n hostType: 'rubygems',\n });\n\n const bundlerHostRulesVariables = bundlerHostRules.reduce(\n (variables, hostRule) => ({\n ...variables,\n ...buildBundleHostVariable(hostRule),\n }),\n {} as Record<string, string>,\n );\n\n const bundler = getBundlerConstraint(\n updateArtifact,\n existingLockFileContent,\n );\n const preCommands = ['ruby --version'];\n\n const execOptions: ExecOptions = {\n cwdFile: lockFileName,\n userConfiguredEnv: config.env,\n extraEnv: {\n ...bundlerHostRulesVariables,\n GEM_HOME: await ensureCacheDir('bundler'),\n },\n docker: {},\n toolConstraints: [\n {\n toolName: 'ruby',\n constraint: await getRubyConstraint(updateArtifact),\n },\n {\n toolName: 'bundler',\n constraint: bundler,\n },\n ],\n preCommands,\n };\n await exec(commands, execOptions);\n\n const status = await getRepoStatus();\n if (!status.modified.includes(lockFileName)) {\n return null;\n }\n logger.debug('Returning updated Gemfile.lock');\n const lockFileContent = await readLocalFile(lockFileName);\n return [\n {\n file: {\n type: 'addition',\n path: lockFileName,\n contents: lockFileContent,\n },\n },\n ];\n } catch (err) {\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n const output = `${String(err.stdout)}\\n${String(err.stderr)}`;\n if (\n err.message.includes('fatal: Could not parse object') ||\n output.includes('but that version could not be found')\n ) {\n return [\n {\n artifactError: {\n lockFile: lockFileName,\n stderr: output,\n },\n },\n ];\n }\n if (\n err.stdout?.includes('Please supply credentials for this source') ||\n err.stderr?.includes('Authentication is required') ||\n err.stderr?.includes(\n 'Please make sure you have the correct access rights',\n )\n ) {\n logger.debug(\n { err },\n 'Gemfile.lock update failed due to missing credentials - skipping branch',\n );\n // Do not generate these PRs because we don't yet support Bundler authentication\n memCache.set('bundlerArtifactsError', BUNDLER_INVALID_CREDENTIALS);\n throw new Error(BUNDLER_INVALID_CREDENTIALS);\n }\n const resolveMatches: string[] = getResolvedPackages(output).filter(\n (depName) => !updatedDepNames.includes(depName),\n );\n if (\n recursionLimit > 0 &&\n resolveMatches.length &&\n !config.isLockFileMaintenance\n ) {\n logger.debug(\n { resolveMatches, updatedDeps },\n 'Found new resolve matches - reattempting recursively',\n );\n const newUpdatedDeps = [\n ...new Set([\n ...updatedDeps,\n ...resolveMatches.map((match) => ({ depName: match })),\n ]),\n ];\n return updateArtifacts(\n {\n packageFileName,\n updatedDeps: newUpdatedDeps,\n newPackageFileContent,\n config,\n },\n recursionLimit - 1,\n );\n }\n\n logger.info({ err }, 'Gemfile.lock update failed due to an unknown reason');\n return [\n {\n artifactError: {\n lockFile: lockFileName,\n stderr: `${String(err.stdout)}\\n${String(err.stderr)}`,\n },\n },\n ];\n }\n}\n"]}
|
1
|
+
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../../../lib/modules/manager/bundler/artifacts.ts"],"names":[],"mappings":"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","sourcesContent":["import is from '@sindresorhus/is';\nimport { quote } from 'shlex';\nimport {\n BUNDLER_INVALID_CREDENTIALS,\n TEMPORARY_ERROR,\n} from '../../../constants/error-messages';\nimport { logger } from '../../../logger';\nimport type { HostRule } from '../../../types';\nimport * as memCache from '../../../util/cache/memory';\nimport { exec } from '../../../util/exec';\nimport type { ExecOptions } from '../../../util/exec/types';\nimport {\n ensureCacheDir,\n readLocalFile,\n writeLocalFile,\n} from '../../../util/fs';\nimport { getRepoStatus } from '../../../util/git';\nimport { newlineRegex, regEx } from '../../../util/regex';\nimport type { UpdateArtifact, UpdateArtifactsResult } from '../types';\nimport {\n getBundlerConstraint,\n getLockFilePath,\n getRubyConstraint,\n} from './common';\nimport {\n findAllAuthenticatable,\n getAuthenticationHeaderValue,\n} from './host-rules';\n\nconst hostConfigVariablePrefix = 'BUNDLE_';\n\nfunction buildBundleHostVariable(hostRule: HostRule): Record<string, string> {\n // istanbul ignore if: doesn't happen in practice\n if (!hostRule.resolvedHost) {\n return {};\n }\n const varName = hostConfigVariablePrefix.concat(\n hostRule.resolvedHost\n .toUpperCase()\n .split('.')\n .join('__')\n .split('-')\n .join('___'),\n );\n return {\n [varName]: `${getAuthenticationHeaderValue(hostRule)}`,\n };\n}\n\nconst resolvedPkgRegex = regEx(\n /(?<pkg>\\S+)(?:\\s*\\([^)]+\\)\\s*)? was resolved to/,\n);\n\nfunction getResolvedPackages(input: string): string[] {\n const lines = input.split(newlineRegex);\n const result: string[] = [];\n for (const line of lines) {\n const resolveMatchGroups = line.match(resolvedPkgRegex)?.groups;\n if (resolveMatchGroups) {\n const { pkg } = resolveMatchGroups;\n result.push(pkg);\n }\n }\n\n return [...new Set(result)];\n}\n\nexport async function updateArtifacts(\n updateArtifact: UpdateArtifact,\n recursionLimit = 10,\n): Promise<UpdateArtifactsResult[] | null> {\n const { packageFileName, updatedDeps, newPackageFileContent, config } =\n updateArtifact;\n logger.debug(`bundler.updateArtifacts(${packageFileName})`);\n const existingError = memCache.get<string>('bundlerArtifactsError');\n // istanbul ignore if\n if (existingError) {\n logger.debug('Aborting Bundler artifacts due to previous failed attempt');\n throw new Error(existingError);\n }\n const lockFileName = await getLockFilePath(packageFileName);\n const existingLockFileContent = await readLocalFile(lockFileName, 'utf8');\n if (!existingLockFileContent) {\n logger.debug('No Gemfile.lock found');\n return null;\n }\n\n const updatedDepNames: string[] = updatedDeps\n .map(({ depName }) => depName)\n .filter(is.nonEmptyStringAndNotWhitespace);\n\n try {\n await writeLocalFile(packageFileName, newPackageFileContent);\n\n const commands: string[] = [];\n\n if (config.isLockFileMaintenance) {\n commands.push('bundler lock --update');\n } else {\n const bundlerUpgraded = updatedDeps\n .map((dep) => dep.depName)\n .includes('bundler');\n if (bundlerUpgraded) {\n commands.push('bundler lock --update --bundler');\n }\n\n const updateTypes = {\n patch: '--patch ',\n minor: '--minor ',\n major: '',\n };\n for (const [updateType, updateArg] of Object.entries(updateTypes)) {\n const deps = updatedDeps\n .filter((dep) => (dep.updateType ?? 'major') === updateType)\n .map((dep) => dep.depName)\n .filter(is.string)\n .filter((dep) => dep !== 'ruby' && dep !== 'bundler');\n let additionalArgs = '';\n if (config.postUpdateOptions?.includes('bundlerConservative')) {\n additionalArgs = '--conservative ';\n }\n if (deps.length) {\n const cmd = `bundler lock ${updateArg}${additionalArgs}--update ${deps\n .map(quote)\n .join(' ')}`;\n commands.push(cmd);\n }\n }\n\n const rubyUpgraded = updatedDeps\n .map((dep) => dep.depName)\n .includes('ruby');\n if (rubyUpgraded) {\n commands.push('bundler lock');\n }\n }\n\n const bundlerHostRules = findAllAuthenticatable({\n hostType: 'rubygems',\n });\n\n const bundlerHostRulesVariables = bundlerHostRules.reduce(\n (variables, hostRule) => ({\n ...variables,\n ...buildBundleHostVariable(hostRule),\n }),\n {} as Record<string, string>,\n );\n\n const bundler = getBundlerConstraint(\n updateArtifact,\n existingLockFileContent,\n );\n const preCommands = ['ruby --version'];\n\n const execOptions: ExecOptions = {\n cwdFile: lockFileName,\n userConfiguredEnv: config.env,\n extraEnv: {\n ...bundlerHostRulesVariables,\n GEM_HOME: await ensureCacheDir('bundler'),\n },\n docker: {},\n toolConstraints: [\n {\n toolName: 'ruby',\n constraint: await getRubyConstraint(updateArtifact),\n },\n {\n toolName: 'bundler',\n constraint: bundler,\n },\n ],\n preCommands,\n };\n await exec(commands, execOptions);\n\n const status = await getRepoStatus();\n if (!status.modified.includes(lockFileName)) {\n return null;\n }\n logger.debug('Returning updated Gemfile.lock');\n const lockFileContent = await readLocalFile(lockFileName);\n return [\n {\n file: {\n type: 'addition',\n path: lockFileName,\n contents: lockFileContent,\n },\n },\n ];\n } catch (err) {\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n const output = `${String(err.stdout)}\\n${String(err.stderr)}`;\n if (\n err.message.includes('fatal: Could not parse object') ||\n output.includes('but that version could not be found')\n ) {\n return [\n {\n artifactError: {\n lockFile: lockFileName,\n stderr: output,\n },\n },\n ];\n }\n if (\n err.stdout?.includes('Please supply credentials for this source') ||\n err.stderr?.includes('Authentication is required') ||\n err.stderr?.includes(\n 'Please make sure you have the correct access rights',\n )\n ) {\n logger.debug(\n { err },\n 'Gemfile.lock update failed due to missing credentials - skipping branch',\n );\n // Do not generate these PRs because we don't yet support Bundler authentication\n memCache.set('bundlerArtifactsError', BUNDLER_INVALID_CREDENTIALS);\n throw new Error(BUNDLER_INVALID_CREDENTIALS);\n }\n const resolveMatches: string[] = getResolvedPackages(output).filter(\n (depName) => !updatedDepNames.includes(depName),\n );\n if (\n recursionLimit > 0 &&\n resolveMatches.length &&\n !config.isLockFileMaintenance\n ) {\n logger.debug(\n { resolveMatches, updatedDeps },\n 'Found new resolve matches - reattempting recursively',\n );\n const newUpdatedDeps = [\n ...new Set([\n ...updatedDeps,\n ...resolveMatches.map((match) => ({ depName: match })),\n ]),\n ];\n return updateArtifacts(\n {\n packageFileName,\n updatedDeps: newUpdatedDeps,\n newPackageFileContent,\n config,\n },\n recursionLimit - 1,\n );\n }\n\n logger.info({ err }, 'Gemfile.lock update failed due to an unknown reason');\n return [\n {\n artifactError: {\n lockFile: lockFileName,\n stderr: `${String(err.stdout)}\\n${String(err.stderr)}`,\n },\n },\n ];\n }\n}\n"]}
|
@@ -6,7 +6,9 @@ exports.getPhpConstraint = getPhpConstraint;
|
|
6
6
|
exports.requireComposerDependencyInstallation = requireComposerDependencyInstallation;
|
7
7
|
exports.extractConstraints = extractConstraints;
|
8
8
|
exports.isArtifactAuthEnabled = isArtifactAuthEnabled;
|
9
|
+
const tslib_1 = require("tslib");
|
9
10
|
// TODO: types (#22198)
|
11
|
+
const is_1 = tslib_1.__importDefault(require("@sindresorhus/is"));
|
10
12
|
const shlex_1 = require("shlex");
|
11
13
|
const global_1 = require("../../../config/global");
|
12
14
|
const logger_1 = require("../../../logger");
|
@@ -18,12 +20,13 @@ function getComposerArguments(config, toolConstraint) {
|
|
18
20
|
let args = '';
|
19
21
|
if (config.composerIgnorePlatformReqs) {
|
20
22
|
if (config.composerIgnorePlatformReqs.length === 0) {
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
if (is_1.default.string(toolConstraint.constraint) &&
|
24
|
+
composer_1.api.intersects(toolConstraint.constraint, '^2.2')) {
|
25
|
+
args += " --ignore-platform-req='ext-*' --ignore-platform-req='lib-*'";
|
26
|
+
}
|
27
|
+
else {
|
28
|
+
args += ' --ignore-platform-reqs';
|
29
|
+
}
|
27
30
|
}
|
28
31
|
else {
|
29
32
|
config.composerIgnorePlatformReqs.forEach((req) => {
|