renovate 44.48.3 → 44.49.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/massage.js +2 -1
- package/dist/config/massage.js.map +1 -1
- package/dist/config/migrate-validate.js +3 -2
- package/dist/config/migrate-validate.js.map +1 -1
- package/dist/config/migration.js +2 -1
- package/dist/config/migration.js.map +1 -1
- package/dist/config/migrations/custom/base-branch-migration.js +2 -1
- package/dist/config/migrations/custom/base-branch-migration.js.map +1 -1
- package/dist/config/migrations/custom/dep-types-migration.js +2 -1
- package/dist/config/migrations/custom/dep-types-migration.js.map +1 -1
- package/dist/config/migrations/custom/file-match-migration.js +2 -1
- package/dist/config/migrations/custom/file-match-migration.js.map +1 -1
- package/dist/config/migrations/custom/node-migration.js +2 -1
- package/dist/config/migrations/custom/node-migration.js.map +1 -1
- package/dist/config/migrations/custom/package-files-migration.js +2 -1
- package/dist/config/migrations/custom/package-files-migration.js.map +1 -1
- package/dist/config/presets/index.js +2 -1
- package/dist/config/presets/index.js.map +1 -1
- package/dist/config/secrets.js +3 -2
- package/dist/config/secrets.js.map +1 -1
- package/dist/config/validation.js +3 -2
- package/dist/config/validation.js.map +1 -1
- package/dist/modules/datasource/aws-eks-addon/index.js +1 -1
- package/dist/modules/datasource/aws-machine-image/index.js +2 -1
- package/dist/modules/datasource/aws-machine-image/index.js.map +1 -1
- package/dist/modules/datasource/aws-rds/index.js +3 -1
- package/dist/modules/datasource/aws-rds/index.js.map +1 -1
- package/dist/modules/datasource/azure-bicep-resource/schema.js +2 -1
- package/dist/modules/datasource/azure-bicep-resource/schema.js.map +1 -1
- package/dist/modules/datasource/conda/index.js +1 -1
- package/dist/modules/datasource/conda/prefix-dev.js +1 -1
- package/dist/modules/datasource/custom/utils.js +2 -1
- package/dist/modules/datasource/custom/utils.js.map +1 -1
- package/dist/modules/datasource/deno/index.js +2 -1
- package/dist/modules/datasource/deno/index.js.map +1 -1
- package/dist/modules/datasource/docker/common.js +3 -2
- package/dist/modules/datasource/docker/common.js.map +1 -1
- package/dist/modules/datasource/docker/index.js +1 -1
- package/dist/modules/datasource/glasskube-packages/index.js +2 -1
- package/dist/modules/datasource/glasskube-packages/index.js.map +1 -1
- package/dist/modules/datasource/index.js +5 -5
- package/dist/modules/datasource/index.js.map +1 -1
- package/dist/modules/datasource/maven/schema.js +2 -1
- package/dist/modules/datasource/maven/schema.js.map +1 -1
- package/dist/modules/datasource/nuget/v3.js +1 -1
- package/dist/modules/datasource/pypi/index.js +1 -1
- package/dist/modules/datasource/python-version/index.js +2 -1
- package/dist/modules/datasource/python-version/index.js.map +1 -1
- package/dist/modules/datasource/ruby-version/index.js +3 -1
- package/dist/modules/datasource/ruby-version/index.js.map +1 -1
- package/dist/modules/datasource/rubygems/versions-endpoint-cache.js +2 -1
- package/dist/modules/datasource/rubygems/versions-endpoint-cache.js.map +1 -1
- package/dist/modules/manager/argocd/extract.js +1 -1
- package/dist/modules/manager/azure-pipelines/extract.js +1 -1
- package/dist/modules/manager/bazel-module/bazelrc.js +1 -1
- package/dist/modules/manager/bazel-module/extract.js +1 -1
- package/dist/modules/manager/bazel-module/parser/index.js +3 -1
- package/dist/modules/manager/bazel-module/parser/index.js.map +1 -1
- package/dist/modules/manager/bazel-module/rules.js +2 -1
- package/dist/modules/manager/bazel-module/rules.js.map +1 -1
- package/dist/modules/manager/cargo/artifacts.js +1 -1
- package/dist/modules/manager/cargo/extract.js +4 -3
- package/dist/modules/manager/cargo/extract.js.map +1 -1
- package/dist/modules/manager/cargo/locked-version.js +1 -1
- package/dist/modules/manager/circleci/extract.js +2 -1
- package/dist/modules/manager/circleci/extract.js.map +1 -1
- package/dist/modules/manager/cocoapods/artifacts.js +1 -1
- package/dist/modules/manager/composer/artifacts.js +6 -4
- package/dist/modules/manager/composer/artifacts.js.map +1 -1
- package/dist/modules/manager/composer/schema.js +3 -2
- package/dist/modules/manager/composer/schema.js.map +1 -1
- package/dist/modules/manager/copier/artifacts.js +15 -4
- package/dist/modules/manager/copier/artifacts.js.map +1 -1
- package/dist/modules/manager/crow/extract.js +1 -1
- package/dist/modules/manager/custom/regex/strategies.js +4 -4
- package/dist/modules/manager/custom/regex/strategies.js.map +1 -1
- package/dist/modules/manager/custom/regex/utils.js +2 -1
- package/dist/modules/manager/custom/regex/utils.js.map +1 -1
- package/dist/modules/manager/docker-compose/extract.js +2 -1
- package/dist/modules/manager/docker-compose/extract.js.map +1 -1
- package/dist/modules/manager/dockerfile/extract.js +2 -1
- package/dist/modules/manager/dockerfile/extract.js.map +1 -1
- package/dist/modules/manager/fingerprint.generated.js +10 -10
- package/dist/modules/manager/fingerprint.generated.js.map +1 -1
- package/dist/modules/manager/flux/extract.js +1 -1
- package/dist/modules/manager/github-actions/artifacts.js +1 -1
- package/dist/modules/manager/gitlabci/schema.js +1 -1
- package/dist/modules/manager/gleam/extract.js +3 -2
- package/dist/modules/manager/gleam/extract.js.map +1 -1
- package/dist/modules/manager/gleam/locked-version.js +1 -1
- package/dist/modules/manager/gomod/artifacts.js +1 -1
- package/dist/modules/manager/gradle/extract/catalog.js +4 -4
- package/dist/modules/manager/gradle/extract/catalog.js.map +1 -1
- package/dist/modules/manager/gradle/extract.js +1 -1
- package/dist/modules/manager/gradle/utils.js +3 -2
- package/dist/modules/manager/gradle/utils.js.map +1 -1
- package/dist/modules/manager/helm-values/util.js +1 -1
- package/dist/modules/manager/helmfile/artifacts.js +1 -1
- package/dist/modules/manager/helmfile/extract.js +2 -2
- package/dist/modules/manager/helmv3/artifacts.js +3 -2
- package/dist/modules/manager/helmv3/artifacts.js.map +1 -1
- package/dist/modules/manager/helmv3/common.js +1 -1
- package/dist/modules/manager/jsonnet-bundler/artifacts.js +1 -1
- package/dist/modules/manager/jsonnet-bundler/extract.js +1 -1
- package/dist/modules/manager/kustomize/artifacts.js +3 -2
- package/dist/modules/manager/kustomize/artifacts.js.map +1 -1
- package/dist/modules/manager/kustomize/extract.js +1 -1
- package/dist/modules/manager/maven/extract.js +4 -3
- package/dist/modules/manager/maven/extract.js.map +1 -1
- package/dist/modules/manager/maven-wrapper/extract.js +1 -1
- package/dist/modules/manager/mise/extract.js +2 -1
- package/dist/modules/manager/mise/extract.js.map +1 -1
- package/dist/modules/manager/mise/upgradeable-tooling.js +2 -1
- package/dist/modules/manager/mise/upgradeable-tooling.js.map +1 -1
- package/dist/modules/manager/npm/artifacts.js +3 -2
- package/dist/modules/manager/npm/artifacts.js.map +1 -1
- package/dist/modules/manager/npm/extract/common/dependency.js +2 -1
- package/dist/modules/manager/npm/extract/common/dependency.js.map +1 -1
- package/dist/modules/manager/npm/extract/pnpm.js +2 -1
- package/dist/modules/manager/npm/extract/pnpm.js.map +1 -1
- package/dist/modules/manager/npm/extract/post/monorepo.js +2 -1
- package/dist/modules/manager/npm/extract/post/monorepo.js.map +1 -1
- package/dist/modules/manager/npm/post-update/yarn.js +3 -2
- package/dist/modules/manager/npm/post-update/yarn.js.map +1 -1
- package/dist/modules/manager/nuget/artifacts.js +2 -1
- package/dist/modules/manager/nuget/artifacts.js.map +1 -1
- package/dist/modules/manager/nuget/extract.js +2 -1
- package/dist/modules/manager/nuget/extract.js.map +1 -1
- package/dist/modules/manager/osgi/extract.js +2 -1
- package/dist/modules/manager/osgi/extract.js.map +1 -1
- package/dist/modules/manager/pep621/processors/uv.js +2 -1
- package/dist/modules/manager/pep621/processors/uv.js.map +1 -1
- package/dist/modules/manager/pep723/schema.js +2 -1
- package/dist/modules/manager/pep723/schema.js.map +1 -1
- package/dist/modules/manager/pip-compile/common.js +6 -6
- package/dist/modules/manager/pip-compile/common.js.map +1 -1
- package/dist/modules/manager/pip-compile/extract.js +4 -4
- package/dist/modules/manager/pip-compile/extract.js.map +1 -1
- package/dist/modules/manager/pipenv/artifacts.js +3 -1
- package/dist/modules/manager/pipenv/artifacts.js.map +1 -1
- package/dist/modules/manager/pixi/extract.js +1 -1
- package/dist/modules/manager/poetry/artifacts.js +2 -1
- package/dist/modules/manager/poetry/artifacts.js.map +1 -1
- package/dist/modules/manager/poetry/schema.js +1 -1
- package/dist/modules/manager/pre-commit/extract.js +2 -1
- package/dist/modules/manager/pre-commit/extract.js.map +1 -1
- package/dist/modules/manager/renovate-config/extract.js +5 -3
- package/dist/modules/manager/renovate-config/extract.js.map +1 -1
- package/dist/modules/manager/setup-cfg/extract.js +3 -2
- package/dist/modules/manager/setup-cfg/extract.js.map +1 -1
- package/dist/modules/manager/sveltos/extract.js +1 -1
- package/dist/modules/manager/tekton/extract.js +1 -1
- package/dist/modules/manager/terraform/lockfile/hash.js +1 -1
- package/dist/modules/manager/terraform/lockfile/index.js +5 -3
- package/dist/modules/manager/terraform/lockfile/index.js.map +1 -1
- package/dist/modules/manager/tflint-plugin/plugins.js +3 -2
- package/dist/modules/manager/tflint-plugin/plugins.js.map +1 -1
- package/dist/modules/manager/velaci/extract.js +4 -3
- package/dist/modules/manager/velaci/extract.js.map +1 -1
- package/dist/modules/manager/vendir/artifacts.js +3 -2
- package/dist/modules/manager/vendir/artifacts.js.map +1 -1
- package/dist/modules/manager/woodpecker/extract.js +2 -1
- package/dist/modules/manager/woodpecker/extract.js.map +1 -1
- package/dist/modules/platform/bitbucket-server/utils.js +4 -3
- package/dist/modules/platform/bitbucket-server/utils.js.map +1 -1
- package/dist/modules/platform/codecommit/index.js +2 -2
- package/dist/modules/platform/codecommit/index.js.map +1 -1
- package/dist/modules/platform/forgejo/index.js +4 -3
- package/dist/modules/platform/forgejo/index.js.map +1 -1
- package/dist/modules/platform/forgejo/utils.js +1 -1
- package/dist/modules/platform/gerrit/index.js +3 -2
- package/dist/modules/platform/gerrit/index.js.map +1 -1
- package/dist/modules/platform/gerrit/scm.js +2 -1
- package/dist/modules/platform/gerrit/scm.js.map +1 -1
- package/dist/modules/platform/gerrit/utils.js +3 -2
- package/dist/modules/platform/gerrit/utils.js.map +1 -1
- package/dist/modules/platform/gitea/index.js +4 -3
- package/dist/modules/platform/gitea/index.js.map +1 -1
- package/dist/modules/platform/gitea/utils.js +2 -1
- package/dist/modules/platform/gitea/utils.js.map +1 -1
- package/dist/modules/platform/github/index.js +14 -13
- package/dist/modules/platform/github/index.js.map +1 -1
- package/dist/modules/platform/github/pr.js +2 -0
- package/dist/modules/platform/github/pr.js.map +1 -1
- package/dist/modules/platform/github/user.js +2 -0
- package/dist/modules/platform/github/user.js.map +1 -1
- package/dist/modules/platform/gitlab/index.js +4 -4
- package/dist/modules/platform/gitlab/index.js.map +1 -1
- package/dist/modules/platform/index.js +3 -2
- package/dist/modules/platform/index.js.map +1 -1
- package/dist/modules/platform/scm-manager/index.js +2 -1
- package/dist/modules/platform/scm-manager/index.js.map +1 -1
- package/dist/modules/platform/scm-manager/mapper.js +2 -1
- package/dist/modules/platform/scm-manager/mapper.js.map +1 -1
- package/dist/modules/versioning/gradle/compare.js +3 -2
- package/dist/modules/versioning/gradle/compare.js.map +1 -1
- package/dist/modules/versioning/pep440/range.js +1 -1
- package/dist/modules/versioning/perl/index.js +3 -2
- package/dist/modules/versioning/perl/index.js.map +1 -1
- package/dist/modules/versioning/rpm/index.js +3 -2
- package/dist/modules/versioning/rpm/index.js.map +1 -1
- package/dist/modules/versioning/ruby/version.js +5 -4
- package/dist/modules/versioning/ruby/version.js.map +1 -1
- package/dist/util/common.js +2 -1
- package/dist/util/common.js.map +1 -1
- package/dist/util/env.js +2 -1
- package/dist/util/env.js.map +1 -1
- package/dist/util/exec/containerbase.js +2 -1
- package/dist/util/exec/containerbase.js.map +1 -1
- package/dist/util/exec/docker/index.js +2 -1
- package/dist/util/exec/docker/index.js.map +1 -1
- package/dist/util/exec/index.js +3 -3
- package/dist/util/exec/index.js.map +1 -1
- package/dist/util/exec/utils.js +2 -1
- package/dist/util/exec/utils.js.map +1 -1
- package/dist/util/git/exec.js +1 -1
- package/dist/util/git/index.js +5 -3
- package/dist/util/git/index.js.map +1 -1
- package/dist/util/http/github.d.ts +1 -0
- package/dist/util/http/github.js +14 -2
- package/dist/util/http/github.js.map +1 -1
- package/dist/util/http/http.js +2 -1
- package/dist/util/http/http.js.map +1 -1
- package/dist/util/package-rules/index.js +2 -1
- package/dist/util/package-rules/index.js.map +1 -1
- package/dist/util/stats.js +19 -17
- package/dist/util/stats.js.map +1 -1
- package/dist/util/template/index.js +1 -1
- package/dist/workers/global/config/parse/index.js +5 -5
- package/dist/workers/global/config/parse/index.js.map +1 -1
- package/dist/workers/repository/dependency-dashboard.js +1 -1
- package/dist/workers/repository/errors-warnings.js +3 -2
- package/dist/workers/repository/errors-warnings.js.map +1 -1
- package/dist/workers/repository/extract/extract-fingerprint-config.js +4 -3
- package/dist/workers/repository/extract/extract-fingerprint-config.js.map +1 -1
- package/dist/workers/repository/extract/index.js +2 -1
- package/dist/workers/repository/extract/index.js.map +1 -1
- package/dist/workers/repository/finalize/repository-statistics.js +6 -4
- package/dist/workers/repository/finalize/repository-statistics.js.map +1 -1
- package/dist/workers/repository/init/inherited.js +5 -4
- package/dist/workers/repository/init/inherited.js.map +1 -1
- package/dist/workers/repository/init/merge.js +2 -2
- package/dist/workers/repository/init/vulnerability.js +4 -2
- package/dist/workers/repository/init/vulnerability.js.map +1 -1
- package/dist/workers/repository/onboarding/branch/create.js +1 -1
- package/dist/workers/repository/onboarding/branch/index.js +2 -1
- package/dist/workers/repository/onboarding/branch/index.js.map +1 -1
- package/dist/workers/repository/package-files.js.map +1 -1
- package/dist/workers/repository/process/extract-update.js +1 -1
- package/dist/workers/repository/process/limits.js +3 -1
- package/dist/workers/repository/process/limits.js.map +1 -1
- package/dist/workers/repository/process/vulnerabilities.js +7 -6
- package/dist/workers/repository/process/vulnerabilities.js.map +1 -1
- package/dist/workers/repository/update/branch/bump-versions.js +1 -1
- package/dist/workers/repository/update/branch/execute-post-upgrade-commands.js +3 -3
- package/dist/workers/repository/update/branch/execute-post-upgrade-commands.js.map +1 -1
- package/dist/workers/repository/update/branch/index.js +4 -3
- package/dist/workers/repository/update/branch/index.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/index.js +30 -27
- package/dist/workers/repository/update/pr/changelog/index.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/release-notes.js +72 -49
- package/dist/workers/repository/update/pr/changelog/release-notes.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/releases.js +35 -32
- package/dist/workers/repository/update/pr/changelog/releases.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/source.js +75 -72
- package/dist/workers/repository/update/pr/changelog/source.js.map +1 -1
- package/dist/workers/repository/update/pr/labels.js +5 -4
- package/dist/workers/repository/update/pr/labels.js.map +1 -1
- package/dist/workers/repository/update/pr/participants.js +3 -2
- package/dist/workers/repository/update/pr/participants.js.map +1 -1
- package/dist/workers/repository/updates/flatten.js +2 -1
- package/dist/workers/repository/updates/flatten.js.map +1 -1
- package/dist/workers/repository/updates/generate.js +3 -2
- package/dist/workers/repository/updates/generate.js.map +1 -1
- package/package.json +1 -1
- package/renovate-schema.json +2 -2
package/dist/config/massage.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { coerceArray } from "../util/array.js";
|
|
1
2
|
import { clone } from "../util/clone.js";
|
|
2
3
|
import { toMs } from "../util/pretty-time.js";
|
|
3
4
|
import { getOptions } from "./options/index.js";
|
|
@@ -39,7 +40,7 @@ function massageConfig(config) {
|
|
|
39
40
|
Object.keys(newRule).forEach((newKey) => {
|
|
40
41
|
if (!(newKey.startsWith(`match`) || newKey.startsWith("exclude"))) delete newRule[newKey];
|
|
41
42
|
});
|
|
42
|
-
newRule.matchUpdateTypes = rule.matchUpdateTypes
|
|
43
|
+
newRule.matchUpdateTypes = coerceArray(rule.matchUpdateTypes);
|
|
43
44
|
newRule.matchUpdateTypes.push(key);
|
|
44
45
|
newRule = {
|
|
45
46
|
...newRule,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"massage.js","names":[],"sources":["../../lib/config/massage.ts"],"sourcesContent":["import { isArray, isNonEmptyArray, isObject, isString } from '@sindresorhus/is';\nimport { clone } from '../util/clone.ts';\nimport { toMs } from '../util/pretty-time.ts';\nimport { getOptions } from './options/index.ts';\nimport type { PackageRule, RenovateConfig, UpdateType } from './types.ts';\n\nconst options = getOptions();\n\nlet allowedStrings: string[];\n\n// Returns a massaged config\nexport function massageConfig(config: RenovateConfig): RenovateConfig {\n if (!allowedStrings) {\n allowedStrings = [];\n options.forEach((option) => {\n if (option.allowString) {\n allowedStrings.push(option.name);\n }\n });\n }\n const massagedConfig = clone(config);\n for (const [key, val] of Object.entries(config)) {\n if (key === 'minimumReleaseAge' && isString(val) && toMs(val) === 0) {\n massagedConfig.minimumReleaseAge = null;\n } else if (allowedStrings.includes(key) && isString(val)) {\n // @ts-expect-error -- TODO: fix me\n massagedConfig[key] = [val];\n } else if (isArray(val)) {\n // @ts-expect-error -- TODO: fix me\n massagedConfig[key] = [];\n val.forEach((item) => {\n if (isObject(item)) {\n // @ts-expect-error -- TODO: fix me\n (massagedConfig[key] as RenovateConfig[]).push(massageConfig(item));\n } else {\n // @ts-expect-error -- TODO: fix me\n (massagedConfig[key] as unknown[]).push(item);\n }\n });\n } else if (isObject(val) && key !== 'encrypted') {\n // @ts-expect-error -- TODO: fix me\n massagedConfig[key] = massageConfig(val);\n }\n }\n if (isNonEmptyArray(massagedConfig.packageRules)) {\n let newRules: PackageRule[] = [];\n const updateTypes: UpdateType[] = [\n 'major',\n 'minor',\n 'patch',\n 'pin',\n 'digest',\n 'rollback',\n ];\n for (const rule of massagedConfig.packageRules) {\n newRules.push(rule);\n for (const [key, val] of Object.entries(rule) as [\n UpdateType,\n PackageRule,\n ][]) {\n if (updateTypes.includes(key)) {\n let newRule = clone(rule);\n Object.keys(newRule).forEach((newKey) => {\n if (!(newKey.startsWith(`match`) || newKey.startsWith('exclude'))) {\n // @ts-expect-error -- TODO: fix me\n delete newRule[newKey];\n }\n });\n newRule.matchUpdateTypes = rule.matchUpdateTypes
|
|
1
|
+
{"version":3,"file":"massage.js","names":[],"sources":["../../lib/config/massage.ts"],"sourcesContent":["import { isArray, isNonEmptyArray, isObject, isString } from '@sindresorhus/is';\nimport { coerceArray } from '../util/array.ts';\nimport { clone } from '../util/clone.ts';\nimport { toMs } from '../util/pretty-time.ts';\nimport { getOptions } from './options/index.ts';\nimport type { PackageRule, RenovateConfig, UpdateType } from './types.ts';\n\nconst options = getOptions();\n\nlet allowedStrings: string[];\n\n// Returns a massaged config\nexport function massageConfig(config: RenovateConfig): RenovateConfig {\n if (!allowedStrings) {\n allowedStrings = [];\n options.forEach((option) => {\n if (option.allowString) {\n allowedStrings.push(option.name);\n }\n });\n }\n const massagedConfig = clone(config);\n for (const [key, val] of Object.entries(config)) {\n if (key === 'minimumReleaseAge' && isString(val) && toMs(val) === 0) {\n massagedConfig.minimumReleaseAge = null;\n } else if (allowedStrings.includes(key) && isString(val)) {\n // @ts-expect-error -- TODO: fix me\n massagedConfig[key] = [val];\n } else if (isArray(val)) {\n // @ts-expect-error -- TODO: fix me\n massagedConfig[key] = [];\n val.forEach((item) => {\n if (isObject(item)) {\n // @ts-expect-error -- TODO: fix me\n (massagedConfig[key] as RenovateConfig[]).push(massageConfig(item));\n } else {\n // @ts-expect-error -- TODO: fix me\n (massagedConfig[key] as unknown[]).push(item);\n }\n });\n } else if (isObject(val) && key !== 'encrypted') {\n // @ts-expect-error -- TODO: fix me\n massagedConfig[key] = massageConfig(val);\n }\n }\n if (isNonEmptyArray(massagedConfig.packageRules)) {\n let newRules: PackageRule[] = [];\n const updateTypes: UpdateType[] = [\n 'major',\n 'minor',\n 'patch',\n 'pin',\n 'digest',\n 'rollback',\n ];\n for (const rule of massagedConfig.packageRules) {\n newRules.push(rule);\n for (const [key, val] of Object.entries(rule) as [\n UpdateType,\n PackageRule,\n ][]) {\n if (updateTypes.includes(key)) {\n let newRule = clone(rule);\n Object.keys(newRule).forEach((newKey) => {\n if (!(newKey.startsWith(`match`) || newKey.startsWith('exclude'))) {\n // @ts-expect-error -- TODO: fix me\n delete newRule[newKey];\n }\n });\n newRule.matchUpdateTypes = coerceArray(rule.matchUpdateTypes);\n newRule.matchUpdateTypes.push(key);\n newRule = { ...newRule, ...val };\n newRules.push(newRule);\n }\n }\n }\n for (const rule of newRules) {\n updateTypes.forEach((updateType) => {\n delete rule[updateType];\n });\n }\n newRules = newRules.filter((rule) => {\n if (\n Object.keys(rule).every(\n (key) => key.startsWith('match') || key.startsWith('exclude'),\n )\n ) {\n // Exclude rules which contain only match or exclude options\n return false;\n }\n return true;\n });\n massagedConfig.packageRules = newRules;\n }\n return massagedConfig;\n}\n"],"mappings":";;;;;;AAOA,MAAM,UAAU,WAAW;AAE3B,IAAI;AAGJ,SAAgB,cAAc,QAAwC;CACpE,IAAI,CAAC,gBAAgB;EACnB,iBAAiB,CAAC;EAClB,QAAQ,SAAS,WAAW;GAC1B,IAAI,OAAO,aACT,eAAe,KAAK,OAAO,IAAI;EAEnC,CAAC;CACH;CACA,MAAM,iBAAiB,MAAM,MAAM;CACnC,KAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,MAAM,GAC5C,IAAI,QAAQ,uBAAuB,SAAS,GAAG,KAAK,KAAK,GAAG,MAAM,GAChE,eAAe,oBAAoB;MAC9B,IAAI,eAAe,SAAS,GAAG,KAAK,SAAS,GAAG,GAErD,eAAe,OAAO,CAAC,GAAG;MACrB,IAAI,QAAQ,GAAG,GAAG;EAEvB,eAAe,OAAO,CAAC;EACvB,IAAI,SAAS,SAAS;GACpB,IAAI,SAAS,IAAI,GAEf,eAAgB,IAAI,CAAsB,KAAK,cAAc,IAAI,CAAC;QAGlE,eAAgB,IAAI,CAAe,KAAK,IAAI;EAEhD,CAAC;CACH,OAAO,IAAI,SAAS,GAAG,KAAK,QAAQ,aAElC,eAAe,OAAO,cAAc,GAAG;CAG3C,IAAI,gBAAgB,eAAe,YAAY,GAAG;EAChD,IAAI,WAA0B,CAAC;EAC/B,MAAM,cAA4B;GAChC;GACA;GACA;GACA;GACA;GACA;EACF;EACA,KAAK,MAAM,QAAQ,eAAe,cAAc;GAC9C,SAAS,KAAK,IAAI;GAClB,KAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,IAAI,GAI1C,IAAI,YAAY,SAAS,GAAG,GAAG;IAC7B,IAAI,UAAU,MAAM,IAAI;IACxB,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,WAAW;KACvC,IAAI,EAAE,OAAO,WAAW,OAAO,KAAK,OAAO,WAAW,SAAS,IAE7D,OAAO,QAAQ;IAEnB,CAAC;IACD,QAAQ,mBAAmB,YAAY,KAAK,gBAAgB;IAC5D,QAAQ,iBAAiB,KAAK,GAAG;IACjC,UAAU;KAAE,GAAG;KAAS,GAAG;IAAI;IAC/B,SAAS,KAAK,OAAO;GACvB;EAEJ;EACA,KAAK,MAAM,QAAQ,UACjB,YAAY,SAAS,eAAe;GAClC,OAAO,KAAK;EACd,CAAC;EAEH,WAAW,SAAS,QAAQ,SAAS;GACnC,IACE,OAAO,KAAK,IAAI,CAAC,CAAC,OACf,QAAQ,IAAI,WAAW,OAAO,KAAK,IAAI,WAAW,SAAS,CAC9D,GAGA,OAAO;GAET,OAAO;EACT,CAAC;EACD,eAAe,eAAe;CAChC;CACA,OAAO;AACT"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { coerceArray } from "../util/array.js";
|
|
1
2
|
import { logger } from "../logger/index.js";
|
|
2
3
|
import { massageConfig } from "./massage.js";
|
|
3
4
|
import { migrateConfig } from "./migration.js";
|
|
@@ -20,8 +21,8 @@ async function migrateAndValidate(config, input) {
|
|
|
20
21
|
/* v8 ignore if -- hard to test */
|
|
21
22
|
if (isNonEmptyArray(warnings)) logger.warn({ warnings }, "Found renovate config warnings");
|
|
22
23
|
if (isNonEmptyArray(errors)) logger.info({ errors }, "Found renovate config errors");
|
|
23
|
-
massagedConfig.errors = (config.errors
|
|
24
|
-
if (!config.repoIsOnboarded) massagedConfig.warnings = (config.warnings
|
|
24
|
+
massagedConfig.errors = coerceArray(config.errors).concat(errors);
|
|
25
|
+
if (!config.repoIsOnboarded) massagedConfig.warnings = coerceArray(config.warnings).concat(warnings);
|
|
25
26
|
return massagedConfig;
|
|
26
27
|
} catch (err) {
|
|
27
28
|
logger.debug({ config: input }, "migrateAndValidate error");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate-validate.js","names":["configMigration.migrateConfig","configMassage.massageConfig","configValidation.validateConfig"],"sources":["../../lib/config/migrate-validate.ts"],"sourcesContent":["import { isNonEmptyArray } from '@sindresorhus/is';\nimport { dequal } from 'dequal';\nimport { logger } from '../logger/index.ts';\nimport * as configMassage from './massage.ts';\nimport * as configMigration from './migration.ts';\nimport type { RenovateConfig, ValidationMessage } from './types.ts';\nimport * as configValidation from './validation.ts';\n\nexport async function migrateAndValidate(\n config: RenovateConfig,\n input: RenovateConfig,\n): Promise<RenovateConfig> {\n logger.debug('migrateAndValidate()');\n try {\n const { isMigrated, migratedConfig } = configMigration.migrateConfig(input);\n if (isMigrated) {\n logger.debug(\n { oldConfig: input, newConfig: migratedConfig },\n 'Config migration necessary',\n );\n } else {\n logger.debug('No config migration necessary');\n }\n const massagedConfig = configMassage.massageConfig(migratedConfig);\n // log only if it's changed\n if (!dequal(input, massagedConfig)) {\n logger.debug({ config: massagedConfig }, 'Post-massage config');\n }\n const {\n warnings,\n errors,\n }: {\n warnings: ValidationMessage[];\n errors: ValidationMessage[];\n } = await configValidation.validateConfig('repo', massagedConfig);\n /* v8 ignore if -- hard to test */\n if (isNonEmptyArray(warnings)) {\n logger.warn({ warnings }, 'Found renovate config warnings');\n }\n if (isNonEmptyArray(errors)) {\n logger.info({ errors }, 'Found renovate config errors');\n }\n massagedConfig.errors = (config.errors
|
|
1
|
+
{"version":3,"file":"migrate-validate.js","names":["configMigration.migrateConfig","configMassage.massageConfig","configValidation.validateConfig"],"sources":["../../lib/config/migrate-validate.ts"],"sourcesContent":["import { isNonEmptyArray } from '@sindresorhus/is';\nimport { dequal } from 'dequal';\nimport { logger } from '../logger/index.ts';\nimport { coerceArray } from '../util/array.ts';\nimport * as configMassage from './massage.ts';\nimport * as configMigration from './migration.ts';\nimport type { RenovateConfig, ValidationMessage } from './types.ts';\nimport * as configValidation from './validation.ts';\n\nexport async function migrateAndValidate(\n config: RenovateConfig,\n input: RenovateConfig,\n): Promise<RenovateConfig> {\n logger.debug('migrateAndValidate()');\n try {\n const { isMigrated, migratedConfig } = configMigration.migrateConfig(input);\n if (isMigrated) {\n logger.debug(\n { oldConfig: input, newConfig: migratedConfig },\n 'Config migration necessary',\n );\n } else {\n logger.debug('No config migration necessary');\n }\n const massagedConfig = configMassage.massageConfig(migratedConfig);\n // log only if it's changed\n if (!dequal(input, massagedConfig)) {\n logger.debug({ config: massagedConfig }, 'Post-massage config');\n }\n const {\n warnings,\n errors,\n }: {\n warnings: ValidationMessage[];\n errors: ValidationMessage[];\n } = await configValidation.validateConfig('repo', massagedConfig);\n /* v8 ignore if -- hard to test */\n if (isNonEmptyArray(warnings)) {\n logger.warn({ warnings }, 'Found renovate config warnings');\n }\n if (isNonEmptyArray(errors)) {\n logger.info({ errors }, 'Found renovate config errors');\n }\n massagedConfig.errors = coerceArray(config.errors).concat(errors);\n if (!config.repoIsOnboarded) {\n massagedConfig.warnings = coerceArray(config.warnings).concat(warnings);\n }\n return massagedConfig;\n } catch (err) {\n logger.debug({ config: input }, 'migrateAndValidate error');\n throw err;\n }\n}\n"],"mappings":";;;;;;;;AASA,eAAsB,mBACpB,QACA,OACyB;CACzB,OAAO,MAAM,sBAAsB;CACnC,IAAI;EACF,MAAM,EAAE,YAAY,mBAAmBA,cAA8B,KAAK;EAC1E,IAAI,YACF,OAAO,MACL;GAAE,WAAW;GAAO,WAAW;EAAe,GAC9C,4BACF;OAEA,OAAO,MAAM,+BAA+B;EAE9C,MAAM,iBAAiBC,cAA4B,cAAc;EAEjE,IAAI,CAAC,OAAO,OAAO,cAAc,GAC/B,OAAO,MAAM,EAAE,QAAQ,eAAe,GAAG,qBAAqB;EAEhE,MAAM,EACJ,UACA,WAIE,MAAMC,eAAgC,QAAQ,cAAc;;EAEhE,IAAI,gBAAgB,QAAQ,GAC1B,OAAO,KAAK,EAAE,SAAS,GAAG,gCAAgC;EAE5D,IAAI,gBAAgB,MAAM,GACxB,OAAO,KAAK,EAAE,OAAO,GAAG,8BAA8B;EAExD,eAAe,SAAS,YAAY,OAAO,MAAM,CAAC,CAAC,OAAO,MAAM;EAChE,IAAI,CAAC,OAAO,iBACV,eAAe,WAAW,YAAY,OAAO,QAAQ,CAAC,CAAC,OAAO,QAAQ;EAExE,OAAO;CACT,SAAS,KAAK;EACZ,OAAO,MAAM,EAAE,QAAQ,MAAM,GAAG,0BAA0B;EAC1D,MAAM;CACR;AACF"}
|
package/dist/config/migration.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { coerceObject } from "../util/object.js";
|
|
1
2
|
import { regEx } from "../util/regex.js";
|
|
2
3
|
import { logger } from "../logger/index.js";
|
|
3
4
|
import { clone } from "../util/clone.js";
|
|
@@ -101,7 +102,7 @@ function migrateConfig(config, parentKey) {
|
|
|
101
102
|
if (!migratedConfig.matchManagers.includes("gradle")) migratedConfig.matchManagers.push("gradle");
|
|
102
103
|
migratedConfig.matchManagers = migratedConfig.matchManagers.filter((manager) => manager !== "gradle-lite");
|
|
103
104
|
}
|
|
104
|
-
if (isNonEmptyObject(migratedConfig["gradle-lite"])) migratedConfig.gradle = mergeChildConfig(migratedConfig.gradle
|
|
105
|
+
if (isNonEmptyObject(migratedConfig["gradle-lite"])) migratedConfig.gradle = mergeChildConfig(coerceObject(migratedConfig.gradle), migratedConfig["gradle-lite"]);
|
|
105
106
|
delete migratedConfig["gradle-lite"];
|
|
106
107
|
const isMigrated = !dequal(config, migratedConfig);
|
|
107
108
|
if (isMigrated) return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migration.js","names":[],"sources":["../../lib/config/migration.ts"],"sourcesContent":["import {\n isArray,\n isBoolean,\n isNonEmptyArray,\n isNonEmptyObject,\n isObject,\n isString,\n} from '@sindresorhus/is';\nimport { dequal } from 'dequal';\nimport { logger } from '../logger/index.ts';\nimport { clone } from '../util/clone.ts';\nimport { regEx } from '../util/regex.ts';\nimport { MigrationsService } from './migrations/index.ts';\nimport { getOptions } from './options/index.ts';\nimport type {\n MigratedConfig,\n MigratedRenovateConfig,\n PackageRule,\n RenovateConfig,\n RenovateOptions,\n} from './types.ts';\nimport { mergeChildConfig } from './utils.ts';\n\nconst options = getOptions();\nexport function fixShortHours(input: string): string {\n return input.replace(regEx(/( \\d?\\d)((a|p)m)/g), '$1:00$2');\n}\n\nlet optionTypes: Record<string, RenovateOptions['type']>;\n// Returns a migrated config\nexport function migrateConfig(\n config: RenovateConfig,\n parentKey?: string,\n): MigratedConfig {\n try {\n if (!optionTypes) {\n optionTypes = {};\n options.forEach((option) => {\n optionTypes[option.name] = option.type;\n });\n }\n const newConfig = MigrationsService.run(config, parentKey);\n const migratedConfig = clone(newConfig) as MigratedRenovateConfig;\n\n for (const [key, val] of Object.entries(newConfig)) {\n if (isString(val) && val.includes('{{baseDir}}')) {\n // @ts-expect-error -- TODO: fix me\n migratedConfig[key] = val.replace(\n regEx(/{{baseDir}}/g),\n '{{packageFileDir}}',\n );\n } else if (isString(val) && val.includes('{{lookupName}}')) {\n // @ts-expect-error -- TODO: fix me\n migratedConfig[key] = val.replace(\n regEx(/{{lookupName}}/g),\n '{{packageName}}',\n );\n } else if (isString(val) && val.includes('{{depNameShort}}')) {\n // @ts-expect-error -- TODO: fix me\n migratedConfig[key] = val.replace(\n regEx(/{{depNameShort}}/g),\n '{{depName}}',\n );\n } else if (isString(val) && val.startsWith('{{semanticPrefix}}')) {\n // @ts-expect-error -- TODO: fix me\n migratedConfig[key] = val.replace(\n '{{semanticPrefix}}',\n '{{#if semanticCommitType}}{{semanticCommitType}}{{#if semanticCommitScope}}({{semanticCommitScope}}){{/if}}: {{/if}}',\n );\n } else if (optionTypes[key] === 'object' && isBoolean(val)) {\n // @ts-expect-error -- TODO: fix me\n migratedConfig[key] = { enabled: val };\n } else if (optionTypes[key] === 'boolean') {\n if (val === 'true') {\n // @ts-expect-error -- TODO: fix me\n migratedConfig[key] = true;\n } else if (val === 'false') {\n // @ts-expect-error -- TODO: fix me\n migratedConfig[key] = false;\n }\n } else if (\n optionTypes[key] === 'string' &&\n isArray(val) &&\n val.length === 1\n ) {\n // @ts-expect-error -- TODO: fix me\n migratedConfig[key] = String(val[0]);\n } else if (isArray(val)) {\n // @ts-expect-error -- TODO: fix me\n // v8 ignore else -- TODO: add test #40625\n if (isArray(migratedConfig?.[key])) {\n const newArray = [];\n // @ts-expect-error -- TODO: fix me\n for (const item of migratedConfig[key]) {\n if (isObject(item) && !isArray(item)) {\n const arrMigrate = migrateConfig(item);\n newArray.push(arrMigrate.migratedConfig);\n } else {\n newArray.push(item);\n }\n }\n // @ts-expect-error -- TODO: fix me\n migratedConfig[key] = newArray;\n }\n } else if (isObject(val)) {\n const subMigrate = migrateConfig(\n // @ts-expect-error -- TODO: fix me\n migratedConfig[key] as RenovateConfig,\n key,\n );\n if (subMigrate.isMigrated) {\n // @ts-expect-error -- TODO: fix me\n migratedConfig[key] = subMigrate.migratedConfig;\n }\n }\n\n const migratedTemplates = {\n fromVersion: 'currentVersion',\n newValueMajor: 'newMajor',\n newValueMinor: 'newMinor',\n newVersionMajor: 'newMajor',\n newVersionMinor: 'newMinor',\n toVersion: 'newVersion',\n };\n // @ts-expect-error -- TODO: fix me\n if (isString(migratedConfig[key])) {\n for (const [from, to] of Object.entries(migratedTemplates)) {\n // @ts-expect-error -- TODO: fix me\n migratedConfig[key] = (migratedConfig[key] as string).replace(\n regEx(from, 'g'),\n to,\n );\n }\n }\n }\n const languages = [\n 'docker',\n 'dotnet',\n 'golang',\n 'java',\n 'js',\n 'node',\n 'php',\n 'python',\n 'ruby',\n 'rust',\n ];\n for (const language of languages) {\n // @ts-expect-error -- TODO: fix me\n if (isNonEmptyObject(migratedConfig[language])) {\n migratedConfig.packageRules ??= [];\n // @ts-expect-error -- TODO: fix me\n const currentContent = migratedConfig[language] as any;\n const packageRule = {\n matchCategories: [language],\n ...currentContent,\n };\n migratedConfig.packageRules.unshift(packageRule);\n // @ts-expect-error -- TODO: fix me\n delete migratedConfig[language];\n }\n }\n // Migrate nested packageRules\n if (isNonEmptyArray(migratedConfig.packageRules)) {\n const existingRules = migratedConfig.packageRules;\n migratedConfig.packageRules = [];\n for (const packageRule of existingRules) {\n // @ts-expect-error -- TODO: fix me\n if (isArray(packageRule.packageRules)) {\n logger.debug('Flattening nested packageRules');\n // merge each subrule and add to the parent list\n // @ts-expect-error -- TODO: fix me\n for (const subrule of packageRule.packageRules) {\n // TODO: fix types #22198\n const combinedRule = mergeChildConfig(\n packageRule,\n subrule as PackageRule,\n );\n // @ts-expect-error -- TODO: fix me\n delete combinedRule.packageRules;\n migratedConfig.packageRules.push(combinedRule);\n }\n } else {\n migratedConfig.packageRules.push(packageRule);\n }\n }\n }\n if (\n // @ts-expect-error -- TODO: fix me\n isNonEmptyObject(migratedConfig['pip-compile']) &&\n // @ts-expect-error -- TODO: fix me\n isNonEmptyArray(migratedConfig['pip-compile'].managerFilePatterns)\n ) {\n // @ts-expect-error -- TODO: fix me\n migratedConfig['pip-compile'].managerFilePatterns = migratedConfig[\n 'pip-compile'\n ].managerFilePatterns.map((filePattern) => {\n const pattern = filePattern as string;\n if (pattern.endsWith('.in')) {\n return pattern.replace(regEx(/\\.in$/), '.txt');\n }\n if (pattern.endsWith('.in/')) {\n return pattern.replace(regEx(/\\.in\\/$/), '.txt/');\n }\n return pattern.replace(regEx(/\\.in\\$\\/$/), '.txt$/');\n });\n }\n if (\n // @ts-expect-error -- TODO: fix me\n isNonEmptyArray(migratedConfig.matchManagers) &&\n // @ts-expect-error -- TODO: fix me\n migratedConfig.matchManagers.includes('gradle-lite')\n ) {\n // @ts-expect-error -- TODO: fix me\n // v8 ignore else -- TODO: add test #40625\n if (!migratedConfig.matchManagers.includes('gradle')) {\n // @ts-expect-error -- TODO: fix me\n migratedConfig.matchManagers.push('gradle');\n }\n // @ts-expect-error -- TODO: fix me\n migratedConfig.matchManagers = migratedConfig.matchManagers.filter(\n // @ts-expect-error -- TODO: fix me\n (manager) => manager !== 'gradle-lite',\n );\n }\n // @ts-expect-error -- TODO: fix me\n if (isNonEmptyObject(migratedConfig['gradle-lite'])) {\n migratedConfig.gradle = mergeChildConfig(\n migratedConfig.gradle ?? {},\n // @ts-expect-error -- TODO: fix me\n migratedConfig['gradle-lite'],\n );\n }\n // @ts-expect-error -- TODO: fix me\n delete migratedConfig['gradle-lite'];\n const isMigrated = !dequal(config, migratedConfig);\n if (isMigrated) {\n // recursive call in case any migrated configs need further migrating\n return {\n isMigrated,\n migratedConfig: migrateConfig(migratedConfig).migratedConfig,\n };\n }\n return { isMigrated, migratedConfig };\n } catch (err) {\n logger.debug({ config, err }, 'migrateConfig() error');\n throw err;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"migration.js","names":[],"sources":["../../lib/config/migration.ts"],"sourcesContent":["import {\n isArray,\n isBoolean,\n isNonEmptyArray,\n isNonEmptyObject,\n isObject,\n isString,\n} from '@sindresorhus/is';\nimport { dequal } from 'dequal';\nimport { logger } from '../logger/index.ts';\nimport { clone } from '../util/clone.ts';\nimport { coerceObject } from '../util/object.ts';\nimport { regEx } from '../util/regex.ts';\nimport { MigrationsService } from './migrations/index.ts';\nimport { getOptions } from './options/index.ts';\nimport type {\n MigratedConfig,\n MigratedRenovateConfig,\n PackageRule,\n RenovateConfig,\n RenovateOptions,\n} from './types.ts';\nimport { mergeChildConfig } from './utils.ts';\n\nconst options = getOptions();\nexport function fixShortHours(input: string): string {\n return input.replace(regEx(/( \\d?\\d)((a|p)m)/g), '$1:00$2');\n}\n\nlet optionTypes: Record<string, RenovateOptions['type']>;\n// Returns a migrated config\nexport function migrateConfig(\n config: RenovateConfig,\n parentKey?: string,\n): MigratedConfig {\n try {\n if (!optionTypes) {\n optionTypes = {};\n options.forEach((option) => {\n optionTypes[option.name] = option.type;\n });\n }\n const newConfig = MigrationsService.run(config, parentKey);\n const migratedConfig = clone(newConfig) as MigratedRenovateConfig;\n\n for (const [key, val] of Object.entries(newConfig)) {\n if (isString(val) && val.includes('{{baseDir}}')) {\n // @ts-expect-error -- TODO: fix me\n migratedConfig[key] = val.replace(\n regEx(/{{baseDir}}/g),\n '{{packageFileDir}}',\n );\n } else if (isString(val) && val.includes('{{lookupName}}')) {\n // @ts-expect-error -- TODO: fix me\n migratedConfig[key] = val.replace(\n regEx(/{{lookupName}}/g),\n '{{packageName}}',\n );\n } else if (isString(val) && val.includes('{{depNameShort}}')) {\n // @ts-expect-error -- TODO: fix me\n migratedConfig[key] = val.replace(\n regEx(/{{depNameShort}}/g),\n '{{depName}}',\n );\n } else if (isString(val) && val.startsWith('{{semanticPrefix}}')) {\n // @ts-expect-error -- TODO: fix me\n migratedConfig[key] = val.replace(\n '{{semanticPrefix}}',\n '{{#if semanticCommitType}}{{semanticCommitType}}{{#if semanticCommitScope}}({{semanticCommitScope}}){{/if}}: {{/if}}',\n );\n } else if (optionTypes[key] === 'object' && isBoolean(val)) {\n // @ts-expect-error -- TODO: fix me\n migratedConfig[key] = { enabled: val };\n } else if (optionTypes[key] === 'boolean') {\n if (val === 'true') {\n // @ts-expect-error -- TODO: fix me\n migratedConfig[key] = true;\n } else if (val === 'false') {\n // @ts-expect-error -- TODO: fix me\n migratedConfig[key] = false;\n }\n } else if (\n optionTypes[key] === 'string' &&\n isArray(val) &&\n val.length === 1\n ) {\n // @ts-expect-error -- TODO: fix me\n migratedConfig[key] = String(val[0]);\n } else if (isArray(val)) {\n // @ts-expect-error -- TODO: fix me\n // v8 ignore else -- TODO: add test #40625\n if (isArray(migratedConfig?.[key])) {\n const newArray = [];\n // @ts-expect-error -- TODO: fix me\n for (const item of migratedConfig[key]) {\n if (isObject(item) && !isArray(item)) {\n const arrMigrate = migrateConfig(item);\n newArray.push(arrMigrate.migratedConfig);\n } else {\n newArray.push(item);\n }\n }\n // @ts-expect-error -- TODO: fix me\n migratedConfig[key] = newArray;\n }\n } else if (isObject(val)) {\n const subMigrate = migrateConfig(\n // @ts-expect-error -- TODO: fix me\n migratedConfig[key] as RenovateConfig,\n key,\n );\n if (subMigrate.isMigrated) {\n // @ts-expect-error -- TODO: fix me\n migratedConfig[key] = subMigrate.migratedConfig;\n }\n }\n\n const migratedTemplates = {\n fromVersion: 'currentVersion',\n newValueMajor: 'newMajor',\n newValueMinor: 'newMinor',\n newVersionMajor: 'newMajor',\n newVersionMinor: 'newMinor',\n toVersion: 'newVersion',\n };\n // @ts-expect-error -- TODO: fix me\n if (isString(migratedConfig[key])) {\n for (const [from, to] of Object.entries(migratedTemplates)) {\n // @ts-expect-error -- TODO: fix me\n migratedConfig[key] = (migratedConfig[key] as string).replace(\n regEx(from, 'g'),\n to,\n );\n }\n }\n }\n const languages = [\n 'docker',\n 'dotnet',\n 'golang',\n 'java',\n 'js',\n 'node',\n 'php',\n 'python',\n 'ruby',\n 'rust',\n ];\n for (const language of languages) {\n // @ts-expect-error -- TODO: fix me\n if (isNonEmptyObject(migratedConfig[language])) {\n migratedConfig.packageRules ??= [];\n // @ts-expect-error -- TODO: fix me\n const currentContent = migratedConfig[language] as any;\n const packageRule = {\n matchCategories: [language],\n ...currentContent,\n };\n migratedConfig.packageRules.unshift(packageRule);\n // @ts-expect-error -- TODO: fix me\n delete migratedConfig[language];\n }\n }\n // Migrate nested packageRules\n if (isNonEmptyArray(migratedConfig.packageRules)) {\n const existingRules = migratedConfig.packageRules;\n migratedConfig.packageRules = [];\n for (const packageRule of existingRules) {\n // @ts-expect-error -- TODO: fix me\n if (isArray(packageRule.packageRules)) {\n logger.debug('Flattening nested packageRules');\n // merge each subrule and add to the parent list\n // @ts-expect-error -- TODO: fix me\n for (const subrule of packageRule.packageRules) {\n // TODO: fix types #22198\n const combinedRule = mergeChildConfig(\n packageRule,\n subrule as PackageRule,\n );\n // @ts-expect-error -- TODO: fix me\n delete combinedRule.packageRules;\n migratedConfig.packageRules.push(combinedRule);\n }\n } else {\n migratedConfig.packageRules.push(packageRule);\n }\n }\n }\n if (\n // @ts-expect-error -- TODO: fix me\n isNonEmptyObject(migratedConfig['pip-compile']) &&\n // @ts-expect-error -- TODO: fix me\n isNonEmptyArray(migratedConfig['pip-compile'].managerFilePatterns)\n ) {\n // @ts-expect-error -- TODO: fix me\n migratedConfig['pip-compile'].managerFilePatterns = migratedConfig[\n 'pip-compile'\n ].managerFilePatterns.map((filePattern) => {\n const pattern = filePattern as string;\n if (pattern.endsWith('.in')) {\n return pattern.replace(regEx(/\\.in$/), '.txt');\n }\n if (pattern.endsWith('.in/')) {\n return pattern.replace(regEx(/\\.in\\/$/), '.txt/');\n }\n return pattern.replace(regEx(/\\.in\\$\\/$/), '.txt$/');\n });\n }\n if (\n // @ts-expect-error -- TODO: fix me\n isNonEmptyArray(migratedConfig.matchManagers) &&\n // @ts-expect-error -- TODO: fix me\n migratedConfig.matchManagers.includes('gradle-lite')\n ) {\n // @ts-expect-error -- TODO: fix me\n // v8 ignore else -- TODO: add test #40625\n if (!migratedConfig.matchManagers.includes('gradle')) {\n // @ts-expect-error -- TODO: fix me\n migratedConfig.matchManagers.push('gradle');\n }\n // @ts-expect-error -- TODO: fix me\n migratedConfig.matchManagers = migratedConfig.matchManagers.filter(\n // @ts-expect-error -- TODO: fix me\n (manager) => manager !== 'gradle-lite',\n );\n }\n // @ts-expect-error -- TODO: fix me\n if (isNonEmptyObject(migratedConfig['gradle-lite'])) {\n migratedConfig.gradle = mergeChildConfig(\n coerceObject(migratedConfig.gradle),\n // @ts-expect-error -- TODO: fix me\n migratedConfig['gradle-lite'],\n );\n }\n // @ts-expect-error -- TODO: fix me\n delete migratedConfig['gradle-lite'];\n const isMigrated = !dequal(config, migratedConfig);\n if (isMigrated) {\n // recursive call in case any migrated configs need further migrating\n return {\n isMigrated,\n migratedConfig: migrateConfig(migratedConfig).migratedConfig,\n };\n }\n return { isMigrated, migratedConfig };\n } catch (err) {\n logger.debug({ config, err }, 'migrateConfig() error');\n throw err;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { coerceArray } from "../../../util/array.js";
|
|
1
2
|
import { AbstractMigration } from "../base/abstract-migration.js";
|
|
2
3
|
import { isArray, isString } from "@sindresorhus/is";
|
|
3
4
|
//#region lib/config/migrations/custom/base-branch-migration.ts
|
|
@@ -5,7 +6,7 @@ var BaseBranchMigration = class extends AbstractMigration {
|
|
|
5
6
|
deprecated = true;
|
|
6
7
|
propertyName = "baseBranch";
|
|
7
8
|
run(value) {
|
|
8
|
-
const baseBranchPatterns = this.get("baseBranchPatterns")
|
|
9
|
+
const baseBranchPatterns = coerceArray(this.get("baseBranchPatterns"));
|
|
9
10
|
if (isArray(value)) this.setHard("baseBranchPatterns", baseBranchPatterns.concat(value));
|
|
10
11
|
if (isString(value)) this.setHard("baseBranchPatterns", baseBranchPatterns.concat([value]));
|
|
11
12
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-branch-migration.js","names":[],"sources":["../../../../lib/config/migrations/custom/base-branch-migration.ts"],"sourcesContent":["import { isArray, isString } from '@sindresorhus/is';\nimport { AbstractMigration } from '../base/abstract-migration.ts';\n\nexport class BaseBranchMigration extends AbstractMigration {\n override readonly deprecated = true;\n override readonly propertyName = 'baseBranch';\n\n override run(value: unknown): void {\n const baseBranchPatterns = this.get('baseBranchPatterns')
|
|
1
|
+
{"version":3,"file":"base-branch-migration.js","names":[],"sources":["../../../../lib/config/migrations/custom/base-branch-migration.ts"],"sourcesContent":["import { isArray, isString } from '@sindresorhus/is';\nimport { coerceArray } from '../../../util/array.ts';\nimport { AbstractMigration } from '../base/abstract-migration.ts';\n\nexport class BaseBranchMigration extends AbstractMigration {\n override readonly deprecated = true;\n override readonly propertyName = 'baseBranch';\n\n override run(value: unknown): void {\n const baseBranchPatterns = coerceArray(this.get('baseBranchPatterns'));\n if (isArray<string>(value)) {\n this.setHard('baseBranchPatterns', baseBranchPatterns.concat(value));\n }\n if (isString(value)) {\n this.setHard('baseBranchPatterns', baseBranchPatterns.concat([value]));\n }\n }\n}\n"],"mappings":";;;;AAIA,IAAa,sBAAb,cAAyC,kBAAkB;CACzD,aAA+B;CAC/B,eAAiC;CAEjC,IAAa,OAAsB;EACjC,MAAM,qBAAqB,YAAY,KAAK,IAAI,oBAAoB,CAAC;EACrE,IAAI,QAAgB,KAAK,GACvB,KAAK,QAAQ,sBAAsB,mBAAmB,OAAO,KAAK,CAAC;EAErE,IAAI,SAAS,KAAK,GAChB,KAAK,QAAQ,sBAAsB,mBAAmB,OAAO,CAAC,KAAK,CAAC,CAAC;CAEzE;AACF"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { coerceArray } from "../../../util/array.js";
|
|
1
2
|
import { AbstractMigration } from "../base/abstract-migration.js";
|
|
2
3
|
import { isArray, isNonEmptyObject, isObject } from "@sindresorhus/is";
|
|
3
4
|
//#region lib/config/migrations/custom/dep-types-migration.ts
|
|
@@ -5,7 +6,7 @@ var DepTypesMigration = class extends AbstractMigration {
|
|
|
5
6
|
deprecated = true;
|
|
6
7
|
propertyName = /^(?:(?:d|devD|optionalD|peerD)ependencies|engines|depTypes)$/;
|
|
7
8
|
run(value, key) {
|
|
8
|
-
const packageRules = this.get("packageRules")
|
|
9
|
+
const packageRules = coerceArray(this.get("packageRules"));
|
|
9
10
|
if (isNonEmptyObject(value) && !isArray(value)) packageRules.push({
|
|
10
11
|
matchDepTypes: [key],
|
|
11
12
|
...value
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dep-types-migration.js","names":[],"sources":["../../../../lib/config/migrations/custom/dep-types-migration.ts"],"sourcesContent":["import { isArray, isNonEmptyObject, isObject } from '@sindresorhus/is';\nimport type { PackageRule } from '../../types.ts';\nimport { AbstractMigration } from '../base/abstract-migration.ts';\n\ninterface DepTypesRule extends PackageRule {\n depType?: string;\n}\n\nexport class DepTypesMigration extends AbstractMigration {\n override readonly deprecated = true;\n override readonly propertyName =\n // oxlint-disable-next-line renovate/require-regex-util -- must stay a native RegExp: MigrationsService matches propertyName via isRegExp(), which RE2 instances fail\n /^(?:(?:d|devD|optionalD|peerD)ependencies|engines|depTypes)$/;\n\n override run(value: unknown, key: string): void {\n const packageRules: PackageRule[] = this.get('packageRules')
|
|
1
|
+
{"version":3,"file":"dep-types-migration.js","names":[],"sources":["../../../../lib/config/migrations/custom/dep-types-migration.ts"],"sourcesContent":["import { isArray, isNonEmptyObject, isObject } from '@sindresorhus/is';\nimport { coerceArray } from '../../../util/array.ts';\nimport type { PackageRule } from '../../types.ts';\nimport { AbstractMigration } from '../base/abstract-migration.ts';\n\ninterface DepTypesRule extends PackageRule {\n depType?: string;\n}\n\nexport class DepTypesMigration extends AbstractMigration {\n override readonly deprecated = true;\n override readonly propertyName =\n // oxlint-disable-next-line renovate/require-regex-util -- must stay a native RegExp: MigrationsService matches propertyName via isRegExp(), which RE2 instances fail\n /^(?:(?:d|devD|optionalD|peerD)ependencies|engines|depTypes)$/;\n\n override run(value: unknown, key: string): void {\n const packageRules: PackageRule[] = coerceArray(this.get('packageRules'));\n if (isNonEmptyObject(value) && !isArray(value)) {\n packageRules.push({\n matchDepTypes: [key],\n ...value,\n });\n }\n\n if (isArray(value)) {\n for (const depType of value as DepTypesRule[]) {\n if (isObject(depType) && !isArray(depType)) {\n const depTypeName = depType.depType;\n if (depTypeName) {\n delete depType.depType;\n depType.matchDepTypes = [depTypeName];\n packageRules.push({ ...(depType as PackageRule) });\n }\n }\n }\n }\n\n if (packageRules.length) {\n this.setHard('packageRules', packageRules);\n }\n }\n}\n"],"mappings":";;;;AASA,IAAa,oBAAb,cAAuC,kBAAkB;CACvD,aAA+B;CAC/B,eAEE;CAEF,IAAa,OAAgB,KAAmB;EAC9C,MAAM,eAA8B,YAAY,KAAK,IAAI,cAAc,CAAC;EACxE,IAAI,iBAAiB,KAAK,KAAK,CAAC,QAAQ,KAAK,GAC3C,aAAa,KAAK;GAChB,eAAe,CAAC,GAAG;GACnB,GAAG;EACL,CAAC;EAGH,IAAI,QAAQ,KAAK,GACV;QAAA,MAAM,WAAW,OACpB,IAAI,SAAS,OAAO,KAAK,CAAC,QAAQ,OAAO,GAAG;IAC1C,MAAM,cAAc,QAAQ;IAC5B,IAAI,aAAa;KACf,OAAO,QAAQ;KACf,QAAQ,gBAAgB,CAAC,WAAW;KACpC,aAAa,KAAK,EAAE,GAAI,QAAwB,CAAC;IACnD;GACF;;EAIJ,IAAI,aAAa,QACf,KAAK,QAAQ,gBAAgB,YAAY;CAE7C;AACF"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { coerceArray } from "../../../util/array.js";
|
|
1
2
|
import { AbstractMigration } from "../base/abstract-migration.js";
|
|
2
3
|
import { isArray, isString } from "@sindresorhus/is";
|
|
3
4
|
//#region lib/config/migrations/custom/file-match-migration.ts
|
|
@@ -8,7 +9,7 @@ var FileMatchMigration = class extends AbstractMigration {
|
|
|
8
9
|
// v8 ignore else -- TODO: add test #40625
|
|
9
10
|
if (isString(value) || isArray(value, isString)) {
|
|
10
11
|
const fileMatch = isArray(value) ? value : [value];
|
|
11
|
-
let managerFilePatterns = this.get("managerFilePatterns")
|
|
12
|
+
let managerFilePatterns = coerceArray(this.get("managerFilePatterns"));
|
|
12
13
|
managerFilePatterns = managerFilePatterns.concat(fileMatch.map((match) => `/${match}/`));
|
|
13
14
|
this.setHard("managerFilePatterns", managerFilePatterns);
|
|
14
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-match-migration.js","names":[],"sources":["../../../../lib/config/migrations/custom/file-match-migration.ts"],"sourcesContent":["import { isArray, isString } from '@sindresorhus/is';\nimport { AbstractMigration } from '../base/abstract-migration.ts';\n\nexport class FileMatchMigration extends AbstractMigration {\n override readonly deprecated = true;\n override readonly propertyName = 'fileMatch';\n\n override run(value: unknown): void {\n // v8 ignore else -- TODO: add test #40625\n if (isString(value) || isArray(value, isString)) {\n const fileMatch = isArray(value) ? value : [value];\n\n let managerFilePatterns = this.get('managerFilePatterns')
|
|
1
|
+
{"version":3,"file":"file-match-migration.js","names":[],"sources":["../../../../lib/config/migrations/custom/file-match-migration.ts"],"sourcesContent":["import { isArray, isString } from '@sindresorhus/is';\nimport { coerceArray } from '../../../util/array.ts';\nimport { AbstractMigration } from '../base/abstract-migration.ts';\n\nexport class FileMatchMigration extends AbstractMigration {\n override readonly deprecated = true;\n override readonly propertyName = 'fileMatch';\n\n override run(value: unknown): void {\n // v8 ignore else -- TODO: add test #40625\n if (isString(value) || isArray(value, isString)) {\n const fileMatch = isArray(value) ? value : [value];\n\n let managerFilePatterns = coerceArray(this.get('managerFilePatterns'));\n managerFilePatterns = managerFilePatterns.concat(\n fileMatch.map((match) => `/${match}/`),\n );\n\n this.setHard('managerFilePatterns', managerFilePatterns);\n }\n }\n}\n"],"mappings":";;;;AAIA,IAAa,qBAAb,cAAwC,kBAAkB;CACxD,aAA+B;CAC/B,eAAiC;CAEjC,IAAa,OAAsB;;EAEjC,IAAI,SAAS,KAAK,KAAK,QAAQ,OAAO,QAAQ,GAAG;GAC/C,MAAM,YAAY,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;GAEjD,IAAI,sBAAsB,YAAY,KAAK,IAAI,qBAAqB,CAAC;GACrE,sBAAsB,oBAAoB,OACxC,UAAU,KAAK,UAAU,IAAI,MAAM,EAAE,CACvC;GAEA,KAAK,QAAQ,uBAAuB,mBAAmB;EACzD;CACF;AACF"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { coerceObject } from "../../../util/object.js";
|
|
1
2
|
import { AbstractMigration } from "../base/abstract-migration.js";
|
|
2
3
|
//#region lib/config/migrations/custom/node-migration.ts
|
|
3
4
|
var NodeMigration = class extends AbstractMigration {
|
|
@@ -7,7 +8,7 @@ var NodeMigration = class extends AbstractMigration {
|
|
|
7
8
|
// v8 ignore else -- TODO: add test #40625
|
|
8
9
|
if (value.enabled === true) {
|
|
9
10
|
delete node.enabled;
|
|
10
|
-
const travis = this.get("travis")
|
|
11
|
+
const travis = coerceObject(this.get("travis"));
|
|
11
12
|
travis.enabled = true;
|
|
12
13
|
if (Object.keys(node).length) this.rewrite(node);
|
|
13
14
|
else this.delete("node");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-migration.js","names":[],"sources":["../../../../lib/config/migrations/custom/node-migration.ts"],"sourcesContent":["import type { RenovateConfig } from '../../types.ts';\nimport { AbstractMigration } from '../base/abstract-migration.ts';\n\nexport class NodeMigration extends AbstractMigration {\n override readonly propertyName = 'node';\n\n override run(value: unknown): void {\n const node = this.get('node')!;\n // v8 ignore else -- TODO: add test #40625\n if ((value as RenovateConfig).enabled === true) {\n // validated non-null\n delete node.enabled;\n const travis = this.get('travis')
|
|
1
|
+
{"version":3,"file":"node-migration.js","names":[],"sources":["../../../../lib/config/migrations/custom/node-migration.ts"],"sourcesContent":["import { coerceObject } from '../../../util/object.ts';\nimport type { RenovateConfig } from '../../types.ts';\nimport { AbstractMigration } from '../base/abstract-migration.ts';\n\nexport class NodeMigration extends AbstractMigration {\n override readonly propertyName = 'node';\n\n override run(value: unknown): void {\n const node = this.get('node')!;\n // v8 ignore else -- TODO: add test #40625\n if ((value as RenovateConfig).enabled === true) {\n // validated non-null\n delete node.enabled;\n const travis = coerceObject(this.get('travis'));\n travis.enabled = true;\n if (Object.keys(node).length) {\n this.rewrite(node);\n } else {\n this.delete('node');\n }\n this.setSafely('travis', travis);\n }\n }\n}\n"],"mappings":";;;AAIA,IAAa,gBAAb,cAAmC,kBAAkB;CACnD,eAAiC;CAEjC,IAAa,OAAsB;EACjC,MAAM,OAAO,KAAK,IAAI,MAAM;;EAE5B,IAAK,MAAyB,YAAY,MAAM;GAE9C,OAAO,KAAK;GACZ,MAAM,SAAS,aAAa,KAAK,IAAI,QAAQ,CAAC;GAC9C,OAAO,UAAU;GACjB,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,QACpB,KAAK,QAAQ,IAAI;QAEjB,KAAK,OAAO,MAAM;GAEpB,KAAK,UAAU,UAAU,MAAM;EACjC;CACF;AACF"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { coerceArray } from "../../../util/array.js";
|
|
1
2
|
import { AbstractMigration } from "../base/abstract-migration.js";
|
|
2
3
|
import { isArray, isNonEmptyObject, isString } from "@sindresorhus/is";
|
|
3
4
|
//#region lib/config/migrations/custom/package-files-migration.ts
|
|
@@ -5,7 +6,7 @@ var PackageFilesMigration = class extends AbstractMigration {
|
|
|
5
6
|
deprecated = true;
|
|
6
7
|
propertyName = "packageFiles";
|
|
7
8
|
run(value) {
|
|
8
|
-
const packageRules = this.get("packageRules")
|
|
9
|
+
const packageRules = coerceArray(this.get("packageRules"));
|
|
9
10
|
// v8 ignore else -- TODO: add test #40625
|
|
10
11
|
if (isArray(value)) {
|
|
11
12
|
const fileList = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-files-migration.js","names":[],"sources":["../../../../lib/config/migrations/custom/package-files-migration.ts"],"sourcesContent":["import { isArray, isNonEmptyObject, isString } from '@sindresorhus/is';\nimport type { PackageRule } from '../../types.ts';\nimport { AbstractMigration } from '../base/abstract-migration.ts';\n\nexport class PackageFilesMigration extends AbstractMigration {\n override readonly deprecated = true;\n override readonly propertyName = 'packageFiles';\n\n override run(value: unknown): void {\n const packageRules: PackageRule[] = this.get('packageRules')
|
|
1
|
+
{"version":3,"file":"package-files-migration.js","names":[],"sources":["../../../../lib/config/migrations/custom/package-files-migration.ts"],"sourcesContent":["import { isArray, isNonEmptyObject, isString } from '@sindresorhus/is';\nimport { coerceArray } from '../../../util/array.ts';\nimport type { PackageRule } from '../../types.ts';\nimport { AbstractMigration } from '../base/abstract-migration.ts';\n\nexport class PackageFilesMigration extends AbstractMigration {\n override readonly deprecated = true;\n override readonly propertyName = 'packageFiles';\n\n override run(value: unknown): void {\n const packageRules: PackageRule[] = coerceArray(this.get('packageRules'));\n // v8 ignore else -- TODO: add test #40625\n if (isArray(value)) {\n const fileList: string[] = [];\n for (const packageFile of value) {\n // v8 ignore else -- TODO: add test #40625\n if (\n isNonEmptyObject(packageFile) &&\n 'packageFile' in packageFile &&\n isString(packageFile.packageFile)\n ) {\n fileList.push(packageFile.packageFile);\n packageFile.paths = [packageFile.packageFile];\n delete packageFile.packageFile;\n\n if (Object.keys(packageFile).length > 1) {\n packageRules.push({\n ...packageFile,\n });\n }\n } else if (isArray(packageFile, isString)) {\n fileList.push(...packageFile);\n } else if (isString(packageFile)) {\n fileList.push(packageFile);\n }\n }\n if (fileList.length) {\n this.setSafely('includePaths', fileList);\n }\n if (packageRules.length) {\n this.setSafely('packageRules', packageRules);\n }\n }\n }\n}\n"],"mappings":";;;;AAKA,IAAa,wBAAb,cAA2C,kBAAkB;CAC3D,aAA+B;CAC/B,eAAiC;CAEjC,IAAa,OAAsB;EACjC,MAAM,eAA8B,YAAY,KAAK,IAAI,cAAc,CAAC;;EAExE,IAAI,QAAQ,KAAK,GAAG;GAClB,MAAM,WAAqB,CAAC;GAC5B,KAAK,MAAM,eAAe;;GAExB,IACE,iBAAiB,WAAW,KAC5B,iBAAiB,eACjB,SAAS,YAAY,WAAW,GAChC;IACA,SAAS,KAAK,YAAY,WAAW;IACrC,YAAY,QAAQ,CAAC,YAAY,WAAW;IAC5C,OAAO,YAAY;IAEnB,IAAI,OAAO,KAAK,WAAW,CAAC,CAAC,SAAS,GACpC,aAAa,KAAK,EAChB,GAAG,YACL,CAAC;GAEL,OAAO,IAAI,QAAQ,aAAa,QAAQ,GACtC,SAAS,KAAK,GAAG,WAAW;QACvB,IAAI,SAAS,WAAW,GAC7B,SAAS,KAAK,WAAW;GAG7B,IAAI,SAAS,QACX,KAAK,UAAU,gBAAgB,QAAQ;GAEzC,IAAI,aAAa,QACf,KAAK,UAAU,gBAAgB,YAAY;EAE/C;CACF;AACF"}
|
|
@@ -2,6 +2,7 @@ import { CONFIG_VALIDATION } from "../../constants/error-messages.js";
|
|
|
2
2
|
import { get, set } from "../../util/cache/memory/index.js";
|
|
3
3
|
import { regEx } from "../../util/regex.js";
|
|
4
4
|
import { GlobalConfig } from "../global.js";
|
|
5
|
+
import { coerceArray } from "../../util/array.js";
|
|
5
6
|
import { logger } from "../../logger/index.js";
|
|
6
7
|
import { clone } from "../../util/clone.js";
|
|
7
8
|
import { massageConfig } from "../massage.js";
|
|
@@ -128,7 +129,7 @@ async function resolveConfigPresets(inputConfig, baseConfig, _ignorePresets, exi
|
|
|
128
129
|
unmerged: /* @__PURE__ */ new Set()
|
|
129
130
|
};
|
|
130
131
|
let ignorePresets = clone(_ignorePresets);
|
|
131
|
-
if (!ignorePresets || ignorePresets.length === 0) ignorePresets = inputConfig.ignorePresets
|
|
132
|
+
if (!ignorePresets || ignorePresets.length === 0) ignorePresets = coerceArray(inputConfig.ignorePresets);
|
|
132
133
|
logger.trace({
|
|
133
134
|
config: inputConfig,
|
|
134
135
|
existingPresets,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["internal.getPreset","memCache.get","migration.migrateConfig","massage.massageConfig","template.compile","internal.isInternal"],"sources":["../../../lib/config/presets/index.ts"],"sourcesContent":["import {\n isArray,\n isNullOrUndefined,\n isObject,\n isString,\n} from '@sindresorhus/is';\nimport {\n CONFIG_VALIDATION,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n} from '../../constants/error-messages.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport * as memCache from '../../util/cache/memory/index.ts';\nimport { clone } from '../../util/clone.ts';\nimport { regEx } from '../../util/regex.ts';\nimport * as template from '../../util/template/index.ts';\nimport { GlobalConfig } from '../global.ts';\nimport * as massage from '../massage.ts';\nimport * as migration from '../migration.ts';\nimport type { AllConfig, RenovateConfig } from '../types.ts';\nimport { mergeChildConfig } from '../utils.ts';\nimport { removedPresets } from './common.ts';\nimport * as internal from './internal/index.ts';\nimport { parsePreset } from './parse.ts';\nimport { canonicalizeRelativePresets } from './relative.ts';\nimport type { Preset, PresetApi } from './types.ts';\nimport {\n PRESET_DEP_NOT_FOUND,\n PRESET_INVALID,\n PRESET_INVALID_JSON,\n PRESET_NOT_FOUND,\n PRESET_PROHIBITED_SUBPRESET,\n PRESET_RELATIVE_NO_PARENT,\n PRESET_RENOVATE_CONFIG_NOT_FOUND,\n} from './util.ts';\n\ninterface PresetSource {\n load: () => Promise<PresetApi>;\n\n /**\n * Whether presets from this source are hosted in a repository, which is what\n * allows them to reference other presets relatively.\n */\n repoHosted: boolean;\n}\n\nconst presetSources: Record<string, PresetSource> = {\n forgejo: { load: () => import('./forgejo/index.ts'), repoHosted: true },\n gitea: { load: () => import('./gitea/index.ts'), repoHosted: true },\n github: { load: () => import('./github/index.ts'), repoHosted: true },\n gitlab: { load: () => import('./gitlab/index.ts'), repoHosted: true },\n http: { load: () => import('./http/index.ts'), repoHosted: false },\n local: { load: () => import('./local/index.ts'), repoHosted: true },\n npm: { load: () => import('./npm/index.ts'), repoHosted: false },\n};\n\nconst presetCacheNamespace = 'preset';\n\nexport function replaceArgs(\n obj: string,\n argMapping: Record<string, any>,\n): string;\nexport function replaceArgs(\n obj: string[],\n argMapping: Record<string, any>,\n): string[];\nexport function replaceArgs(\n obj: Record<string, any>,\n argMapping: Record<string, any>,\n): Record<string, any>;\nexport function replaceArgs(\n obj: Record<string, any>[],\n argMapping: Record<string, any>,\n): Record<string, any>[];\n\n/**\n * TODO: fix me #22198\n * @param obj\n * @param argMapping\n */\nexport function replaceArgs(obj: any, argMapping: Record<string, any>): any;\nexport function replaceArgs(\n obj: string | string[] | Record<string, any> | Record<string, any>[],\n argMapping: Record<string, any>,\n): any {\n if (isString(obj)) {\n let returnStr = obj;\n for (const [arg, argVal] of Object.entries(argMapping)) {\n const re = regEx(`{{${arg}}}`, 'g', false);\n returnStr = returnStr.replace(re, argVal);\n }\n return returnStr;\n }\n if (isArray(obj)) {\n const returnArray = [];\n for (const item of obj) {\n returnArray.push(replaceArgs(item, argMapping));\n }\n return returnArray;\n }\n if (isObject(obj)) {\n const returnObj: Record<string, any> = {};\n for (const [key, val] of Object.entries(obj)) {\n returnObj[key] = replaceArgs(val, argMapping);\n }\n return returnObj;\n }\n return obj;\n}\n\nexport async function getPreset(\n preset: string,\n baseConfig?: RenovateConfig,\n): Promise<RenovateConfig> {\n logger.trace(`getPreset(${preset})`);\n // Check if the preset has been removed or replaced\n const newPreset = removedPresets[preset];\n if (newPreset) {\n return getPreset(newPreset, baseConfig);\n }\n if (newPreset === null) {\n return {};\n }\n const parsedPreset = parsePreset(preset);\n const { presetSource, repo, presetPath, presetName, tag, params, rawParams } =\n parsedPreset;\n\n if (presetSource === 'relative') {\n throw new Error(PRESET_RELATIVE_NO_PARENT);\n }\n\n let presetConfig: Preset | null | undefined;\n\n if (presetSource === 'internal') {\n presetConfig = internal.getPreset({\n repo,\n presetPath,\n presetName,\n tag,\n });\n } else {\n const cacheKey = `preset:${preset}`;\n const presetCachePersistence = GlobalConfig.get('presetCachePersistence');\n\n const packageCache = presetCachePersistence\n ? await import('../../util/cache/package/index.ts')\n : undefined;\n\n if (packageCache) {\n presetConfig = await packageCache.get(presetCacheNamespace, cacheKey);\n } else {\n presetConfig = memCache.get(cacheKey);\n }\n\n if (isNullOrUndefined(presetConfig)) {\n const source = await presetSources[presetSource].load();\n presetConfig = await source.getPreset({\n repo,\n presetPath,\n presetName,\n tag,\n });\n if (packageCache) {\n await packageCache.set(\n presetCacheNamespace,\n cacheKey,\n presetConfig,\n 15,\n );\n } else {\n memCache.set(cacheKey, presetConfig);\n }\n }\n }\n\n if (!presetConfig) {\n throw new Error(PRESET_DEP_NOT_FOUND);\n }\n logger.trace({ presetConfig }, `Found preset ${preset}`);\n if (params) {\n const argMapping: Record<string, string> = {};\n for (const [index, value] of params.entries()) {\n argMapping[`arg${index}`] = value;\n }\n if (rawParams) {\n argMapping.args = rawParams;\n }\n presetConfig = replaceArgs(presetConfig, argMapping);\n }\n logger.trace({ presetConfig }, `Applied params to preset ${preset}`);\n const presetKeys = Object.keys(presetConfig);\n if (\n presetKeys.length === 2 &&\n presetKeys.includes('description') &&\n presetKeys.includes('extends')\n ) {\n // preset is just a collection of other presets\n delete presetConfig.description;\n }\n const packageListKeys = ['description', 'matchPackageNames'];\n if (presetKeys.every((key) => packageListKeys.includes(key))) {\n delete presetConfig.description;\n }\n const { migratedConfig } = migration.migrateConfig(presetConfig);\n const massagedConfig = massage.massageConfig(migratedConfig);\n if (presetSources[parsedPreset.presetSource]?.repoHosted) {\n // only presets which are hosted in a repository can contain relative\n // references, in all other presets they are left as they are and fail\n // when they are resolved\n canonicalizeRelativePresets(massagedConfig, parsedPreset);\n }\n return massagedConfig;\n}\n\nexport interface ResolveConfigPresetsResult {\n config: AllConfig;\n /** when resolving the given configuration, which internal/shared presets were discovered */\n visitedPresets: {\n /** which internal/shared presets were merged into the final config */\n merged: string[];\n /** which internal/shared presets were not merged into the final config */\n unmerged: string[];\n };\n}\n\n/**\n * @param [mergeInternalPresets=true] when resolving the config presets, whether to merge Renovate internal presets into the resulting configuration.\n * When set to `false`, this will resolve these internal presets (recursively), but not merge them.\n * This is primarily intended to be used by \"shallow config\" resolution (for logging purposes).\n */\nexport async function resolveConfigPresets(\n inputConfig: AllConfig,\n baseConfig?: RenovateConfig,\n _ignorePresets?: string[],\n existingPresets: string[] = [],\n mergeInternalPresets = true,\n): Promise<ResolveConfigPresetsResult> {\n const allVisitedPresets = {\n merged: new Set<string>(),\n unmerged: new Set<string>(),\n };\n\n let ignorePresets = clone(_ignorePresets);\n if (!ignorePresets || ignorePresets.length === 0) {\n ignorePresets = inputConfig.ignorePresets ?? [];\n }\n logger.trace(\n { config: inputConfig, existingPresets, mergeInternalPresets },\n 'resolveConfigPresets',\n );\n\n let config: AllConfig = {};\n // First, merge all the preset configs from left to right\n if (inputConfig.extends?.length) {\n // Compile templates\n inputConfig.extends = inputConfig.extends.map((tmpl) =>\n template.compile(tmpl, {}),\n );\n for (const preset of inputConfig.extends) {\n // don't attempt to merge any internal presets if we're not expecting to\n if (!mergeInternalPresets && internal.isInternal(preset)) {\n logger.once.trace(\n { ignoredPreset: preset, mergeInternalPresets },\n 'Not merging preset',\n );\n // ... but make sure we note that we haven't resolved it\n allVisitedPresets.unmerged.add(preset);\n continue;\n }\n\n if (shouldResolvePreset(preset, existingPresets, ignorePresets)) {\n logger.trace(`Resolving preset \"${preset}\"`);\n const fetchedPreset = await fetchPreset(\n preset,\n baseConfig,\n inputConfig,\n existingPresets,\n );\n const { config: presetConfig, visitedPresets } =\n await resolveConfigPresets(\n fetchedPreset,\n baseConfig ?? inputConfig,\n ignorePresets,\n existingPresets.concat([preset]),\n mergeInternalPresets,\n );\n config = mergeChildConfig(config, presetConfig);\n allVisitedPresets.merged.add(preset);\n\n // then also make sure we've noted any nested presets we've merged\n for (const mergedPreset of visitedPresets.merged) {\n allVisitedPresets.merged.add(mergedPreset);\n }\n // ... or not merged\n for (const unmergedPreset of visitedPresets.unmerged) {\n allVisitedPresets.unmerged.add(unmergedPreset);\n }\n }\n }\n }\n logger.trace({ config }, `Post-preset resolve config`);\n // Now assign \"regular\" config on top\n config = mergeChildConfig(config, inputConfig);\n delete config.extends;\n delete config.ignorePresets;\n // Any description of this config replaces the ones collated from its presets.\n // Check the length, because array options default to an empty array.\n if (config.overrideDescription?.length) {\n config.description = config.overrideDescription;\n }\n delete config.overrideDescription;\n logger.trace({ config }, `Post-merge resolve config`);\n for (const [key, val] of Object.entries(config) as [\n keyof AllConfig,\n unknown,\n ][]) {\n const ignoredKeys = ['content', 'onboardingConfig'];\n if (isArray(val)) {\n // Resolve nested objects inside arrays\n config[key] = [] as never; // type can't be narrowed\n for (const element of val) {\n if (isObject(element)) {\n const { config: presetConfig, visitedPresets: visited } =\n await resolveConfigPresets(\n element,\n baseConfig,\n ignorePresets,\n existingPresets,\n mergeInternalPresets,\n );\n (config[key] as RenovateConfig[]).push(presetConfig);\n\n // then also make sure we've noted any nested presets we've merged\n for (const mergedPreset of visited.merged) {\n allVisitedPresets.merged.add(mergedPreset);\n }\n // ... or not merged\n for (const unmergedPreset of visited.unmerged) {\n allVisitedPresets.unmerged.add(unmergedPreset);\n }\n } else {\n (config[key] as unknown[]).push(element);\n }\n }\n } else if (isObject(val) && !ignoredKeys.includes(key)) {\n // Resolve nested objects\n logger.trace(`Resolving object \"${key}\"`);\n const { config: presetConfig, visitedPresets: visited } =\n await resolveConfigPresets(\n val,\n baseConfig,\n ignorePresets,\n existingPresets,\n mergeInternalPresets,\n );\n config[key] = presetConfig as never; // type can't be narrowed\n\n // then also make sure we've noted any nested presets we've merged\n for (const mergedPreset of visited.merged) {\n allVisitedPresets.merged.add(mergedPreset);\n }\n // ... or not merged\n for (const unmergedPreset of visited.unmerged) {\n allVisitedPresets.unmerged.add(unmergedPreset);\n }\n }\n }\n logger.trace({ config: inputConfig }, 'Input config');\n logger.trace(\n { config, visitedPresets: allVisitedPresets },\n 'Resolved config',\n );\n\n return {\n config,\n visitedPresets: {\n merged: Array.from(allVisitedPresets.merged),\n unmerged: Array.from(allVisitedPresets.unmerged),\n },\n };\n}\n\nasync function fetchPreset(\n preset: string,\n baseConfig: RenovateConfig | undefined,\n inputConfig: AllConfig,\n existingPresets: string[],\n): Promise<AllConfig> {\n try {\n return await getPreset(preset, baseConfig ?? inputConfig);\n } catch (err) {\n logger.debug({ preset, err }, 'Preset fetch error');\n if (err instanceof ExternalHostError) {\n throw err;\n }\n if (err.message === PLATFORM_RATE_LIMIT_EXCEEDED) {\n throw err;\n }\n const error = new Error(CONFIG_VALIDATION);\n if (err.message === PRESET_DEP_NOT_FOUND) {\n error.validationError = `Cannot find preset's package (${preset})`;\n } else if (err.message === PRESET_RENOVATE_CONFIG_NOT_FOUND) {\n error.validationError = `Preset package is missing a renovate-config entry (${preset})`;\n } else if (err.message === PRESET_NOT_FOUND) {\n error.validationError = `Preset name not found within published preset config (${preset})`;\n } else if (err.message === PRESET_INVALID) {\n error.validationError = `Preset is invalid (${preset})`;\n } else if (err.message === PRESET_PROHIBITED_SUBPRESET) {\n error.validationError = `Sub-presets cannot be combined with a custom path (${preset})`;\n } else if (err.message === PRESET_INVALID_JSON) {\n error.validationError = `Preset is invalid JSON (${preset})`;\n } else if (err.message === PRESET_RELATIVE_NO_PARENT) {\n error.validationError = `Relative preset reference cannot be resolved (${preset}). Relative presets can only be used within presets from a supported source, must stay inside their repository, and cannot be templated or used outside of a preset (for example in the repository config, inherited config, or globalExtends)`;\n } else {\n error.validationError = `Preset caused unexpected error (${preset})`;\n }\n if (existingPresets.length) {\n error.validationError +=\n '. Note: this is a *nested* preset so please contact the preset author if you are unable to fix it yourself.';\n }\n logger.info(\n { validationError: error.validationError },\n 'Throwing preset error',\n );\n throw error;\n }\n}\n\nfunction shouldResolvePreset(\n preset: string,\n existingPresets: string[],\n ignorePresets: string[],\n): boolean {\n if (existingPresets.includes(preset)) {\n logger.debug(\n `Already seen preset ${preset} in [${existingPresets.join(', ')}]`,\n );\n return false;\n }\n if (ignorePresets.includes(preset)) {\n logger.debug(\n `Ignoring preset ${preset} in [${existingPresets.join(', ')}]`,\n );\n return false;\n }\n return true;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["internal.getPreset","memCache.get","migration.migrateConfig","massage.massageConfig","template.compile","internal.isInternal"],"sources":["../../../lib/config/presets/index.ts"],"sourcesContent":["import {\n isArray,\n isNullOrUndefined,\n isObject,\n isString,\n} from '@sindresorhus/is';\nimport {\n CONFIG_VALIDATION,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n} from '../../constants/error-messages.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport { coerceArray } from '../../util/array.ts';\nimport * as memCache from '../../util/cache/memory/index.ts';\nimport { clone } from '../../util/clone.ts';\nimport { regEx } from '../../util/regex.ts';\nimport * as template from '../../util/template/index.ts';\nimport { GlobalConfig } from '../global.ts';\nimport * as massage from '../massage.ts';\nimport * as migration from '../migration.ts';\nimport type { AllConfig, RenovateConfig } from '../types.ts';\nimport { mergeChildConfig } from '../utils.ts';\nimport { removedPresets } from './common.ts';\nimport * as internal from './internal/index.ts';\nimport { parsePreset } from './parse.ts';\nimport { canonicalizeRelativePresets } from './relative.ts';\nimport type { Preset, PresetApi } from './types.ts';\nimport {\n PRESET_DEP_NOT_FOUND,\n PRESET_INVALID,\n PRESET_INVALID_JSON,\n PRESET_NOT_FOUND,\n PRESET_PROHIBITED_SUBPRESET,\n PRESET_RELATIVE_NO_PARENT,\n PRESET_RENOVATE_CONFIG_NOT_FOUND,\n} from './util.ts';\n\ninterface PresetSource {\n load: () => Promise<PresetApi>;\n\n /**\n * Whether presets from this source are hosted in a repository, which is what\n * allows them to reference other presets relatively.\n */\n repoHosted: boolean;\n}\n\nconst presetSources: Record<string, PresetSource> = {\n forgejo: { load: () => import('./forgejo/index.ts'), repoHosted: true },\n gitea: { load: () => import('./gitea/index.ts'), repoHosted: true },\n github: { load: () => import('./github/index.ts'), repoHosted: true },\n gitlab: { load: () => import('./gitlab/index.ts'), repoHosted: true },\n http: { load: () => import('./http/index.ts'), repoHosted: false },\n local: { load: () => import('./local/index.ts'), repoHosted: true },\n npm: { load: () => import('./npm/index.ts'), repoHosted: false },\n};\n\nconst presetCacheNamespace = 'preset';\n\nexport function replaceArgs(\n obj: string,\n argMapping: Record<string, any>,\n): string;\nexport function replaceArgs(\n obj: string[],\n argMapping: Record<string, any>,\n): string[];\nexport function replaceArgs(\n obj: Record<string, any>,\n argMapping: Record<string, any>,\n): Record<string, any>;\nexport function replaceArgs(\n obj: Record<string, any>[],\n argMapping: Record<string, any>,\n): Record<string, any>[];\n\n/**\n * TODO: fix me #22198\n * @param obj\n * @param argMapping\n */\nexport function replaceArgs(obj: any, argMapping: Record<string, any>): any;\nexport function replaceArgs(\n obj: string | string[] | Record<string, any> | Record<string, any>[],\n argMapping: Record<string, any>,\n): any {\n if (isString(obj)) {\n let returnStr = obj;\n for (const [arg, argVal] of Object.entries(argMapping)) {\n const re = regEx(`{{${arg}}}`, 'g', false);\n returnStr = returnStr.replace(re, argVal);\n }\n return returnStr;\n }\n if (isArray(obj)) {\n const returnArray = [];\n for (const item of obj) {\n returnArray.push(replaceArgs(item, argMapping));\n }\n return returnArray;\n }\n if (isObject(obj)) {\n const returnObj: Record<string, any> = {};\n for (const [key, val] of Object.entries(obj)) {\n returnObj[key] = replaceArgs(val, argMapping);\n }\n return returnObj;\n }\n return obj;\n}\n\nexport async function getPreset(\n preset: string,\n baseConfig?: RenovateConfig,\n): Promise<RenovateConfig> {\n logger.trace(`getPreset(${preset})`);\n // Check if the preset has been removed or replaced\n const newPreset = removedPresets[preset];\n if (newPreset) {\n return getPreset(newPreset, baseConfig);\n }\n if (newPreset === null) {\n return {};\n }\n const parsedPreset = parsePreset(preset);\n const { presetSource, repo, presetPath, presetName, tag, params, rawParams } =\n parsedPreset;\n\n if (presetSource === 'relative') {\n throw new Error(PRESET_RELATIVE_NO_PARENT);\n }\n\n let presetConfig: Preset | null | undefined;\n\n if (presetSource === 'internal') {\n presetConfig = internal.getPreset({\n repo,\n presetPath,\n presetName,\n tag,\n });\n } else {\n const cacheKey = `preset:${preset}`;\n const presetCachePersistence = GlobalConfig.get('presetCachePersistence');\n\n const packageCache = presetCachePersistence\n ? await import('../../util/cache/package/index.ts')\n : undefined;\n\n if (packageCache) {\n presetConfig = await packageCache.get(presetCacheNamespace, cacheKey);\n } else {\n presetConfig = memCache.get(cacheKey);\n }\n\n if (isNullOrUndefined(presetConfig)) {\n const source = await presetSources[presetSource].load();\n presetConfig = await source.getPreset({\n repo,\n presetPath,\n presetName,\n tag,\n });\n if (packageCache) {\n await packageCache.set(\n presetCacheNamespace,\n cacheKey,\n presetConfig,\n 15,\n );\n } else {\n memCache.set(cacheKey, presetConfig);\n }\n }\n }\n\n if (!presetConfig) {\n throw new Error(PRESET_DEP_NOT_FOUND);\n }\n logger.trace({ presetConfig }, `Found preset ${preset}`);\n if (params) {\n const argMapping: Record<string, string> = {};\n for (const [index, value] of params.entries()) {\n argMapping[`arg${index}`] = value;\n }\n if (rawParams) {\n argMapping.args = rawParams;\n }\n presetConfig = replaceArgs(presetConfig, argMapping);\n }\n logger.trace({ presetConfig }, `Applied params to preset ${preset}`);\n const presetKeys = Object.keys(presetConfig);\n if (\n presetKeys.length === 2 &&\n presetKeys.includes('description') &&\n presetKeys.includes('extends')\n ) {\n // preset is just a collection of other presets\n delete presetConfig.description;\n }\n const packageListKeys = ['description', 'matchPackageNames'];\n if (presetKeys.every((key) => packageListKeys.includes(key))) {\n delete presetConfig.description;\n }\n const { migratedConfig } = migration.migrateConfig(presetConfig);\n const massagedConfig = massage.massageConfig(migratedConfig);\n if (presetSources[parsedPreset.presetSource]?.repoHosted) {\n // only presets which are hosted in a repository can contain relative\n // references, in all other presets they are left as they are and fail\n // when they are resolved\n canonicalizeRelativePresets(massagedConfig, parsedPreset);\n }\n return massagedConfig;\n}\n\nexport interface ResolveConfigPresetsResult {\n config: AllConfig;\n /** when resolving the given configuration, which internal/shared presets were discovered */\n visitedPresets: {\n /** which internal/shared presets were merged into the final config */\n merged: string[];\n /** which internal/shared presets were not merged into the final config */\n unmerged: string[];\n };\n}\n\n/**\n * @param [mergeInternalPresets=true] when resolving the config presets, whether to merge Renovate internal presets into the resulting configuration.\n * When set to `false`, this will resolve these internal presets (recursively), but not merge them.\n * This is primarily intended to be used by \"shallow config\" resolution (for logging purposes).\n */\nexport async function resolveConfigPresets(\n inputConfig: AllConfig,\n baseConfig?: RenovateConfig,\n _ignorePresets?: string[],\n existingPresets: string[] = [],\n mergeInternalPresets = true,\n): Promise<ResolveConfigPresetsResult> {\n const allVisitedPresets = {\n merged: new Set<string>(),\n unmerged: new Set<string>(),\n };\n\n let ignorePresets = clone(_ignorePresets);\n if (!ignorePresets || ignorePresets.length === 0) {\n ignorePresets = coerceArray(inputConfig.ignorePresets);\n }\n logger.trace(\n { config: inputConfig, existingPresets, mergeInternalPresets },\n 'resolveConfigPresets',\n );\n\n let config: AllConfig = {};\n // First, merge all the preset configs from left to right\n if (inputConfig.extends?.length) {\n // Compile templates\n inputConfig.extends = inputConfig.extends.map((tmpl) =>\n template.compile(tmpl, {}),\n );\n for (const preset of inputConfig.extends) {\n // don't attempt to merge any internal presets if we're not expecting to\n if (!mergeInternalPresets && internal.isInternal(preset)) {\n logger.once.trace(\n { ignoredPreset: preset, mergeInternalPresets },\n 'Not merging preset',\n );\n // ... but make sure we note that we haven't resolved it\n allVisitedPresets.unmerged.add(preset);\n continue;\n }\n\n if (shouldResolvePreset(preset, existingPresets, ignorePresets)) {\n logger.trace(`Resolving preset \"${preset}\"`);\n const fetchedPreset = await fetchPreset(\n preset,\n baseConfig,\n inputConfig,\n existingPresets,\n );\n const { config: presetConfig, visitedPresets } =\n await resolveConfigPresets(\n fetchedPreset,\n baseConfig ?? inputConfig,\n ignorePresets,\n existingPresets.concat([preset]),\n mergeInternalPresets,\n );\n config = mergeChildConfig(config, presetConfig);\n allVisitedPresets.merged.add(preset);\n\n // then also make sure we've noted any nested presets we've merged\n for (const mergedPreset of visitedPresets.merged) {\n allVisitedPresets.merged.add(mergedPreset);\n }\n // ... or not merged\n for (const unmergedPreset of visitedPresets.unmerged) {\n allVisitedPresets.unmerged.add(unmergedPreset);\n }\n }\n }\n }\n logger.trace({ config }, `Post-preset resolve config`);\n // Now assign \"regular\" config on top\n config = mergeChildConfig(config, inputConfig);\n delete config.extends;\n delete config.ignorePresets;\n // Any description of this config replaces the ones collated from its presets.\n // Check the length, because array options default to an empty array.\n if (config.overrideDescription?.length) {\n config.description = config.overrideDescription;\n }\n delete config.overrideDescription;\n logger.trace({ config }, `Post-merge resolve config`);\n for (const [key, val] of Object.entries(config) as [\n keyof AllConfig,\n unknown,\n ][]) {\n const ignoredKeys = ['content', 'onboardingConfig'];\n if (isArray(val)) {\n // Resolve nested objects inside arrays\n config[key] = [] as never; // type can't be narrowed\n for (const element of val) {\n if (isObject(element)) {\n const { config: presetConfig, visitedPresets: visited } =\n await resolveConfigPresets(\n element,\n baseConfig,\n ignorePresets,\n existingPresets,\n mergeInternalPresets,\n );\n (config[key] as RenovateConfig[]).push(presetConfig);\n\n // then also make sure we've noted any nested presets we've merged\n for (const mergedPreset of visited.merged) {\n allVisitedPresets.merged.add(mergedPreset);\n }\n // ... or not merged\n for (const unmergedPreset of visited.unmerged) {\n allVisitedPresets.unmerged.add(unmergedPreset);\n }\n } else {\n (config[key] as unknown[]).push(element);\n }\n }\n } else if (isObject(val) && !ignoredKeys.includes(key)) {\n // Resolve nested objects\n logger.trace(`Resolving object \"${key}\"`);\n const { config: presetConfig, visitedPresets: visited } =\n await resolveConfigPresets(\n val,\n baseConfig,\n ignorePresets,\n existingPresets,\n mergeInternalPresets,\n );\n config[key] = presetConfig as never; // type can't be narrowed\n\n // then also make sure we've noted any nested presets we've merged\n for (const mergedPreset of visited.merged) {\n allVisitedPresets.merged.add(mergedPreset);\n }\n // ... or not merged\n for (const unmergedPreset of visited.unmerged) {\n allVisitedPresets.unmerged.add(unmergedPreset);\n }\n }\n }\n logger.trace({ config: inputConfig }, 'Input config');\n logger.trace(\n { config, visitedPresets: allVisitedPresets },\n 'Resolved config',\n );\n\n return {\n config,\n visitedPresets: {\n merged: Array.from(allVisitedPresets.merged),\n unmerged: Array.from(allVisitedPresets.unmerged),\n },\n };\n}\n\nasync function fetchPreset(\n preset: string,\n baseConfig: RenovateConfig | undefined,\n inputConfig: AllConfig,\n existingPresets: string[],\n): Promise<AllConfig> {\n try {\n return await getPreset(preset, baseConfig ?? inputConfig);\n } catch (err) {\n logger.debug({ preset, err }, 'Preset fetch error');\n if (err instanceof ExternalHostError) {\n throw err;\n }\n if (err.message === PLATFORM_RATE_LIMIT_EXCEEDED) {\n throw err;\n }\n const error = new Error(CONFIG_VALIDATION);\n if (err.message === PRESET_DEP_NOT_FOUND) {\n error.validationError = `Cannot find preset's package (${preset})`;\n } else if (err.message === PRESET_RENOVATE_CONFIG_NOT_FOUND) {\n error.validationError = `Preset package is missing a renovate-config entry (${preset})`;\n } else if (err.message === PRESET_NOT_FOUND) {\n error.validationError = `Preset name not found within published preset config (${preset})`;\n } else if (err.message === PRESET_INVALID) {\n error.validationError = `Preset is invalid (${preset})`;\n } else if (err.message === PRESET_PROHIBITED_SUBPRESET) {\n error.validationError = `Sub-presets cannot be combined with a custom path (${preset})`;\n } else if (err.message === PRESET_INVALID_JSON) {\n error.validationError = `Preset is invalid JSON (${preset})`;\n } else if (err.message === PRESET_RELATIVE_NO_PARENT) {\n error.validationError = `Relative preset reference cannot be resolved (${preset}). Relative presets can only be used within presets from a supported source, must stay inside their repository, and cannot be templated or used outside of a preset (for example in the repository config, inherited config, or globalExtends)`;\n } else {\n error.validationError = `Preset caused unexpected error (${preset})`;\n }\n if (existingPresets.length) {\n error.validationError +=\n '. Note: this is a *nested* preset so please contact the preset author if you are unable to fix it yourself.';\n }\n logger.info(\n { validationError: error.validationError },\n 'Throwing preset error',\n );\n throw error;\n }\n}\n\nfunction shouldResolvePreset(\n preset: string,\n existingPresets: string[],\n ignorePresets: string[],\n): boolean {\n if (existingPresets.includes(preset)) {\n logger.debug(\n `Already seen preset ${preset} in [${existingPresets.join(', ')}]`,\n );\n return false;\n }\n if (ignorePresets.includes(preset)) {\n logger.debug(\n `Ignoring preset ${preset} in [${existingPresets.join(', ')}]`,\n );\n return false;\n }\n return true;\n}\n"],"mappings":"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"}
|
package/dist/config/secrets.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { coerceObject } from "../util/object.js";
|
|
1
2
|
import { regEx } from "../util/regex.js";
|
|
2
3
|
import { addSecretForSanitizing } from "../util/sanitize.js";
|
|
3
4
|
import { replaceInterpolatedValuesInObject, validateInterpolatedValues } from "../util/interpolator.js";
|
|
@@ -37,8 +38,8 @@ function applySecretsAndVariablesToConfig(applyConfig) {
|
|
|
37
38
|
const secrets = applyConfig.secrets ?? config.secrets;
|
|
38
39
|
const variables = applyConfig.variables ?? config.variables;
|
|
39
40
|
if (isPlainObject(secrets)) for (const secret of Object.values(secrets)) addSecretForSanitizing(secret);
|
|
40
|
-
const configWithVars = replaceInterpolatedValuesInObject(config, variables
|
|
41
|
-
return replaceInterpolatedValuesInObject(configWithVars, secrets
|
|
41
|
+
const configWithVars = replaceInterpolatedValuesInObject(config, coerceObject(variables), options.variables, deleteVariables);
|
|
42
|
+
return replaceInterpolatedValuesInObject(configWithVars, coerceObject(secrets), options.secrets, deleteSecrets);
|
|
42
43
|
}
|
|
43
44
|
//#endregion
|
|
44
45
|
export { applySecretsAndVariablesToConfig, options, validateConfigSecretsAndVariables };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secrets.js","names":[],"sources":["../../lib/config/secrets.ts"],"sourcesContent":["import { isPlainObject } from '@sindresorhus/is';\nimport type { InterpolatorOptions } from '../util/interpolator.ts';\nimport {\n replaceInterpolatedValuesInObject,\n validateInterpolatedValues,\n} from '../util/interpolator.ts';\nimport { regEx } from '../util/regex.ts';\nimport { addSecretForSanitizing } from '../util/sanitize.ts';\nimport type { AllConfig, RenovateConfig } from './types.ts';\n\nconst namePattern = '[A-Za-z][A-Za-z0-9_]*';\nconst nameRegex = regEx(`^${namePattern}$`);\nconst secretTemplateRegex = regEx(`{{ *secrets\\\\.(${namePattern}) *}}`, 'g');\nconst variableTemplateRegex = regEx(\n `{{ *variables\\\\.(${namePattern}) *}}`,\n 'g',\n);\n\nexport const options: Record<'secrets' | 'variables', InterpolatorOptions> = {\n secrets: {\n name: 'secrets',\n nameRegex,\n templateRegex: secretTemplateRegex,\n },\n variables: {\n name: 'variables',\n nameRegex,\n templateRegex: variableTemplateRegex,\n },\n};\n\nfunction validateNestedInterpolatedValues<T extends 'secrets' | 'variables'>(\n config: AllConfig,\n key: T,\n): void {\n validateInterpolatedValues(config[key], options[key]);\n if (config.repositories) {\n for (const repository of config.repositories) {\n if (isPlainObject(repository)) {\n validateInterpolatedValues(repository[key], options[key]);\n }\n }\n }\n}\n\nexport function validateConfigSecretsAndVariables(\n config: RenovateConfig,\n): void {\n validateNestedInterpolatedValues(config, 'secrets');\n validateNestedInterpolatedValues(config, 'variables');\n}\n\ninterface ApplySecretsAndVariablesConfig {\n config: RenovateConfig;\n secrets?: RenovateConfig['secrets'];\n variables?: RenovateConfig['variables'];\n deleteSecrets?: boolean;\n deleteVariables?: boolean;\n}\n\n/**\n * Applies both variables and secrets to the Renovate config by interpolating values\n */\nexport function applySecretsAndVariablesToConfig(\n applyConfig: ApplySecretsAndVariablesConfig,\n): RenovateConfig {\n const { config, deleteSecrets, deleteVariables } = applyConfig;\n const secrets = applyConfig.secrets ?? config.secrets;\n const variables = applyConfig.variables ?? config.variables;\n\n // Add all secrets to be sanitized\n if (isPlainObject(secrets)) {\n for (const secret of Object.values(secrets)) {\n addSecretForSanitizing(secret);\n }\n }\n\n const configWithVars = replaceInterpolatedValuesInObject(\n config,\n variables
|
|
1
|
+
{"version":3,"file":"secrets.js","names":[],"sources":["../../lib/config/secrets.ts"],"sourcesContent":["import { isPlainObject } from '@sindresorhus/is';\nimport type { InterpolatorOptions } from '../util/interpolator.ts';\nimport {\n replaceInterpolatedValuesInObject,\n validateInterpolatedValues,\n} from '../util/interpolator.ts';\nimport { coerceObject } from '../util/object.ts';\nimport { regEx } from '../util/regex.ts';\nimport { addSecretForSanitizing } from '../util/sanitize.ts';\nimport type { AllConfig, RenovateConfig } from './types.ts';\n\nconst namePattern = '[A-Za-z][A-Za-z0-9_]*';\nconst nameRegex = regEx(`^${namePattern}$`);\nconst secretTemplateRegex = regEx(`{{ *secrets\\\\.(${namePattern}) *}}`, 'g');\nconst variableTemplateRegex = regEx(\n `{{ *variables\\\\.(${namePattern}) *}}`,\n 'g',\n);\n\nexport const options: Record<'secrets' | 'variables', InterpolatorOptions> = {\n secrets: {\n name: 'secrets',\n nameRegex,\n templateRegex: secretTemplateRegex,\n },\n variables: {\n name: 'variables',\n nameRegex,\n templateRegex: variableTemplateRegex,\n },\n};\n\nfunction validateNestedInterpolatedValues<T extends 'secrets' | 'variables'>(\n config: AllConfig,\n key: T,\n): void {\n validateInterpolatedValues(config[key], options[key]);\n if (config.repositories) {\n for (const repository of config.repositories) {\n if (isPlainObject(repository)) {\n validateInterpolatedValues(repository[key], options[key]);\n }\n }\n }\n}\n\nexport function validateConfigSecretsAndVariables(\n config: RenovateConfig,\n): void {\n validateNestedInterpolatedValues(config, 'secrets');\n validateNestedInterpolatedValues(config, 'variables');\n}\n\ninterface ApplySecretsAndVariablesConfig {\n config: RenovateConfig;\n secrets?: RenovateConfig['secrets'];\n variables?: RenovateConfig['variables'];\n deleteSecrets?: boolean;\n deleteVariables?: boolean;\n}\n\n/**\n * Applies both variables and secrets to the Renovate config by interpolating values\n */\nexport function applySecretsAndVariablesToConfig(\n applyConfig: ApplySecretsAndVariablesConfig,\n): RenovateConfig {\n const { config, deleteSecrets, deleteVariables } = applyConfig;\n const secrets = applyConfig.secrets ?? config.secrets;\n const variables = applyConfig.variables ?? config.variables;\n\n // Add all secrets to be sanitized\n if (isPlainObject(secrets)) {\n for (const secret of Object.values(secrets)) {\n addSecretForSanitizing(secret);\n }\n }\n\n const configWithVars = replaceInterpolatedValuesInObject(\n config,\n coerceObject(variables),\n options.variables,\n deleteVariables,\n );\n\n return replaceInterpolatedValuesInObject(\n configWithVars,\n coerceObject(secrets),\n options.secrets,\n deleteSecrets,\n );\n}\n"],"mappings":";;;;;;AAWA,MAAM,cAAc;AACpB,MAAM,YAAY,MAAM,IAAI,YAAY,EAAE;AAC1C,MAAM,sBAAsB,MAAM,kBAAkB,YAAY,QAAQ,GAAG;AAC3E,MAAM,wBAAwB,MAC5B,oBAAoB,YAAY,QAChC,GACF;AAEA,MAAa,UAAgE;CAC3E,SAAS;EACP,MAAM;EACN;EACA,eAAe;CACjB;CACA,WAAW;EACT,MAAM;EACN;EACA,eAAe;CACjB;AACF;AAEA,SAAS,iCACP,QACA,KACM;CACN,2BAA2B,OAAO,MAAM,QAAQ,IAAI;CACpD,IAAI,OAAO,cACJ;OAAA,MAAM,cAAc,OAAO,cAC9B,IAAI,cAAc,UAAU,GAC1B,2BAA2B,WAAW,MAAM,QAAQ,IAAI;CAAA;AAIhE;AAEA,SAAgB,kCACd,QACM;CACN,iCAAiC,QAAQ,SAAS;CAClD,iCAAiC,QAAQ,WAAW;AACtD;;;;AAaA,SAAgB,iCACd,aACgB;CAChB,MAAM,EAAE,QAAQ,eAAe,oBAAoB;CACnD,MAAM,UAAU,YAAY,WAAW,OAAO;CAC9C,MAAM,YAAY,YAAY,aAAa,OAAO;CAGlD,IAAI,cAAc,OAAO,GACvB,KAAK,MAAM,UAAU,OAAO,OAAO,OAAO,GACxC,uBAAuB,MAAM;CAIjC,MAAM,iBAAiB,kCACrB,QACA,aAAa,SAAS,GACtB,QAAQ,WACR,eACF;CAEA,OAAO,kCACL,gBACA,aAAa,OAAO,GACpB,QAAQ,SACR,aACF;AACF"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { regEx } from "../util/regex.js";
|
|
2
2
|
import { getConfigFileNames } from "./app-strings.js";
|
|
3
3
|
import { GlobalConfig } from "./global.js";
|
|
4
|
+
import { coerceArray } from "../util/array.js";
|
|
4
5
|
import { anyMatchRegexOrGlobList, getRegexPredicate, isRegexMatch, matchRegexOrGlobList } from "../util/string-match.js";
|
|
5
6
|
import { logger } from "../logger/index.js";
|
|
6
7
|
import { clone } from "../util/clone.js";
|
|
@@ -458,7 +459,7 @@ async function validateConfig(configType, config, isPreset, parentPath) {
|
|
|
458
459
|
message: `Invalid \`${currentPath}.${key}.${res}\` configuration: value is not a string`
|
|
459
460
|
});
|
|
460
461
|
} else if (key === "env") {
|
|
461
|
-
const allowedEnvVars = configType === "global" ? config.allowedEnv
|
|
462
|
+
const allowedEnvVars = configType === "global" ? coerceArray(config.allowedEnv) : GlobalConfig.get("allowedEnv");
|
|
462
463
|
for (const [envVarName, envVarValue] of Object.entries(val)) {
|
|
463
464
|
if (!isString(envVarValue)) errors.push({
|
|
464
465
|
topic: ConfigValidationTopic.Error,
|
|
@@ -600,7 +601,7 @@ async function validateConfig(configType, config, isPreset, parentPath) {
|
|
|
600
601
|
}
|
|
601
602
|
}
|
|
602
603
|
if (key === "hostRules" && isArray(val)) {
|
|
603
|
-
const allowedHeaders = configType === "global" ? config.allowedHeaders
|
|
604
|
+
const allowedHeaders = configType === "global" ? coerceArray(config.allowedHeaders) : GlobalConfig.get("allowedHeaders");
|
|
604
605
|
for (const rule of val) {
|
|
605
606
|
if (isNonEmptyString(rule.matchHost)) {
|
|
606
607
|
if (rule.matchHost.includes("://") && parseUrl(rule.matchHost) === null) errors.push({
|