renovate 44.28.0 → 44.29.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/dist/config/options/index.js +1 -2
  2. package/dist/config/options/index.js.map +1 -1
  3. package/dist/config/presets/index.js +39 -12
  4. package/dist/config/presets/index.js.map +1 -1
  5. package/dist/config/presets/parse.js +64 -7
  6. package/dist/config/presets/parse.js.map +1 -1
  7. package/dist/config/presets/relative.js +66 -0
  8. package/dist/config/presets/relative.js.map +1 -0
  9. package/dist/config/presets/util.js +3 -1
  10. package/dist/config/presets/util.js.map +1 -1
  11. package/dist/config/validation.js +48 -4
  12. package/dist/config/validation.js.map +1 -1
  13. package/dist/global-config-option-defaults.generated.js +1 -1
  14. package/dist/global-config-option-defaults.generated.js.map +1 -1
  15. package/dist/logger/bunyan.js +2 -2
  16. package/dist/logger/bunyan.js.map +1 -1
  17. package/dist/logger/cmd-serializer.js +2 -1
  18. package/dist/logger/cmd-serializer.js.map +1 -1
  19. package/dist/modules/datasource/go/goproxy-parser.js +2 -2
  20. package/dist/modules/datasource/go/goproxy-parser.js.map +1 -1
  21. package/dist/modules/datasource/index.js +3 -3
  22. package/dist/modules/datasource/index.js.map +1 -1
  23. package/dist/modules/datasource/nuget/common.js +2 -1
  24. package/dist/modules/datasource/nuget/common.js.map +1 -1
  25. package/dist/modules/datasource/packagist/schema.js +2 -2
  26. package/dist/modules/datasource/packagist/schema.js.map +1 -1
  27. package/dist/modules/datasource/rpm/providers/common.js +3 -2
  28. package/dist/modules/datasource/rpm/providers/common.js.map +1 -1
  29. package/dist/modules/manager/ant/update.js +2 -1
  30. package/dist/modules/manager/ant/update.js.map +1 -1
  31. package/dist/modules/manager/bazel-module/parser/fragments.js +4 -3
  32. package/dist/modules/manager/bazel-module/parser/fragments.js.map +1 -1
  33. package/dist/modules/manager/bun/extract.js +2 -2
  34. package/dist/modules/manager/bun/extract.js.map +1 -1
  35. package/dist/modules/manager/circleci/extract.js +2 -1
  36. package/dist/modules/manager/circleci/extract.js.map +1 -1
  37. package/dist/modules/manager/deno/post.js +2 -2
  38. package/dist/modules/manager/deno/post.js.map +1 -1
  39. package/dist/modules/manager/fingerprint.generated.js +1 -1
  40. package/dist/modules/manager/fingerprint.generated.js.map +1 -1
  41. package/dist/modules/manager/helm-values/extract.js +2 -1
  42. package/dist/modules/manager/helm-values/extract.js.map +1 -1
  43. package/dist/modules/manager/helm-values/util.js +3 -2
  44. package/dist/modules/manager/helm-values/util.js.map +1 -1
  45. package/dist/modules/manager/npm/extract/common/dependency.js +1 -1
  46. package/dist/modules/manager/npm/extract/common/dependency.js.map +1 -1
  47. package/dist/modules/manager/npm/extract/post/monorepo.js +3 -3
  48. package/dist/modules/manager/npm/extract/post/monorepo.js.map +1 -1
  49. package/dist/modules/manager/npm/post-update/rules.js +2 -2
  50. package/dist/modules/manager/npm/post-update/rules.js.map +1 -1
  51. package/dist/modules/manager/osgi/extract.js +2 -2
  52. package/dist/modules/manager/osgi/extract.js.map +1 -1
  53. package/dist/modules/manager/pipenv/extract.js +2 -2
  54. package/dist/modules/manager/pipenv/extract.js.map +1 -1
  55. package/dist/modules/manager/pre-commit/parsing.js +3 -2
  56. package/dist/modules/manager/pre-commit/parsing.js.map +1 -1
  57. package/dist/modules/manager/proto/schema.js +2 -1
  58. package/dist/modules/manager/proto/schema.js.map +1 -1
  59. package/dist/modules/manager/renovate-config/extract.js +16 -2
  60. package/dist/modules/manager/renovate-config/extract.js.map +1 -1
  61. package/dist/modules/manager/woodpecker/extract.js +2 -2
  62. package/dist/modules/manager/woodpecker/extract.js.map +1 -1
  63. package/dist/modules/versioning/apk/index.js +2 -1
  64. package/dist/modules/versioning/apk/index.js.map +1 -1
  65. package/dist/modules/versioning/bazel-module/bzlmod-version.js +2 -1
  66. package/dist/modules/versioning/bazel-module/bzlmod-version.js.map +1 -1
  67. package/dist/modules/versioning/bazel-module/index.js +2 -1
  68. package/dist/modules/versioning/bazel-module/index.js.map +1 -1
  69. package/dist/modules/versioning/conan/common.js +2 -1
  70. package/dist/modules/versioning/conan/common.js.map +1 -1
  71. package/dist/modules/versioning/conan/range.js +5 -3
  72. package/dist/modules/versioning/conan/range.js.map +1 -1
  73. package/dist/modules/versioning/gradle/compare.js +1 -1
  74. package/dist/modules/versioning/gradle/compare.js.map +1 -1
  75. package/dist/modules/versioning/lambda-node/index.js +2 -1
  76. package/dist/modules/versioning/lambda-node/index.js.map +1 -1
  77. package/dist/modules/versioning/maven/compare.js +4 -3
  78. package/dist/modules/versioning/maven/compare.js.map +1 -1
  79. package/dist/modules/versioning/pep440/range.js +2 -1
  80. package/dist/modules/versioning/pep440/range.js.map +1 -1
  81. package/dist/modules/versioning/pvp/index.js +2 -1
  82. package/dist/modules/versioning/pvp/index.js.map +1 -1
  83. package/dist/modules/versioning/ruby/index.js +2 -1
  84. package/dist/modules/versioning/ruby/index.js.map +1 -1
  85. package/dist/util/cache/package/impl/file.js +2 -1
  86. package/dist/util/cache/package/impl/file.js.map +1 -1
  87. package/dist/util/cache/package/legacy.js +2 -1
  88. package/dist/util/cache/package/legacy.js.map +1 -1
  89. package/dist/util/date.js +2 -1
  90. package/dist/util/date.js.map +1 -1
  91. package/dist/util/exec/docker/index.js +2 -2
  92. package/dist/util/exec/docker/index.js.map +1 -1
  93. package/dist/util/exec/index.js +2 -2
  94. package/dist/util/exec/index.js.map +1 -1
  95. package/dist/util/exec/utils.js +2 -2
  96. package/dist/util/exec/utils.js.map +1 -1
  97. package/dist/util/fingerprint.js.map +1 -1
  98. package/dist/util/git/index.js +3 -3
  99. package/dist/util/git/index.js.map +1 -1
  100. package/dist/util/git/instrument.js +3 -2
  101. package/dist/util/git/instrument.js.map +1 -1
  102. package/dist/util/host-rules.js +1 -1
  103. package/dist/util/host-rules.js.map +1 -1
  104. package/dist/util/http/github.js +2 -2
  105. package/dist/util/http/github.js.map +1 -1
  106. package/dist/util/object.js.map +1 -1
  107. package/dist/util/result.js.map +1 -1
  108. package/dist/util/s3.js +2 -2
  109. package/dist/util/s3.js.map +1 -1
  110. package/dist/util/schema-utils/index.js.map +1 -1
  111. package/dist/util/timestamp.js +2 -1
  112. package/dist/util/timestamp.js.map +1 -1
  113. package/dist/workers/global/config/parse/index.js +2 -2
  114. package/dist/workers/global/config/parse/index.js.map +1 -1
  115. package/dist/workers/global/index.js +2 -2
  116. package/dist/workers/global/index.js.map +1 -1
  117. package/dist/workers/repository/update/branch/execute-post-upgrade-commands.js +2 -2
  118. package/dist/workers/repository/update/branch/execute-post-upgrade-commands.js.map +1 -1
  119. package/dist/workers/repository/update/pr/changelog/release-notes.js +2 -2
  120. package/dist/workers/repository/update/pr/changelog/release-notes.js.map +1 -1
  121. package/package.json +2 -2
  122. package/renovate-schema.json +2 -2
@@ -9,7 +9,7 @@ import { coerceObject } from "../object.js";
9
9
  import { rawExec } from "./common.js";
10
10
  import { generateDockerCommand, removeDockerContainer } from "./docker/index.js";
11
11
  import { getHermitEnvs, isHermit } from "./hermit.js";
12
- import { isNonEmptyString } from "@sindresorhus/is";
12
+ import { isNonEmptyString, isString } from "@sindresorhus/is";
13
13
  import upath from "upath";
14
14
  //#region lib/util/exec/index.ts
15
15
  function dockerEnvVars(extraEnv, childEnv) {
@@ -51,7 +51,7 @@ async function prepareRawExec(cmd, opts, sideCarImage) {
51
51
  opts.env.CONTAINERBASE_CACHE_DIR = containerbaseDir;
52
52
  }
53
53
  let rawOptions = getRawExecOptions(opts);
54
- let rawCommands = typeof cmd === "string" ? [cmd] : cmd;
54
+ let rawCommands = isString(cmd) ? [cmd] : cmd;
55
55
  if (isDocker(docker)) {
56
56
  logger.debug({ image: sideCarImage }, "Using docker to execute");
57
57
  const envVars = [
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../lib/util/exec/index.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../config/global.ts';\nimport type { RepoToolSettingsOptions } from '../../config/types.ts';\nimport { TEMPORARY_ERROR } from '../../constants/error-messages.ts';\nimport { logger } from '../../logger/index.ts';\nimport { coerceArray } from '../array.ts';\nimport { getCustomEnv, getUserEnv } from '../env.ts';\nimport { coerceObject } from '../object.ts';\nimport { rawExec } from './common.ts';\nimport { generateInstallCommands, isDynamicInstall } from './containerbase.ts';\nimport {\n generateDockerCommand,\n removeDockerContainer,\n} from './docker/index.ts';\nimport { getHermitEnvs, isHermit } from './hermit.ts';\nimport type {\n CommandWithOptions,\n DockerOptions,\n ExecOptions,\n ExecResult,\n ExtraEnv,\n Opt,\n RawExecOptions,\n} from './types.ts';\nimport { getChildEnv } from './utils.ts';\n\nfunction dockerEnvVars(extraEnv: ExtraEnv, childEnv: ExtraEnv): string[] {\n const extraEnvKeys = Object.keys(extraEnv);\n return extraEnvKeys.filter((key) => isNonEmptyString(childEnv[key]));\n}\n\nfunction getCwd({ cwd, cwdFile }: ExecOptions): string | undefined {\n // TODO: types (#22198)\n const defaultCwd = GlobalConfig.get('localDir');\n const paramCwd = cwdFile\n ? upath.join(defaultCwd, upath.dirname(cwdFile))\n : cwd;\n return paramCwd ?? defaultCwd;\n}\n\nfunction getRawExecOptions(opts: ExecOptions): RawExecOptions {\n const defaultExecutionTimeout = GlobalConfig.get('executionTimeout');\n const childEnv = getChildEnv(opts);\n const cwd = getCwd(opts);\n let timeout = opts.timeout;\n timeout ??= defaultExecutionTimeout * 60 * 1000;\n\n // Set default max buffer size to 10MB\n const maxBuffer = opts.maxBuffer ?? 10 * 1024 * 1024;\n\n return {\n cwd,\n env: childEnv,\n maxBuffer,\n timeout,\n ...(opts.shell !== undefined && { shell: opts.shell }),\n stdin: 'pipe',\n stdout: opts.ignoreStdout ? 'ignore' : 'pipe',\n stderr: 'pipe',\n };\n}\n\nfunction isDocker(docker: Opt<DockerOptions>): docker is DockerOptions {\n return GlobalConfig.get('binarySource') === 'docker' && !!docker;\n}\n\ninterface RawExecArguments {\n rawCommands: (string | CommandWithOptions)[];\n rawOptions: RawExecOptions;\n}\n\nasync function prepareRawExec(\n cmd:\n | string\n | string[]\n | CommandWithOptions[]\n | (string | CommandWithOptions)[],\n opts: ExecOptions,\n sideCarImage: string,\n): Promise<RawExecArguments> {\n const { docker } = opts;\n const preCommands = opts.preCommands ?? [];\n const customEnvVariables = getCustomEnv();\n const userConfiguredEnv = getUserEnv();\n const { containerbaseDir, binarySource } = GlobalConfig.get();\n\n if (binarySource === 'docker' || binarySource === 'install') {\n logger.debug(`Setting CONTAINERBASE_CACHE_DIR to ${containerbaseDir!}`);\n opts.env ??= {};\n opts.env.CONTAINERBASE_CACHE_DIR = containerbaseDir;\n }\n\n let rawOptions = getRawExecOptions(opts);\n\n let rawCommands = typeof cmd === 'string' ? [cmd] : cmd;\n\n if (isDocker(docker)) {\n logger.debug({ image: sideCarImage }, 'Using docker to execute');\n const extraEnv = {\n ...opts.extraEnv,\n ...customEnvVariables,\n ...userConfiguredEnv,\n };\n const childEnv = getChildEnv(opts);\n const envVars = [\n ...dockerEnvVars(extraEnv, childEnv),\n ...coerceArray(docker.envVars),\n 'CONTAINERBASE_CACHE_DIR',\n ];\n const cwd = getCwd(opts);\n const dockerOptions: DockerOptions = { ...docker, cwd, envVars };\n const dockerCommand = await generateDockerCommand(\n rawCommands,\n [\n ...(await generateInstallCommands(opts.toolConstraints)),\n ...preCommands,\n ],\n dockerOptions,\n sideCarImage,\n );\n rawCommands = [dockerCommand];\n } else if (isDynamicInstall(opts.toolConstraints)) {\n logger.debug('Using containerbase dynamic installs');\n rawCommands = [\n ...(await generateInstallCommands(opts.toolConstraints)),\n ...preCommands,\n ...rawCommands,\n ];\n } else if (isHermit()) {\n const hermitEnvVars = await getHermitEnvs(rawOptions);\n logger.debug(\n { hermitEnvVars },\n 'merging hermit environment variables into the execution options',\n );\n rawOptions = {\n ...rawOptions,\n env: {\n ...rawOptions.env,\n ...hermitEnvVars,\n },\n };\n }\n\n if (\n GlobalConfig.get('binarySource') === 'global' &&\n opts.toolConstraints?.length\n ) {\n logger.once.debug(\n { toolConstraints: opts.toolConstraints },\n 'Ignoring tool contraints because of `binarySource=global`',\n );\n }\n\n return { rawCommands, rawOptions };\n}\n\nexport async function exec(\n cmd:\n | string\n | string[]\n | CommandWithOptions[]\n | (string | CommandWithOptions)[],\n opts: ExecOptions = {},\n): Promise<ExecResult> {\n const { docker } = opts;\n const dockerChildPrefix = GlobalConfig.get('dockerChildPrefix');\n const sideCarImage = GlobalConfig.get('dockerSidecarImage');\n\n const { rawCommands, rawOptions } = await prepareRawExec(\n cmd,\n opts,\n sideCarImage,\n );\n const useDocker = isDocker(docker);\n\n let res: ExecResult = { stdout: '', stderr: '' };\n for (const rawCmd of rawCommands) {\n const startTime = Date.now();\n if (useDocker) {\n await removeDockerContainer(sideCarImage, dockerChildPrefix);\n }\n logger.debug(\n { command: rawCmd, env: Object.keys(coerceObject(rawOptions.env)) },\n 'Executing command',\n );\n logger.trace({ commandOptions: rawOptions }, 'Command options');\n try {\n res = await rawExec(rawCmd, rawOptions);\n } catch (err) {\n const durationMs = Math.round(Date.now() - startTime);\n logger.debug({ err, durationMs }, 'rawExec err');\n if (useDocker) {\n await removeDockerContainer(sideCarImage, dockerChildPrefix).catch(\n (removeErr: Error) => {\n const message: string = err.message;\n throw new Error(\n `Error: \"${removeErr.message}\" - Original Error: \"${message}\"`,\n );\n },\n );\n }\n if (err.signal === `SIGTERM`) {\n logger.debug(\n { err },\n 'exec interrupted by SIGTERM - run needs to be aborted',\n );\n throw new Error(TEMPORARY_ERROR);\n }\n throw err;\n }\n const durationMs = Math.round(Date.now() - startTime);\n logger.debug(\n {\n durationMs,\n stdout: res.stdout,\n stderr: res.stderr,\n },\n 'exec completed',\n );\n }\n\n return res;\n}\n\n/**\n * When we resolve `toolSettings` in `getToolSettingsOptions`, we provide a stronger type than our input types, because we set defaults on config options.\n *\n * We do not have a default that is set for `nodeMaxMemory`, so it must remain as optional.\n */\ntype ResolvedToolSettingsOptions = Required<\n Omit<RepoToolSettingsOptions, 'nodeMaxMemory'>\n> &\n Pick<RepoToolSettingsOptions, 'nodeMaxMemory'>;\n\nexport function getToolSettingsOptions(\n repoConfig?: RepoToolSettingsOptions,\n): ResolvedToolSettingsOptions {\n let defaults = GlobalConfig.get('toolSettings');\n defaults ??= {\n jvmMaxMemory: 512,\n jvmMemory: 512,\n };\n\n const jvmMaxMemory = defaults?.jvmMaxMemory ?? 512;\n const options: ResolvedToolSettingsOptions = {\n jvmMaxMemory,\n jvmMemory: defaults?.jvmMemory ?? jvmMaxMemory,\n nodeMaxMemory: defaults?.nodeMaxMemory,\n };\n\n if (repoConfig !== undefined) {\n if (repoConfig.jvmMaxMemory) {\n if (repoConfig.jvmMaxMemory > options.jvmMaxMemory) {\n logger.once.debug(\n `A higher jvmMaxMemory (${repoConfig.jvmMaxMemory}) than the global configuration (${options.jvmMaxMemory}) is not permitted for Java VM invocations. Using global configuration instead`,\n );\n }\n\n options.jvmMaxMemory = Math.min(\n options.jvmMaxMemory,\n repoConfig.jvmMaxMemory,\n );\n }\n\n if (repoConfig.jvmMemory) {\n options.jvmMemory = repoConfig.jvmMemory;\n }\n\n if (repoConfig.nodeMaxMemory) {\n if (\n options.nodeMaxMemory &&\n repoConfig.nodeMaxMemory > options.nodeMaxMemory\n ) {\n logger.once.debug(\n `A higher nodeMaxMemory (${repoConfig.nodeMaxMemory}) than the global configuration (${options.nodeMaxMemory}) is not permitted for Node invocations. Using global configuration instead`,\n );\n } else {\n options.nodeMaxMemory = repoConfig.nodeMaxMemory;\n }\n }\n }\n\n options.jvmMaxMemory = Math.floor(options.jvmMaxMemory);\n options.jvmMemory = Math.floor(options.jvmMemory);\n if (options.nodeMaxMemory) {\n options.nodeMaxMemory = Math.floor(options.nodeMaxMemory);\n }\n\n // make sure that the starting memory can't be more than the max memory\n options.jvmMemory = Math.min(options.jvmMemory, options.jvmMaxMemory);\n\n if (options.jvmMaxMemory < 512 || options.jvmMemory < 512) {\n options.jvmMaxMemory = Math.max(options.jvmMaxMemory, 512);\n\n logger.once.debug(\n 'Overriding low memory settings for Java VM invocations to a minimum of 512M',\n );\n options.jvmMemory = Math.max(options.jvmMemory, 512);\n }\n\n return options;\n}\n\nexport function gradleJvmArg(config: RepoToolSettingsOptions): string {\n return ` -Dorg.gradle.jvmargs=\"-Xms${config.jvmMemory}m -Xmx${config.jvmMaxMemory}m\"`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../lib/util/exec/index.ts"],"sourcesContent":["import { isNonEmptyString, isString } from '@sindresorhus/is';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../config/global.ts';\nimport type { RepoToolSettingsOptions } from '../../config/types.ts';\nimport { TEMPORARY_ERROR } from '../../constants/error-messages.ts';\nimport { logger } from '../../logger/index.ts';\nimport { coerceArray } from '../array.ts';\nimport { getCustomEnv, getUserEnv } from '../env.ts';\nimport { coerceObject } from '../object.ts';\nimport { rawExec } from './common.ts';\nimport { generateInstallCommands, isDynamicInstall } from './containerbase.ts';\nimport {\n generateDockerCommand,\n removeDockerContainer,\n} from './docker/index.ts';\nimport { getHermitEnvs, isHermit } from './hermit.ts';\nimport type {\n CommandWithOptions,\n DockerOptions,\n ExecOptions,\n ExecResult,\n ExtraEnv,\n Opt,\n RawExecOptions,\n} from './types.ts';\nimport { getChildEnv } from './utils.ts';\n\nfunction dockerEnvVars(extraEnv: ExtraEnv, childEnv: ExtraEnv): string[] {\n const extraEnvKeys = Object.keys(extraEnv);\n return extraEnvKeys.filter((key) => isNonEmptyString(childEnv[key]));\n}\n\nfunction getCwd({ cwd, cwdFile }: ExecOptions): string | undefined {\n // TODO: types (#22198)\n const defaultCwd = GlobalConfig.get('localDir');\n const paramCwd = cwdFile\n ? upath.join(defaultCwd, upath.dirname(cwdFile))\n : cwd;\n return paramCwd ?? defaultCwd;\n}\n\nfunction getRawExecOptions(opts: ExecOptions): RawExecOptions {\n const defaultExecutionTimeout = GlobalConfig.get('executionTimeout');\n const childEnv = getChildEnv(opts);\n const cwd = getCwd(opts);\n let timeout = opts.timeout;\n timeout ??= defaultExecutionTimeout * 60 * 1000;\n\n // Set default max buffer size to 10MB\n const maxBuffer = opts.maxBuffer ?? 10 * 1024 * 1024;\n\n return {\n cwd,\n env: childEnv,\n maxBuffer,\n timeout,\n ...(opts.shell !== undefined && { shell: opts.shell }),\n stdin: 'pipe',\n stdout: opts.ignoreStdout ? 'ignore' : 'pipe',\n stderr: 'pipe',\n };\n}\n\nfunction isDocker(docker: Opt<DockerOptions>): docker is DockerOptions {\n return GlobalConfig.get('binarySource') === 'docker' && !!docker;\n}\n\ninterface RawExecArguments {\n rawCommands: (string | CommandWithOptions)[];\n rawOptions: RawExecOptions;\n}\n\nasync function prepareRawExec(\n cmd:\n | string\n | string[]\n | CommandWithOptions[]\n | (string | CommandWithOptions)[],\n opts: ExecOptions,\n sideCarImage: string,\n): Promise<RawExecArguments> {\n const { docker } = opts;\n const preCommands = opts.preCommands ?? [];\n const customEnvVariables = getCustomEnv();\n const userConfiguredEnv = getUserEnv();\n const { containerbaseDir, binarySource } = GlobalConfig.get();\n\n if (binarySource === 'docker' || binarySource === 'install') {\n logger.debug(`Setting CONTAINERBASE_CACHE_DIR to ${containerbaseDir!}`);\n opts.env ??= {};\n opts.env.CONTAINERBASE_CACHE_DIR = containerbaseDir;\n }\n\n let rawOptions = getRawExecOptions(opts);\n\n let rawCommands = isString(cmd) ? [cmd] : cmd;\n\n if (isDocker(docker)) {\n logger.debug({ image: sideCarImage }, 'Using docker to execute');\n const extraEnv = {\n ...opts.extraEnv,\n ...customEnvVariables,\n ...userConfiguredEnv,\n };\n const childEnv = getChildEnv(opts);\n const envVars = [\n ...dockerEnvVars(extraEnv, childEnv),\n ...coerceArray(docker.envVars),\n 'CONTAINERBASE_CACHE_DIR',\n ];\n const cwd = getCwd(opts);\n const dockerOptions: DockerOptions = { ...docker, cwd, envVars };\n const dockerCommand = await generateDockerCommand(\n rawCommands,\n [\n ...(await generateInstallCommands(opts.toolConstraints)),\n ...preCommands,\n ],\n dockerOptions,\n sideCarImage,\n );\n rawCommands = [dockerCommand];\n } else if (isDynamicInstall(opts.toolConstraints)) {\n logger.debug('Using containerbase dynamic installs');\n rawCommands = [\n ...(await generateInstallCommands(opts.toolConstraints)),\n ...preCommands,\n ...rawCommands,\n ];\n } else if (isHermit()) {\n const hermitEnvVars = await getHermitEnvs(rawOptions);\n logger.debug(\n { hermitEnvVars },\n 'merging hermit environment variables into the execution options',\n );\n rawOptions = {\n ...rawOptions,\n env: {\n ...rawOptions.env,\n ...hermitEnvVars,\n },\n };\n }\n\n if (\n GlobalConfig.get('binarySource') === 'global' &&\n opts.toolConstraints?.length\n ) {\n logger.once.debug(\n { toolConstraints: opts.toolConstraints },\n 'Ignoring tool contraints because of `binarySource=global`',\n );\n }\n\n return { rawCommands, rawOptions };\n}\n\nexport async function exec(\n cmd:\n | string\n | string[]\n | CommandWithOptions[]\n | (string | CommandWithOptions)[],\n opts: ExecOptions = {},\n): Promise<ExecResult> {\n const { docker } = opts;\n const dockerChildPrefix = GlobalConfig.get('dockerChildPrefix');\n const sideCarImage = GlobalConfig.get('dockerSidecarImage');\n\n const { rawCommands, rawOptions } = await prepareRawExec(\n cmd,\n opts,\n sideCarImage,\n );\n const useDocker = isDocker(docker);\n\n let res: ExecResult = { stdout: '', stderr: '' };\n for (const rawCmd of rawCommands) {\n const startTime = Date.now();\n if (useDocker) {\n await removeDockerContainer(sideCarImage, dockerChildPrefix);\n }\n logger.debug(\n { command: rawCmd, env: Object.keys(coerceObject(rawOptions.env)) },\n 'Executing command',\n );\n logger.trace({ commandOptions: rawOptions }, 'Command options');\n try {\n res = await rawExec(rawCmd, rawOptions);\n } catch (err) {\n const durationMs = Math.round(Date.now() - startTime);\n logger.debug({ err, durationMs }, 'rawExec err');\n if (useDocker) {\n await removeDockerContainer(sideCarImage, dockerChildPrefix).catch(\n (removeErr: Error) => {\n const message: string = err.message;\n throw new Error(\n `Error: \"${removeErr.message}\" - Original Error: \"${message}\"`,\n );\n },\n );\n }\n if (err.signal === `SIGTERM`) {\n logger.debug(\n { err },\n 'exec interrupted by SIGTERM - run needs to be aborted',\n );\n throw new Error(TEMPORARY_ERROR);\n }\n throw err;\n }\n const durationMs = Math.round(Date.now() - startTime);\n logger.debug(\n {\n durationMs,\n stdout: res.stdout,\n stderr: res.stderr,\n },\n 'exec completed',\n );\n }\n\n return res;\n}\n\n/**\n * When we resolve `toolSettings` in `getToolSettingsOptions`, we provide a stronger type than our input types, because we set defaults on config options.\n *\n * We do not have a default that is set for `nodeMaxMemory`, so it must remain as optional.\n */\ntype ResolvedToolSettingsOptions = Required<\n Omit<RepoToolSettingsOptions, 'nodeMaxMemory'>\n> &\n Pick<RepoToolSettingsOptions, 'nodeMaxMemory'>;\n\nexport function getToolSettingsOptions(\n repoConfig?: RepoToolSettingsOptions,\n): ResolvedToolSettingsOptions {\n let defaults = GlobalConfig.get('toolSettings');\n defaults ??= {\n jvmMaxMemory: 512,\n jvmMemory: 512,\n };\n\n const jvmMaxMemory = defaults?.jvmMaxMemory ?? 512;\n const options: ResolvedToolSettingsOptions = {\n jvmMaxMemory,\n jvmMemory: defaults?.jvmMemory ?? jvmMaxMemory,\n nodeMaxMemory: defaults?.nodeMaxMemory,\n };\n\n if (repoConfig !== undefined) {\n if (repoConfig.jvmMaxMemory) {\n if (repoConfig.jvmMaxMemory > options.jvmMaxMemory) {\n logger.once.debug(\n `A higher jvmMaxMemory (${repoConfig.jvmMaxMemory}) than the global configuration (${options.jvmMaxMemory}) is not permitted for Java VM invocations. Using global configuration instead`,\n );\n }\n\n options.jvmMaxMemory = Math.min(\n options.jvmMaxMemory,\n repoConfig.jvmMaxMemory,\n );\n }\n\n if (repoConfig.jvmMemory) {\n options.jvmMemory = repoConfig.jvmMemory;\n }\n\n if (repoConfig.nodeMaxMemory) {\n if (\n options.nodeMaxMemory &&\n repoConfig.nodeMaxMemory > options.nodeMaxMemory\n ) {\n logger.once.debug(\n `A higher nodeMaxMemory (${repoConfig.nodeMaxMemory}) than the global configuration (${options.nodeMaxMemory}) is not permitted for Node invocations. Using global configuration instead`,\n );\n } else {\n options.nodeMaxMemory = repoConfig.nodeMaxMemory;\n }\n }\n }\n\n options.jvmMaxMemory = Math.floor(options.jvmMaxMemory);\n options.jvmMemory = Math.floor(options.jvmMemory);\n if (options.nodeMaxMemory) {\n options.nodeMaxMemory = Math.floor(options.nodeMaxMemory);\n }\n\n // make sure that the starting memory can't be more than the max memory\n options.jvmMemory = Math.min(options.jvmMemory, options.jvmMaxMemory);\n\n if (options.jvmMaxMemory < 512 || options.jvmMemory < 512) {\n options.jvmMaxMemory = Math.max(options.jvmMaxMemory, 512);\n\n logger.once.debug(\n 'Overriding low memory settings for Java VM invocations to a minimum of 512M',\n );\n options.jvmMemory = Math.max(options.jvmMemory, 512);\n }\n\n return options;\n}\n\nexport function gradleJvmArg(config: RepoToolSettingsOptions): string {\n return ` -Dorg.gradle.jvmargs=\"-Xms${config.jvmMemory}m -Xmx${config.jvmMaxMemory}m\"`;\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { getCustomEnv, getUserEnv } from "../env.js";
2
2
  import { getChildProcessEnv } from "./env.js";
3
- import { isBoolean, isNonEmptyStringAndNotWhitespace, isString } from "@sindresorhus/is";
3
+ import { isBoolean, isNonEmptyStringAndNotWhitespace, isObject, isString } from "@sindresorhus/is";
4
4
  import { join } from "shlex";
5
5
  //#region lib/util/exec/utils.ts
6
6
  function getChildEnv({ extraEnv, env: forcedEnv = {} } = {}) {
@@ -21,7 +21,7 @@ function getChildEnv({ extraEnv, env: forcedEnv = {} } = {}) {
21
21
  return result;
22
22
  }
23
23
  function isCommandWithOptions(cmd) {
24
- if (!(typeof cmd === "object" && cmd !== null && "command" in cmd)) return false;
24
+ if (!(isObject(cmd) && "command" in cmd)) return false;
25
25
  if (!Array.isArray(cmd.command)) return false;
26
26
  if (!cmd.command.length) return false;
27
27
  if (cmd.command.some((v) => !isString(v))) return false;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../../../lib/util/exec/utils.ts"],"sourcesContent":["import {\n isBoolean,\n isNonEmptyStringAndNotWhitespace,\n isString,\n} from '@sindresorhus/is';\nimport { join } from 'shlex';\nimport { getCustomEnv, getUserEnv } from '../env.ts';\nimport { getChildProcessEnv } from './env.ts';\nimport type { CommandWithOptions, ExecOptions } from './types.ts';\n\nexport type ResolvedChildEnv = Record<string, string>;\n\nexport function getChildEnv({\n extraEnv,\n env: forcedEnv = {},\n}: Pick<ExecOptions, 'env' | 'extraEnv'> = {}): ResolvedChildEnv {\n const globalConfigEnv = getCustomEnv();\n const userConfiguredEnv = getUserEnv();\n\n const inheritedKeys: string[] = [];\n for (const [key, val] of Object.entries(extraEnv ?? {})) {\n if (isString(val)) {\n inheritedKeys.push(key);\n }\n }\n\n const parentEnv = getChildProcessEnv(inheritedKeys);\n const combinedEnv = {\n ...extraEnv,\n ...parentEnv,\n ...globalConfigEnv,\n ...userConfiguredEnv,\n ...forcedEnv,\n };\n\n const result: Record<string, string> = {};\n for (const [key, val] of Object.entries(combinedEnv)) {\n if (isString(val)) {\n result[key] = `${val}`;\n }\n }\n\n return result;\n}\n\nexport function isCommandWithOptions(cmd: unknown): cmd is CommandWithOptions {\n if (!(typeof cmd === 'object' && cmd !== null && 'command' in cmd)) {\n return false;\n }\n\n if (!Array.isArray(cmd.command)) {\n return false;\n }\n\n if (!cmd.command.length) {\n return false;\n }\n\n if (cmd.command.some((v) => !isString(v))) {\n return false;\n }\n\n if ('ignoreFailure' in cmd && !isBoolean(cmd.ignoreFailure)) {\n return false;\n }\n\n if (\n 'shell' in cmd &&\n !(isBoolean(cmd.shell) || isNonEmptyStringAndNotWhitespace(cmd.shell))\n ) {\n return false;\n }\n\n return true;\n}\n\nexport function asRawCommand(cmd: string | CommandWithOptions): string {\n if (isCommandWithOptions(cmd)) {\n return join(cmd.command);\n }\n\n return cmd;\n}\n\nexport function asRawCommands(\n cmds: string | (string | CommandWithOptions)[],\n): string[] {\n if (isString(cmds)) {\n return [cmds];\n }\n return cmds.map((cmd) => asRawCommand(cmd));\n}\n"],"mappings":";;;;;AAYA,SAAgB,YAAY,EAC1B,UACA,KAAK,YAAY,CAAC,MACuB,CAAC,GAAqB;CAC/D,MAAM,kBAAkB,aAAa;CACrC,MAAM,oBAAoB,WAAW;CAErC,MAAM,gBAA0B,CAAC;CACjC,KAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,YAAY,CAAC,CAAC,GACpD,IAAI,SAAS,GAAG,GACd,cAAc,KAAK,GAAG;CAI1B,MAAM,YAAY,mBAAmB,aAAa;CAClD,MAAM,cAAc;EAClB,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;CACL;CAEA,MAAM,SAAiC,CAAC;CACxC,KAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,WAAW,GACjD,IAAI,SAAS,GAAG,GACd,OAAO,OAAO,GAAG;CAIrB,OAAO;AACT;AAEA,SAAgB,qBAAqB,KAAyC;CAC5E,IAAI,EAAE,OAAO,QAAQ,YAAY,QAAQ,QAAQ,aAAa,MAC5D,OAAO;CAGT,IAAI,CAAC,MAAM,QAAQ,IAAI,OAAO,GAC5B,OAAO;CAGT,IAAI,CAAC,IAAI,QAAQ,QACf,OAAO;CAGT,IAAI,IAAI,QAAQ,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,GACtC,OAAO;CAGT,IAAI,mBAAmB,OAAO,CAAC,UAAU,IAAI,aAAa,GACxD,OAAO;CAGT,IACE,WAAW,OACX,EAAE,UAAU,IAAI,KAAK,KAAK,iCAAiC,IAAI,KAAK,IAEpE,OAAO;CAGT,OAAO;AACT;AAEA,SAAgB,aAAa,KAA0C;CACrE,IAAI,qBAAqB,GAAG,GAC1B,OAAO,KAAK,IAAI,OAAO;CAGzB,OAAO;AACT"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../../lib/util/exec/utils.ts"],"sourcesContent":["import {\n isBoolean,\n isNonEmptyStringAndNotWhitespace,\n isObject,\n isString,\n} from '@sindresorhus/is';\nimport { join } from 'shlex';\nimport { getCustomEnv, getUserEnv } from '../env.ts';\nimport { getChildProcessEnv } from './env.ts';\nimport type { CommandWithOptions, ExecOptions } from './types.ts';\n\nexport type ResolvedChildEnv = Record<string, string>;\n\nexport function getChildEnv({\n extraEnv,\n env: forcedEnv = {},\n}: Pick<ExecOptions, 'env' | 'extraEnv'> = {}): ResolvedChildEnv {\n const globalConfigEnv = getCustomEnv();\n const userConfiguredEnv = getUserEnv();\n\n const inheritedKeys: string[] = [];\n for (const [key, val] of Object.entries(extraEnv ?? {})) {\n if (isString(val)) {\n inheritedKeys.push(key);\n }\n }\n\n const parentEnv = getChildProcessEnv(inheritedKeys);\n const combinedEnv = {\n ...extraEnv,\n ...parentEnv,\n ...globalConfigEnv,\n ...userConfiguredEnv,\n ...forcedEnv,\n };\n\n const result: Record<string, string> = {};\n for (const [key, val] of Object.entries(combinedEnv)) {\n if (isString(val)) {\n result[key] = `${val}`;\n }\n }\n\n return result;\n}\n\nexport function isCommandWithOptions(cmd: unknown): cmd is CommandWithOptions {\n if (!(isObject(cmd) && 'command' in cmd)) {\n return false;\n }\n\n if (!Array.isArray(cmd.command)) {\n return false;\n }\n\n if (!cmd.command.length) {\n return false;\n }\n\n if (cmd.command.some((v) => !isString(v))) {\n return false;\n }\n\n if ('ignoreFailure' in cmd && !isBoolean(cmd.ignoreFailure)) {\n return false;\n }\n\n if (\n 'shell' in cmd &&\n !(isBoolean(cmd.shell) || isNonEmptyStringAndNotWhitespace(cmd.shell))\n ) {\n return false;\n }\n\n return true;\n}\n\nexport function asRawCommand(cmd: string | CommandWithOptions): string {\n if (isCommandWithOptions(cmd)) {\n return join(cmd.command);\n }\n\n return cmd;\n}\n\nexport function asRawCommands(\n cmds: string | (string | CommandWithOptions)[],\n): string[] {\n if (isString(cmds)) {\n return [cmds];\n }\n return cmds.map((cmd) => asRawCommand(cmd));\n}\n"],"mappings":";;;;;AAaA,SAAgB,YAAY,EAC1B,UACA,KAAK,YAAY,CAAC,MACuB,CAAC,GAAqB;CAC/D,MAAM,kBAAkB,aAAa;CACrC,MAAM,oBAAoB,WAAW;CAErC,MAAM,gBAA0B,CAAC;CACjC,KAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,YAAY,CAAC,CAAC,GACpD,IAAI,SAAS,GAAG,GACd,cAAc,KAAK,GAAG;CAI1B,MAAM,YAAY,mBAAmB,aAAa;CAClD,MAAM,cAAc;EAClB,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;CACL;CAEA,MAAM,SAAiC,CAAC;CACxC,KAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,WAAW,GACjD,IAAI,SAAS,GAAG,GACd,OAAO,OAAO,GAAG;CAIrB,OAAO;AACT;AAEA,SAAgB,qBAAqB,KAAyC;CAC5E,IAAI,EAAE,SAAS,GAAG,KAAK,aAAa,MAClC,OAAO;CAGT,IAAI,CAAC,MAAM,QAAQ,IAAI,OAAO,GAC5B,OAAO;CAGT,IAAI,CAAC,IAAI,QAAQ,QACf,OAAO;CAGT,IAAI,IAAI,QAAQ,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,GACtC,OAAO;CAGT,IAAI,mBAAmB,OAAO,CAAC,UAAU,IAAI,aAAa,GACxD,OAAO;CAGT,IACE,WAAW,OACX,EAAE,UAAU,IAAI,KAAK,KAAK,iCAAiC,IAAI,KAAK,IAEpE,OAAO;CAGT,OAAO;AACT;AAEA,SAAgB,aAAa,KAA0C;CACrE,IAAI,qBAAqB,GAAG,GAC1B,OAAO,KAAK,IAAI,OAAO;CAGzB,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"fingerprint.js","names":[],"sources":["../../lib/util/fingerprint.ts"],"sourcesContent":["import { type Hash, createHash } from 'node:crypto';\n\n// Returns true when `value` would appear in the canonical JSON produced by\n// `safe-stable-stringify`. We pre-check before emitting because objects must\n// drop keys whose value resolves to nothing (incl. via toJSON → undefined),\n// and incremental hashing can't roll back already-emitted bytes.\n//\n// `cache` memoizes the result per object reference so callers that invoke\n// isEmittable just before recursing don't re-walk the toJSON chain twice.\nfunction isEmittable(value: unknown, cache: WeakMap<object, boolean>): boolean {\n if (\n value === undefined ||\n typeof value === 'function' ||\n typeof value === 'symbol'\n ) {\n return false;\n }\n if (value === null || typeof value !== 'object') {\n return true;\n }\n const cached = cache.get(value);\n if (cached !== undefined) {\n return cached;\n }\n const obj = value as { toJSON?: () => unknown };\n const result =\n typeof obj.toJSON === 'function' ? isEmittable(obj.toJSON(), cache) : true;\n cache.set(value, result);\n return result;\n}\n\n// Walks `value` and emits canonical JSON chunks directly into `h`,\n// matching `safe-stable-stringify` (deterministic mode) byte-for-byte\n// without materializing the full string. Required to avoid V8's max\n// string length when the input is large (e.g. a PR carrying upgrades\n// across hundreds of manifest files).\nfunction fingerprintInto(\n h: Hash,\n value: unknown,\n seen: WeakSet<object>,\n emittableCache: WeakMap<object, boolean>,\n): void {\n if (value === null || typeof value !== 'object') {\n h.update(JSON.stringify(value));\n return;\n }\n\n const obj = value as { toJSON?: () => unknown };\n if (typeof obj.toJSON === 'function') {\n fingerprintInto(h, obj.toJSON(), seen, emittableCache);\n return;\n }\n\n if (seen.has(value)) {\n h.update('\"[Circular]\"');\n return;\n }\n seen.add(value);\n\n if (Array.isArray(value)) {\n h.update('[');\n for (let i = 0; i < value.length; i++) {\n if (i > 0) {\n h.update(',');\n }\n const item: unknown = value[i];\n if (isEmittable(item, emittableCache)) {\n fingerprintInto(h, item, seen, emittableCache);\n } else {\n h.update('null');\n }\n }\n h.update(']');\n } else {\n const entries = value as Record<string, unknown>;\n const keys = Object.keys(entries).sort();\n h.update('{');\n let first = true;\n for (const k of keys) {\n const v = entries[k];\n if (!isEmittable(v, emittableCache)) {\n continue;\n }\n if (!first) {\n h.update(',');\n }\n first = false;\n h.update(JSON.stringify(k));\n h.update(':');\n fingerprintInto(h, v, seen, emittableCache);\n }\n h.update('}');\n }\n seen.delete(value);\n}\n\nexport function fingerprint(input: unknown): string {\n const emittableCache = new WeakMap<object, boolean>();\n if (!isEmittable(input, emittableCache)) {\n return '';\n }\n const h = createHash('sha512');\n fingerprintInto(h, input, new WeakSet(), emittableCache);\n return h.digest('hex');\n}\n"],"mappings":";;AASA,SAAS,YAAY,OAAgB,OAA0C;CAC7E,IACE,UAAU,KAAA,KACV,OAAO,UAAU,cACjB,OAAO,UAAU,UAEjB,OAAO;CAET,IAAI,UAAU,QAAQ,OAAO,UAAU,UACrC,OAAO;CAET,MAAM,SAAS,MAAM,IAAI,KAAK;CAC9B,IAAI,WAAW,KAAA,GACb,OAAO;CAET,MAAM,MAAM;CACZ,MAAM,SACJ,OAAO,IAAI,WAAW,aAAa,YAAY,IAAI,OAAO,GAAG,KAAK,IAAI;CACxE,MAAM,IAAI,OAAO,MAAM;CACvB,OAAO;AACT;AAOA,SAAS,gBACP,GACA,OACA,MACA,gBACM;CACN,IAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;EAC/C,EAAE,OAAO,KAAK,UAAU,KAAK,CAAC;EAC9B;CACF;CAEA,MAAM,MAAM;CACZ,IAAI,OAAO,IAAI,WAAW,YAAY;EACpC,gBAAgB,GAAG,IAAI,OAAO,GAAG,MAAM,cAAc;EACrD;CACF;CAEA,IAAI,KAAK,IAAI,KAAK,GAAG;EACnB,EAAE,OAAO,gBAAc;EACvB;CACF;CACA,KAAK,IAAI,KAAK;CAEd,IAAI,MAAM,QAAQ,KAAK,GAAG;EACxB,EAAE,OAAO,GAAG;EACZ,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;GACrC,IAAI,IAAI,GACN,EAAE,OAAO,GAAG;GAEd,MAAM,OAAgB,MAAM;GAC5B,IAAI,YAAY,MAAM,cAAc,GAClC,gBAAgB,GAAG,MAAM,MAAM,cAAc;QAE7C,EAAE,OAAO,MAAM;EAEnB;EACA,EAAE,OAAO,GAAG;CACd,OAAO;EACL,MAAM,UAAU;EAChB,MAAM,OAAO,OAAO,KAAK,OAAO,CAAC,CAAC,KAAK;EACvC,EAAE,OAAO,GAAG;EACZ,IAAI,QAAQ;EACZ,KAAK,MAAM,KAAK,MAAM;GACpB,MAAM,IAAI,QAAQ;GAClB,IAAI,CAAC,YAAY,GAAG,cAAc,GAChC;GAEF,IAAI,CAAC,OACH,EAAE,OAAO,GAAG;GAEd,QAAQ;GACR,EAAE,OAAO,KAAK,UAAU,CAAC,CAAC;GAC1B,EAAE,OAAO,GAAG;GACZ,gBAAgB,GAAG,GAAG,MAAM,cAAc;EAC5C;EACA,EAAE,OAAO,GAAG;CACd;CACA,KAAK,OAAO,KAAK;AACnB;AAEA,SAAgB,YAAY,OAAwB;CAClD,MAAM,iCAAiB,IAAI,QAAyB;CACpD,IAAI,CAAC,YAAY,OAAO,cAAc,GACpC,OAAO;CAET,MAAM,IAAI,WAAW,QAAQ;CAC7B,gBAAgB,GAAG,uBAAO,IAAI,QAAQ,GAAG,cAAc;CACvD,OAAO,EAAE,OAAO,KAAK;AACvB"}
1
+ {"version":3,"file":"fingerprint.js","names":[],"sources":["../../lib/util/fingerprint.ts"],"sourcesContent":["import { type Hash, createHash } from 'node:crypto';\n\n// Returns true when `value` would appear in the canonical JSON produced by\n// `safe-stable-stringify`. We pre-check before emitting because objects must\n// drop keys whose value resolves to nothing (incl. via toJSON → undefined),\n// and incremental hashing can't roll back already-emitted bytes.\n//\n// `cache` memoizes the result per object reference so callers that invoke\n// isEmittable just before recursing don't re-walk the toJSON chain twice.\nfunction isEmittable(value: unknown, cache: WeakMap<object, boolean>): boolean {\n if (\n value === undefined ||\n typeof value === 'function' ||\n typeof value === 'symbol'\n ) {\n return false;\n }\n // oxlint-disable-next-line renovate/prefer-is-object -- byte-exact JSON canonicalization: functions are handled explicitly above and must not take the object path\n if (value === null || typeof value !== 'object') {\n return true;\n }\n const cached = cache.get(value);\n if (cached !== undefined) {\n return cached;\n }\n const obj = value as { toJSON?: () => unknown };\n const result =\n typeof obj.toJSON === 'function' ? isEmittable(obj.toJSON(), cache) : true;\n cache.set(value, result);\n return result;\n}\n\n// Walks `value` and emits canonical JSON chunks directly into `h`,\n// matching `safe-stable-stringify` (deterministic mode) byte-for-byte\n// without materializing the full string. Required to avoid V8's max\n// string length when the input is large (e.g. a PR carrying upgrades\n// across hundreds of manifest files).\nfunction fingerprintInto(\n h: Hash,\n value: unknown,\n seen: WeakSet<object>,\n emittableCache: WeakMap<object, boolean>,\n): void {\n // oxlint-disable-next-line renovate/prefer-is-object -- byte-exact JSON canonicalization: functions must take the JSON.stringify primitive path, but isObject() matches them\n if (value === null || typeof value !== 'object') {\n h.update(JSON.stringify(value));\n return;\n }\n\n const obj = value as { toJSON?: () => unknown };\n if (typeof obj.toJSON === 'function') {\n fingerprintInto(h, obj.toJSON(), seen, emittableCache);\n return;\n }\n\n if (seen.has(value)) {\n h.update('\"[Circular]\"');\n return;\n }\n seen.add(value);\n\n if (Array.isArray(value)) {\n h.update('[');\n for (let i = 0; i < value.length; i++) {\n if (i > 0) {\n h.update(',');\n }\n const item: unknown = value[i];\n if (isEmittable(item, emittableCache)) {\n fingerprintInto(h, item, seen, emittableCache);\n } else {\n h.update('null');\n }\n }\n h.update(']');\n } else {\n const entries = value as Record<string, unknown>;\n const keys = Object.keys(entries).sort();\n h.update('{');\n let first = true;\n for (const k of keys) {\n const v = entries[k];\n if (!isEmittable(v, emittableCache)) {\n continue;\n }\n if (!first) {\n h.update(',');\n }\n first = false;\n h.update(JSON.stringify(k));\n h.update(':');\n fingerprintInto(h, v, seen, emittableCache);\n }\n h.update('}');\n }\n seen.delete(value);\n}\n\nexport function fingerprint(input: unknown): string {\n const emittableCache = new WeakMap<object, boolean>();\n if (!isEmittable(input, emittableCache)) {\n return '';\n }\n const h = createHash('sha512');\n fingerprintInto(h, input, new WeakSet(), emittableCache);\n return h.digest('hex');\n}\n"],"mappings":";;AASA,SAAS,YAAY,OAAgB,OAA0C;CAC7E,IACE,UAAU,KAAA,KACV,OAAO,UAAU,cACjB,OAAO,UAAU,UAEjB,OAAO;CAGT,IAAI,UAAU,QAAQ,OAAO,UAAU,UACrC,OAAO;CAET,MAAM,SAAS,MAAM,IAAI,KAAK;CAC9B,IAAI,WAAW,KAAA,GACb,OAAO;CAET,MAAM,MAAM;CACZ,MAAM,SACJ,OAAO,IAAI,WAAW,aAAa,YAAY,IAAI,OAAO,GAAG,KAAK,IAAI;CACxE,MAAM,IAAI,OAAO,MAAM;CACvB,OAAO;AACT;AAOA,SAAS,gBACP,GACA,OACA,MACA,gBACM;CAEN,IAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;EAC/C,EAAE,OAAO,KAAK,UAAU,KAAK,CAAC;EAC9B;CACF;CAEA,MAAM,MAAM;CACZ,IAAI,OAAO,IAAI,WAAW,YAAY;EACpC,gBAAgB,GAAG,IAAI,OAAO,GAAG,MAAM,cAAc;EACrD;CACF;CAEA,IAAI,KAAK,IAAI,KAAK,GAAG;EACnB,EAAE,OAAO,gBAAc;EACvB;CACF;CACA,KAAK,IAAI,KAAK;CAEd,IAAI,MAAM,QAAQ,KAAK,GAAG;EACxB,EAAE,OAAO,GAAG;EACZ,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;GACrC,IAAI,IAAI,GACN,EAAE,OAAO,GAAG;GAEd,MAAM,OAAgB,MAAM;GAC5B,IAAI,YAAY,MAAM,cAAc,GAClC,gBAAgB,GAAG,MAAM,MAAM,cAAc;QAE7C,EAAE,OAAO,MAAM;EAEnB;EACA,EAAE,OAAO,GAAG;CACd,OAAO;EACL,MAAM,UAAU;EAChB,MAAM,OAAO,OAAO,KAAK,OAAO,CAAC,CAAC,KAAK;EACvC,EAAE,OAAO,GAAG;EACZ,IAAI,QAAQ;EACZ,KAAK,MAAM,KAAK,MAAM;GACpB,MAAM,IAAI,QAAQ;GAClB,IAAI,CAAC,YAAY,GAAG,cAAc,GAChC;GAEF,IAAI,CAAC,OACH,EAAE,OAAO,GAAG;GAEd,QAAQ;GACR,EAAE,OAAO,KAAK,UAAU,CAAC,CAAC;GAC1B,EAAE,OAAO,GAAG;GACZ,gBAAgB,GAAG,GAAG,MAAM,cAAc;EAC5C;EACA,EAAE,OAAO,GAAG;CACd;CACA,KAAK,OAAO,KAAK;AACnB;AAEA,SAAgB,YAAY,OAAwB;CAClD,MAAM,iCAAiB,IAAI,QAAyB;CACpD,IAAI,CAAC,YAAY,OAAO,cAAc,GACpC,OAAO;CAET,MAAM,IAAI,WAAW,QAAQ;CAC7B,gBAAgB,GAAG,uBAAO,IAAI,QAAQ,GAAG,cAAc;CACvD,OAAO,EAAE,OAAO,KAAK;AACvB"}
@@ -25,7 +25,7 @@ import { getCachedModifiedResult, setCachedModifiedResult } from "./modified-cac
25
25
  import { configSigningKey, setPrivateKey, writePrivateKey } from "./private-key.js";
26
26
  import { GitTreeMode } from "./types.js";
27
27
  import { getCachedUpdateDateResult, setCachedUpdateDateResult } from "./update-date-cache.js";
28
- import { isBoolean, isNonEmptyObject, isNonEmptyStringAndNotWhitespace, isString } from "@sindresorhus/is";
28
+ import { isBoolean, isNonEmptyObject, isNonEmptyStringAndNotWhitespace, isString, isTruthy } from "@sindresorhus/is";
29
29
  import fs from "fs-extra";
30
30
  import { DateTime } from "luxon";
31
31
  import upath from "upath";
@@ -162,7 +162,7 @@ async function fetchBranchCommits(preferUpstream = true) {
162
162
  try {
163
163
  const lsRemoteRes = await gitRetry(() => git.raw(opts));
164
164
  logger.trace({ lsRemoteRes }, "git ls-remote result");
165
- lsRemoteRes.split(newlineRegex).filter(Boolean).map((line) => line.trim().split(regEx(/\s+/))).forEach(([sha, ref]) => {
165
+ lsRemoteRes.split(newlineRegex).filter(isTruthy).map((line) => line.trim().split(regEx(/\s+/))).forEach(([sha, ref]) => {
166
166
  config.branchCommits[ref.replace("refs/heads/", "")] = toLongCommitSha(sha);
167
167
  });
168
168
  if (isNonEmptyObject(config.virtualBranches)) for (const [name, branch] of Object.entries(config.virtualBranches)) config.branchCommits[name] = branch.sha;
@@ -1024,7 +1024,7 @@ async function prepareCommit({ branchName, files, message, trailers, force = fal
1024
1024
  else {
1025
1025
  let contents;
1026
1026
  /* v8 ignore else -- TODO: add test #40625 */
1027
- if (typeof file.contents === "string") contents = Buffer.from(file.contents);
1027
+ if (isString(file.contents)) contents = Buffer.from(file.contents);
1028
1028
  else contents = file.contents;
1029
1029
  if (file.isSymlink) await fs.symlink(file.contents, upath.join(localDir, fileName));
1030
1030
  else await fs.outputFile(upath.join(localDir, fileName), contents, { mode: file.isExecutable ? 511 : 438 });