renovate 43.263.0 → 43.263.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/app-strings.js +1 -1
- package/dist/config/app-strings.js.map +1 -1
- package/dist/config/decrypt/bcpgp.js +7 -4
- package/dist/config/decrypt/bcpgp.js.map +1 -1
- package/dist/config/migration.js +4 -6
- package/dist/config/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/validation-helpers/match-base-branches.js +4 -6
- package/dist/config/validation-helpers/match-base-branches.js.map +1 -1
- package/dist/config/validation-helpers/regex-glob-matchers.js +4 -6
- package/dist/config/validation-helpers/regex-glob-matchers.js.map +1 -1
- package/dist/config/validation-helpers/utils.js +2 -4
- package/dist/config/validation-helpers/utils.js.map +1 -1
- package/dist/config/validation.js +4 -6
- package/dist/config/validation.js.map +1 -1
- package/dist/config-validator.js +1 -3
- package/dist/config-validator.js.map +1 -1
- package/dist/global-config-option-defaults.generated.js +1 -1
- package/dist/global-config-option-defaults.generated.js.map +1 -1
- package/dist/modules/datasource/artifactory/index.js +6 -8
- package/dist/modules/datasource/artifactory/index.js.map +1 -1
- package/dist/modules/datasource/aws-machine-image/index.js +1 -2
- package/dist/modules/datasource/aws-machine-image/index.js.map +1 -1
- package/dist/modules/datasource/azure-pipelines-tasks/index.js +2 -3
- package/dist/modules/datasource/azure-pipelines-tasks/index.js.map +1 -1
- package/dist/modules/datasource/conda/index.js +1 -3
- package/dist/modules/datasource/conda/index.js.map +1 -1
- package/dist/modules/datasource/dart-version/index.js +1 -2
- package/dist/modules/datasource/dart-version/index.js.map +1 -1
- package/dist/modules/datasource/datasource.js +1 -3
- package/dist/modules/datasource/datasource.js.map +1 -1
- package/dist/modules/datasource/devbox/index.js +1 -3
- package/dist/modules/datasource/devbox/index.js.map +1 -1
- package/dist/modules/datasource/docker/ecr.js +2 -1
- package/dist/modules/datasource/docker/ecr.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/galaxy-collection/index.js +1 -1
- package/dist/modules/datasource/galaxy-collection/index.js.map +1 -1
- package/dist/modules/datasource/go/releases-goproxy.js +2 -2
- package/dist/modules/datasource/go/releases-goproxy.js.map +1 -1
- package/dist/modules/datasource/java-version/index.js +1 -3
- package/dist/modules/datasource/java-version/index.js.map +1 -1
- package/dist/modules/datasource/maven/util.js +2 -1
- package/dist/modules/datasource/maven/util.js.map +1 -1
- package/dist/modules/datasource/nuget/common.js +6 -4
- package/dist/modules/datasource/nuget/common.js.map +1 -1
- package/dist/modules/datasource/util.js +3 -2
- package/dist/modules/datasource/util.js.map +1 -1
- package/dist/modules/manager/azure-pipelines/extract.js +1 -1
- package/dist/modules/manager/azure-pipelines/extract.js.map +1 -1
- package/dist/modules/manager/bazel/extract.js +1 -3
- package/dist/modules/manager/bazel/extract.js.map +1 -1
- package/dist/modules/manager/bazel/parser.js +1 -1
- package/dist/modules/manager/bazel/parser.js.map +1 -1
- package/dist/modules/manager/buildpacks/extract.js +1 -1
- package/dist/modules/manager/buildpacks/extract.js.map +1 -1
- package/dist/modules/manager/bundler/common.js +23 -25
- package/dist/modules/manager/bundler/common.js.map +1 -1
- package/dist/modules/manager/bundler/extract.js +2 -6
- package/dist/modules/manager/bundler/extract.js.map +1 -1
- package/dist/modules/manager/cargo/extract.js +4 -6
- package/dist/modules/manager/cargo/extract.js.map +1 -1
- package/dist/modules/manager/dockerfile/extract.js +3 -3
- package/dist/modules/manager/dockerfile/extract.js.map +1 -1
- package/dist/modules/manager/fingerprint.generated.js +13 -13
- package/dist/modules/manager/fingerprint.generated.js.map +1 -1
- package/dist/modules/manager/flux/extract.js +2 -1
- package/dist/modules/manager/flux/extract.js.map +1 -1
- package/dist/modules/manager/github-actions/parse.js +1 -1
- package/dist/modules/manager/github-actions/parse.js.map +1 -1
- package/dist/modules/manager/gradle/extract/catalog.js +4 -3
- package/dist/modules/manager/gradle/extract/catalog.js.map +1 -1
- package/dist/modules/manager/gradle/extract.js +2 -2
- package/dist/modules/manager/gradle/extract.js.map +1 -1
- package/dist/modules/manager/gradle/parser/common.js +1 -1
- package/dist/modules/manager/gradle/parser/common.js.map +1 -1
- package/dist/modules/manager/gradle/parser/handlers.js +1 -1
- package/dist/modules/manager/gradle/parser/handlers.js.map +1 -1
- package/dist/modules/manager/helm-values/extract.js.map +1 -1
- package/dist/modules/manager/helmfile/extract.js +1 -1
- package/dist/modules/manager/helmfile/extract.js.map +1 -1
- package/dist/modules/manager/maven/extract.js.map +1 -1
- package/dist/modules/manager/maven/update.js +2 -1
- package/dist/modules/manager/maven/update.js.map +1 -1
- package/dist/modules/manager/mise/utils.js +5 -7
- package/dist/modules/manager/mise/utils.js.map +1 -1
- package/dist/modules/manager/mix/extract.js +3 -6
- package/dist/modules/manager/mix/extract.js.map +1 -1
- package/dist/modules/manager/npm/extract/common/overrides.js +1 -1
- package/dist/modules/manager/npm/extract/common/overrides.js.map +1 -1
- package/dist/modules/manager/npm/extract/yarn.js +1 -1
- package/dist/modules/manager/npm/extract/yarn.js.map +1 -1
- package/dist/modules/manager/npm/npmrc.js +1 -3
- package/dist/modules/manager/npm/npmrc.js.map +1 -1
- package/dist/modules/manager/npm/update/dependency/common.js +2 -3
- package/dist/modules/manager/npm/update/dependency/common.js.map +1 -1
- package/dist/modules/manager/npm/update/dependency/index.js +1 -1
- package/dist/modules/manager/npm/update/dependency/index.js.map +1 -1
- package/dist/modules/manager/npm/update/dependency/pnpm.js +1 -1
- package/dist/modules/manager/npm/update/dependency/pnpm.js.map +1 -1
- package/dist/modules/manager/npm/update/dependency/yarn.js +1 -1
- package/dist/modules/manager/npm/update/dependency/yarn.js.map +1 -1
- package/dist/modules/manager/osgi/extract.js +1 -1
- package/dist/modules/manager/osgi/extract.js.map +1 -1
- package/dist/modules/manager/pep621/processors/uv.js +1 -1
- package/dist/modules/manager/pep621/processors/uv.js.map +1 -1
- package/dist/modules/manager/pep621/schema.js.map +1 -1
- package/dist/modules/manager/pip_setup/extract.js +1 -1
- package/dist/modules/manager/pip_setup/extract.js.map +1 -1
- package/dist/modules/manager/pipenv/artifacts.js.map +1 -1
- package/dist/modules/manager/poetry/schema.js +2 -2
- package/dist/modules/manager/poetry/schema.js.map +1 -1
- package/dist/modules/manager/pub/artifacts.js +4 -6
- package/dist/modules/manager/pub/artifacts.js.map +1 -1
- package/dist/modules/manager/pub/utils.js +2 -2
- package/dist/modules/manager/pub/utils.js.map +1 -1
- package/dist/modules/manager/puppet/common.js +4 -6
- package/dist/modules/manager/puppet/common.js.map +1 -1
- package/dist/modules/manager/sbt/extract.js +1 -1
- package/dist/modules/manager/sbt/extract.js.map +1 -1
- package/dist/modules/manager/sbt/util.js +4 -2
- package/dist/modules/manager/sbt/util.js.map +1 -1
- package/dist/modules/manager/terraform/lockfile/util.js +1 -1
- package/dist/modules/manager/terraform/lockfile/util.js.map +1 -1
- package/dist/modules/platform/azure/index.js +15 -19
- package/dist/modules/platform/azure/index.js.map +1 -1
- package/dist/modules/platform/azure/issue.js +67 -17
- package/dist/modules/platform/azure/issue.js.map +1 -1
- package/dist/modules/platform/bitbucket/index.js +1 -3
- package/dist/modules/platform/bitbucket/index.js.map +1 -1
- package/dist/modules/platform/forgejo/index.js +5 -3
- package/dist/modules/platform/forgejo/index.js.map +1 -1
- package/dist/modules/platform/forgejo/utils.js +1 -1
- package/dist/modules/platform/forgejo/utils.js.map +1 -1
- package/dist/modules/platform/gerrit/scm.js +5 -7
- package/dist/modules/platform/gerrit/scm.js.map +1 -1
- package/dist/modules/platform/gitea/index.js +5 -3
- package/dist/modules/platform/gitea/index.js.map +1 -1
- package/dist/modules/platform/gitea/utils.js +1 -1
- package/dist/modules/platform/gitea/utils.js.map +1 -1
- package/dist/modules/platform/github/index.js +5 -7
- package/dist/modules/platform/github/index.js.map +1 -1
- package/dist/modules/platform/github/pr.js +1 -1
- package/dist/modules/platform/github/pr.js.map +1 -1
- package/dist/modules/platform/gitlab/index.js +2 -1
- package/dist/modules/platform/gitlab/index.js.map +1 -1
- package/dist/modules/platform/utils/pr-body.js +2 -1
- package/dist/modules/platform/utils/pr-body.js.map +1 -1
- package/dist/modules/versioning/apk/index.js +3 -3
- package/dist/modules/versioning/apk/index.js.map +1 -1
- package/dist/modules/versioning/composer/index.js +4 -7
- package/dist/modules/versioning/composer/index.js.map +1 -1
- package/dist/modules/versioning/conan/common.js +4 -6
- package/dist/modules/versioning/conan/common.js.map +1 -1
- package/dist/modules/versioning/conan/index.js +1 -3
- package/dist/modules/versioning/conan/index.js.map +1 -1
- package/dist/modules/versioning/conan/range.js +4 -5
- package/dist/modules/versioning/conan/range.js.map +1 -1
- package/dist/modules/versioning/conda/index.js +1 -1
- package/dist/modules/versioning/conda/index.js.map +1 -1
- package/dist/modules/versioning/gradle/index.js +7 -3
- package/dist/modules/versioning/gradle/index.js.map +1 -1
- package/dist/modules/versioning/hermit/index.js +2 -2
- package/dist/modules/versioning/hermit/index.js.map +1 -1
- package/dist/modules/versioning/ivy/index.js +1 -1
- package/dist/modules/versioning/ivy/index.js.map +1 -1
- package/dist/modules/versioning/maven/compare.js +4 -6
- package/dist/modules/versioning/maven/compare.js.map +1 -1
- package/dist/modules/versioning/npm/range.js +5 -7
- package/dist/modules/versioning/npm/range.js.map +1 -1
- package/dist/modules/versioning/nuget/version.js +6 -6
- package/dist/modules/versioning/nuget/version.js.map +1 -1
- package/dist/modules/versioning/pep440/index.js +1 -1
- package/dist/modules/versioning/pep440/index.js.map +1 -1
- package/dist/modules/versioning/pep440/range.js +2 -6
- package/dist/modules/versioning/pep440/range.js.map +1 -1
- package/dist/modules/versioning/poetry/index.js +1 -1
- package/dist/modules/versioning/poetry/index.js.map +1 -1
- package/dist/modules/versioning/pvp/index.js +2 -2
- package/dist/modules/versioning/pvp/index.js.map +1 -1
- package/dist/modules/versioning/rpm/index.js +4 -3
- package/dist/modules/versioning/rpm/index.js.map +1 -1
- package/dist/modules/versioning/ruby/range.js +2 -2
- package/dist/modules/versioning/ruby/range.js.map +1 -1
- package/dist/modules/versioning/ruby/strategies/bump.js +1 -1
- package/dist/modules/versioning/ruby/strategies/bump.js.map +1 -1
- package/dist/modules/versioning/ruby/strategies/replace.js +13 -12
- package/dist/modules/versioning/ruby/strategies/replace.js.map +1 -1
- package/dist/modules/versioning/ruby/version.js +1 -1
- package/dist/modules/versioning/ruby/version.js.map +1 -1
- package/dist/modules/versioning/rust-release-channel/index.js +1 -1
- package/dist/modules/versioning/rust-release-channel/index.js.map +1 -1
- package/dist/modules/versioning/rust-release-channel/util.js +4 -4
- package/dist/modules/versioning/rust-release-channel/util.js.map +1 -1
- package/dist/util/common.js +1 -3
- package/dist/util/common.js.map +1 -1
- package/dist/util/exec/common.js +4 -6
- package/dist/util/exec/common.js.map +1 -1
- package/dist/util/exec/containerbase.js +1 -3
- package/dist/util/exec/containerbase.js.map +1 -1
- package/dist/util/git/instrument.js +3 -3
- package/dist/util/git/instrument.js.map +1 -1
- package/dist/util/github/graphql/datasource-fetcher.js +5 -4
- package/dist/util/github/graphql/datasource-fetcher.js.map +1 -1
- package/dist/util/http/cache/package-http-cache-provider.js.map +1 -1
- package/dist/util/http/github.js +3 -2
- package/dist/util/http/github.js.map +1 -1
- package/dist/util/http/http.d.ts +1 -1
- package/dist/util/http/http.js.map +1 -1
- package/dist/util/result.d.ts +8 -8
- package/dist/util/result.js +1 -1
- package/dist/util/result.js.map +1 -1
- package/dist/util/url.js +2 -2
- package/dist/util/url.js.map +1 -1
- package/dist/workers/global/config/parse/cli.js +18 -20
- package/dist/workers/global/config/parse/cli.js.map +1 -1
- package/dist/workers/global/config/parse/env.js +3 -5
- package/dist/workers/global/config/parse/env.js.map +1 -1
- package/dist/workers/repository/config-migration/branch/index.js +3 -5
- package/dist/workers/repository/config-migration/branch/index.js.map +1 -1
- package/dist/workers/repository/init/merge.js +2 -3
- package/dist/workers/repository/init/merge.js.map +1 -1
- package/dist/workers/repository/onboarding/branch/check.js +7 -9
- package/dist/workers/repository/onboarding/branch/check.js.map +1 -1
- package/dist/workers/repository/onboarding/branch/index.js +4 -8
- package/dist/workers/repository/onboarding/branch/index.js.map +1 -1
- package/dist/workers/repository/onboarding/branch/onboarding-branch-cache.js +2 -2
- package/dist/workers/repository/onboarding/branch/onboarding-branch-cache.js.map +1 -1
- package/dist/workers/repository/process/extract-update.js.map +1 -1
- package/dist/workers/repository/process/fetch.js.map +1 -1
- package/dist/workers/repository/process/libyear.js +1 -3
- package/dist/workers/repository/process/libyear.js.map +1 -1
- package/dist/workers/repository/process/lookup/filter-checks.js +9 -11
- package/dist/workers/repository/process/lookup/filter-checks.js.map +1 -1
- package/dist/workers/repository/process/lookup/index.js +5 -8
- package/dist/workers/repository/process/lookup/index.js.map +1 -1
- package/dist/workers/repository/process/vulnerabilities.js +3 -3
- package/dist/workers/repository/process/vulnerabilities.js.map +1 -1
- package/dist/workers/repository/reconfigure/index.js +3 -5
- package/dist/workers/repository/reconfigure/index.js.map +1 -1
- package/dist/workers/repository/update/branch/bump-versions.js +1 -1
- package/dist/workers/repository/update/branch/bump-versions.js.map +1 -1
- package/dist/workers/repository/update/branch/get-updated.js +3 -5
- package/dist/workers/repository/update/branch/get-updated.js.map +1 -1
- package/dist/workers/repository/update/pr/body/updates-table.js +1 -3
- package/dist/workers/repository/update/pr/body/updates-table.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/common.js +1 -1
- package/dist/workers/repository/update/pr/changelog/common.js.map +1 -1
- package/dist/workers/repository/update/pr/index.js +6 -7
- package/dist/workers/repository/update/pr/index.js.map +1 -1
- package/dist/workers/repository/updates/flatten.js +1 -1
- package/dist/workers/repository/updates/flatten.js.map +1 -1
- package/dist/workers/repository/updates/generate.js +1 -1
- package/dist/workers/repository/updates/generate.js.map +1 -1
- package/package.json +2 -2
- package/renovate-schema.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/flux/extract.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport {\n type Document,\n type Scalar,\n type YAMLMap,\n isMap,\n isPair,\n isScalar,\n parseAllDocuments,\n} from 'yaml';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { isHttpUrl } from '../../../util/url.ts';\nimport { parseYaml } from '../../../util/yaml.ts';\nimport { BitbucketTagsDatasource } from '../../datasource/bitbucket-tags/index.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport { GitRefsDatasource } from '../../datasource/git-refs/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubReleasesDatasource } from '../../datasource/github-releases/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport { GitlabTagsDatasource } from '../../datasource/gitlab-tags/index.ts';\nimport { HelmDatasource } from '../../datasource/helm/index.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport { findDependencies } from '../helm-values/extract.ts';\nimport { isOCIRegistry, removeOCIPrefix } from '../helmv3/oci.ts';\nimport { extractImage } from '../kustomize/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFile,\n PackageFileContent,\n} from '../types.ts';\nimport {\n collectHelmRepos,\n isSystemManifest,\n systemManifestHeaderRegex,\n} from './common.ts';\nimport { FluxResource, type HelmRepository } from './schema.ts';\nimport type {\n FluxManagerData,\n FluxManifest,\n ResourceFluxManifest,\n SystemFluxManifest,\n} from './types.ts';\n\nfunction readManifest(\n content: string,\n packageFile: string,\n): FluxManifest | null {\n if (isSystemManifest(packageFile)) {\n const versionMatch = regEx(systemManifestHeaderRegex).exec(content);\n if (!versionMatch) {\n return null;\n }\n return {\n kind: 'system',\n file: packageFile,\n content,\n version: versionMatch[1],\n components: versionMatch[2],\n };\n }\n\n return {\n kind: 'resource',\n file: packageFile,\n content,\n resources: parseYaml(content, {\n customSchema: FluxResource,\n failureBehaviour: 'filter',\n }),\n };\n}\n\nconst githubUrlRegex = regEx(\n /^(?:https:\\/\\/|git@)github\\.com[/:](?<packageName>[^/]+\\/[^/]+?)(?:\\.git)?$/,\n);\nconst gitlabUrlRegex = regEx(\n /^(?:https:\\/\\/|git@)gitlab\\.com[/:](?<packageName>[^/]+\\/[^/]+?)(?:\\.git)?$/,\n);\nconst bitbucketUrlRegex = regEx(\n /^(?:https:\\/\\/|git@)bitbucket\\.org[/:](?<packageName>[^/]+\\/[^/]+?)(?:\\.git)?$/,\n);\n\nfunction resolveGitRepositoryPerSourceTag(\n dep: PackageDependency,\n gitUrl: string,\n): void {\n const githubMatchGroups = githubUrlRegex.exec(gitUrl)?.groups;\n if (githubMatchGroups) {\n dep.datasource = GithubTagsDatasource.id;\n dep.packageName = githubMatchGroups.packageName;\n dep.sourceUrl = `https://github.com/${dep.packageName}`;\n return;\n }\n\n const gitlabMatchGroups = gitlabUrlRegex.exec(gitUrl)?.groups;\n if (gitlabMatchGroups) {\n dep.datasource = GitlabTagsDatasource.id;\n dep.packageName = gitlabMatchGroups.packageName;\n dep.sourceUrl = `https://gitlab.com/${dep.packageName}`;\n return;\n }\n\n const bitbucketMatchGroups = bitbucketUrlRegex.exec(gitUrl)?.groups;\n if (bitbucketMatchGroups) {\n dep.datasource = BitbucketTagsDatasource.id;\n dep.packageName = bitbucketMatchGroups.packageName;\n dep.sourceUrl = `https://bitbucket.org/${dep.packageName}`;\n return;\n }\n\n dep.datasource = GitTagsDatasource.id;\n dep.packageName = gitUrl;\n if (isHttpUrl(gitUrl)) {\n dep.sourceUrl = gitUrl.replace(/\\.git$/, '');\n }\n}\n\nfunction resolveHelmRepository(\n dep: PackageDependency,\n matchingRepositories: HelmRepository[],\n registryAliases: Record<string, string> | undefined,\n sourceRefName?: string,\n): void {\n if (matchingRepositories.length) {\n dep.registryUrls = matchingRepositories\n .map((repo) => {\n if (repo.spec.type === 'oci' || isOCIRegistry(repo.spec.url)) {\n // Change datasource to Docker\n dep.datasource = DockerDatasource.id;\n // Ensure the URL is a valid OCI path\n dep.packageName = getDep(\n `${removeOCIPrefix(repo.spec.url)}/${dep.depName}`,\n false,\n registryAliases,\n ).packageName;\n return null;\n } else {\n return repo.spec.url;\n }\n })\n .filter(isString);\n\n // if registryUrls is empty, delete it from dep\n if (!dep.registryUrls?.length) {\n delete dep.registryUrls;\n }\n return;\n }\n\n if (sourceRefName && registryAliases) {\n const aliasUrl = registryAliases[sourceRefName];\n if (aliasUrl) {\n if (isOCIRegistry(aliasUrl)) {\n // Treat alias value as an OCI registry URL\n dep.datasource = DockerDatasource.id;\n dep.packageName = getDep(\n `${removeOCIPrefix(aliasUrl)}/${dep.depName}`,\n false,\n registryAliases,\n ).packageName;\n } else {\n dep.registryUrls = [aliasUrl];\n }\n return;\n }\n }\n\n dep.skipReason = 'unknown-registry';\n}\n\nfunction resolveSystemManifest(\n manifest: SystemFluxManifest,\n): PackageDependency<FluxManagerData>[] {\n return [\n {\n depName: 'fluxcd/flux2',\n datasource: GithubReleasesDatasource.id,\n currentValue: manifest.version,\n managerData: {\n components: manifest.components,\n },\n },\n ];\n}\n\n/**\n * Returns all `spec.ref` map nodes for OCIRepository resources matching `resourceName`.\n */\nfunction findOCIRefNodes(\n docs: Document.Parsed[],\n resourceName: string,\n): YAMLMap[] {\n const refNodes: YAMLMap[] = [];\n for (const doc of docs) {\n const docContents = doc.contents;\n if (!isMap(docContents)) {\n continue;\n }\n const kindNode = docContents.get('kind', true);\n if (\n !isScalar(kindNode) ||\n (kindNode.value as unknown) !== 'OCIRepository'\n ) {\n continue;\n }\n const nameNode = docContents.getIn(['metadata', 'name'], true);\n if (!isScalar(nameNode) || nameNode.value !== resourceName) {\n continue;\n }\n const specNode = docContents.get('spec');\n if (!isMap(specNode)) {\n continue;\n }\n const refNode = specNode.get('ref');\n if (isMap(refNode)) {\n refNodes.push(refNode);\n }\n }\n\n return refNodes;\n}\n\nfunction extractOCIRefTagAndDigestRange(\n docs: Document.Parsed[],\n content: string,\n resourceName: string,\n): { replaceString: string; tagFirst: boolean } | null {\n for (const refNode of findOCIRefNodes(docs, resourceName)) {\n let tagKey: Scalar | undefined;\n let tagValue: Scalar | undefined;\n let digestKey: Scalar | undefined;\n let digestValue: Scalar | undefined;\n\n for (const item of refNode.items) {\n if (!isPair(item) || !isScalar(item.key)) {\n continue;\n }\n if (item.key.value === 'tag' && isScalar(item.value)) {\n tagKey = item.key;\n tagValue = item.value;\n } else if (item.key.value === 'digest' && isScalar(item.value)) {\n digestKey = item.key;\n digestValue = item.value;\n }\n }\n\n if (\n !tagKey?.range ||\n !tagValue?.range ||\n !digestKey?.range ||\n !digestValue?.range\n ) {\n continue;\n }\n\n const tagFirst = tagKey.range[0] < digestKey.range[0];\n const start = tagFirst ? tagKey.range[0] : digestKey.range[0];\n const end = tagFirst ? digestValue.range[1] : tagValue.range[1];\n\n return { replaceString: content.slice(start, end), tagFirst };\n }\n\n return null;\n}\n\nfunction extractOCIRefTagRange(\n docs: Document.Parsed[],\n content: string,\n resourceName: string,\n): { replaceString: string; indentation: string } | null {\n for (const refNode of findOCIRefNodes(docs, resourceName)) {\n for (const item of refNode.items) {\n if (\n isPair(item) &&\n isScalar(item.key) &&\n item.key.value === 'tag' &&\n isScalar(item.value) &&\n item.key.range &&\n item.value.range\n ) {\n const keyStart = item.key.range[0];\n const valueEnd = item.value.range[1];\n const lineStart = content.lastIndexOf('\\n', keyStart - 1) + 1;\n return {\n replaceString: content.slice(keyStart, valueEnd),\n indentation: content.slice(lineStart, keyStart),\n };\n }\n }\n }\n\n return null;\n}\n\nfunction resolveResourceManifest(\n manifest: ResourceFluxManifest,\n helmRepositories: HelmRepository[],\n registryAliases: Record<string, string> | undefined,\n content: string,\n): PackageDependency[] {\n let docs: Document.Parsed[] | undefined;\n const deps: PackageDependency[] = [];\n for (const resource of manifest.resources) {\n switch (resource.kind) {\n case 'HelmRelease': {\n if (resource.spec.chartRef) {\n logger.trace(\n 'HelmRelease using chartRef was found, skipping as version will be handled via referenced resource directly',\n );\n } else if (resource.spec.chart) {\n const chartSpec = resource.spec.chart.spec;\n const depName = chartSpec.chart;\n const dep: PackageDependency = {\n depName,\n currentValue: resource.spec.chart.spec.version,\n datasource: HelmDatasource.id,\n };\n\n if (depName.startsWith('./')) {\n dep.skipReason = 'local-chart';\n delete dep.datasource;\n } else {\n const sourceRef = chartSpec.sourceRef;\n const matchingRepositories = helmRepositories.filter(\n (rep) =>\n rep.kind === sourceRef?.kind &&\n rep.metadata.name === sourceRef.name &&\n rep.metadata.namespace ===\n (sourceRef?.namespace ?? resource.metadata?.namespace),\n );\n resolveHelmRepository(\n dep,\n matchingRepositories,\n registryAliases,\n sourceRef?.name,\n );\n }\n deps.push(dep);\n } else {\n logger.debug(\n `invalid or incomplete ${resource.metadata.name} HelmRelease spec, skipping`,\n );\n }\n\n if (resource.spec.values) {\n logger.trace('detecting dependencies in HelmRelease values');\n deps.push(...findDependencies(resource.spec.values, registryAliases));\n }\n break;\n }\n\n case 'HelmChart': {\n if (resource.spec.sourceRef.kind === 'GitRepository') {\n logger.trace(\n 'HelmChart using GitRepository was found, skipping as version will be handled via referenced resource directly',\n );\n continue;\n }\n\n const dep: PackageDependency = {\n depName: resource.spec.chart,\n };\n\n if (resource.spec.sourceRef.kind === 'HelmRepository') {\n dep.currentValue = resource.spec.version;\n dep.datasource = HelmDatasource.id;\n\n const sourceRef = resource.spec.sourceRef;\n const matchingRepositories = helmRepositories.filter(\n (rep) =>\n rep.kind === sourceRef?.kind &&\n rep.metadata.name === sourceRef.name &&\n rep.metadata.namespace === resource.metadata?.namespace,\n );\n resolveHelmRepository(\n dep,\n matchingRepositories,\n registryAliases,\n sourceRef?.name,\n );\n } else {\n dep.skipReason = 'unsupported-datasource';\n }\n deps.push(dep);\n break;\n }\n\n case 'GitRepository': {\n const dep: PackageDependency = {\n depName: resource.metadata.name,\n };\n\n if (resource.spec.ref?.commit) {\n const gitUrl = resource.spec.url;\n dep.currentDigest = resource.spec.ref.commit;\n dep.datasource = GitRefsDatasource.id;\n dep.packageName = gitUrl;\n dep.replaceString = resource.spec.ref.commit;\n if (isHttpUrl(gitUrl)) {\n dep.sourceUrl = gitUrl.replace(/\\.git$/, '');\n }\n if (resource.spec.ref?.branch) {\n dep.currentValue = resource.spec.ref.branch;\n }\n } else if (resource.spec.ref?.tag) {\n dep.currentValue = resource.spec.ref.tag;\n resolveGitRepositoryPerSourceTag(dep, resource.spec.url);\n } else {\n dep.skipReason = 'unversioned-reference';\n }\n deps.push(dep);\n break;\n }\n case 'OCIRepository': {\n const container = removeOCIPrefix(resource.spec.url);\n if (resource.spec.ref?.digest && resource.spec.ref?.tag) {\n const combinedDep = getDep(\n `${container}@${resource.spec.ref.digest}`,\n false,\n registryAliases,\n );\n // Set currentValue to the tag so the docker datasource can look up the image's new digest\n combinedDep.currentValue = resource.spec.ref.tag;\n\n const refRange = extractOCIRefTagAndDigestRange(\n (docs ??= parseAllDocuments(content, { strict: false })),\n content,\n resource.metadata.name,\n );\n if (refRange) {\n combinedDep.replaceString = refRange.replaceString;\n if (refRange.tagFirst) {\n combinedDep.autoReplaceStringTemplate = refRange.replaceString\n .replace(resource.spec.ref.tag, '{{newValue}}')\n .replace(resource.spec.ref.digest, '{{newDigest}}');\n } else {\n combinedDep.autoReplaceStringTemplate = refRange.replaceString\n .replace(resource.spec.ref.digest, '{{newDigest}}')\n .replace(resource.spec.ref.tag, '{{newValue}}');\n }\n } else {\n logger.debug(\n { file: manifest.file, name: resource.metadata.name },\n 'Could not find tag/digest nodes in content, skipping replacement',\n );\n combinedDep.skipReason = 'invalid-value';\n }\n\n deps.push(combinedDep);\n } else if (resource.spec.ref?.digest) {\n const dep = getDep(\n `${container}@${resource.spec.ref.digest}`,\n false,\n registryAliases,\n );\n deps.push(dep);\n } else if (resource.spec.ref?.tag) {\n const dep = getDep(\n `${container}:${resource.spec.ref.tag}`,\n false,\n registryAliases,\n );\n const refTagRange = extractOCIRefTagRange(\n (docs ??= parseAllDocuments(content, { strict: false })),\n content,\n resource.metadata.name,\n );\n if (refTagRange) {\n dep.replaceString = refTagRange.replaceString;\n const newline = content.includes('\\r\\n') ? '\\r\\n' : '\\n';\n dep.autoReplaceStringTemplate = `${refTagRange.replaceString.replace(\n resource.spec.ref.tag,\n '{{newValue}}',\n )}{{#if newDigest}}${newline}${refTagRange.indentation}digest: {{newDigest}}{{/if}}`;\n } else {\n logger.debug(\n { file: manifest.file, name: resource.metadata.name },\n 'Unable to locate tag node for replacement (may be YAML alias or alias reference), digest pinning will not be possible',\n );\n dep.replaceString = resource.spec.ref.tag;\n dep.autoReplaceStringTemplate = '{{newValue}}';\n }\n deps.push(dep);\n } else {\n const dep = getDep(container, false, registryAliases);\n dep.skipReason = 'unversioned-reference';\n deps.push(dep);\n }\n break;\n }\n\n case 'Kustomization': {\n for (const image of coerceArray(resource.spec.images)) {\n const dep = extractImage(image, registryAliases);\n if (dep) {\n deps.push(dep);\n }\n }\n }\n }\n }\n return deps;\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n config?: ExtractConfig,\n): PackageFileContent<FluxManagerData> | null {\n const manifest = readManifest(content, packageFile);\n if (!manifest) {\n return null;\n }\n const helmRepositories = collectHelmRepos([manifest]);\n let deps: PackageDependency[] | null = null;\n switch (manifest.kind) {\n case 'system':\n deps = resolveSystemManifest(manifest);\n break;\n case 'resource': {\n deps = resolveResourceManifest(\n manifest,\n helmRepositories,\n config?.registryAliases,\n content,\n );\n break;\n }\n }\n return deps?.length ? { deps } : null;\n}\n\nexport async function extractAllPackageFiles(\n config: ExtractConfig,\n packageFiles: string[],\n): Promise<PackageFile<FluxManagerData>[] | null> {\n const manifests: FluxManifest[] = [];\n const results: PackageFile<FluxManagerData>[] = [];\n\n for (const file of packageFiles) {\n const content = await readLocalFile(file, 'utf8');\n if (content) {\n const manifest = readManifest(content, file);\n if (manifest) {\n manifests.push(manifest);\n }\n }\n }\n\n const helmRepositories = collectHelmRepos(manifests);\n\n for (const manifest of manifests) {\n let deps: PackageDependency[] | null = null;\n switch (manifest.kind) {\n case 'system':\n deps = resolveSystemManifest(manifest);\n break;\n case 'resource': {\n deps = resolveResourceManifest(\n manifest,\n helmRepositories,\n config.registryAliases,\n manifest.content,\n );\n break;\n }\n }\n if (deps?.length) {\n results.push({\n packageFile: manifest.file,\n deps,\n });\n }\n }\n\n return results.length ? results : null;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA+CA,SAAS,aACP,SACA,aACqB;CACrB,IAAI,iBAAiB,WAAW,GAAG;EACjC,MAAM,eAAe,MAAM,yBAAyB,CAAC,CAAC,KAAK,OAAO;EAClE,IAAI,CAAC,cACH,OAAO;EAET,OAAO;GACL,MAAM;GACN,MAAM;GACN;GACA,SAAS,aAAa;GACtB,YAAY,aAAa;EAC3B;CACF;CAEA,OAAO;EACL,MAAM;EACN,MAAM;EACN;EACA,WAAW,UAAU,SAAS;GAC5B,cAAc;GACd,kBAAkB;EACpB,CAAC;CACH;AACF;AAEA,MAAM,iBAAiB,MACrB,6EACF;AACA,MAAM,iBAAiB,MACrB,6EACF;AACA,MAAM,oBAAoB,MACxB,gFACF;AAEA,SAAS,iCACP,KACA,QACM;CACN,MAAM,oBAAoB,eAAe,KAAK,MAAM,CAAC,EAAE;CACvD,IAAI,mBAAmB;EACrB,IAAI,aAAa,qBAAqB;EACtC,IAAI,cAAc,kBAAkB;EACpC,IAAI,YAAY,sBAAsB,IAAI;EAC1C;CACF;CAEA,MAAM,oBAAoB,eAAe,KAAK,MAAM,CAAC,EAAE;CACvD,IAAI,mBAAmB;EACrB,IAAI,aAAa,qBAAqB;EACtC,IAAI,cAAc,kBAAkB;EACpC,IAAI,YAAY,sBAAsB,IAAI;EAC1C;CACF;CAEA,MAAM,uBAAuB,kBAAkB,KAAK,MAAM,CAAC,EAAE;CAC7D,IAAI,sBAAsB;EACxB,IAAI,aAAa,wBAAwB;EACzC,IAAI,cAAc,qBAAqB;EACvC,IAAI,YAAY,yBAAyB,IAAI;EAC7C;CACF;CAEA,IAAI,aAAa,kBAAkB;CACnC,IAAI,cAAc;CAClB,IAAI,UAAU,MAAM,GAClB,IAAI,YAAY,OAAO,QAAQ,UAAU,EAAE;AAE/C;AAEA,SAAS,sBACP,KACA,sBACA,iBACA,eACM;CACN,IAAI,qBAAqB,QAAQ;EAC/B,IAAI,eAAe,qBAChB,KAAK,SAAS;GACb,IAAI,KAAK,KAAK,SAAS,SAAS,cAAc,KAAK,KAAK,GAAG,GAAG;IAE5D,IAAI,aAAa,iBAAiB;IAElC,IAAI,cAAc,OAChB,GAAG,gBAAgB,KAAK,KAAK,GAAG,EAAE,GAAG,IAAI,WACzC,OACA,eACF,CAAC,CAAC;IACF,OAAO;GACT,OACE,OAAO,KAAK,KAAK;EAErB,CAAC,CAAC,CACD,OAAO,QAAQ;EAGlB,IAAI,CAAC,IAAI,cAAc,QACrB,OAAO,IAAI;EAEb;CACF;CAEA,IAAI,iBAAiB,iBAAiB;EACpC,MAAM,WAAW,gBAAgB;EACjC,IAAI,UAAU;GACZ,IAAI,cAAc,QAAQ,GAAG;IAE3B,IAAI,aAAa,iBAAiB;IAClC,IAAI,cAAc,OAChB,GAAG,gBAAgB,QAAQ,EAAE,GAAG,IAAI,WACpC,OACA,eACF,CAAC,CAAC;GACJ,OACE,IAAI,eAAe,CAAC,QAAQ;GAE9B;EACF;CACF;CAEA,IAAI,aAAa;AACnB;AAEA,SAAS,sBACP,UACsC;CACtC,OAAO,CACL;EACE,SAAS;EACT,YAAY,yBAAyB;EACrC,cAAc,SAAS;EACvB,aAAa,EACX,YAAY,SAAS,WACvB;CACF,CACF;AACF;;;;AAKA,SAAS,gBACP,MACA,cACW;CACX,MAAM,WAAsB,CAAC;CAC7B,KAAK,MAAM,OAAO,MAAM;EACtB,MAAM,cAAc,IAAI;EACxB,IAAI,CAAC,MAAM,WAAW,GACpB;EAEF,MAAM,WAAW,YAAY,IAAI,QAAQ,IAAI;EAC7C,IACE,CAAC,SAAS,QAAQ,KACjB,SAAS,UAAsB,iBAEhC;EAEF,MAAM,WAAW,YAAY,MAAM,CAAC,YAAY,MAAM,GAAG,IAAI;EAC7D,IAAI,CAAC,SAAS,QAAQ,KAAK,SAAS,UAAU,cAC5C;EAEF,MAAM,WAAW,YAAY,IAAI,MAAM;EACvC,IAAI,CAAC,MAAM,QAAQ,GACjB;EAEF,MAAM,UAAU,SAAS,IAAI,KAAK;EAClC,IAAI,MAAM,OAAO,GACf,SAAS,KAAK,OAAO;CAEzB;CAEA,OAAO;AACT;AAEA,SAAS,+BACP,MACA,SACA,cACqD;CACrD,KAAK,MAAM,WAAW,gBAAgB,MAAM,YAAY,GAAG;EACzD,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EAEJ,KAAK,MAAM,QAAQ,QAAQ,OAAO;GAChC,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,SAAS,KAAK,GAAG,GACrC;GAEF,IAAI,KAAK,IAAI,UAAU,SAAS,SAAS,KAAK,KAAK,GAAG;IACpD,SAAS,KAAK;IACd,WAAW,KAAK;GAClB,OAAO,IAAI,KAAK,IAAI,UAAU,YAAY,SAAS,KAAK,KAAK,GAAG;IAC9D,YAAY,KAAK;IACjB,cAAc,KAAK;GACrB;EACF;EAEA,IACE,CAAC,QAAQ,SACT,CAAC,UAAU,SACX,CAAC,WAAW,SACZ,CAAC,aAAa,OAEd;EAGF,MAAM,WAAW,OAAO,MAAM,KAAK,UAAU,MAAM;EACnD,MAAM,QAAQ,WAAW,OAAO,MAAM,KAAK,UAAU,MAAM;EAC3D,MAAM,MAAM,WAAW,YAAY,MAAM,KAAK,SAAS,MAAM;EAE7D,OAAO;GAAE,eAAe,QAAQ,MAAM,OAAO,GAAG;GAAG;EAAS;CAC9D;CAEA,OAAO;AACT;AAEA,SAAS,sBACP,MACA,SACA,cACuD;CACvD,KAAK,MAAM,WAAW,gBAAgB,MAAM,YAAY,GACtD,KAAK,MAAM,QAAQ,QAAQ,OACzB,IACE,OAAO,IAAI,KACX,SAAS,KAAK,GAAG,KACjB,KAAK,IAAI,UAAU,SACnB,SAAS,KAAK,KAAK,KACnB,KAAK,IAAI,SACT,KAAK,MAAM,OACX;EACA,MAAM,WAAW,KAAK,IAAI,MAAM;EAChC,MAAM,WAAW,KAAK,MAAM,MAAM;EAClC,MAAM,YAAY,QAAQ,YAAY,MAAM,WAAW,CAAC,IAAI;EAC5D,OAAO;GACL,eAAe,QAAQ,MAAM,UAAU,QAAQ;GAC/C,aAAa,QAAQ,MAAM,WAAW,QAAQ;EAChD;CACF;CAIJ,OAAO;AACT;AAEA,SAAS,wBACP,UACA,kBACA,iBACA,SACqB;CACrB,IAAI;CACJ,MAAM,OAA4B,CAAC;CACnC,KAAK,MAAM,YAAY,SAAS,WAC9B,QAAQ,SAAS,MAAjB;EACE,KAAK;GACH,IAAI,SAAS,KAAK,UAChB,OAAO,MACL,4GACF;QACK,IAAI,SAAS,KAAK,OAAO;IAC9B,MAAM,YAAY,SAAS,KAAK,MAAM;IACtC,MAAM,UAAU,UAAU;IAC1B,MAAM,MAAyB;KAC7B;KACA,cAAc,SAAS,KAAK,MAAM,KAAK;KACvC,YAAY,eAAe;IAC7B;IAEA,IAAI,QAAQ,WAAW,IAAI,GAAG;KAC5B,IAAI,aAAa;KACjB,OAAO,IAAI;IACb,OAAO;KACL,MAAM,YAAY,UAAU;KAQ5B,sBACE,KAR2B,iBAAiB,QAC3C,QACC,IAAI,SAAS,WAAW,QACxB,IAAI,SAAS,SAAS,UAAU,QAChC,IAAI,SAAS,eACV,WAAW,aAAa,SAAS,UAAU,UAI7B,GACnB,iBACA,WAAW,IACb;IACF;IACA,KAAK,KAAK,GAAG;GACf,OACE,OAAO,MACL,yBAAyB,SAAS,SAAS,KAAK,4BAClD;GAGF,IAAI,SAAS,KAAK,QAAQ;IACxB,OAAO,MAAM,8CAA8C;IAC3D,KAAK,KAAK,GAAG,iBAAiB,SAAS,KAAK,QAAQ,eAAe,CAAC;GACtE;GACA;EAGF,KAAK,aAAa;GAChB,IAAI,SAAS,KAAK,UAAU,SAAS,iBAAiB;IACpD,OAAO,MACL,+GACF;IACA;GACF;GAEA,MAAM,MAAyB,EAC7B,SAAS,SAAS,KAAK,MACzB;GAEA,IAAI,SAAS,KAAK,UAAU,SAAS,kBAAkB;IACrD,IAAI,eAAe,SAAS,KAAK;IACjC,IAAI,aAAa,eAAe;IAEhC,MAAM,YAAY,SAAS,KAAK;IAOhC,sBACE,KAP2B,iBAAiB,QAC3C,QACC,IAAI,SAAS,WAAW,QACxB,IAAI,SAAS,SAAS,UAAU,QAChC,IAAI,SAAS,cAAc,SAAS,UAAU,SAI7B,GACnB,iBACA,WAAW,IACb;GACF,OACE,IAAI,aAAa;GAEnB,KAAK,KAAK,GAAG;GACb;EACF;EAEA,KAAK,iBAAiB;GACpB,MAAM,MAAyB,EAC7B,SAAS,SAAS,SAAS,KAC7B;GAEA,IAAI,SAAS,KAAK,KAAK,QAAQ;IAC7B,MAAM,SAAS,SAAS,KAAK;IAC7B,IAAI,gBAAgB,SAAS,KAAK,IAAI;IACtC,IAAI,aAAa,kBAAkB;IACnC,IAAI,cAAc;IAClB,IAAI,gBAAgB,SAAS,KAAK,IAAI;IACtC,IAAI,UAAU,MAAM,GAClB,IAAI,YAAY,OAAO,QAAQ,UAAU,EAAE;IAE7C,IAAI,SAAS,KAAK,KAAK,QACrB,IAAI,eAAe,SAAS,KAAK,IAAI;GAEzC,OAAO,IAAI,SAAS,KAAK,KAAK,KAAK;IACjC,IAAI,eAAe,SAAS,KAAK,IAAI;IACrC,iCAAiC,KAAK,SAAS,KAAK,GAAG;GACzD,OACE,IAAI,aAAa;GAEnB,KAAK,KAAK,GAAG;GACb;EACF;EACA,KAAK,iBAAiB;GACpB,MAAM,YAAY,gBAAgB,SAAS,KAAK,GAAG;GACnD,IAAI,SAAS,KAAK,KAAK,UAAU,SAAS,KAAK,KAAK,KAAK;IACvD,MAAM,cAAc,OAClB,GAAG,UAAU,GAAG,SAAS,KAAK,IAAI,UAClC,OACA,eACF;IAEA,YAAY,eAAe,SAAS,KAAK,IAAI;IAE7C,MAAM,WAAW,+BACd,SAAS,kBAAkB,SAAS,EAAE,QAAQ,MAAM,CAAC,GACtD,SACA,SAAS,SAAS,IACpB;IACA,IAAI,UAAU;KACZ,YAAY,gBAAgB,SAAS;KACrC,IAAI,SAAS,UACX,YAAY,4BAA4B,SAAS,cAC9C,QAAQ,SAAS,KAAK,IAAI,KAAK,cAAc,CAAC,CAC9C,QAAQ,SAAS,KAAK,IAAI,QAAQ,eAAe;UAEpD,YAAY,4BAA4B,SAAS,cAC9C,QAAQ,SAAS,KAAK,IAAI,QAAQ,eAAe,CAAC,CAClD,QAAQ,SAAS,KAAK,IAAI,KAAK,cAAc;IAEpD,OAAO;KACL,OAAO,MACL;MAAE,MAAM,SAAS;MAAM,MAAM,SAAS,SAAS;KAAK,GACpD,kEACF;KACA,YAAY,aAAa;IAC3B;IAEA,KAAK,KAAK,WAAW;GACvB,OAAO,IAAI,SAAS,KAAK,KAAK,QAAQ;IACpC,MAAM,MAAM,OACV,GAAG,UAAU,GAAG,SAAS,KAAK,IAAI,UAClC,OACA,eACF;IACA,KAAK,KAAK,GAAG;GACf,OAAO,IAAI,SAAS,KAAK,KAAK,KAAK;IACjC,MAAM,MAAM,OACV,GAAG,UAAU,GAAG,SAAS,KAAK,IAAI,OAClC,OACA,eACF;IACA,MAAM,cAAc,sBACjB,SAAS,kBAAkB,SAAS,EAAE,QAAQ,MAAM,CAAC,GACtD,SACA,SAAS,SAAS,IACpB;IACA,IAAI,aAAa;KACf,IAAI,gBAAgB,YAAY;KAChC,MAAM,UAAU,QAAQ,SAAS,MAAM,IAAI,SAAS;KACpD,IAAI,4BAA4B,GAAG,YAAY,cAAc,QAC3D,SAAS,KAAK,IAAI,KAClB,cACF,EAAE,mBAAmB,UAAU,YAAY,YAAY;IACzD,OAAO;KACL,OAAO,MACL;MAAE,MAAM,SAAS;MAAM,MAAM,SAAS,SAAS;KAAK,GACpD,uHACF;KACA,IAAI,gBAAgB,SAAS,KAAK,IAAI;KACtC,IAAI,4BAA4B;IAClC;IACA,KAAK,KAAK,GAAG;GACf,OAAO;IACL,MAAM,MAAM,OAAO,WAAW,OAAO,eAAe;IACpD,IAAI,aAAa;IACjB,KAAK,KAAK,GAAG;GACf;GACA;EACF;EAEA,KAAK,iBACH,KAAK,MAAM,SAAS,YAAY,SAAS,KAAK,MAAM,GAAG;GACrD,MAAM,MAAM,aAAa,OAAO,eAAe;GAC/C,IAAI,KACF,KAAK,KAAK,GAAG;EAEjB;CAEJ;CAEF,OAAO;AACT;AAEA,SAAgB,mBACd,SACA,aACA,QAC4C;CAC5C,MAAM,WAAW,aAAa,SAAS,WAAW;CAClD,IAAI,CAAC,UACH,OAAO;CAET,MAAM,mBAAmB,iBAAiB,CAAC,QAAQ,CAAC;CACpD,IAAI,OAAmC;CACvC,QAAQ,SAAS,MAAjB;EACE,KAAK;GACH,OAAO,sBAAsB,QAAQ;GACrC;EACF,KAAK;GACH,OAAO,wBACL,UACA,kBACA,QAAQ,iBACR,OACF;GACA;CAEJ;CACA,OAAO,MAAM,SAAS,EAAE,KAAK,IAAI;AACnC;AAEA,eAAsB,uBACpB,QACA,cACgD;CAChD,MAAM,YAA4B,CAAC;CACnC,MAAM,UAA0C,CAAC;CAEjD,KAAK,MAAM,QAAQ,cAAc;EAC/B,MAAM,UAAU,MAAM,cAAc,MAAM,MAAM;EAChD,IAAI,SAAS;GACX,MAAM,WAAW,aAAa,SAAS,IAAI;GAC3C,IAAI,UACF,UAAU,KAAK,QAAQ;EAE3B;CACF;CAEA,MAAM,mBAAmB,iBAAiB,SAAS;CAEnD,KAAK,MAAM,YAAY,WAAW;EAChC,IAAI,OAAmC;EACvC,QAAQ,SAAS,MAAjB;GACE,KAAK;IACH,OAAO,sBAAsB,QAAQ;IACrC;GACF,KAAK;IACH,OAAO,wBACL,UACA,kBACA,OAAO,iBACP,SAAS,OACX;IACA;EAEJ;EACA,IAAI,MAAM,QACR,QAAQ,KAAK;GACX,aAAa,SAAS;GACtB;EACF,CAAC;CAEL;CAEA,OAAO,QAAQ,SAAS,UAAU;AACpC"}
|
|
1
|
+
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/flux/extract.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport {\n type Document,\n type Scalar,\n type YAMLMap,\n isMap,\n isPair,\n isScalar,\n parseAllDocuments,\n} from 'yaml';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { isHttpUrl } from '../../../util/url.ts';\nimport { parseYaml } from '../../../util/yaml.ts';\nimport { BitbucketTagsDatasource } from '../../datasource/bitbucket-tags/index.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport { GitRefsDatasource } from '../../datasource/git-refs/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubReleasesDatasource } from '../../datasource/github-releases/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport { GitlabTagsDatasource } from '../../datasource/gitlab-tags/index.ts';\nimport { HelmDatasource } from '../../datasource/helm/index.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport { findDependencies } from '../helm-values/extract.ts';\nimport { isOCIRegistry, removeOCIPrefix } from '../helmv3/oci.ts';\nimport { extractImage } from '../kustomize/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFile,\n PackageFileContent,\n} from '../types.ts';\nimport {\n collectHelmRepos,\n isSystemManifest,\n systemManifestHeaderRegex,\n} from './common.ts';\nimport { FluxResource, type HelmRepository } from './schema.ts';\nimport type {\n FluxManagerData,\n FluxManifest,\n ResourceFluxManifest,\n SystemFluxManifest,\n} from './types.ts';\n\nfunction readManifest(\n content: string,\n packageFile: string,\n): FluxManifest | null {\n if (isSystemManifest(packageFile)) {\n const versionMatch = regEx(systemManifestHeaderRegex).exec(content);\n if (!versionMatch) {\n return null;\n }\n return {\n kind: 'system',\n file: packageFile,\n content,\n version: versionMatch[1],\n components: versionMatch[2],\n };\n }\n\n return {\n kind: 'resource',\n file: packageFile,\n content,\n resources: parseYaml(content, {\n customSchema: FluxResource,\n failureBehaviour: 'filter',\n }),\n };\n}\n\nconst githubUrlRegex = regEx(\n /^(?:https:\\/\\/|git@)github\\.com[/:](?<packageName>[^/]+\\/[^/]+?)(?:\\.git)?$/,\n);\nconst gitlabUrlRegex = regEx(\n /^(?:https:\\/\\/|git@)gitlab\\.com[/:](?<packageName>[^/]+\\/[^/]+?)(?:\\.git)?$/,\n);\nconst bitbucketUrlRegex = regEx(\n /^(?:https:\\/\\/|git@)bitbucket\\.org[/:](?<packageName>[^/]+\\/[^/]+?)(?:\\.git)?$/,\n);\n\nfunction resolveGitRepositoryPerSourceTag(\n dep: PackageDependency,\n gitUrl: string,\n): void {\n const githubMatchGroups = githubUrlRegex.exec(gitUrl)?.groups;\n if (githubMatchGroups) {\n dep.datasource = GithubTagsDatasource.id;\n dep.packageName = githubMatchGroups.packageName;\n dep.sourceUrl = `https://github.com/${dep.packageName}`;\n return;\n }\n\n const gitlabMatchGroups = gitlabUrlRegex.exec(gitUrl)?.groups;\n if (gitlabMatchGroups) {\n dep.datasource = GitlabTagsDatasource.id;\n dep.packageName = gitlabMatchGroups.packageName;\n dep.sourceUrl = `https://gitlab.com/${dep.packageName}`;\n return;\n }\n\n const bitbucketMatchGroups = bitbucketUrlRegex.exec(gitUrl)?.groups;\n if (bitbucketMatchGroups) {\n dep.datasource = BitbucketTagsDatasource.id;\n dep.packageName = bitbucketMatchGroups.packageName;\n dep.sourceUrl = `https://bitbucket.org/${dep.packageName}`;\n return;\n }\n\n dep.datasource = GitTagsDatasource.id;\n dep.packageName = gitUrl;\n if (isHttpUrl(gitUrl)) {\n dep.sourceUrl = gitUrl.replace(/\\.git$/, '');\n }\n}\n\nfunction resolveHelmRepository(\n dep: PackageDependency,\n matchingRepositories: HelmRepository[],\n registryAliases: Record<string, string> | undefined,\n sourceRefName?: string,\n): void {\n if (matchingRepositories.length) {\n dep.registryUrls = matchingRepositories\n .map((repo) => {\n if (repo.spec.type === 'oci' || isOCIRegistry(repo.spec.url)) {\n // Change datasource to Docker\n dep.datasource = DockerDatasource.id;\n // Ensure the URL is a valid OCI path\n dep.packageName = getDep(\n `${removeOCIPrefix(repo.spec.url)}/${dep.depName}`,\n false,\n registryAliases,\n ).packageName;\n return null;\n }\n return repo.spec.url;\n })\n .filter(isString);\n\n // if registryUrls is empty, delete it from dep\n if (!dep.registryUrls?.length) {\n delete dep.registryUrls;\n }\n return;\n }\n\n if (sourceRefName && registryAliases) {\n const aliasUrl = registryAliases[sourceRefName];\n if (aliasUrl) {\n if (isOCIRegistry(aliasUrl)) {\n // Treat alias value as an OCI registry URL\n dep.datasource = DockerDatasource.id;\n dep.packageName = getDep(\n `${removeOCIPrefix(aliasUrl)}/${dep.depName}`,\n false,\n registryAliases,\n ).packageName;\n } else {\n dep.registryUrls = [aliasUrl];\n }\n return;\n }\n }\n\n dep.skipReason = 'unknown-registry';\n}\n\nfunction resolveSystemManifest(\n manifest: SystemFluxManifest,\n): PackageDependency<FluxManagerData>[] {\n return [\n {\n depName: 'fluxcd/flux2',\n datasource: GithubReleasesDatasource.id,\n currentValue: manifest.version,\n managerData: {\n components: manifest.components,\n },\n },\n ];\n}\n\n/**\n * Returns all `spec.ref` map nodes for OCIRepository resources matching `resourceName`.\n */\nfunction findOCIRefNodes(\n docs: Document.Parsed[],\n resourceName: string,\n): YAMLMap[] {\n const refNodes: YAMLMap[] = [];\n for (const doc of docs) {\n const docContents = doc.contents;\n if (!isMap(docContents)) {\n continue;\n }\n const kindNode = docContents.get('kind', true);\n if (\n !isScalar(kindNode) ||\n (kindNode.value as unknown) !== 'OCIRepository'\n ) {\n continue;\n }\n const nameNode = docContents.getIn(['metadata', 'name'], true);\n if (!isScalar(nameNode) || nameNode.value !== resourceName) {\n continue;\n }\n const specNode = docContents.get('spec');\n if (!isMap(specNode)) {\n continue;\n }\n const refNode = specNode.get('ref');\n if (isMap(refNode)) {\n refNodes.push(refNode);\n }\n }\n\n return refNodes;\n}\n\nfunction extractOCIRefTagAndDigestRange(\n docs: Document.Parsed[],\n content: string,\n resourceName: string,\n): { replaceString: string; tagFirst: boolean } | null {\n for (const refNode of findOCIRefNodes(docs, resourceName)) {\n let tagKey: Scalar | undefined;\n let tagValue: Scalar | undefined;\n let digestKey: Scalar | undefined;\n let digestValue: Scalar | undefined;\n\n for (const item of refNode.items) {\n if (!isPair(item) || !isScalar(item.key)) {\n continue;\n }\n if (item.key.value === 'tag' && isScalar(item.value)) {\n tagKey = item.key;\n tagValue = item.value;\n } else if (item.key.value === 'digest' && isScalar(item.value)) {\n digestKey = item.key;\n digestValue = item.value;\n }\n }\n\n if (\n !tagKey?.range ||\n !tagValue?.range ||\n !digestKey?.range ||\n !digestValue?.range\n ) {\n continue;\n }\n\n const tagFirst = tagKey.range[0] < digestKey.range[0];\n const start = tagFirst ? tagKey.range[0] : digestKey.range[0];\n const end = tagFirst ? digestValue.range[1] : tagValue.range[1];\n\n return { replaceString: content.slice(start, end), tagFirst };\n }\n\n return null;\n}\n\nfunction extractOCIRefTagRange(\n docs: Document.Parsed[],\n content: string,\n resourceName: string,\n): { replaceString: string; indentation: string } | null {\n for (const refNode of findOCIRefNodes(docs, resourceName)) {\n for (const item of refNode.items) {\n if (\n isPair(item) &&\n isScalar(item.key) &&\n item.key.value === 'tag' &&\n isScalar(item.value) &&\n item.key.range &&\n item.value.range\n ) {\n const keyStart = item.key.range[0];\n const valueEnd = item.value.range[1];\n const lineStart = content.lastIndexOf('\\n', keyStart - 1) + 1;\n return {\n replaceString: content.slice(keyStart, valueEnd),\n indentation: content.slice(lineStart, keyStart),\n };\n }\n }\n }\n\n return null;\n}\n\nfunction resolveResourceManifest(\n manifest: ResourceFluxManifest,\n helmRepositories: HelmRepository[],\n registryAliases: Record<string, string> | undefined,\n content: string,\n): PackageDependency[] {\n let docs: Document.Parsed[] | undefined;\n const deps: PackageDependency[] = [];\n for (const resource of manifest.resources) {\n switch (resource.kind) {\n case 'HelmRelease': {\n if (resource.spec.chartRef) {\n logger.trace(\n 'HelmRelease using chartRef was found, skipping as version will be handled via referenced resource directly',\n );\n } else if (resource.spec.chart) {\n const chartSpec = resource.spec.chart.spec;\n const depName = chartSpec.chart;\n const dep: PackageDependency = {\n depName,\n currentValue: resource.spec.chart.spec.version,\n datasource: HelmDatasource.id,\n };\n\n if (depName.startsWith('./')) {\n dep.skipReason = 'local-chart';\n delete dep.datasource;\n } else {\n const sourceRef = chartSpec.sourceRef;\n const matchingRepositories = helmRepositories.filter(\n (rep) =>\n rep.kind === sourceRef?.kind &&\n rep.metadata.name === sourceRef.name &&\n rep.metadata.namespace ===\n (sourceRef?.namespace ?? resource.metadata?.namespace),\n );\n resolveHelmRepository(\n dep,\n matchingRepositories,\n registryAliases,\n sourceRef?.name,\n );\n }\n deps.push(dep);\n } else {\n logger.debug(\n `invalid or incomplete ${resource.metadata.name} HelmRelease spec, skipping`,\n );\n }\n\n if (resource.spec.values) {\n logger.trace('detecting dependencies in HelmRelease values');\n deps.push(...findDependencies(resource.spec.values, registryAliases));\n }\n break;\n }\n\n case 'HelmChart': {\n if (resource.spec.sourceRef.kind === 'GitRepository') {\n logger.trace(\n 'HelmChart using GitRepository was found, skipping as version will be handled via referenced resource directly',\n );\n continue;\n }\n\n const dep: PackageDependency = {\n depName: resource.spec.chart,\n };\n\n if (resource.spec.sourceRef.kind === 'HelmRepository') {\n dep.currentValue = resource.spec.version;\n dep.datasource = HelmDatasource.id;\n\n const sourceRef = resource.spec.sourceRef;\n const matchingRepositories = helmRepositories.filter(\n (rep) =>\n rep.kind === sourceRef?.kind &&\n rep.metadata.name === sourceRef.name &&\n rep.metadata.namespace === resource.metadata?.namespace,\n );\n resolveHelmRepository(\n dep,\n matchingRepositories,\n registryAliases,\n sourceRef?.name,\n );\n } else {\n dep.skipReason = 'unsupported-datasource';\n }\n deps.push(dep);\n break;\n }\n\n case 'GitRepository': {\n const dep: PackageDependency = {\n depName: resource.metadata.name,\n };\n\n if (resource.spec.ref?.commit) {\n const gitUrl = resource.spec.url;\n dep.currentDigest = resource.spec.ref.commit;\n dep.datasource = GitRefsDatasource.id;\n dep.packageName = gitUrl;\n dep.replaceString = resource.spec.ref.commit;\n if (isHttpUrl(gitUrl)) {\n dep.sourceUrl = gitUrl.replace(/\\.git$/, '');\n }\n if (resource.spec.ref?.branch) {\n dep.currentValue = resource.spec.ref.branch;\n }\n } else if (resource.spec.ref?.tag) {\n dep.currentValue = resource.spec.ref.tag;\n resolveGitRepositoryPerSourceTag(dep, resource.spec.url);\n } else {\n dep.skipReason = 'unversioned-reference';\n }\n deps.push(dep);\n break;\n }\n case 'OCIRepository': {\n const container = removeOCIPrefix(resource.spec.url);\n if (resource.spec.ref?.digest && resource.spec.ref?.tag) {\n const combinedDep = getDep(\n `${container}@${resource.spec.ref.digest}`,\n false,\n registryAliases,\n );\n // Set currentValue to the tag so the docker datasource can look up the image's new digest\n combinedDep.currentValue = resource.spec.ref.tag;\n\n const refRange = extractOCIRefTagAndDigestRange(\n (docs ??= parseAllDocuments(content, { strict: false })),\n content,\n resource.metadata.name,\n );\n if (refRange) {\n combinedDep.replaceString = refRange.replaceString;\n if (refRange.tagFirst) {\n combinedDep.autoReplaceStringTemplate = refRange.replaceString\n .replace(resource.spec.ref.tag, '{{newValue}}')\n .replace(resource.spec.ref.digest, '{{newDigest}}');\n } else {\n combinedDep.autoReplaceStringTemplate = refRange.replaceString\n .replace(resource.spec.ref.digest, '{{newDigest}}')\n .replace(resource.spec.ref.tag, '{{newValue}}');\n }\n } else {\n logger.debug(\n { file: manifest.file, name: resource.metadata.name },\n 'Could not find tag/digest nodes in content, skipping replacement',\n );\n combinedDep.skipReason = 'invalid-value';\n }\n\n deps.push(combinedDep);\n } else if (resource.spec.ref?.digest) {\n const dep = getDep(\n `${container}@${resource.spec.ref.digest}`,\n false,\n registryAliases,\n );\n deps.push(dep);\n } else if (resource.spec.ref?.tag) {\n const dep = getDep(\n `${container}:${resource.spec.ref.tag}`,\n false,\n registryAliases,\n );\n const refTagRange = extractOCIRefTagRange(\n (docs ??= parseAllDocuments(content, { strict: false })),\n content,\n resource.metadata.name,\n );\n if (refTagRange) {\n dep.replaceString = refTagRange.replaceString;\n const newline = content.includes('\\r\\n') ? '\\r\\n' : '\\n';\n dep.autoReplaceStringTemplate = `${refTagRange.replaceString.replace(\n resource.spec.ref.tag,\n '{{newValue}}',\n )}{{#if newDigest}}${newline}${refTagRange.indentation}digest: {{newDigest}}{{/if}}`;\n } else {\n logger.debug(\n { file: manifest.file, name: resource.metadata.name },\n 'Unable to locate tag node for replacement (may be YAML alias or alias reference), digest pinning will not be possible',\n );\n dep.replaceString = resource.spec.ref.tag;\n dep.autoReplaceStringTemplate = '{{newValue}}';\n }\n deps.push(dep);\n } else {\n const dep = getDep(container, false, registryAliases);\n dep.skipReason = 'unversioned-reference';\n deps.push(dep);\n }\n break;\n }\n\n case 'Kustomization': {\n for (const image of coerceArray(resource.spec.images)) {\n const dep = extractImage(image, registryAliases);\n if (dep) {\n deps.push(dep);\n }\n }\n }\n }\n }\n return deps;\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n config?: ExtractConfig,\n): PackageFileContent<FluxManagerData> | null {\n const manifest = readManifest(content, packageFile);\n if (!manifest) {\n return null;\n }\n const helmRepositories = collectHelmRepos([manifest]);\n let deps: PackageDependency[] | null = null;\n switch (manifest.kind) {\n case 'system':\n deps = resolveSystemManifest(manifest);\n break;\n case 'resource': {\n deps = resolveResourceManifest(\n manifest,\n helmRepositories,\n config?.registryAliases,\n content,\n );\n break;\n }\n }\n return deps?.length ? { deps } : null;\n}\n\nexport async function extractAllPackageFiles(\n config: ExtractConfig,\n packageFiles: string[],\n): Promise<PackageFile<FluxManagerData>[] | null> {\n const manifests: FluxManifest[] = [];\n const results: PackageFile<FluxManagerData>[] = [];\n\n for (const file of packageFiles) {\n const content = await readLocalFile(file, 'utf8');\n if (content) {\n const manifest = readManifest(content, file);\n if (manifest) {\n manifests.push(manifest);\n }\n }\n }\n\n const helmRepositories = collectHelmRepos(manifests);\n\n for (const manifest of manifests) {\n let deps: PackageDependency[] | null = null;\n switch (manifest.kind) {\n case 'system':\n deps = resolveSystemManifest(manifest);\n break;\n case 'resource': {\n deps = resolveResourceManifest(\n manifest,\n helmRepositories,\n config.registryAliases,\n manifest.content,\n );\n break;\n }\n }\n if (deps?.length) {\n results.push({\n packageFile: manifest.file,\n deps,\n });\n }\n }\n\n return results.length ? results : null;\n}\n"],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@ function splitFirst(str, sep) {
|
|
|
12
12
|
function parseQuote(input) {
|
|
13
13
|
const trimmed = input.trim();
|
|
14
14
|
const first = trimmed[0];
|
|
15
|
-
const last = trimmed
|
|
15
|
+
const last = trimmed.at(-1);
|
|
16
16
|
if (trimmed.length >= 2 && first === last && (first === "\"" || first === "'")) return {
|
|
17
17
|
value: trimmed.slice(1, -1),
|
|
18
18
|
quote: first
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse.js","names":[],"sources":["../../../../lib/modules/manager/github-actions/parse.ts"],"sourcesContent":["import is from '@sindresorhus/is';\nimport { regEx } from '../../../util/regex.ts';\n\nfunction splitFirstFrom(\n str: string,\n sep: string,\n start: number,\n): [string, string] | null {\n const idx = str.indexOf(sep, start);\n if (idx === -1) {\n return null;\n }\n return [str.slice(0, idx), str.slice(idx + sep.length)];\n}\n\nfunction splitFirst(str: string, sep: string): [string, string] | null {\n return splitFirstFrom(str, sep, 0);\n}\n\ninterface QuotedValue {\n value: string;\n quote: string;\n}\n\nexport function parseQuote(input: string): QuotedValue {\n const trimmed = input.trim();\n const first = trimmed[0];\n const last = trimmed[trimmed.length - 1];\n\n if (\n trimmed.length >= 2 &&\n first === last &&\n (first === '\"' || first === \"'\")\n ) {\n return { value: trimmed.slice(1, -1), quote: first };\n }\n\n return { value: trimmed, quote: '' };\n}\n\n/**\n * Docker container:\n * - `docker://image:tag`\n * - `docker://image@digest`\n * - `docker://image:tag@digest`\n */\nexport interface DockerReference {\n kind: 'docker';\n image: string;\n tag?: string;\n digest?: string;\n originalRef: string;\n}\n\n/**\n * Local file or directory:\n * - `./path/to/action`\n * - `./.github/workflows/main.yml`\n */\nexport interface LocalReference {\n kind: 'local';\n path: string;\n}\n\n/**\n * Repository:\n * - `owner/repo[/path]@ref`\n * - `https://host/owner/repo[/path]@ref`\n */\nexport interface RepositoryReference {\n kind: 'repository';\n\n hostname: string;\n isExplicitHostname: boolean;\n\n owner: string;\n repo: string;\n path?: string;\n\n ref: string;\n}\n\nexport type ActionReference =\n | DockerReference\n | LocalReference\n | RepositoryReference;\n\nexport interface ParsedUsesLine {\n /** The whitespace before \"uses:\" */\n indentation: string;\n\n /** The `uses:` (and optional `-`) part */\n usesPrefix: string;\n\n /** The raw value part, potentially quoted (e.g. `actions/checkout@v2`) */\n replaceString: string;\n\n /** Whitespace between value and `#` */\n commentPrecedingWhitespace: string;\n\n /** The full comment including `#` */\n commentString: string;\n\n actionRef: ActionReference | null;\n commentData: CommentData;\n\n /** The quote char used (' or \" or empty) */\n quote: string;\n}\n\nconst shaRe = regEx(/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/);\nconst shaShortRe = regEx(/^[a-f0-9]{6,7}$/);\n\nexport function isSha(str: string): boolean {\n return shaRe.test(str);\n}\n\nexport function isShortSha(str: string): boolean {\n return shaShortRe.test(str);\n}\n\nconst DOCKER_PREFIX = 'docker://';\n\nfunction parseDockerReference(input: string): DockerReference | null {\n const originalRef = input.slice(DOCKER_PREFIX.length);\n if (!originalRef) {\n return null;\n }\n\n const digestParts = splitFirst(originalRef, '@');\n if (digestParts) {\n const [image, digest] = digestParts;\n return { kind: 'docker', image, digest, originalRef };\n }\n\n // Find tag: look for first colon after last slash (to avoid matching port in registry)\n const lastSlashIndex = originalRef.lastIndexOf('/');\n const searchStart = lastSlashIndex === -1 ? 0 : lastSlashIndex + 1;\n const tagParts = splitFirstFrom(originalRef, ':', searchStart);\n\n if (tagParts) {\n const [image, tag] = tagParts;\n return { kind: 'docker', image, tag, originalRef };\n }\n\n return { kind: 'docker', image: originalRef, originalRef };\n}\n\nconst repositoryActionRegex = regEx(\n /^(?:https:\\/\\/(?<hostname>[^/]+)\\/)?(?<owner>[^/]+)\\/(?<repo>[^/]+)(?:\\/(?<path>.+?))?@(?<ref>.+)$/,\n);\n\nfunction parseRepositoryReference(input: string): RepositoryReference | null {\n const match = repositoryActionRegex.exec(input);\n if (!match?.groups) {\n return null;\n }\n\n const { owner, repo, path, ref } = match.groups;\n\n let { hostname } = match.groups;\n let isExplicitHostname = true;\n if (is.undefined(hostname)) {\n hostname = 'github.com';\n isExplicitHostname = false;\n }\n\n return {\n kind: 'repository',\n hostname,\n isExplicitHostname,\n owner,\n repo,\n path,\n ref,\n };\n}\n\nexport function parseActionReference(uses: string): ActionReference | null {\n if (!uses) {\n return null;\n }\n\n if (uses.startsWith(DOCKER_PREFIX)) {\n return parseDockerReference(uses);\n }\n\n if (uses.startsWith('./') || uses.startsWith('../')) {\n return { kind: 'local', path: uses };\n }\n\n return parseRepositoryReference(uses);\n}\n\nexport interface CommentData {\n pinnedVersion?: string;\n ref?: string;\n ratchetExclude?: boolean;\n matchedString?: string;\n index?: number;\n}\n\nconst pinTokenRe = regEx(\n /^\\s*(?:(?:renovate\\s*:\\s*)?(?:pin\\s+|tag\\s*=\\s*)?|(?:ratchet:[\\w-]+\\/[.\\w-]+))?@?(?<version>([\\w-]*[-/])?v?\\d+(?:\\.\\d+(?:\\.\\d+)?)?(?:-[a-zA-Z0-9.]+)?)/,\n);\n\nexport const versionLikeRe = regEx(/^v?\\d+/);\n\nconst bareTokenRe = regEx(/^\\s*(?<token>\\S+)\\s*$/);\n\nexport function parseComment(commentBody: string): CommentData {\n const trimmed = commentBody.trim();\n if (trimmed === 'ratchet:exclude') {\n return { ratchetExclude: true };\n }\n\n // We use commentBody (with leading spaces) to get the correct index relative to the comment start\n const match = pinTokenRe.exec(commentBody);\n if (match?.groups?.version) {\n return {\n pinnedVersion: match.groups.version,\n matchedString: match[0],\n index: match.index,\n };\n }\n\n const bareMatch = bareTokenRe.exec(commentBody);\n if (bareMatch?.groups?.token) {\n return {\n ref: bareMatch.groups.token,\n matchedString: bareMatch[0],\n index: bareMatch.index,\n };\n }\n\n return {};\n}\n\nconst usesLineRegex = regEx(\n /^(?<prefix>\\s+(?:-\\s+)?uses\\s*:\\s*)(?<remainder>.+)$/,\n);\n\n/**\n * Parses a GitHub Actions `uses:` line into its components.\n *\n * Expected line format:\n * ```\n * <indentation>[- ]uses: [quote]<action-reference>[quote][ # <comment>]\n * ```\n *\n * Examples:\n * - ` uses: actions/checkout@v4`\n * - ` - uses: \"owner/repo@abc123\" # v1.0.0`\n * - ` uses: docker://alpine:3.18`\n *\n * @returns Parsed components or `null` if the line doesn't match `uses:` pattern\n */\nexport function parseUsesLine(line: string): ParsedUsesLine | null {\n const match = usesLineRegex.exec(line);\n if (!match?.groups) {\n return null;\n }\n\n const { prefix, remainder } = match.groups;\n\n if (remainder.startsWith('#')) {\n return null;\n }\n\n const indentation = prefix.slice(0, prefix.indexOf('uses'));\n\n // We look for ' #' to determine where the comment starts.\n // This is a safe heuristic for valid \"uses\" values which cannot contain spaces.\n const commentIndex = remainder.indexOf(' #');\n\n // No comment case\n if (commentIndex === -1) {\n const { value, quote } = parseQuote(remainder);\n return {\n indentation,\n usesPrefix: prefix,\n replaceString: remainder.trim(),\n commentPrecedingWhitespace: '',\n commentString: '',\n actionRef: parseActionReference(value),\n commentData: {},\n quote,\n };\n }\n\n // Has comment: split value and comment\n const rawValuePart = remainder.slice(0, commentIndex);\n const commentPart = remainder.slice(commentIndex + 1); // starts at #\n\n // Calculate whitespace between value and #\n const partBeforeHash = remainder.slice(0, commentIndex + 1);\n const commentPrecedingWhitespace = partBeforeHash.slice(\n partBeforeHash.trimEnd().length,\n );\n\n const { value, quote } = parseQuote(rawValuePart);\n // commentPart always starts with '#' (see commentIndex search above)\n const cleanCommentBody = commentPart.slice(1);\n\n return {\n indentation,\n usesPrefix: prefix,\n replaceString: rawValuePart.trim(),\n commentPrecedingWhitespace,\n commentString: commentPart,\n actionRef: parseActionReference(value),\n commentData: parseComment(cleanCommentBody),\n quote,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parse.js","names":[],"sources":["../../../../lib/modules/manager/github-actions/parse.ts"],"sourcesContent":["import is from '@sindresorhus/is';\nimport { regEx } from '../../../util/regex.ts';\n\nfunction splitFirstFrom(\n str: string,\n sep: string,\n start: number,\n): [string, string] | null {\n const idx = str.indexOf(sep, start);\n if (idx === -1) {\n return null;\n }\n return [str.slice(0, idx), str.slice(idx + sep.length)];\n}\n\nfunction splitFirst(str: string, sep: string): [string, string] | null {\n return splitFirstFrom(str, sep, 0);\n}\n\ninterface QuotedValue {\n value: string;\n quote: string;\n}\n\nexport function parseQuote(input: string): QuotedValue {\n const trimmed = input.trim();\n const first = trimmed[0];\n const last = trimmed.at(-1);\n\n if (\n trimmed.length >= 2 &&\n first === last &&\n (first === '\"' || first === \"'\")\n ) {\n return { value: trimmed.slice(1, -1), quote: first };\n }\n\n return { value: trimmed, quote: '' };\n}\n\n/**\n * Docker container:\n * - `docker://image:tag`\n * - `docker://image@digest`\n * - `docker://image:tag@digest`\n */\nexport interface DockerReference {\n kind: 'docker';\n image: string;\n tag?: string;\n digest?: string;\n originalRef: string;\n}\n\n/**\n * Local file or directory:\n * - `./path/to/action`\n * - `./.github/workflows/main.yml`\n */\nexport interface LocalReference {\n kind: 'local';\n path: string;\n}\n\n/**\n * Repository:\n * - `owner/repo[/path]@ref`\n * - `https://host/owner/repo[/path]@ref`\n */\nexport interface RepositoryReference {\n kind: 'repository';\n\n hostname: string;\n isExplicitHostname: boolean;\n\n owner: string;\n repo: string;\n path?: string;\n\n ref: string;\n}\n\nexport type ActionReference =\n | DockerReference\n | LocalReference\n | RepositoryReference;\n\nexport interface ParsedUsesLine {\n /** The whitespace before \"uses:\" */\n indentation: string;\n\n /** The `uses:` (and optional `-`) part */\n usesPrefix: string;\n\n /** The raw value part, potentially quoted (e.g. `actions/checkout@v2`) */\n replaceString: string;\n\n /** Whitespace between value and `#` */\n commentPrecedingWhitespace: string;\n\n /** The full comment including `#` */\n commentString: string;\n\n actionRef: ActionReference | null;\n commentData: CommentData;\n\n /** The quote char used (' or \" or empty) */\n quote: string;\n}\n\nconst shaRe = regEx(/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/);\nconst shaShortRe = regEx(/^[a-f0-9]{6,7}$/);\n\nexport function isSha(str: string): boolean {\n return shaRe.test(str);\n}\n\nexport function isShortSha(str: string): boolean {\n return shaShortRe.test(str);\n}\n\nconst DOCKER_PREFIX = 'docker://';\n\nfunction parseDockerReference(input: string): DockerReference | null {\n const originalRef = input.slice(DOCKER_PREFIX.length);\n if (!originalRef) {\n return null;\n }\n\n const digestParts = splitFirst(originalRef, '@');\n if (digestParts) {\n const [image, digest] = digestParts;\n return { kind: 'docker', image, digest, originalRef };\n }\n\n // Find tag: look for first colon after last slash (to avoid matching port in registry)\n const lastSlashIndex = originalRef.lastIndexOf('/');\n const searchStart = lastSlashIndex === -1 ? 0 : lastSlashIndex + 1;\n const tagParts = splitFirstFrom(originalRef, ':', searchStart);\n\n if (tagParts) {\n const [image, tag] = tagParts;\n return { kind: 'docker', image, tag, originalRef };\n }\n\n return { kind: 'docker', image: originalRef, originalRef };\n}\n\nconst repositoryActionRegex = regEx(\n /^(?:https:\\/\\/(?<hostname>[^/]+)\\/)?(?<owner>[^/]+)\\/(?<repo>[^/]+)(?:\\/(?<path>.+?))?@(?<ref>.+)$/,\n);\n\nfunction parseRepositoryReference(input: string): RepositoryReference | null {\n const match = repositoryActionRegex.exec(input);\n if (!match?.groups) {\n return null;\n }\n\n const { owner, repo, path, ref } = match.groups;\n\n let { hostname } = match.groups;\n let isExplicitHostname = true;\n if (is.undefined(hostname)) {\n hostname = 'github.com';\n isExplicitHostname = false;\n }\n\n return {\n kind: 'repository',\n hostname,\n isExplicitHostname,\n owner,\n repo,\n path,\n ref,\n };\n}\n\nexport function parseActionReference(uses: string): ActionReference | null {\n if (!uses) {\n return null;\n }\n\n if (uses.startsWith(DOCKER_PREFIX)) {\n return parseDockerReference(uses);\n }\n\n if (uses.startsWith('./') || uses.startsWith('../')) {\n return { kind: 'local', path: uses };\n }\n\n return parseRepositoryReference(uses);\n}\n\nexport interface CommentData {\n pinnedVersion?: string;\n ref?: string;\n ratchetExclude?: boolean;\n matchedString?: string;\n index?: number;\n}\n\nconst pinTokenRe = regEx(\n /^\\s*(?:(?:renovate\\s*:\\s*)?(?:pin\\s+|tag\\s*=\\s*)?|(?:ratchet:[\\w-]+\\/[.\\w-]+))?@?(?<version>([\\w-]*[-/])?v?\\d+(?:\\.\\d+(?:\\.\\d+)?)?(?:-[a-zA-Z0-9.]+)?)/,\n);\n\nexport const versionLikeRe = regEx(/^v?\\d+/);\n\nconst bareTokenRe = regEx(/^\\s*(?<token>\\S+)\\s*$/);\n\nexport function parseComment(commentBody: string): CommentData {\n const trimmed = commentBody.trim();\n if (trimmed === 'ratchet:exclude') {\n return { ratchetExclude: true };\n }\n\n // We use commentBody (with leading spaces) to get the correct index relative to the comment start\n const match = pinTokenRe.exec(commentBody);\n if (match?.groups?.version) {\n return {\n pinnedVersion: match.groups.version,\n matchedString: match[0],\n index: match.index,\n };\n }\n\n const bareMatch = bareTokenRe.exec(commentBody);\n if (bareMatch?.groups?.token) {\n return {\n ref: bareMatch.groups.token,\n matchedString: bareMatch[0],\n index: bareMatch.index,\n };\n }\n\n return {};\n}\n\nconst usesLineRegex = regEx(\n /^(?<prefix>\\s+(?:-\\s+)?uses\\s*:\\s*)(?<remainder>.+)$/,\n);\n\n/**\n * Parses a GitHub Actions `uses:` line into its components.\n *\n * Expected line format:\n * ```\n * <indentation>[- ]uses: [quote]<action-reference>[quote][ # <comment>]\n * ```\n *\n * Examples:\n * - ` uses: actions/checkout@v4`\n * - ` - uses: \"owner/repo@abc123\" # v1.0.0`\n * - ` uses: docker://alpine:3.18`\n *\n * @returns Parsed components or `null` if the line doesn't match `uses:` pattern\n */\nexport function parseUsesLine(line: string): ParsedUsesLine | null {\n const match = usesLineRegex.exec(line);\n if (!match?.groups) {\n return null;\n }\n\n const { prefix, remainder } = match.groups;\n\n if (remainder.startsWith('#')) {\n return null;\n }\n\n const indentation = prefix.slice(0, prefix.indexOf('uses'));\n\n // We look for ' #' to determine where the comment starts.\n // This is a safe heuristic for valid \"uses\" values which cannot contain spaces.\n const commentIndex = remainder.indexOf(' #');\n\n // No comment case\n if (commentIndex === -1) {\n const { value, quote } = parseQuote(remainder);\n return {\n indentation,\n usesPrefix: prefix,\n replaceString: remainder.trim(),\n commentPrecedingWhitespace: '',\n commentString: '',\n actionRef: parseActionReference(value),\n commentData: {},\n quote,\n };\n }\n\n // Has comment: split value and comment\n const rawValuePart = remainder.slice(0, commentIndex);\n const commentPart = remainder.slice(commentIndex + 1); // starts at #\n\n // Calculate whitespace between value and #\n const partBeforeHash = remainder.slice(0, commentIndex + 1);\n const commentPrecedingWhitespace = partBeforeHash.slice(\n partBeforeHash.trimEnd().length,\n );\n\n const { value, quote } = parseQuote(rawValuePart);\n // commentPart always starts with '#' (see commentIndex search above)\n const cleanCommentBody = commentPart.slice(1);\n\n return {\n indentation,\n usesPrefix: prefix,\n replaceString: rawValuePart.trim(),\n commentPrecedingWhitespace,\n commentString: commentPart,\n actionRef: parseActionReference(value),\n commentData: parseComment(cleanCommentBody),\n quote,\n };\n}\n"],"mappings":"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"}
|
|
@@ -38,7 +38,8 @@ function extractVersion({ version, versions, depStartIndex, depSubContent, depNa
|
|
|
38
38
|
depSubContent: versionSubContent,
|
|
39
39
|
sectionKey: originalAlias
|
|
40
40
|
});
|
|
41
|
-
}
|
|
41
|
+
}
|
|
42
|
+
return extractLiteralVersion({
|
|
42
43
|
version,
|
|
43
44
|
depStartIndex,
|
|
44
45
|
depSubContent,
|
|
@@ -47,11 +48,11 @@ function extractVersion({ version, versions, depStartIndex, depSubContent, depNa
|
|
|
47
48
|
}
|
|
48
49
|
function extractLiteralVersion({ version, depStartIndex, depSubContent, sectionKey }) {
|
|
49
50
|
if (!version) return { skipReason: "unspecified-version" };
|
|
50
|
-
|
|
51
|
+
if (isString(version)) return {
|
|
51
52
|
currentValue: version,
|
|
52
53
|
fileReplacePosition: depStartIndex + findVersionIndex(depSubContent, sectionKey, version)
|
|
53
54
|
};
|
|
54
|
-
|
|
55
|
+
if (isPlainObject(version)) {
|
|
55
56
|
const versionKeys = [
|
|
56
57
|
"require",
|
|
57
58
|
"prefer",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.js","names":["parseToml","deepmerge"],"sources":["../../../../../lib/modules/manager/gradle/extract/catalog.ts"],"sourcesContent":["import { isPlainObject, isString } from '@sindresorhus/is';\nimport deepmerge from 'deepmerge';\nimport type { SkipReason } from '../../../../types/index.ts';\nimport { hasKey } from '../../../../util/object.ts';\nimport { escapeRegExp, regEx } from '../../../../util/regex.ts';\nimport { massage, parse as parseToml } from '../../../../util/toml.ts';\nimport type { PackageDependency } from '../../types.ts';\nimport type {\n GradleCatalog,\n GradleCatalogArtifactDescriptor,\n GradleCatalogModuleDescriptor,\n GradleManagerData,\n GradleVersionCatalogVersion,\n GradleVersionPointerTarget,\n PackageVariables,\n VersionPointer,\n} from '../types.ts';\nimport { isTOMLFile } from '../utils.ts';\n\nfunction findVersionIndex(\n content: string,\n depName: string,\n version: string,\n): number {\n const eDn = escapeRegExp(depName);\n const eVer = escapeRegExp(version);\n const re = regEx(\n `(?:id\\\\s*=\\\\s*)?['\"]?${eDn}[\"']?(?:(?:\\\\s*=\\\\s*)|:|,\\\\s*)(?:.*version(?:\\\\.ref)?(?:\\\\s*\\\\=\\\\s*))?[\"']?${eVer}['\"]?`,\n );\n const match = re.exec(content);\n if (match) {\n return match.index + content.slice(match.index).indexOf(version);\n }\n // ignoring Fallback because I can't reach it in tests, and code is not supposed to reach it but just in case.\n /* istanbul ignore next */\n return findIndexAfter(content, depName, version);\n}\n\nfunction findIndexAfter(\n content: string,\n sliceAfter: string,\n find: string,\n): number {\n const slicePoint = content.indexOf(sliceAfter) + sliceAfter.length;\n return slicePoint + content.slice(slicePoint).indexOf(find);\n}\n\nfunction isArtifactDescriptor(\n obj: GradleCatalogArtifactDescriptor | GradleCatalogModuleDescriptor,\n): obj is GradleCatalogArtifactDescriptor {\n return hasKey('group', obj);\n}\n\nfunction isVersionPointer(\n obj: GradleVersionCatalogVersion | undefined,\n): obj is VersionPointer {\n return hasKey('ref', obj);\n}\n\nfunction normalizeAlias(alias: string): string {\n return alias.replace(regEx(/[-_]/g), '.');\n}\n\nfunction findOriginalAlias(\n versions: Record<string, GradleVersionPointerTarget>,\n alias: string,\n): string {\n const normalizedAlias = normalizeAlias(alias);\n for (const sectionKey of Object.keys(versions)) {\n if (normalizeAlias(sectionKey) === normalizedAlias) {\n return sectionKey;\n }\n }\n\n return alias;\n}\n\ninterface VersionExtract {\n currentValue?: string;\n fileReplacePosition?: number;\n skipReason?: SkipReason;\n}\n\nfunction extractVersion({\n version,\n versions,\n depStartIndex,\n depSubContent,\n depName,\n versionStartIndex,\n versionSubContent,\n}: {\n version: GradleVersionCatalogVersion | undefined;\n versions: Record<string, GradleVersionPointerTarget>;\n depStartIndex: number;\n depSubContent: string;\n depName: string;\n versionStartIndex: number;\n versionSubContent: string;\n}): VersionExtract {\n if (isVersionPointer(version)) {\n const originalAlias = findOriginalAlias(versions, version.ref);\n return extractLiteralVersion({\n version: versions[originalAlias],\n depStartIndex: versionStartIndex,\n depSubContent: versionSubContent,\n sectionKey: originalAlias,\n });\n } else {\n return extractLiteralVersion({\n version,\n depStartIndex,\n depSubContent,\n sectionKey: depName,\n });\n }\n}\n\nfunction extractLiteralVersion({\n version,\n depStartIndex,\n depSubContent,\n sectionKey,\n}: {\n version: GradleVersionPointerTarget | undefined;\n depStartIndex: number;\n depSubContent: string;\n sectionKey: string;\n}): VersionExtract {\n if (!version) {\n return { skipReason: 'unspecified-version' };\n } else if (isString(version)) {\n const fileReplacePosition =\n depStartIndex + findVersionIndex(depSubContent, sectionKey, version);\n return { currentValue: version, fileReplacePosition };\n } else if (isPlainObject(version)) {\n // https://github.com/gradle/gradle/blob/d9adf33a57925582988fc512002dcc0e8ce4db95/subprojects/core/src/main/java/org/gradle/api/internal/catalog/parser/TomlCatalogFileParser.java#L368\n // https://docs.gradle.org/current/userguide/rich_versions.html\n // https://docs.gradle.org/current/userguide/platforms.html#sub::toml-dependencies-format\n const versionKeys = ['require', 'prefer', 'strictly'];\n let found = false;\n let currentValue: string | undefined;\n let fileReplacePosition: number | undefined;\n\n if (version.reject || version.rejectAll) {\n return { skipReason: 'unsupported-version' };\n }\n\n for (const key of versionKeys) {\n if (key in version) {\n if (found) {\n // Currently, we only support one version constraint at a time\n return { skipReason: 'multiple-constraint-dep' };\n }\n found = true;\n\n currentValue = version[key] as string;\n fileReplacePosition =\n depStartIndex +\n findIndexAfter(depSubContent, sectionKey, currentValue);\n }\n }\n\n if (found) {\n return { currentValue, fileReplacePosition };\n }\n }\n\n return { skipReason: 'unspecified-version' };\n}\n\nfunction extractDependency({\n descriptor,\n versions,\n depStartIndex,\n depSubContent,\n depName,\n versionStartIndex,\n versionSubContent,\n}: {\n descriptor:\n | string\n | GradleCatalogModuleDescriptor\n | GradleCatalogArtifactDescriptor;\n versions: Record<string, GradleVersionPointerTarget>;\n depStartIndex: number;\n depSubContent: string;\n depName: string;\n versionStartIndex: number;\n versionSubContent: string;\n}): PackageDependency<GradleManagerData> {\n if (isString(descriptor)) {\n const [group, name, currentValue] = descriptor.split(':');\n if (!currentValue) {\n return {\n depName,\n skipReason: 'unspecified-version',\n };\n }\n return {\n depName: `${group}:${name}`,\n currentValue,\n managerData: {\n fileReplacePosition:\n depStartIndex + findIndexAfter(depSubContent, depName, currentValue),\n },\n };\n }\n\n const { currentValue, fileReplacePosition, skipReason } = extractVersion({\n version: descriptor.version,\n versions,\n depStartIndex,\n depSubContent,\n depName,\n versionStartIndex,\n versionSubContent,\n });\n\n if (skipReason) {\n return {\n depName,\n skipReason,\n };\n }\n\n const dependency: PackageDependency<GradleManagerData> = {\n currentValue,\n managerData: { fileReplacePosition },\n };\n\n if (isArtifactDescriptor(descriptor)) {\n const { group, name } = descriptor;\n dependency.depName = `${group}:${name}`;\n } else {\n const [depGroupName, name] = descriptor.module.split(':');\n dependency.depName = `${depGroupName}:${name}`;\n }\n\n if (isVersionPointer(descriptor.version)) {\n dependency.sharedVariableName = normalizeAlias(descriptor.version.ref);\n }\n\n return dependency;\n}\n\nexport function parseCatalog(\n packageFile: string,\n content: string,\n): { vars: PackageVariables; deps: PackageDependency<GradleManagerData>[] } {\n const tomlContent = parseToml(massage(content)) as GradleCatalog;\n const versions = tomlContent.versions ?? {};\n const libs = tomlContent.libraries ?? {};\n const libStartIndex = content.indexOf('libraries');\n const libSubContent = content.slice(libStartIndex);\n const versionStartIndex = content.indexOf('versions');\n const versionSubContent = content.slice(versionStartIndex);\n const extractedDeps: PackageDependency<GradleManagerData>[] = [];\n const vars: PackageVariables = {};\n\n for (const [key, version] of Object.entries(versions)) {\n const { currentValue, fileReplacePosition } = extractLiteralVersion({\n version,\n depStartIndex: versionStartIndex,\n depSubContent: versionSubContent,\n sectionKey: key,\n });\n if (currentValue && fileReplacePosition !== undefined) {\n vars[normalizeAlias(key)] = {\n key: normalizeAlias(key),\n value: currentValue,\n fileReplacePosition,\n packageFile,\n };\n }\n }\n\n for (const libraryName of Object.keys(libs)) {\n const libDescriptor = libs[libraryName];\n const dependency = extractDependency({\n descriptor: libDescriptor,\n versions,\n depStartIndex: libStartIndex,\n depSubContent: libSubContent,\n depName: libraryName,\n versionStartIndex,\n versionSubContent,\n });\n extractedDeps.push(dependency);\n }\n\n const plugins = tomlContent.plugins ?? {};\n const pluginsStartIndex = content.indexOf('[plugins]');\n const pluginsSubContent = content.slice(pluginsStartIndex);\n for (const pluginName of Object.keys(plugins)) {\n const pluginDescriptor = plugins[pluginName];\n const [depName, version] = isString(pluginDescriptor)\n ? pluginDescriptor.split(':')\n : [pluginDescriptor.id, pluginDescriptor.version];\n const { currentValue, fileReplacePosition, skipReason } = extractVersion({\n version,\n versions,\n depStartIndex: pluginsStartIndex,\n depSubContent: pluginsSubContent,\n depName,\n versionStartIndex,\n versionSubContent,\n });\n\n const dependency: PackageDependency<GradleManagerData> = {\n depType: 'plugin',\n depName,\n packageName: `${depName}:${depName}.gradle.plugin`,\n currentValue,\n commitMessageTopic: `plugin ${pluginName}`,\n managerData: { fileReplacePosition },\n };\n if (skipReason) {\n dependency.skipReason = skipReason;\n }\n if (isVersionPointer(version) && dependency.commitMessageTopic) {\n dependency.sharedVariableName = normalizeAlias(version.ref);\n delete dependency.commitMessageTopic;\n }\n\n extractedDeps.push(dependency);\n }\n\n const deps = extractedDeps.map((dep) => {\n return deepmerge(dep, { managerData: { packageFile } });\n });\n return { vars, deps };\n}\n\nfunction makeCatalogGroupKey(\n dep: PackageDependency<GradleManagerData>,\n): string {\n return `${dep.managerData!.packageFile}:${dep.managerData!.fileReplacePosition}`;\n}\n\nexport function unifyCatalogSharedVariableNames(\n deps: PackageDependency<GradleManagerData>[],\n): void {\n const aliasMap: Record<string, string[]> = {};\n const catalogDeps: PackageDependency<GradleManagerData>[] = [];\n\n for (const dep of deps) {\n const packageFile = dep.managerData?.packageFile;\n if (\n packageFile &&\n dep.managerData?.fileReplacePosition !== undefined &&\n dep.sharedVariableName &&\n isTOMLFile(packageFile)\n ) {\n catalogDeps.push(dep);\n\n const key = makeCatalogGroupKey(dep);\n (aliasMap[key] ??= []).push(dep.sharedVariableName);\n }\n }\n\n for (const dep of catalogDeps) {\n const key = makeCatalogGroupKey(dep);\n const aliases = aliasMap[key];\n if (aliases.length > 1) {\n const name = aliases[0];\n dep.sharedVariableName = name.replace(regEx(/^[^.]+\\.versions\\./), '');\n }\n }\n}\n"],"mappings":";;;;;;;AAmBA,SAAS,iBACP,SACA,SACA,SACQ;CAMR,MAAM,QAHK,MACT,wBAHU,aAAa,OAGG,EAAE,6EAFjB,aAAa,OAEoF,EAAE,MAEjG,CAAC,CAAC,KAAK,OAAO;CAC7B,IAAI,OACF,OAAO,MAAM,QAAQ,QAAQ,MAAM,MAAM,KAAK,CAAC,CAAC,QAAQ,OAAO;;CAIjE,OAAO,eAAe,SAAS,SAAS,OAAO;AACjD;AAEA,SAAS,eACP,SACA,YACA,MACQ;CACR,MAAM,aAAa,QAAQ,QAAQ,UAAU,IAAI,WAAW;CAC5D,OAAO,aAAa,QAAQ,MAAM,UAAU,CAAC,CAAC,QAAQ,IAAI;AAC5D;AAEA,SAAS,qBACP,KACwC;CACxC,OAAO,OAAO,SAAS,GAAG;AAC5B;AAEA,SAAS,iBACP,KACuB;CACvB,OAAO,OAAO,OAAO,GAAG;AAC1B;AAEA,SAAS,eAAe,OAAuB;CAC7C,OAAO,MAAM,QAAQ,MAAM,OAAO,GAAG,GAAG;AAC1C;AAEA,SAAS,kBACP,UACA,OACQ;CACR,MAAM,kBAAkB,eAAe,KAAK;CAC5C,KAAK,MAAM,cAAc,OAAO,KAAK,QAAQ,GAC3C,IAAI,eAAe,UAAU,MAAM,iBACjC,OAAO;CAIX,OAAO;AACT;AAQA,SAAS,eAAe,EACtB,SACA,UACA,eACA,eACA,SACA,mBACA,qBASiB;CACjB,IAAI,iBAAiB,OAAO,GAAG;EAC7B,MAAM,gBAAgB,kBAAkB,UAAU,QAAQ,GAAG;EAC7D,OAAO,sBAAsB;GAC3B,SAAS,SAAS;GAClB,eAAe;GACf,eAAe;GACf,YAAY;EACd,CAAC;CACH,OACE,OAAO,sBAAsB;EAC3B;EACA;EACA;EACA,YAAY;CACd,CAAC;AAEL;AAEA,SAAS,sBAAsB,EAC7B,SACA,eACA,eACA,cAMiB;CACjB,IAAI,CAAC,SACH,OAAO,EAAE,YAAY,sBAAsB;MACtC,IAAI,SAAS,OAAO,GAGzB,OAAO;EAAE,cAAc;EAAS,qBAD9B,gBAAgB,iBAAiB,eAAe,YAAY,OAAO;CACjB;MAC/C,IAAI,cAAc,OAAO,GAAG;EAIjC,MAAM,cAAc;GAAC;GAAW;GAAU;EAAU;EACpD,IAAI,QAAQ;EACZ,IAAI;EACJ,IAAI;EAEJ,IAAI,QAAQ,UAAU,QAAQ,WAC5B,OAAO,EAAE,YAAY,sBAAsB;EAG7C,KAAK,MAAM,OAAO,aAChB,IAAI,OAAO,SAAS;GAClB,IAAI,OAEF,OAAO,EAAE,YAAY,0BAA0B;GAEjD,QAAQ;GAER,eAAe,QAAQ;GACvB,sBACE,gBACA,eAAe,eAAe,YAAY,YAAY;EAC1D;EAGF,IAAI,OACF,OAAO;GAAE;GAAc;EAAoB;CAE/C;CAEA,OAAO,EAAE,YAAY,sBAAsB;AAC7C;AAEA,SAAS,kBAAkB,EACzB,YACA,UACA,eACA,eACA,SACA,mBACA,qBAYuC;CACvC,IAAI,SAAS,UAAU,GAAG;EACxB,MAAM,CAAC,OAAO,MAAM,gBAAgB,WAAW,MAAM,GAAG;EACxD,IAAI,CAAC,cACH,OAAO;GACL;GACA,YAAY;EACd;EAEF,OAAO;GACL,SAAS,GAAG,MAAM,GAAG;GACrB;GACA,aAAa,EACX,qBACE,gBAAgB,eAAe,eAAe,SAAS,YAAY,EACvE;EACF;CACF;CAEA,MAAM,EAAE,cAAc,qBAAqB,eAAe,eAAe;EACvE,SAAS,WAAW;EACpB;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,IAAI,YACF,OAAO;EACL;EACA;CACF;CAGF,MAAM,aAAmD;EACvD;EACA,aAAa,EAAE,oBAAoB;CACrC;CAEA,IAAI,qBAAqB,UAAU,GAAG;EACpC,MAAM,EAAE,OAAO,SAAS;EACxB,WAAW,UAAU,GAAG,MAAM,GAAG;CACnC,OAAO;EACL,MAAM,CAAC,cAAc,QAAQ,WAAW,OAAO,MAAM,GAAG;EACxD,WAAW,UAAU,GAAG,aAAa,GAAG;CAC1C;CAEA,IAAI,iBAAiB,WAAW,OAAO,GACrC,WAAW,qBAAqB,eAAe,WAAW,QAAQ,GAAG;CAGvE,OAAO;AACT;AAEA,SAAgB,aACd,aACA,SAC0E;CAC1E,MAAM,cAAcA,MAAU,QAAQ,OAAO,CAAC;CAC9C,MAAM,WAAW,YAAY,YAAY,CAAC;CAC1C,MAAM,OAAO,YAAY,aAAa,CAAC;CACvC,MAAM,gBAAgB,QAAQ,QAAQ,WAAW;CACjD,MAAM,gBAAgB,QAAQ,MAAM,aAAa;CACjD,MAAM,oBAAoB,QAAQ,QAAQ,UAAU;CACpD,MAAM,oBAAoB,QAAQ,MAAM,iBAAiB;CACzD,MAAM,gBAAwD,CAAC;CAC/D,MAAM,OAAyB,CAAC;CAEhC,KAAK,MAAM,CAAC,KAAK,YAAY,OAAO,QAAQ,QAAQ,GAAG;EACrD,MAAM,EAAE,cAAc,wBAAwB,sBAAsB;GAClE;GACA,eAAe;GACf,eAAe;GACf,YAAY;EACd,CAAC;EACD,IAAI,gBAAgB,wBAAwB,KAAA,GAC1C,KAAK,eAAe,GAAG,KAAK;GAC1B,KAAK,eAAe,GAAG;GACvB,OAAO;GACP;GACA;EACF;CAEJ;CAEA,KAAK,MAAM,eAAe,OAAO,KAAK,IAAI,GAAG;EAC3C,MAAM,gBAAgB,KAAK;EAC3B,MAAM,aAAa,kBAAkB;GACnC,YAAY;GACZ;GACA,eAAe;GACf,eAAe;GACf,SAAS;GACT;GACA;EACF,CAAC;EACD,cAAc,KAAK,UAAU;CAC/B;CAEA,MAAM,UAAU,YAAY,WAAW,CAAC;CACxC,MAAM,oBAAoB,QAAQ,QAAQ,WAAW;CACrD,MAAM,oBAAoB,QAAQ,MAAM,iBAAiB;CACzD,KAAK,MAAM,cAAc,OAAO,KAAK,OAAO,GAAG;EAC7C,MAAM,mBAAmB,QAAQ;EACjC,MAAM,CAAC,SAAS,WAAW,SAAS,gBAAgB,IAChD,iBAAiB,MAAM,GAAG,IAC1B,CAAC,iBAAiB,IAAI,iBAAiB,OAAO;EAClD,MAAM,EAAE,cAAc,qBAAqB,eAAe,eAAe;GACvE;GACA;GACA,eAAe;GACf,eAAe;GACf;GACA;GACA;EACF,CAAC;EAED,MAAM,aAAmD;GACvD,SAAS;GACT;GACA,aAAa,GAAG,QAAQ,GAAG,QAAQ;GACnC;GACA,oBAAoB,UAAU;GAC9B,aAAa,EAAE,oBAAoB;EACrC;EACA,IAAI,YACF,WAAW,aAAa;EAE1B,IAAI,iBAAiB,OAAO,KAAK,WAAW,oBAAoB;GAC9D,WAAW,qBAAqB,eAAe,QAAQ,GAAG;GAC1D,OAAO,WAAW;EACpB;EAEA,cAAc,KAAK,UAAU;CAC/B;CAKA,OAAO;EAAE;EAAM,MAHF,cAAc,KAAK,QAAQ;GACtC,OAAOC,MAAU,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;EACxD,CACkB;CAAE;AACtB;AAEA,SAAS,oBACP,KACQ;CACR,OAAO,GAAG,IAAI,YAAa,YAAY,GAAG,IAAI,YAAa;AAC7D;AAEA,SAAgB,gCACd,MACM;CACN,MAAM,WAAqC,CAAC;CAC5C,MAAM,cAAsD,CAAC;CAE7D,KAAK,MAAM,OAAO,MAAM;EACtB,MAAM,cAAc,IAAI,aAAa;EACrC,IACE,eACA,IAAI,aAAa,wBAAwB,KAAA,KACzC,IAAI,sBACJ,WAAW,WAAW,GACtB;GACA,YAAY,KAAK,GAAG;GAEpB,MAAM,MAAM,oBAAoB,GAAG;GACnC,CAAC,SAAS,SAAS,CAAC,EAAA,CAAG,KAAK,IAAI,kBAAkB;EACpD;CACF;CAEA,KAAK,MAAM,OAAO,aAAa;EAE7B,MAAM,UAAU,SADJ,oBAAoB,GACL;EAC3B,IAAI,QAAQ,SAAS,GAEnB,IAAI,qBADS,QAAQ,EACQ,CAAC,QAAQ,MAAM,oBAAoB,GAAG,EAAE;CAEzE;AACF"}
|
|
1
|
+
{"version":3,"file":"catalog.js","names":["parseToml","deepmerge"],"sources":["../../../../../lib/modules/manager/gradle/extract/catalog.ts"],"sourcesContent":["import { isPlainObject, isString } from '@sindresorhus/is';\nimport deepmerge from 'deepmerge';\nimport type { SkipReason } from '../../../../types/index.ts';\nimport { hasKey } from '../../../../util/object.ts';\nimport { escapeRegExp, regEx } from '../../../../util/regex.ts';\nimport { massage, parse as parseToml } from '../../../../util/toml.ts';\nimport type { PackageDependency } from '../../types.ts';\nimport type {\n GradleCatalog,\n GradleCatalogArtifactDescriptor,\n GradleCatalogModuleDescriptor,\n GradleManagerData,\n GradleVersionCatalogVersion,\n GradleVersionPointerTarget,\n PackageVariables,\n VersionPointer,\n} from '../types.ts';\nimport { isTOMLFile } from '../utils.ts';\n\nfunction findVersionIndex(\n content: string,\n depName: string,\n version: string,\n): number {\n const eDn = escapeRegExp(depName);\n const eVer = escapeRegExp(version);\n const re = regEx(\n `(?:id\\\\s*=\\\\s*)?['\"]?${eDn}[\"']?(?:(?:\\\\s*=\\\\s*)|:|,\\\\s*)(?:.*version(?:\\\\.ref)?(?:\\\\s*\\\\=\\\\s*))?[\"']?${eVer}['\"]?`,\n );\n const match = re.exec(content);\n if (match) {\n return match.index + content.slice(match.index).indexOf(version);\n }\n // ignoring Fallback because I can't reach it in tests, and code is not supposed to reach it but just in case.\n /* istanbul ignore next */\n return findIndexAfter(content, depName, version);\n}\n\nfunction findIndexAfter(\n content: string,\n sliceAfter: string,\n find: string,\n): number {\n const slicePoint = content.indexOf(sliceAfter) + sliceAfter.length;\n return slicePoint + content.slice(slicePoint).indexOf(find);\n}\n\nfunction isArtifactDescriptor(\n obj: GradleCatalogArtifactDescriptor | GradleCatalogModuleDescriptor,\n): obj is GradleCatalogArtifactDescriptor {\n return hasKey('group', obj);\n}\n\nfunction isVersionPointer(\n obj: GradleVersionCatalogVersion | undefined,\n): obj is VersionPointer {\n return hasKey('ref', obj);\n}\n\nfunction normalizeAlias(alias: string): string {\n return alias.replace(regEx(/[-_]/g), '.');\n}\n\nfunction findOriginalAlias(\n versions: Record<string, GradleVersionPointerTarget>,\n alias: string,\n): string {\n const normalizedAlias = normalizeAlias(alias);\n for (const sectionKey of Object.keys(versions)) {\n if (normalizeAlias(sectionKey) === normalizedAlias) {\n return sectionKey;\n }\n }\n\n return alias;\n}\n\ninterface VersionExtract {\n currentValue?: string;\n fileReplacePosition?: number;\n skipReason?: SkipReason;\n}\n\nfunction extractVersion({\n version,\n versions,\n depStartIndex,\n depSubContent,\n depName,\n versionStartIndex,\n versionSubContent,\n}: {\n version: GradleVersionCatalogVersion | undefined;\n versions: Record<string, GradleVersionPointerTarget>;\n depStartIndex: number;\n depSubContent: string;\n depName: string;\n versionStartIndex: number;\n versionSubContent: string;\n}): VersionExtract {\n if (isVersionPointer(version)) {\n const originalAlias = findOriginalAlias(versions, version.ref);\n return extractLiteralVersion({\n version: versions[originalAlias],\n depStartIndex: versionStartIndex,\n depSubContent: versionSubContent,\n sectionKey: originalAlias,\n });\n }\n return extractLiteralVersion({\n version,\n depStartIndex,\n depSubContent,\n sectionKey: depName,\n });\n}\n\nfunction extractLiteralVersion({\n version,\n depStartIndex,\n depSubContent,\n sectionKey,\n}: {\n version: GradleVersionPointerTarget | undefined;\n depStartIndex: number;\n depSubContent: string;\n sectionKey: string;\n}): VersionExtract {\n if (!version) {\n return { skipReason: 'unspecified-version' };\n }\n if (isString(version)) {\n const fileReplacePosition =\n depStartIndex + findVersionIndex(depSubContent, sectionKey, version);\n return { currentValue: version, fileReplacePosition };\n }\n if (isPlainObject(version)) {\n // https://github.com/gradle/gradle/blob/d9adf33a57925582988fc512002dcc0e8ce4db95/subprojects/core/src/main/java/org/gradle/api/internal/catalog/parser/TomlCatalogFileParser.java#L368\n // https://docs.gradle.org/current/userguide/rich_versions.html\n // https://docs.gradle.org/current/userguide/platforms.html#sub::toml-dependencies-format\n const versionKeys = ['require', 'prefer', 'strictly'];\n let found = false;\n let currentValue: string | undefined;\n let fileReplacePosition: number | undefined;\n\n if (version.reject || version.rejectAll) {\n return { skipReason: 'unsupported-version' };\n }\n\n for (const key of versionKeys) {\n if (key in version) {\n if (found) {\n // Currently, we only support one version constraint at a time\n return { skipReason: 'multiple-constraint-dep' };\n }\n found = true;\n\n currentValue = version[key] as string;\n fileReplacePosition =\n depStartIndex +\n findIndexAfter(depSubContent, sectionKey, currentValue);\n }\n }\n\n if (found) {\n return { currentValue, fileReplacePosition };\n }\n }\n\n return { skipReason: 'unspecified-version' };\n}\n\nfunction extractDependency({\n descriptor,\n versions,\n depStartIndex,\n depSubContent,\n depName,\n versionStartIndex,\n versionSubContent,\n}: {\n descriptor:\n | string\n | GradleCatalogModuleDescriptor\n | GradleCatalogArtifactDescriptor;\n versions: Record<string, GradleVersionPointerTarget>;\n depStartIndex: number;\n depSubContent: string;\n depName: string;\n versionStartIndex: number;\n versionSubContent: string;\n}): PackageDependency<GradleManagerData> {\n if (isString(descriptor)) {\n const [group, name, currentValue] = descriptor.split(':');\n if (!currentValue) {\n return {\n depName,\n skipReason: 'unspecified-version',\n };\n }\n return {\n depName: `${group}:${name}`,\n currentValue,\n managerData: {\n fileReplacePosition:\n depStartIndex + findIndexAfter(depSubContent, depName, currentValue),\n },\n };\n }\n\n const { currentValue, fileReplacePosition, skipReason } = extractVersion({\n version: descriptor.version,\n versions,\n depStartIndex,\n depSubContent,\n depName,\n versionStartIndex,\n versionSubContent,\n });\n\n if (skipReason) {\n return {\n depName,\n skipReason,\n };\n }\n\n const dependency: PackageDependency<GradleManagerData> = {\n currentValue,\n managerData: { fileReplacePosition },\n };\n\n if (isArtifactDescriptor(descriptor)) {\n const { group, name } = descriptor;\n dependency.depName = `${group}:${name}`;\n } else {\n const [depGroupName, name] = descriptor.module.split(':');\n dependency.depName = `${depGroupName}:${name}`;\n }\n\n if (isVersionPointer(descriptor.version)) {\n dependency.sharedVariableName = normalizeAlias(descriptor.version.ref);\n }\n\n return dependency;\n}\n\nexport function parseCatalog(\n packageFile: string,\n content: string,\n): { vars: PackageVariables; deps: PackageDependency<GradleManagerData>[] } {\n const tomlContent = parseToml(massage(content)) as GradleCatalog;\n const versions = tomlContent.versions ?? {};\n const libs = tomlContent.libraries ?? {};\n const libStartIndex = content.indexOf('libraries');\n const libSubContent = content.slice(libStartIndex);\n const versionStartIndex = content.indexOf('versions');\n const versionSubContent = content.slice(versionStartIndex);\n const extractedDeps: PackageDependency<GradleManagerData>[] = [];\n const vars: PackageVariables = {};\n\n for (const [key, version] of Object.entries(versions)) {\n const { currentValue, fileReplacePosition } = extractLiteralVersion({\n version,\n depStartIndex: versionStartIndex,\n depSubContent: versionSubContent,\n sectionKey: key,\n });\n if (currentValue && fileReplacePosition !== undefined) {\n vars[normalizeAlias(key)] = {\n key: normalizeAlias(key),\n value: currentValue,\n fileReplacePosition,\n packageFile,\n };\n }\n }\n\n for (const libraryName of Object.keys(libs)) {\n const libDescriptor = libs[libraryName];\n const dependency = extractDependency({\n descriptor: libDescriptor,\n versions,\n depStartIndex: libStartIndex,\n depSubContent: libSubContent,\n depName: libraryName,\n versionStartIndex,\n versionSubContent,\n });\n extractedDeps.push(dependency);\n }\n\n const plugins = tomlContent.plugins ?? {};\n const pluginsStartIndex = content.indexOf('[plugins]');\n const pluginsSubContent = content.slice(pluginsStartIndex);\n for (const pluginName of Object.keys(plugins)) {\n const pluginDescriptor = plugins[pluginName];\n const [depName, version] = isString(pluginDescriptor)\n ? pluginDescriptor.split(':')\n : [pluginDescriptor.id, pluginDescriptor.version];\n const { currentValue, fileReplacePosition, skipReason } = extractVersion({\n version,\n versions,\n depStartIndex: pluginsStartIndex,\n depSubContent: pluginsSubContent,\n depName,\n versionStartIndex,\n versionSubContent,\n });\n\n const dependency: PackageDependency<GradleManagerData> = {\n depType: 'plugin',\n depName,\n packageName: `${depName}:${depName}.gradle.plugin`,\n currentValue,\n commitMessageTopic: `plugin ${pluginName}`,\n managerData: { fileReplacePosition },\n };\n if (skipReason) {\n dependency.skipReason = skipReason;\n }\n if (isVersionPointer(version) && dependency.commitMessageTopic) {\n dependency.sharedVariableName = normalizeAlias(version.ref);\n delete dependency.commitMessageTopic;\n }\n\n extractedDeps.push(dependency);\n }\n\n const deps = extractedDeps.map((dep) => {\n return deepmerge(dep, { managerData: { packageFile } });\n });\n return { vars, deps };\n}\n\nfunction makeCatalogGroupKey(\n dep: PackageDependency<GradleManagerData>,\n): string {\n return `${dep.managerData!.packageFile}:${dep.managerData!.fileReplacePosition}`;\n}\n\nexport function unifyCatalogSharedVariableNames(\n deps: PackageDependency<GradleManagerData>[],\n): void {\n const aliasMap: Record<string, string[]> = {};\n const catalogDeps: PackageDependency<GradleManagerData>[] = [];\n\n for (const dep of deps) {\n const packageFile = dep.managerData?.packageFile;\n if (\n packageFile &&\n dep.managerData?.fileReplacePosition !== undefined &&\n dep.sharedVariableName &&\n isTOMLFile(packageFile)\n ) {\n catalogDeps.push(dep);\n\n const key = makeCatalogGroupKey(dep);\n (aliasMap[key] ??= []).push(dep.sharedVariableName);\n }\n }\n\n for (const dep of catalogDeps) {\n const key = makeCatalogGroupKey(dep);\n const aliases = aliasMap[key];\n if (aliases.length > 1) {\n const name = aliases[0];\n dep.sharedVariableName = name.replace(regEx(/^[^.]+\\.versions\\./), '');\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -43,8 +43,8 @@ function matchesContentDescriptor(dep, contentDescriptors) {
|
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
if (hasIncludes && hasExcludes) return matchesInclude && !matchesExclude;
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
if (hasIncludes) return matchesInclude;
|
|
47
|
+
if (hasExcludes) return !matchesExclude;
|
|
48
48
|
return true;
|
|
49
49
|
}
|
|
50
50
|
function getRegistryUrlsForDep(packageRegistries, dep) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","names":["gradleVersioning"],"sources":["../../../../lib/modules/manager/gradle/extract.ts"],"sourcesContent":["import upath from 'upath';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { getLocalFiles } from '../../../util/fs/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { MavenDatasource } from '../../datasource/maven/index.ts';\nimport gradleVersioning from '../../versioning/gradle/index.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFile,\n} from '../types.ts';\nimport {\n parseCatalog,\n unifyCatalogSharedVariableNames,\n} from './extract/catalog.ts';\nimport {\n isGcvPropsFile,\n parseGcv,\n usesGcv,\n} from './extract/consistent-versions-plugin.ts';\nimport { REGISTRY_URLS } from './parser/common.ts';\nimport { parseGradle, parseKotlinSource, parseProps } from './parser.ts';\nimport type {\n ContentDescriptorSpec,\n GradleManagerData,\n PackageRegistry,\n VariableRegistry,\n} from './types.ts';\nimport {\n getVars,\n isGradleScriptFile,\n isKotlinSourceFile,\n isPropsFile,\n isTOMLFile,\n reorderFiles,\n toAbsolutePath,\n updateVars,\n updateVarsFromDefaultCatalog,\n} from './utils.ts';\n\nconst mavenDatasource = MavenDatasource.id;\n\nfunction updatePackageRegistries(\n packageRegistries: PackageRegistry[],\n urls: PackageRegistry[],\n): void {\n for (const url of urls) {\n const registryAlreadyKnown = packageRegistries.some(\n (item) =>\n item.registryUrl === url.registryUrl &&\n item.scope === url.scope &&\n item.registryType === url.registryType &&\n item.content === url.content,\n );\n if (!registryAlreadyKnown) {\n packageRegistries.push(url);\n }\n }\n}\n\nexport function matchesContentDescriptor(\n dep: PackageDependency<GradleManagerData>,\n contentDescriptors?: ContentDescriptorSpec[],\n): boolean {\n const [groupId, artifactId] = (dep.packageName ?? dep.depName!).split(':');\n let hasIncludes = false;\n let hasExcludes = false;\n let matchesInclude = false;\n let matchesExclude = false;\n\n for (const content of coerceArray(contentDescriptors)) {\n const {\n mode,\n matcher,\n groupId: contentGroupId,\n artifactId: contentArtifactId,\n version: contentVersion,\n } = content;\n\n // group matching\n let groupMatch = false;\n if (matcher === 'regex') {\n groupMatch = regEx(contentGroupId).test(groupId);\n } else if (matcher === 'subgroup') {\n groupMatch =\n groupId === contentGroupId || `${groupId}.`.startsWith(contentGroupId);\n } else {\n groupMatch = groupId === contentGroupId;\n }\n\n // artifact matching (optional)\n let artifactMatch = true;\n if (groupMatch && contentArtifactId) {\n if (matcher === 'regex') {\n artifactMatch = regEx(contentArtifactId).test(artifactId);\n } else {\n artifactMatch = artifactId === contentArtifactId;\n }\n }\n\n // version matching (optional)\n let versionMatch = true;\n if (groupMatch && artifactMatch && contentVersion && dep.currentValue) {\n if (matcher === 'regex') {\n versionMatch = regEx(contentVersion).test(dep.currentValue);\n } else {\n // contentVersion can be an exact version or a gradle-supported version range\n versionMatch = gradleVersioning.matches(\n dep.currentValue,\n contentVersion,\n );\n }\n }\n\n const isMatch = groupMatch && artifactMatch && versionMatch;\n if (mode === 'include') {\n hasIncludes = true;\n if (isMatch) {\n matchesInclude = true;\n }\n } else if (mode === 'exclude') {\n hasExcludes = true;\n if (isMatch) {\n matchesExclude = true;\n }\n }\n }\n\n if (hasIncludes && hasExcludes) {\n // if both includes and excludes exist, dep must match include and not match exclude\n return matchesInclude && !matchesExclude;\n } else if (hasIncludes) {\n // if only includes exist, dep must match at least one include\n return matchesInclude;\n } else if (hasExcludes) {\n // if only excludes exist, dep must not match any exclude\n return !matchesExclude;\n }\n\n // by default, repositories include everything and exclude nothing\n return true;\n}\n\nfunction getRegistryUrlsForDep(\n packageRegistries: PackageRegistry[],\n dep: PackageDependency<GradleManagerData>,\n): string[] {\n const scope = dep.depType === 'plugin' ? 'plugin' : 'dep';\n\n const matchingRegistries = packageRegistries.filter(\n (item) =>\n item.scope === scope && matchesContentDescriptor(dep, item.content),\n );\n\n const exclusiveRegistries = matchingRegistries.filter(\n (item) => item.registryType === 'exclusive',\n );\n\n const registryUrls = (\n exclusiveRegistries.length ? exclusiveRegistries : matchingRegistries\n ).map((item) => item.registryUrl);\n\n if (!registryUrls.length && scope === 'plugin') {\n registryUrls.push(REGISTRY_URLS.gradlePluginPortal);\n }\n\n return [...new Set(registryUrls)];\n}\n\nasync function parsePackageFiles(\n config: ExtractConfig,\n packageFiles: string[],\n extractedDeps: PackageDependency<GradleManagerData>[],\n packageFilesByName: Record<string, PackageFile>,\n packageRegistries: PackageRegistry[],\n): Promise<PackageDependency<GradleManagerData>[]> {\n const varRegistry: VariableRegistry = {};\n const fileContents = await getLocalFiles(packageFiles);\n\n for (const packageFile of packageFiles) {\n packageFilesByName[packageFile] = {\n packageFile,\n datasource: mavenDatasource,\n deps: [],\n };\n\n try {\n // TODO #22198\n const content = fileContents[packageFile]!;\n const packageFileDir = upath.dirname(toAbsolutePath(packageFile));\n\n if (isPropsFile(packageFile)) {\n const { vars, deps } = parseProps(content, packageFile);\n updateVars(varRegistry, packageFileDir, vars);\n extractedDeps.push(...deps);\n } else if (isTOMLFile(packageFile)) {\n const { vars, deps } = parseCatalog(packageFile, content);\n updateVarsFromDefaultCatalog(\n varRegistry,\n packageFileDir,\n packageFile,\n vars,\n );\n extractedDeps.push(...deps);\n } else if (\n isGcvPropsFile(packageFile) &&\n usesGcv(packageFile, fileContents)\n ) {\n const deps = parseGcv(packageFile, fileContents);\n extractedDeps.push(...deps);\n } else if (isKotlinSourceFile(packageFile)) {\n const vars = getVars(varRegistry, packageFileDir);\n const { vars: gradleVars, deps } = parseKotlinSource(\n content,\n vars,\n packageFile,\n );\n updateVars(varRegistry, '/', gradleVars);\n extractedDeps.push(...deps);\n } else if (isGradleScriptFile(packageFile)) {\n const vars = getVars(varRegistry, packageFileDir);\n const {\n deps,\n urls,\n vars: gradleVars,\n } = parseGradle(content, vars, packageFile, fileContents);\n updatePackageRegistries(packageRegistries, urls);\n updateVars(varRegistry, packageFileDir, gradleVars);\n extractedDeps.push(...deps);\n }\n } catch (err) {\n logger.debug(\n { err, config, packageFile },\n `Failed to process Gradle file`,\n );\n }\n }\n\n return extractedDeps;\n}\n\nexport async function extractAllPackageFiles(\n config: ExtractConfig,\n packageFiles: string[],\n): Promise<PackageFile[] | null> {\n const packageFilesByName: Record<string, PackageFile> = {};\n const packageRegistries: PackageRegistry[] = [];\n const extractedDeps: PackageDependency<GradleManagerData>[] = [];\n const kotlinSourceFiles = packageFiles.filter(isKotlinSourceFile);\n const gradleFiles = reorderFiles(\n packageFiles.filter((e) => !kotlinSourceFiles.includes(e)),\n );\n\n await parsePackageFiles(\n config,\n [...kotlinSourceFiles, ...kotlinSourceFiles, ...gradleFiles],\n extractedDeps,\n packageFilesByName,\n packageRegistries,\n );\n\n if (!extractedDeps.length) {\n return null;\n }\n\n unifyCatalogSharedVariableNames(extractedDeps);\n\n for (const dep of extractedDeps) {\n dep.fileReplacePosition = dep?.managerData?.fileReplacePosition; // #8224\n\n const key = dep.managerData?.packageFile;\n // istanbul ignore else\n if (key) {\n let pkgFile: PackageFile = packageFilesByName[key];\n // istanbul ignore if: won't happen if \"apply from\" processes only initially known files\n if (!pkgFile) {\n pkgFile = {\n packageFile: key,\n datasource: mavenDatasource,\n deps: [],\n };\n }\n\n dep.datasource ??= mavenDatasource;\n\n if (dep.datasource === mavenDatasource) {\n dep.registryUrls = getRegistryUrlsForDep(packageRegistries, dep);\n\n dep.depType ??=\n key.startsWith('buildSrc') && !kotlinSourceFiles.length\n ? 'devDependencies'\n : 'dependencies';\n }\n\n const depAlreadyInPkgFile = pkgFile.deps.some(\n (item) =>\n item.depName === dep.depName &&\n item.managerData?.fileReplacePosition ===\n dep.managerData?.fileReplacePosition,\n );\n if (!depAlreadyInPkgFile) {\n pkgFile.deps.push(dep);\n }\n\n packageFilesByName[key] = pkgFile;\n } else {\n logger.debug({ dep }, `Failed to process Gradle dependency`);\n }\n }\n\n return Object.values(packageFilesByName);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extract.js","names":["gradleVersioning"],"sources":["../../../../lib/modules/manager/gradle/extract.ts"],"sourcesContent":["import upath from 'upath';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { getLocalFiles } from '../../../util/fs/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { MavenDatasource } from '../../datasource/maven/index.ts';\nimport gradleVersioning from '../../versioning/gradle/index.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFile,\n} from '../types.ts';\nimport {\n parseCatalog,\n unifyCatalogSharedVariableNames,\n} from './extract/catalog.ts';\nimport {\n isGcvPropsFile,\n parseGcv,\n usesGcv,\n} from './extract/consistent-versions-plugin.ts';\nimport { REGISTRY_URLS } from './parser/common.ts';\nimport { parseGradle, parseKotlinSource, parseProps } from './parser.ts';\nimport type {\n ContentDescriptorSpec,\n GradleManagerData,\n PackageRegistry,\n VariableRegistry,\n} from './types.ts';\nimport {\n getVars,\n isGradleScriptFile,\n isKotlinSourceFile,\n isPropsFile,\n isTOMLFile,\n reorderFiles,\n toAbsolutePath,\n updateVars,\n updateVarsFromDefaultCatalog,\n} from './utils.ts';\n\nconst mavenDatasource = MavenDatasource.id;\n\nfunction updatePackageRegistries(\n packageRegistries: PackageRegistry[],\n urls: PackageRegistry[],\n): void {\n for (const url of urls) {\n const registryAlreadyKnown = packageRegistries.some(\n (item) =>\n item.registryUrl === url.registryUrl &&\n item.scope === url.scope &&\n item.registryType === url.registryType &&\n item.content === url.content,\n );\n if (!registryAlreadyKnown) {\n packageRegistries.push(url);\n }\n }\n}\n\nexport function matchesContentDescriptor(\n dep: PackageDependency<GradleManagerData>,\n contentDescriptors?: ContentDescriptorSpec[],\n): boolean {\n const [groupId, artifactId] = (dep.packageName ?? dep.depName!).split(':');\n let hasIncludes = false;\n let hasExcludes = false;\n let matchesInclude = false;\n let matchesExclude = false;\n\n for (const content of coerceArray(contentDescriptors)) {\n const {\n mode,\n matcher,\n groupId: contentGroupId,\n artifactId: contentArtifactId,\n version: contentVersion,\n } = content;\n\n // group matching\n let groupMatch = false;\n if (matcher === 'regex') {\n groupMatch = regEx(contentGroupId).test(groupId);\n } else if (matcher === 'subgroup') {\n groupMatch =\n groupId === contentGroupId || `${groupId}.`.startsWith(contentGroupId);\n } else {\n groupMatch = groupId === contentGroupId;\n }\n\n // artifact matching (optional)\n let artifactMatch = true;\n if (groupMatch && contentArtifactId) {\n if (matcher === 'regex') {\n artifactMatch = regEx(contentArtifactId).test(artifactId);\n } else {\n artifactMatch = artifactId === contentArtifactId;\n }\n }\n\n // version matching (optional)\n let versionMatch = true;\n if (groupMatch && artifactMatch && contentVersion && dep.currentValue) {\n if (matcher === 'regex') {\n versionMatch = regEx(contentVersion).test(dep.currentValue);\n } else {\n // contentVersion can be an exact version or a gradle-supported version range\n versionMatch = gradleVersioning.matches(\n dep.currentValue,\n contentVersion,\n );\n }\n }\n\n const isMatch = groupMatch && artifactMatch && versionMatch;\n if (mode === 'include') {\n hasIncludes = true;\n if (isMatch) {\n matchesInclude = true;\n }\n } else if (mode === 'exclude') {\n hasExcludes = true;\n if (isMatch) {\n matchesExclude = true;\n }\n }\n }\n\n if (hasIncludes && hasExcludes) {\n // if both includes and excludes exist, dep must match include and not match exclude\n return matchesInclude && !matchesExclude;\n }\n if (hasIncludes) {\n // if only includes exist, dep must match at least one include\n return matchesInclude;\n }\n if (hasExcludes) {\n // if only excludes exist, dep must not match any exclude\n return !matchesExclude;\n }\n\n // by default, repositories include everything and exclude nothing\n return true;\n}\n\nfunction getRegistryUrlsForDep(\n packageRegistries: PackageRegistry[],\n dep: PackageDependency<GradleManagerData>,\n): string[] {\n const scope = dep.depType === 'plugin' ? 'plugin' : 'dep';\n\n const matchingRegistries = packageRegistries.filter(\n (item) =>\n item.scope === scope && matchesContentDescriptor(dep, item.content),\n );\n\n const exclusiveRegistries = matchingRegistries.filter(\n (item) => item.registryType === 'exclusive',\n );\n\n const registryUrls = (\n exclusiveRegistries.length ? exclusiveRegistries : matchingRegistries\n ).map((item) => item.registryUrl);\n\n if (!registryUrls.length && scope === 'plugin') {\n registryUrls.push(REGISTRY_URLS.gradlePluginPortal);\n }\n\n return [...new Set(registryUrls)];\n}\n\nasync function parsePackageFiles(\n config: ExtractConfig,\n packageFiles: string[],\n extractedDeps: PackageDependency<GradleManagerData>[],\n packageFilesByName: Record<string, PackageFile>,\n packageRegistries: PackageRegistry[],\n): Promise<PackageDependency<GradleManagerData>[]> {\n const varRegistry: VariableRegistry = {};\n const fileContents = await getLocalFiles(packageFiles);\n\n for (const packageFile of packageFiles) {\n packageFilesByName[packageFile] = {\n packageFile,\n datasource: mavenDatasource,\n deps: [],\n };\n\n try {\n // TODO #22198\n const content = fileContents[packageFile]!;\n const packageFileDir = upath.dirname(toAbsolutePath(packageFile));\n\n if (isPropsFile(packageFile)) {\n const { vars, deps } = parseProps(content, packageFile);\n updateVars(varRegistry, packageFileDir, vars);\n extractedDeps.push(...deps);\n } else if (isTOMLFile(packageFile)) {\n const { vars, deps } = parseCatalog(packageFile, content);\n updateVarsFromDefaultCatalog(\n varRegistry,\n packageFileDir,\n packageFile,\n vars,\n );\n extractedDeps.push(...deps);\n } else if (\n isGcvPropsFile(packageFile) &&\n usesGcv(packageFile, fileContents)\n ) {\n const deps = parseGcv(packageFile, fileContents);\n extractedDeps.push(...deps);\n } else if (isKotlinSourceFile(packageFile)) {\n const vars = getVars(varRegistry, packageFileDir);\n const { vars: gradleVars, deps } = parseKotlinSource(\n content,\n vars,\n packageFile,\n );\n updateVars(varRegistry, '/', gradleVars);\n extractedDeps.push(...deps);\n } else if (isGradleScriptFile(packageFile)) {\n const vars = getVars(varRegistry, packageFileDir);\n const {\n deps,\n urls,\n vars: gradleVars,\n } = parseGradle(content, vars, packageFile, fileContents);\n updatePackageRegistries(packageRegistries, urls);\n updateVars(varRegistry, packageFileDir, gradleVars);\n extractedDeps.push(...deps);\n }\n } catch (err) {\n logger.debug(\n { err, config, packageFile },\n `Failed to process Gradle file`,\n );\n }\n }\n\n return extractedDeps;\n}\n\nexport async function extractAllPackageFiles(\n config: ExtractConfig,\n packageFiles: string[],\n): Promise<PackageFile[] | null> {\n const packageFilesByName: Record<string, PackageFile> = {};\n const packageRegistries: PackageRegistry[] = [];\n const extractedDeps: PackageDependency<GradleManagerData>[] = [];\n const kotlinSourceFiles = packageFiles.filter(isKotlinSourceFile);\n const gradleFiles = reorderFiles(\n packageFiles.filter((e) => !kotlinSourceFiles.includes(e)),\n );\n\n await parsePackageFiles(\n config,\n [...kotlinSourceFiles, ...kotlinSourceFiles, ...gradleFiles],\n extractedDeps,\n packageFilesByName,\n packageRegistries,\n );\n\n if (!extractedDeps.length) {\n return null;\n }\n\n unifyCatalogSharedVariableNames(extractedDeps);\n\n for (const dep of extractedDeps) {\n dep.fileReplacePosition = dep?.managerData?.fileReplacePosition; // #8224\n\n const key = dep.managerData?.packageFile;\n // istanbul ignore else\n if (key) {\n let pkgFile: PackageFile = packageFilesByName[key];\n // istanbul ignore if: won't happen if \"apply from\" processes only initially known files\n if (!pkgFile) {\n pkgFile = {\n packageFile: key,\n datasource: mavenDatasource,\n deps: [],\n };\n }\n\n dep.datasource ??= mavenDatasource;\n\n if (dep.datasource === mavenDatasource) {\n dep.registryUrls = getRegistryUrlsForDep(packageRegistries, dep);\n\n dep.depType ??=\n key.startsWith('buildSrc') && !kotlinSourceFiles.length\n ? 'devDependencies'\n : 'dependencies';\n }\n\n const depAlreadyInPkgFile = pkgFile.deps.some(\n (item) =>\n item.depName === dep.depName &&\n item.managerData?.fileReplacePosition ===\n dep.managerData?.fileReplacePosition,\n );\n if (!depAlreadyInPkgFile) {\n pkgFile.deps.push(dep);\n }\n\n packageFilesByName[key] = pkgFile;\n } else {\n logger.debug({ dep }, `Failed to process Gradle dependency`);\n }\n }\n\n return Object.values(packageFilesByName);\n}\n"],"mappings":"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"}
|
|
@@ -81,7 +81,7 @@ function coalesceVariable(ctx) {
|
|
|
81
81
|
}
|
|
82
82
|
function findVariableInKotlinImport(name, ctx, variables) {
|
|
83
83
|
if (ctx.tmpKotlinImportStore.length && name.includes(".")) for (const tokens of ctx.tmpKotlinImportStore) {
|
|
84
|
-
const lastToken = tokens
|
|
84
|
+
const lastToken = tokens.at(-1);
|
|
85
85
|
if (lastToken && name.startsWith(`${lastToken.value}.`)) {
|
|
86
86
|
const identifier = `${tokens.slice(0, -1).map((token) => token.value).join(".")}.${name}`;
|
|
87
87
|
if (variables[identifier]) return variables[identifier];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","names":["q"],"sources":["../../../../../lib/modules/manager/gradle/parser/common.ts"],"sourcesContent":["import type { lexer, parser } from '@renovatebot/good-enough-parser';\nimport { query as q } from '@renovatebot/good-enough-parser';\nimport { clone } from '../../../../util/clone.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport type {\n Ctx,\n NonEmptyArray,\n PackageVariables,\n VariableData,\n} from '../types.ts';\n\nexport const REGISTRY_URLS = {\n google: 'https://dl.google.com/android/maven2/',\n gradlePluginPortal: 'https://plugins.gradle.org/m2/',\n jcenter: 'https://jcenter.bintray.com/',\n mavenCentral: 'https://repo.maven.apache.org/maven2',\n};\n\nexport const GRADLE_PLUGINS = {\n checkstyle: ['toolVersion', 'com.puppycrawl.tools:checkstyle'],\n codenarc: ['toolVersion', 'org.codenarc:CodeNarc'],\n composeOptions: [\n 'kotlinCompilerExtensionVersion',\n 'androidx.compose.compiler:compiler',\n ],\n detekt: ['toolVersion', 'io.gitlab.arturbosch.detekt:detekt-core'],\n findbugs: ['toolVersion', 'com.google.code.findbugs:findbugs'],\n googleJavaFormat: [\n 'toolVersion',\n 'com.google.googlejavaformat:google-java-format',\n ],\n jacoco: ['toolVersion', 'org.jacoco:jacoco'],\n jmh: ['jmhVersion', 'org.openjdk.jmh:jmh-core'],\n lombok: ['version', 'org.projectlombok:lombok'],\n micronaut: ['version', 'io.micronaut.platform:micronaut-platform'],\n pmd: ['toolVersion', 'net.sourceforge.pmd:pmd-java'],\n spotbugs: ['toolVersion', 'com.github.spotbugs:spotbugs'],\n};\n\nexport const GRADLE_TEST_SUITES = {\n useJunit: 'junit:junit',\n useJUnitJupiter: 'org.junit.jupiter:junit-jupiter',\n useKotlinTest: 'org.jetbrains.kotlin:kotlin-test-junit',\n useSpock: 'org.spockframework:spock-core',\n useTestNG: 'org.testng:testng',\n};\n\nexport function storeVarToken(ctx: Ctx, node: lexer.Token): Ctx {\n ctx.varTokens.push(node);\n return ctx;\n}\n\nexport function increaseNestingDepth(ctx: Ctx): Ctx {\n ctx.tmpNestingDepth.push(...ctx.varTokens);\n ctx.varTokens = [];\n return ctx;\n}\n\nexport function reduceNestingDepth(ctx: Ctx): Ctx {\n ctx.tmpNestingDepth.pop();\n return ctx;\n}\n\nexport function prependNestingDepth(ctx: Ctx): Ctx {\n ctx.varTokens = [...clone(ctx.tmpNestingDepth), ...ctx.varTokens];\n return ctx;\n}\n\nexport function storeInTokenMap(ctx: Ctx, tokenMapKey: string): Ctx {\n ctx.tokenMap[tokenMapKey] = ctx.varTokens;\n ctx.varTokens = [];\n\n return ctx;\n}\n\nexport function loadFromTokenMap(\n ctx: Ctx,\n tokenMapKey: string,\n): NonEmptyArray<lexer.Token> {\n const tokens = ctx.tokenMap[tokenMapKey];\n if (!tokens) {\n throw new Error(`Expected token ${tokenMapKey} not found`);\n }\n\n return tokens as NonEmptyArray<lexer.Token>;\n}\n\nexport function cleanupTempVars(ctx: Ctx): Ctx {\n ctx.tokenMap = {};\n ctx.varTokens = [];\n\n return ctx;\n}\n\nexport function stripReservedPrefixFromKeyTokens(ctx: Ctx): Ctx {\n const unwantedPrefixes = [\n 'ext',\n 'extra',\n 'project',\n 'rootProject',\n 'properties',\n ];\n while (\n ctx.varTokens.length > 1 && // ensures there will be always at least one token\n ctx.varTokens[0] &&\n unwantedPrefixes.includes(ctx.varTokens[0].value)\n ) {\n ctx.varTokens.shift();\n }\n\n return ctx;\n}\n\nexport function coalesceVariable(ctx: Ctx): Ctx {\n if (ctx.varTokens.length > 1) {\n ctx.varTokens[0].value = ctx.varTokens\n .map((token) => token.value)\n .join('.');\n ctx.varTokens.length = 1;\n }\n\n return ctx;\n}\n\nexport function findVariableInKotlinImport(\n name: string,\n ctx: Ctx,\n variables: PackageVariables,\n): VariableData | undefined {\n if (ctx.tmpKotlinImportStore.length && name.includes('.')) {\n for (const tokens of ctx.tmpKotlinImportStore) {\n const lastToken = tokens[tokens.length - 1];\n if (lastToken && name.startsWith(`${lastToken.value}.`)) {\n const prefix = tokens\n .slice(0, -1)\n .map((token) => token.value)\n .join('.');\n const identifier = `${prefix}.${name}`;\n\n if (variables[identifier]) {\n return variables[identifier];\n }\n }\n }\n }\n\n return undefined;\n}\n\nexport function findVariable(\n name: string,\n ctx: Ctx,\n variables: PackageVariables = ctx.globalVars,\n): VariableData | undefined {\n if (ctx.tmpNestingDepth.length) {\n const prefixParts = ctx.tmpNestingDepth.map((token) => token.value);\n for (let idx = ctx.tmpNestingDepth.length; idx > 0; idx -= 1) {\n const prefix = prefixParts.slice(0, idx).join('.');\n const identifier = `${prefix}.${name}`;\n\n if (variables[identifier]) {\n return variables[identifier];\n }\n }\n }\n\n if (variables[name]) {\n return variables[name];\n }\n\n return findVariableInKotlinImport(name, ctx, variables);\n}\n\nexport function interpolateString(\n childTokens: lexer.Token[],\n ctx: Ctx,\n variables: PackageVariables = ctx.globalVars,\n): string | null {\n const resolvedSubstrings: string[] = [];\n for (const childToken of childTokens) {\n const type = childToken.type;\n if (type === 'string-value') {\n resolvedSubstrings.push(childToken.value);\n } else if (type === 'symbol') {\n const varData = findVariable(childToken.value, ctx, variables);\n if (varData) {\n resolvedSubstrings.push(varData.value);\n } else {\n return null;\n }\n } else {\n return null;\n }\n }\n\n return resolvedSubstrings.join('');\n}\n\nexport const qStringValue = q.str((ctx: Ctx, node: lexer.Token) => {\n storeVarToken(ctx, node);\n return ctx;\n});\n\nexport const qStringValueAsSymbol = q.str((ctx: Ctx, node: lexer.Token) => {\n const nodeTransformed: lexer.SymbolToken = {\n ...node,\n type: 'symbol',\n };\n storeVarToken(ctx, nodeTransformed);\n return ctx;\n});\n\n// https://docs.gradle.org/current/javadoc/org/gradle/api/provider/Provider.html#get()\nexport const qProviderValue = q\n .tree({\n maxDepth: 1,\n type: 'wrapped-tree',\n startsWith: '(',\n endsWith: ')',\n search: q.begin<Ctx>().end(),\n })\n .handler((ctx) => {\n if (ctx.varTokens.length > 1 && ctx.varTokens.at(-1)?.value === 'get') {\n ctx.varTokens.pop();\n }\n return ctx;\n });\n\n// foo.bar[\"baz\"] = \"1.2.3\"\nexport const qVariableAssignmentIdentifier = q\n .sym(storeVarToken)\n .many(\n q.alt(\n q.op<Ctx>('.').sym(storeVarToken),\n q.tree<Ctx>({\n type: 'wrapped-tree',\n maxDepth: 1,\n startsWith: '[',\n endsWith: ']',\n search: q.begin<Ctx>().join(qStringValueAsSymbol).end(),\n }),\n ),\n 0,\n 32,\n )\n .handler(stripReservedPrefixFromKeyTokens);\n\n// foo.bar[\"baz\"] -> \"foo.bar.baz\"\nexport const qVariableAccessIdentifier = q\n .handler<Ctx>((ctx) => {\n ctx.tmpTokenStore.backupVarAccessTokens = ctx.varTokens;\n ctx.varTokens = [];\n return ctx;\n })\n .join(qVariableAssignmentIdentifier)\n .opt(qProviderValue)\n .handler(coalesceVariable)\n .handler((ctx) => {\n ctx.varTokens = [\n ...ctx.tmpTokenStore.backupVarAccessTokens,\n ...ctx.varTokens,\n ];\n delete ctx.tmpTokenStore.backupVarAccessTokens;\n return ctx;\n });\n\n// project.ext.getProperty(...)\n// extra.get(...)\nexport const qPropertyAccessIdentifier = q\n .opt(q.sym<Ctx>(regEx(/^(?:rootProject|project)$/)).op('.'))\n .alt(\n q.opt(q.sym<Ctx>('ext').op('.')).sym(regEx(/^(?:property|getProperty)$/)),\n q\n .sym<Ctx>(regEx(/^(?:extra|ext)$/))\n .op('.')\n .sym('get'),\n )\n .tree({\n maxDepth: 1,\n startsWith: '(',\n endsWith: ')',\n search: q.begin<Ctx>().join(qStringValueAsSymbol).end(),\n })\n .opt(q.sym<Ctx>('as').sym('String'));\n\n// \"foo${bar}baz\"\nexport const qTemplateString = q\n .tree({\n type: 'string-tree',\n maxDepth: 2,\n preHandler: (ctx) => {\n ctx.tmpTokenStore.templateTokens = [];\n return ctx;\n },\n search: q\n .alt(qStringValue, qPropertyAccessIdentifier, qVariableAccessIdentifier)\n .handler((ctx) => {\n ctx.tmpTokenStore.templateTokens?.push(...ctx.varTokens);\n ctx.varTokens = [];\n return ctx;\n }),\n })\n .handler((ctx) => {\n ctx.varTokens = ctx.tmpTokenStore.templateTokens!;\n return ctx;\n });\n\n// foo = \"bar\"\n// foo + foo + \"${foo}\" + \"foo\" => \"barbarbarfoo\"\nexport const qConcatExpr = (\n ...matchers: q.QueryBuilder<Ctx, parser.Node>[]\n): q.QueryBuilder<Ctx, parser.Node> =>\n q.alt(...matchers).many(q.op<Ctx>('+').alt(...matchers), 0, 32);\n\nexport const qValueMatcher = qConcatExpr(\n qTemplateString,\n qPropertyAccessIdentifier,\n qVariableAccessIdentifier,\n);\n\n// import foo.bar\n// runtimeOnly(\"some:foo:${bar.bazVersion}\")\nexport const qKotlinImport = q\n .sym<Ctx>('import')\n .join(qVariableAssignmentIdentifier)\n .handler((ctx) => {\n ctx.tmpKotlinImportStore.push(ctx.varTokens);\n return ctx;\n })\n .handler(cleanupTempVars);\n\n// foo { bar { baz } }\n// foo.bar { baz }\nexport const qDotOrBraceExpr = (\n symValue: q.SymMatcherValue,\n matcher: q.QueryBuilder<Ctx, parser.Node>,\n): q.QueryBuilder<Ctx, parser.Node> =>\n q.sym<Ctx>(symValue).alt(\n q.op<Ctx>('.').join(matcher),\n q.tree({\n type: 'wrapped-tree',\n maxDepth: 1,\n startsWith: '{',\n endsWith: '}',\n search: matcher,\n }),\n );\n\nexport const qGroupId = qValueMatcher.handler((ctx) =>\n storeInTokenMap(ctx, 'groupId'),\n);\n\nexport const qArtifactId = qValueMatcher.handler((ctx) =>\n storeInTokenMap(ctx, 'artifactId'),\n);\n\nexport const qVersion = qValueMatcher.handler((ctx) =>\n storeInTokenMap(ctx, 'version'),\n);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"common.js","names":["q"],"sources":["../../../../../lib/modules/manager/gradle/parser/common.ts"],"sourcesContent":["import type { lexer, parser } from '@renovatebot/good-enough-parser';\nimport { query as q } from '@renovatebot/good-enough-parser';\nimport { clone } from '../../../../util/clone.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport type {\n Ctx,\n NonEmptyArray,\n PackageVariables,\n VariableData,\n} from '../types.ts';\n\nexport const REGISTRY_URLS = {\n google: 'https://dl.google.com/android/maven2/',\n gradlePluginPortal: 'https://plugins.gradle.org/m2/',\n jcenter: 'https://jcenter.bintray.com/',\n mavenCentral: 'https://repo.maven.apache.org/maven2',\n};\n\nexport const GRADLE_PLUGINS = {\n checkstyle: ['toolVersion', 'com.puppycrawl.tools:checkstyle'],\n codenarc: ['toolVersion', 'org.codenarc:CodeNarc'],\n composeOptions: [\n 'kotlinCompilerExtensionVersion',\n 'androidx.compose.compiler:compiler',\n ],\n detekt: ['toolVersion', 'io.gitlab.arturbosch.detekt:detekt-core'],\n findbugs: ['toolVersion', 'com.google.code.findbugs:findbugs'],\n googleJavaFormat: [\n 'toolVersion',\n 'com.google.googlejavaformat:google-java-format',\n ],\n jacoco: ['toolVersion', 'org.jacoco:jacoco'],\n jmh: ['jmhVersion', 'org.openjdk.jmh:jmh-core'],\n lombok: ['version', 'org.projectlombok:lombok'],\n micronaut: ['version', 'io.micronaut.platform:micronaut-platform'],\n pmd: ['toolVersion', 'net.sourceforge.pmd:pmd-java'],\n spotbugs: ['toolVersion', 'com.github.spotbugs:spotbugs'],\n};\n\nexport const GRADLE_TEST_SUITES = {\n useJunit: 'junit:junit',\n useJUnitJupiter: 'org.junit.jupiter:junit-jupiter',\n useKotlinTest: 'org.jetbrains.kotlin:kotlin-test-junit',\n useSpock: 'org.spockframework:spock-core',\n useTestNG: 'org.testng:testng',\n};\n\nexport function storeVarToken(ctx: Ctx, node: lexer.Token): Ctx {\n ctx.varTokens.push(node);\n return ctx;\n}\n\nexport function increaseNestingDepth(ctx: Ctx): Ctx {\n ctx.tmpNestingDepth.push(...ctx.varTokens);\n ctx.varTokens = [];\n return ctx;\n}\n\nexport function reduceNestingDepth(ctx: Ctx): Ctx {\n ctx.tmpNestingDepth.pop();\n return ctx;\n}\n\nexport function prependNestingDepth(ctx: Ctx): Ctx {\n ctx.varTokens = [...clone(ctx.tmpNestingDepth), ...ctx.varTokens];\n return ctx;\n}\n\nexport function storeInTokenMap(ctx: Ctx, tokenMapKey: string): Ctx {\n ctx.tokenMap[tokenMapKey] = ctx.varTokens;\n ctx.varTokens = [];\n\n return ctx;\n}\n\nexport function loadFromTokenMap(\n ctx: Ctx,\n tokenMapKey: string,\n): NonEmptyArray<lexer.Token> {\n const tokens = ctx.tokenMap[tokenMapKey];\n if (!tokens) {\n throw new Error(`Expected token ${tokenMapKey} not found`);\n }\n\n return tokens as NonEmptyArray<lexer.Token>;\n}\n\nexport function cleanupTempVars(ctx: Ctx): Ctx {\n ctx.tokenMap = {};\n ctx.varTokens = [];\n\n return ctx;\n}\n\nexport function stripReservedPrefixFromKeyTokens(ctx: Ctx): Ctx {\n const unwantedPrefixes = [\n 'ext',\n 'extra',\n 'project',\n 'rootProject',\n 'properties',\n ];\n while (\n ctx.varTokens.length > 1 && // ensures there will be always at least one token\n ctx.varTokens[0] &&\n unwantedPrefixes.includes(ctx.varTokens[0].value)\n ) {\n ctx.varTokens.shift();\n }\n\n return ctx;\n}\n\nexport function coalesceVariable(ctx: Ctx): Ctx {\n if (ctx.varTokens.length > 1) {\n ctx.varTokens[0].value = ctx.varTokens\n .map((token) => token.value)\n .join('.');\n ctx.varTokens.length = 1;\n }\n\n return ctx;\n}\n\nexport function findVariableInKotlinImport(\n name: string,\n ctx: Ctx,\n variables: PackageVariables,\n): VariableData | undefined {\n if (ctx.tmpKotlinImportStore.length && name.includes('.')) {\n for (const tokens of ctx.tmpKotlinImportStore) {\n const lastToken = tokens.at(-1);\n if (lastToken && name.startsWith(`${lastToken.value}.`)) {\n const prefix = tokens\n .slice(0, -1)\n .map((token) => token.value)\n .join('.');\n const identifier = `${prefix}.${name}`;\n\n if (variables[identifier]) {\n return variables[identifier];\n }\n }\n }\n }\n\n return undefined;\n}\n\nexport function findVariable(\n name: string,\n ctx: Ctx,\n variables: PackageVariables = ctx.globalVars,\n): VariableData | undefined {\n if (ctx.tmpNestingDepth.length) {\n const prefixParts = ctx.tmpNestingDepth.map((token) => token.value);\n for (let idx = ctx.tmpNestingDepth.length; idx > 0; idx -= 1) {\n const prefix = prefixParts.slice(0, idx).join('.');\n const identifier = `${prefix}.${name}`;\n\n if (variables[identifier]) {\n return variables[identifier];\n }\n }\n }\n\n if (variables[name]) {\n return variables[name];\n }\n\n return findVariableInKotlinImport(name, ctx, variables);\n}\n\nexport function interpolateString(\n childTokens: lexer.Token[],\n ctx: Ctx,\n variables: PackageVariables = ctx.globalVars,\n): string | null {\n const resolvedSubstrings: string[] = [];\n for (const childToken of childTokens) {\n const type = childToken.type;\n if (type === 'string-value') {\n resolvedSubstrings.push(childToken.value);\n } else if (type === 'symbol') {\n const varData = findVariable(childToken.value, ctx, variables);\n if (varData) {\n resolvedSubstrings.push(varData.value);\n } else {\n return null;\n }\n } else {\n return null;\n }\n }\n\n return resolvedSubstrings.join('');\n}\n\nexport const qStringValue = q.str((ctx: Ctx, node: lexer.Token) => {\n storeVarToken(ctx, node);\n return ctx;\n});\n\nexport const qStringValueAsSymbol = q.str((ctx: Ctx, node: lexer.Token) => {\n const nodeTransformed: lexer.SymbolToken = {\n ...node,\n type: 'symbol',\n };\n storeVarToken(ctx, nodeTransformed);\n return ctx;\n});\n\n// https://docs.gradle.org/current/javadoc/org/gradle/api/provider/Provider.html#get()\nexport const qProviderValue = q\n .tree({\n maxDepth: 1,\n type: 'wrapped-tree',\n startsWith: '(',\n endsWith: ')',\n search: q.begin<Ctx>().end(),\n })\n .handler((ctx) => {\n if (ctx.varTokens.length > 1 && ctx.varTokens.at(-1)?.value === 'get') {\n ctx.varTokens.pop();\n }\n return ctx;\n });\n\n// foo.bar[\"baz\"] = \"1.2.3\"\nexport const qVariableAssignmentIdentifier = q\n .sym(storeVarToken)\n .many(\n q.alt(\n q.op<Ctx>('.').sym(storeVarToken),\n q.tree<Ctx>({\n type: 'wrapped-tree',\n maxDepth: 1,\n startsWith: '[',\n endsWith: ']',\n search: q.begin<Ctx>().join(qStringValueAsSymbol).end(),\n }),\n ),\n 0,\n 32,\n )\n .handler(stripReservedPrefixFromKeyTokens);\n\n// foo.bar[\"baz\"] -> \"foo.bar.baz\"\nexport const qVariableAccessIdentifier = q\n .handler<Ctx>((ctx) => {\n ctx.tmpTokenStore.backupVarAccessTokens = ctx.varTokens;\n ctx.varTokens = [];\n return ctx;\n })\n .join(qVariableAssignmentIdentifier)\n .opt(qProviderValue)\n .handler(coalesceVariable)\n .handler((ctx) => {\n ctx.varTokens = [\n ...ctx.tmpTokenStore.backupVarAccessTokens,\n ...ctx.varTokens,\n ];\n delete ctx.tmpTokenStore.backupVarAccessTokens;\n return ctx;\n });\n\n// project.ext.getProperty(...)\n// extra.get(...)\nexport const qPropertyAccessIdentifier = q\n .opt(q.sym<Ctx>(regEx(/^(?:rootProject|project)$/)).op('.'))\n .alt(\n q.opt(q.sym<Ctx>('ext').op('.')).sym(regEx(/^(?:property|getProperty)$/)),\n q\n .sym<Ctx>(regEx(/^(?:extra|ext)$/))\n .op('.')\n .sym('get'),\n )\n .tree({\n maxDepth: 1,\n startsWith: '(',\n endsWith: ')',\n search: q.begin<Ctx>().join(qStringValueAsSymbol).end(),\n })\n .opt(q.sym<Ctx>('as').sym('String'));\n\n// \"foo${bar}baz\"\nexport const qTemplateString = q\n .tree({\n type: 'string-tree',\n maxDepth: 2,\n preHandler: (ctx) => {\n ctx.tmpTokenStore.templateTokens = [];\n return ctx;\n },\n search: q\n .alt(qStringValue, qPropertyAccessIdentifier, qVariableAccessIdentifier)\n .handler((ctx) => {\n ctx.tmpTokenStore.templateTokens?.push(...ctx.varTokens);\n ctx.varTokens = [];\n return ctx;\n }),\n })\n .handler((ctx) => {\n ctx.varTokens = ctx.tmpTokenStore.templateTokens!;\n return ctx;\n });\n\n// foo = \"bar\"\n// foo + foo + \"${foo}\" + \"foo\" => \"barbarbarfoo\"\nexport const qConcatExpr = (\n ...matchers: q.QueryBuilder<Ctx, parser.Node>[]\n): q.QueryBuilder<Ctx, parser.Node> =>\n q.alt(...matchers).many(q.op<Ctx>('+').alt(...matchers), 0, 32);\n\nexport const qValueMatcher = qConcatExpr(\n qTemplateString,\n qPropertyAccessIdentifier,\n qVariableAccessIdentifier,\n);\n\n// import foo.bar\n// runtimeOnly(\"some:foo:${bar.bazVersion}\")\nexport const qKotlinImport = q\n .sym<Ctx>('import')\n .join(qVariableAssignmentIdentifier)\n .handler((ctx) => {\n ctx.tmpKotlinImportStore.push(ctx.varTokens);\n return ctx;\n })\n .handler(cleanupTempVars);\n\n// foo { bar { baz } }\n// foo.bar { baz }\nexport const qDotOrBraceExpr = (\n symValue: q.SymMatcherValue,\n matcher: q.QueryBuilder<Ctx, parser.Node>,\n): q.QueryBuilder<Ctx, parser.Node> =>\n q.sym<Ctx>(symValue).alt(\n q.op<Ctx>('.').join(matcher),\n q.tree({\n type: 'wrapped-tree',\n maxDepth: 1,\n startsWith: '{',\n endsWith: '}',\n search: matcher,\n }),\n );\n\nexport const qGroupId = qValueMatcher.handler((ctx) =>\n storeInTokenMap(ctx, 'groupId'),\n);\n\nexport const qArtifactId = qValueMatcher.handler((ctx) =>\n storeInTokenMap(ctx, 'artifactId'),\n);\n\nexport const qVersion = qValueMatcher.handler((ctx) =>\n storeInTokenMap(ctx, 'version'),\n);\n"],"mappings":"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"}
|
|
@@ -62,7 +62,7 @@ function handleDepString(ctx) {
|
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
if (!dep.managerData) {
|
|
65
|
-
const lastToken = stringTokens
|
|
65
|
+
const lastToken = stringTokens.at(-1);
|
|
66
66
|
if (lastToken?.type === "string-value" && dep.currentValue && lastToken.value.includes(dep.currentValue)) {
|
|
67
67
|
packageFile = ctx.packageFile;
|
|
68
68
|
if (stringTokens.length === 1) fileReplacePosition = lastToken.offset + dep.depName.length + 1;
|