renovate 44.146.2 → 44.147.0

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.
@@ -4,7 +4,7 @@ import { parseJson } from "../../../../util/common.js";
4
4
  import { migrateAndValidateConfig } from "./util.js";
5
5
  import { coersions } from "./coersions.js";
6
6
  import { getEnvName } from "../../../../config/options/env.js";
7
- import { isArray } from "@sindresorhus/is";
7
+ import { isArray, isPlainObject } from "@sindresorhus/is";
8
8
  import JSON5 from "json5";
9
9
  //#region lib/workers/global/config/parse/env.ts
10
10
  function normalizePrefixes(env, prefix) {
@@ -89,6 +89,19 @@ function massageConvertedExperimentalVars(env) {
89
89
  }
90
90
  return result;
91
91
  }
92
+ /**
93
+ * Combines an env value with the value from `RENOVATE_CONFIG`: mergeable lists are appended, mergeable objects are shallow-merged, anything else is replaced.
94
+ */
95
+ function mergeEnvValue(option, existing, value) {
96
+ if (option.mergeable) {
97
+ if (isArray(existing) && isArray(value)) return [...existing, ...value];
98
+ if (isPlainObject(existing) && isPlainObject(value)) return {
99
+ ...existing,
100
+ ...value
101
+ };
102
+ }
103
+ return value;
104
+ }
92
105
  async function getConfig(inputEnv, configEnvKey = "RENOVATE_CONFIG") {
93
106
  const env = prepareEnv(inputEnv);
94
107
  const config = await parseAndValidateOrExit(env, configEnvKey);
@@ -101,10 +114,8 @@ async function getConfig(inputEnv, configEnvKey = "RENOVATE_CONFIG") {
101
114
  if (!envVal) continue;
102
115
  if (option.type === "array" && option.subType === "object") try {
103
116
  const parsed = JSON5.parse(envVal);
104
- if (isArray(parsed)) {
105
- const existing = config[option.name];
106
- config[option.name] = isArray(existing) ? [...existing, ...parsed] : parsed;
107
- } else logger.debug({
117
+ if (isArray(parsed)) config[option.name] = mergeEnvValue(option, config[option.name], parsed);
118
+ else logger.debug({
108
119
  val: envVal,
109
120
  envName
110
121
  }, "Could not parse object array");
@@ -117,7 +128,7 @@ async function getConfig(inputEnv, configEnvKey = "RENOVATE_CONFIG") {
117
128
  else {
118
129
  const coerce = coersions[option.type];
119
130
  try {
120
- config[option.name] = coerce(envVal);
131
+ config[option.name] = mergeEnvValue(option, config[option.name], coerce(envVal));
121
132
  } catch (e) {
122
133
  throw new Error(`${envName} was invalid: ${e}`);
123
134
  }
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","names":[],"sources":["../../../../../lib/workers/global/config/parse/env.ts"],"sourcesContent":["import { isArray } from '@sindresorhus/is';\nimport JSON5 from 'json5';\nimport { getEnvName } from '../../../../config/options/env.ts';\nimport { getOptions } from '../../../../config/options/index.ts';\nimport type { AllConfig } from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { parseJson } from '../../../../util/common.ts';\nimport { coersions } from './coersions.ts';\nimport { migrateAndValidateConfig } from './util.ts';\n\nfunction normalizePrefixes(\n env: NodeJS.ProcessEnv,\n prefix: string | undefined,\n): NodeJS.ProcessEnv {\n const result = { ...env };\n if (prefix) {\n for (const [key, val] of Object.entries(result)) {\n if (key.startsWith(prefix)) {\n const newKey = key.replace(prefix, 'RENOVATE_');\n result[newKey] = val;\n delete result[key];\n }\n }\n }\n return result;\n}\n\nconst renameKeys = {\n aliases: 'registryAliases',\n azureAutoComplete: 'platformAutomerge', // migrate: azureAutoComplete\n gitLabAutomerge: 'platformAutomerge', // migrate: gitLabAutomerge\n mergeConfidenceApiBaseUrl: 'mergeConfidenceEndpoint',\n mergeConfidenceSupportedDatasources: 'mergeConfidenceDatasources',\n allowedPostUpgradeCommands: 'allowedCommands',\n baseBranches: 'baseBranchPatterns',\n};\n\nfunction renameEnvKeys(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const result = { ...env };\n for (const [from, to] of Object.entries(renameKeys)) {\n const fromKey = getEnvName({ name: from });\n const toKey = getEnvName({ name: to });\n if (env[fromKey]) {\n result[toKey] = env[fromKey];\n delete result[fromKey];\n }\n }\n return result;\n}\n\nconst migratedKeysWithValues = [\n {\n oldName: 'recreateClosed',\n newName: 'recreateWhen',\n from: 'true',\n to: 'always',\n },\n {\n oldName: 'recreateClosed',\n newName: 'recreateWhen',\n from: 'false',\n to: 'auto',\n },\n];\n\nfunction massageEnvKeyValues(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const result = { ...env };\n for (const { oldName, newName, from, to } of migratedKeysWithValues) {\n const key = getEnvName({ name: oldName });\n if (env[key] !== undefined && result[key] === from) {\n delete result[key];\n result[getEnvName({ name: newName })] = to;\n }\n }\n return result;\n}\n\ninterface ConvertedExperimentalEnvVar {\n optionName: string;\n // Normalize the raw env var value before passing it through, if needed.\n normalizeValue?: (value: string) => string;\n}\n\n// Maps RENOVATE_X_ env vars that have been promoted to regular config options\n// to the option name they now correspond to.\nexport const convertedExperimentalEnvVars: ReadonlyMap<\n string,\n ConvertedExperimentalEnvVar\n> = new Map([\n ['RENOVATE_X_AUTODISCOVER_REPO_SORT', { optionName: 'autodiscoverRepoSort' }],\n [\n 'RENOVATE_X_AUTODISCOVER_REPO_ORDER',\n { optionName: 'autodiscoverRepoOrder' },\n ],\n ['RENOVATE_X_DOCKER_MAX_PAGES', { optionName: 'dockerMaxPages' }],\n ['RENOVATE_X_DELETE_CONFIG_FILE', { optionName: 'deleteConfigFile' }],\n ['RENOVATE_X_S3_ENDPOINT', { optionName: 's3Endpoint' }],\n ['RENOVATE_X_S3_PATH_STYLE', { optionName: 's3PathStyle' }],\n [\n 'RENOVATE_X_MERGE_CONFIDENCE_API_BASE_URL',\n { optionName: 'mergeConfidenceEndpoint' },\n ],\n [\n 'RENOVATE_X_MERGE_CONFIDENCE_SUPPORTED_DATASOURCES',\n { optionName: 'mergeConfidenceDatasources' },\n ],\n [\n 'RENOVATE_X_REPO_CACHE_FORCE_LOCAL',\n {\n optionName: 'repositoryCacheForceLocal',\n // The old env var was treated as a flag: any non-empty value meant true.\n normalizeValue: (v: string) => (v ? 'true' : v),\n },\n ],\n]);\n\n/**\n * Massages the experimental env vars which have been converted to config options\n *\n * e.g. RENOVATE_X_AUTODISCOVER_REPO_SORT -> RENOVATE_AUTODISCOVER_REPO_SORT\n */\nfunction massageConvertedExperimentalVars(\n env: NodeJS.ProcessEnv,\n): NodeJS.ProcessEnv {\n const result = { ...env };\n for (const [\n oldKey,\n { optionName, normalizeValue },\n ] of convertedExperimentalEnvVars) {\n if (env[oldKey] !== undefined) {\n const newKey = getEnvName({ name: optionName });\n result[newKey] = normalizeValue\n ? normalizeValue(env[oldKey])\n : env[oldKey];\n delete result[oldKey];\n }\n }\n return result;\n}\n\nexport async function getConfig(\n inputEnv: NodeJS.ProcessEnv,\n configEnvKey = 'RENOVATE_CONFIG',\n): Promise<AllConfig> {\n const env = prepareEnv(inputEnv);\n const config = await parseAndValidateOrExit(env, configEnvKey);\n\n const options = getOptions();\n config.hostRules ??= [];\n\n for (const option of options) {\n if (option.env === false) {\n continue;\n }\n\n const envName = getEnvName(option);\n const envVal = env[envName];\n if (!envVal) {\n continue;\n }\n\n if (option.type === 'array' && option.subType === 'object') {\n try {\n const parsed = JSON5.parse(envVal);\n if (isArray(parsed)) {\n // lists of objects (`hostRules`, `customManagers`, both mergeable) extend\n // the ones from RENOVATE_CONFIG instead of replacing them\n const existing: unknown = config[option.name as keyof AllConfig];\n // @ts-expect-error -- type can't be narrowed\n config[option.name] = isArray(existing)\n ? [...existing, ...parsed]\n : parsed;\n } else {\n logger.debug(\n { val: envVal, envName },\n 'Could not parse object array',\n );\n }\n } catch {\n logger.debug(\n { val: envVal, envName },\n 'Could not parse environment variable',\n );\n }\n } else {\n const coerce = coersions[option.type];\n try {\n // @ts-expect-error -- type can't be narrowed\n config[option.name] = coerce(envVal);\n } catch (e) {\n throw new Error(`${envName} was invalid: ${e}`);\n }\n\n if (option.name === 'dryRun') {\n if ((config[option.name] as string) === 'true') {\n logger.warn('env config dryRun property has been changed to full');\n config[option.name] = 'full';\n } else if ((config[option.name] as string) === 'false') {\n logger.warn('env config dryRun property has been changed to null');\n delete config[option.name];\n } else if ((config[option.name] as string) === 'null') {\n delete config[option.name];\n }\n }\n\n if (option.name === 'requireConfig') {\n if ((config[option.name] as string) === 'true') {\n logger.warn(\n 'env config requireConfig property has been changed to required',\n );\n config[option.name] = 'required';\n } else if ((config[option.name] as string) === 'false') {\n logger.warn(\n 'env config requireConfig property has been changed to optional',\n );\n config[option.name] = 'optional';\n }\n }\n\n if (option.name === 'platformCommit') {\n if ((config[option.name] as string) === 'true') {\n logger.warn(\n 'env config platformCommit property has been changed to enabled',\n );\n config[option.name] = 'enabled';\n } else if ((config[option.name] as string) === 'false') {\n logger.warn(\n 'env config platformCommit property has been changed to disabled',\n );\n config[option.name] = 'disabled';\n }\n }\n }\n }\n\n const githubComToken = env.GITHUB_COM_TOKEN ?? env.RENOVATE_GITHUB_COM_TOKEN;\n if (githubComToken) {\n logger.debug(`Converting GITHUB_COM_TOKEN into a global host rule`);\n config.hostRules.push({\n hostType: 'github',\n matchHost: 'github.com',\n token: githubComToken,\n });\n }\n\n // These env vars are deprecated and deleted to make sure they're not used\n const unsupportedEnv = [\n 'BITBUCKET_TOKEN',\n 'BITBUCKET_USERNAME',\n 'BITBUCKET_PASSWORD',\n 'GITHUB_ENDPOINT',\n 'GITHUB_TOKEN',\n 'GITLAB_ENDPOINT',\n 'GITLAB_TOKEN',\n 'VSTS_ENDPOINT',\n 'VSTS_TOKEN',\n ];\n\n for (const val of unsupportedEnv) {\n delete env[val];\n }\n\n return config;\n}\n\nexport function prepareEnv(inputEnv: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n let env = normalizePrefixes(inputEnv, inputEnv.ENV_PREFIX);\n env = massageConvertedExperimentalVars(env);\n env = renameEnvKeys(env);\n // massage the values of migrated configuration keys\n return massageEnvKeyValues(env);\n}\n\nexport async function parseAndValidateOrExit(\n env: NodeJS.ProcessEnv,\n configEnvKey: string,\n): Promise<AllConfig> {\n if (!env[configEnvKey]) {\n return {};\n }\n\n try {\n const config = parseJson(\n env[configEnvKey],\n `${configEnvKey}.env.json5`,\n ) as AllConfig;\n logger.debug({ config }, `Detected config in env ${configEnvKey}`);\n\n return await migrateAndValidateConfig(config, `${configEnvKey}`);\n } catch (err) {\n logger.fatal(\n { err, configEnvKey },\n 'Could not parse config environment variable',\n );\n process.exit(1);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"env.js","names":[],"sources":["../../../../../lib/workers/global/config/parse/env.ts"],"sourcesContent":["import { isArray, isPlainObject } from '@sindresorhus/is';\nimport JSON5 from 'json5';\nimport { getEnvName } from '../../../../config/options/env.ts';\nimport { getOptions } from '../../../../config/options/index.ts';\nimport type { AllConfig, RenovateOptions } from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { parseJson } from '../../../../util/common.ts';\nimport { coersions } from './coersions.ts';\nimport { migrateAndValidateConfig } from './util.ts';\n\nfunction normalizePrefixes(\n env: NodeJS.ProcessEnv,\n prefix: string | undefined,\n): NodeJS.ProcessEnv {\n const result = { ...env };\n if (prefix) {\n for (const [key, val] of Object.entries(result)) {\n if (key.startsWith(prefix)) {\n const newKey = key.replace(prefix, 'RENOVATE_');\n result[newKey] = val;\n delete result[key];\n }\n }\n }\n return result;\n}\n\nconst renameKeys = {\n aliases: 'registryAliases',\n azureAutoComplete: 'platformAutomerge', // migrate: azureAutoComplete\n gitLabAutomerge: 'platformAutomerge', // migrate: gitLabAutomerge\n mergeConfidenceApiBaseUrl: 'mergeConfidenceEndpoint',\n mergeConfidenceSupportedDatasources: 'mergeConfidenceDatasources',\n allowedPostUpgradeCommands: 'allowedCommands',\n baseBranches: 'baseBranchPatterns',\n};\n\nfunction renameEnvKeys(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const result = { ...env };\n for (const [from, to] of Object.entries(renameKeys)) {\n const fromKey = getEnvName({ name: from });\n const toKey = getEnvName({ name: to });\n if (env[fromKey]) {\n result[toKey] = env[fromKey];\n delete result[fromKey];\n }\n }\n return result;\n}\n\nconst migratedKeysWithValues = [\n {\n oldName: 'recreateClosed',\n newName: 'recreateWhen',\n from: 'true',\n to: 'always',\n },\n {\n oldName: 'recreateClosed',\n newName: 'recreateWhen',\n from: 'false',\n to: 'auto',\n },\n];\n\nfunction massageEnvKeyValues(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const result = { ...env };\n for (const { oldName, newName, from, to } of migratedKeysWithValues) {\n const key = getEnvName({ name: oldName });\n if (env[key] !== undefined && result[key] === from) {\n delete result[key];\n result[getEnvName({ name: newName })] = to;\n }\n }\n return result;\n}\n\ninterface ConvertedExperimentalEnvVar {\n optionName: string;\n // Normalize the raw env var value before passing it through, if needed.\n normalizeValue?: (value: string) => string;\n}\n\n// Maps RENOVATE_X_ env vars that have been promoted to regular config options\n// to the option name they now correspond to.\nexport const convertedExperimentalEnvVars: ReadonlyMap<\n string,\n ConvertedExperimentalEnvVar\n> = new Map([\n ['RENOVATE_X_AUTODISCOVER_REPO_SORT', { optionName: 'autodiscoverRepoSort' }],\n [\n 'RENOVATE_X_AUTODISCOVER_REPO_ORDER',\n { optionName: 'autodiscoverRepoOrder' },\n ],\n ['RENOVATE_X_DOCKER_MAX_PAGES', { optionName: 'dockerMaxPages' }],\n ['RENOVATE_X_DELETE_CONFIG_FILE', { optionName: 'deleteConfigFile' }],\n ['RENOVATE_X_S3_ENDPOINT', { optionName: 's3Endpoint' }],\n ['RENOVATE_X_S3_PATH_STYLE', { optionName: 's3PathStyle' }],\n [\n 'RENOVATE_X_MERGE_CONFIDENCE_API_BASE_URL',\n { optionName: 'mergeConfidenceEndpoint' },\n ],\n [\n 'RENOVATE_X_MERGE_CONFIDENCE_SUPPORTED_DATASOURCES',\n { optionName: 'mergeConfidenceDatasources' },\n ],\n [\n 'RENOVATE_X_REPO_CACHE_FORCE_LOCAL',\n {\n optionName: 'repositoryCacheForceLocal',\n // The old env var was treated as a flag: any non-empty value meant true.\n normalizeValue: (v: string) => (v ? 'true' : v),\n },\n ],\n]);\n\n/**\n * Massages the experimental env vars which have been converted to config options\n *\n * e.g. RENOVATE_X_AUTODISCOVER_REPO_SORT -> RENOVATE_AUTODISCOVER_REPO_SORT\n */\nfunction massageConvertedExperimentalVars(\n env: NodeJS.ProcessEnv,\n): NodeJS.ProcessEnv {\n const result = { ...env };\n for (const [\n oldKey,\n { optionName, normalizeValue },\n ] of convertedExperimentalEnvVars) {\n if (env[oldKey] !== undefined) {\n const newKey = getEnvName({ name: optionName });\n result[newKey] = normalizeValue\n ? normalizeValue(env[oldKey])\n : env[oldKey];\n delete result[oldKey];\n }\n }\n return result;\n}\n\n/**\n * Combines an env value with the value from `RENOVATE_CONFIG`: mergeable lists are appended, mergeable objects are shallow-merged, anything else is replaced.\n */\nfunction mergeEnvValue(\n option: Readonly<RenovateOptions>,\n existing: unknown,\n value: unknown,\n): unknown {\n if (option.mergeable) {\n if (isArray(existing) && isArray(value)) {\n return [...existing, ...value];\n }\n if (isPlainObject(existing) && isPlainObject(value)) {\n return { ...existing, ...value };\n }\n }\n return value;\n}\n\nexport async function getConfig(\n inputEnv: NodeJS.ProcessEnv,\n configEnvKey = 'RENOVATE_CONFIG',\n): Promise<AllConfig> {\n const env = prepareEnv(inputEnv);\n const config = await parseAndValidateOrExit(env, configEnvKey);\n\n const options = getOptions();\n config.hostRules ??= [];\n\n for (const option of options) {\n if (option.env === false) {\n continue;\n }\n\n const envName = getEnvName(option);\n const envVal = env[envName];\n if (!envVal) {\n continue;\n }\n\n if (option.type === 'array' && option.subType === 'object') {\n try {\n const parsed = JSON5.parse(envVal);\n if (isArray(parsed)) {\n // @ts-expect-error -- type can't be narrowed\n config[option.name] = mergeEnvValue(\n option,\n config[option.name as keyof AllConfig],\n parsed,\n );\n } else {\n logger.debug(\n { val: envVal, envName },\n 'Could not parse object array',\n );\n }\n } catch {\n logger.debug(\n { val: envVal, envName },\n 'Could not parse environment variable',\n );\n }\n } else {\n const coerce = coersions[option.type];\n try {\n // @ts-expect-error -- type can't be narrowed\n config[option.name] = mergeEnvValue(\n option,\n config[option.name as keyof AllConfig],\n coerce(envVal),\n );\n } catch (e) {\n throw new Error(`${envName} was invalid: ${e}`);\n }\n\n if (option.name === 'dryRun') {\n if ((config[option.name] as string) === 'true') {\n logger.warn('env config dryRun property has been changed to full');\n config[option.name] = 'full';\n } else if ((config[option.name] as string) === 'false') {\n logger.warn('env config dryRun property has been changed to null');\n delete config[option.name];\n } else if ((config[option.name] as string) === 'null') {\n delete config[option.name];\n }\n }\n\n if (option.name === 'requireConfig') {\n if ((config[option.name] as string) === 'true') {\n logger.warn(\n 'env config requireConfig property has been changed to required',\n );\n config[option.name] = 'required';\n } else if ((config[option.name] as string) === 'false') {\n logger.warn(\n 'env config requireConfig property has been changed to optional',\n );\n config[option.name] = 'optional';\n }\n }\n\n if (option.name === 'platformCommit') {\n if ((config[option.name] as string) === 'true') {\n logger.warn(\n 'env config platformCommit property has been changed to enabled',\n );\n config[option.name] = 'enabled';\n } else if ((config[option.name] as string) === 'false') {\n logger.warn(\n 'env config platformCommit property has been changed to disabled',\n );\n config[option.name] = 'disabled';\n }\n }\n }\n }\n\n const githubComToken = env.GITHUB_COM_TOKEN ?? env.RENOVATE_GITHUB_COM_TOKEN;\n if (githubComToken) {\n logger.debug(`Converting GITHUB_COM_TOKEN into a global host rule`);\n config.hostRules.push({\n hostType: 'github',\n matchHost: 'github.com',\n token: githubComToken,\n });\n }\n\n // These env vars are deprecated and deleted to make sure they're not used\n const unsupportedEnv = [\n 'BITBUCKET_TOKEN',\n 'BITBUCKET_USERNAME',\n 'BITBUCKET_PASSWORD',\n 'GITHUB_ENDPOINT',\n 'GITHUB_TOKEN',\n 'GITLAB_ENDPOINT',\n 'GITLAB_TOKEN',\n 'VSTS_ENDPOINT',\n 'VSTS_TOKEN',\n ];\n\n for (const val of unsupportedEnv) {\n delete env[val];\n }\n\n return config;\n}\n\nexport function prepareEnv(inputEnv: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n let env = normalizePrefixes(inputEnv, inputEnv.ENV_PREFIX);\n env = massageConvertedExperimentalVars(env);\n env = renameEnvKeys(env);\n // massage the values of migrated configuration keys\n return massageEnvKeyValues(env);\n}\n\nexport async function parseAndValidateOrExit(\n env: NodeJS.ProcessEnv,\n configEnvKey: string,\n): Promise<AllConfig> {\n if (!env[configEnvKey]) {\n return {};\n }\n\n try {\n const config = parseJson(\n env[configEnvKey],\n `${configEnvKey}.env.json5`,\n ) as AllConfig;\n logger.debug({ config }, `Detected config in env ${configEnvKey}`);\n\n return await migrateAndValidateConfig(config, `${configEnvKey}`);\n } catch (err) {\n logger.fatal(\n { err, configEnvKey },\n 'Could not parse config environment variable',\n );\n process.exit(1);\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "renovate",
3
3
  "description": "Automated dependency updates. Flexible so you don't need to be.",
4
- "version": "44.146.2",
4
+ "version": "44.147.0",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "renovate": "dist/renovate.js",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$id": "https://docs.renovatebot.com/renovate-schema.json",
3
- "title": "JSON schema for Renovate 44.146.2 config files (https://renovatebot.com/)",
3
+ "title": "JSON schema for Renovate 44.147.0 config files (https://renovatebot.com/)",
4
4
  "$schema": "http://json-schema.org/draft-07/schema#",
5
- "x-renovate-version": "44.146.2",
5
+ "x-renovate-version": "44.147.0",
6
6
  "allowComments": true,
7
7
  "type": "object",
8
8
  "definitions": {
@@ -8648,8 +8648,7 @@
8648
8648
  "default": {},
8649
8649
  "additionalProperties": {
8650
8650
  "type": "string"
8651
- },
8652
- "$ref": "#"
8651
+ }
8653
8652
  },
8654
8653
  "registryUrlTemplate": {
8655
8654
  "description": "Optional registry URL for extracted dependencies. Valid only within a `customManagers` object.\nSee also: https://docs.renovatebot.com/configuration-options/#custommanagersregistryurltemplate",