renovate 44.30.0 → 44.30.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 (203) hide show
  1. package/dist/config/migration.js +3 -3
  2. package/dist/config/migration.js.map +1 -1
  3. package/dist/config/migrations/custom/azure-gitlab-automerge-migration.js.map +1 -1
  4. package/dist/config/migrations/custom/dep-types-migration.js.map +1 -1
  5. package/dist/config/options/env.js +2 -1
  6. package/dist/config/options/env.js.map +1 -1
  7. package/dist/config/options/index.js +1 -1
  8. package/dist/config/options/index.js.map +1 -1
  9. package/dist/global-config-option-defaults.generated.js +1 -1
  10. package/dist/global-config-option-defaults.generated.js.map +1 -1
  11. package/dist/logger/utils.js +3 -3
  12. package/dist/logger/utils.js.map +1 -1
  13. package/dist/modules/datasource/crate/index.js +3 -3
  14. package/dist/modules/datasource/crate/index.js.map +1 -1
  15. package/dist/modules/datasource/go/base.js +1 -1
  16. package/dist/modules/datasource/go/base.js.map +1 -1
  17. package/dist/modules/datasource/go/goproxy-parser.js +1 -1
  18. package/dist/modules/datasource/go/goproxy-parser.js.map +1 -1
  19. package/dist/modules/datasource/hexpm-bob/index.js +3 -3
  20. package/dist/modules/datasource/hexpm-bob/index.js.map +1 -1
  21. package/dist/modules/datasource/maven/util.js +1 -1
  22. package/dist/modules/datasource/maven/util.js.map +1 -1
  23. package/dist/modules/datasource/packagist/schema.js +2 -1
  24. package/dist/modules/datasource/packagist/schema.js.map +1 -1
  25. package/dist/modules/datasource/pypi/common.js +1 -1
  26. package/dist/modules/datasource/pypi/common.js.map +1 -1
  27. package/dist/modules/datasource/rpm/repomd.js +2 -1
  28. package/dist/modules/datasource/rpm/repomd.js.map +1 -1
  29. package/dist/modules/datasource/sbt-package/util.js +3 -3
  30. package/dist/modules/datasource/sbt-package/util.js.map +1 -1
  31. package/dist/modules/datasource/terraform-provider/index.js +1 -1
  32. package/dist/modules/datasource/terraform-provider/index.js.map +1 -1
  33. package/dist/modules/manager/ansible-galaxy/util.js +4 -4
  34. package/dist/modules/manager/ansible-galaxy/util.js.map +1 -1
  35. package/dist/modules/manager/asdf/upgradeable-tooling.js +5 -5
  36. package/dist/modules/manager/asdf/upgradeable-tooling.js.map +1 -1
  37. package/dist/modules/manager/bazel-module/extract.js +2 -1
  38. package/dist/modules/manager/bazel-module/extract.js.map +1 -1
  39. package/dist/modules/manager/bazel-module/parser/repo-rules.js +1 -1
  40. package/dist/modules/manager/bazel-module/parser/repo-rules.js.map +1 -1
  41. package/dist/modules/manager/bitbucket-pipelines/extract.js +2 -2
  42. package/dist/modules/manager/bitbucket-pipelines/extract.js.map +1 -1
  43. package/dist/modules/manager/bun/utils.js +2 -1
  44. package/dist/modules/manager/bun/utils.js.map +1 -1
  45. package/dist/modules/manager/bundler/extract.js +1 -1
  46. package/dist/modules/manager/bundler/extract.js.map +1 -1
  47. package/dist/modules/manager/cake/index.js.map +1 -1
  48. package/dist/modules/manager/composer/schema.js +2 -2
  49. package/dist/modules/manager/composer/schema.js.map +1 -1
  50. package/dist/modules/manager/cpanfile/language.js.map +1 -1
  51. package/dist/modules/manager/cpanfile/parser.js +4 -4
  52. package/dist/modules/manager/cpanfile/parser.js.map +1 -1
  53. package/dist/modules/manager/crossplane/extract.js +2 -1
  54. package/dist/modules/manager/crossplane/extract.js.map +1 -1
  55. package/dist/modules/manager/deps-edn/extract.js +1 -1
  56. package/dist/modules/manager/deps-edn/extract.js.map +1 -1
  57. package/dist/modules/manager/deps-edn/parser.js.map +1 -1
  58. package/dist/modules/manager/dockerfile/extract.js +2 -2
  59. package/dist/modules/manager/dockerfile/extract.js.map +1 -1
  60. package/dist/modules/manager/flux/extract.js +2 -2
  61. package/dist/modules/manager/flux/extract.js.map +1 -1
  62. package/dist/modules/manager/git-submodules/extract.js +1 -1
  63. package/dist/modules/manager/git-submodules/extract.js.map +1 -1
  64. package/dist/modules/manager/gomod/artifacts.js +1 -1
  65. package/dist/modules/manager/gomod/artifacts.js.map +1 -1
  66. package/dist/modules/manager/gradle/extract/consistent-versions-plugin.js +2 -2
  67. package/dist/modules/manager/gradle/extract/consistent-versions-plugin.js.map +1 -1
  68. package/dist/modules/manager/gradle-wrapper/artifacts.js +2 -2
  69. package/dist/modules/manager/gradle-wrapper/artifacts.js.map +1 -1
  70. package/dist/modules/manager/helmv3/utils.js +2 -1
  71. package/dist/modules/manager/helmv3/utils.js.map +1 -1
  72. package/dist/modules/manager/hermit/extract.js +1 -1
  73. package/dist/modules/manager/hermit/extract.js.map +1 -1
  74. package/dist/modules/manager/homebrew/utils.js +3 -3
  75. package/dist/modules/manager/homebrew/utils.js.map +1 -1
  76. package/dist/modules/manager/jsonnet-bundler/extract.js +2 -1
  77. package/dist/modules/manager/jsonnet-bundler/extract.js.map +1 -1
  78. package/dist/modules/manager/leiningen/extract.js +2 -2
  79. package/dist/modules/manager/leiningen/extract.js.map +1 -1
  80. package/dist/modules/manager/maven-wrapper/artifacts.js +6 -6
  81. package/dist/modules/manager/maven-wrapper/artifacts.js.map +1 -1
  82. package/dist/modules/manager/mise/backends.js +3 -3
  83. package/dist/modules/manager/mise/backends.js.map +1 -1
  84. package/dist/modules/manager/mise/upgradeable-tooling.js +1 -1
  85. package/dist/modules/manager/mise/upgradeable-tooling.js.map +1 -1
  86. package/dist/modules/manager/npm/extract/common/dependency.js +2 -2
  87. package/dist/modules/manager/npm/extract/common/dependency.js.map +1 -1
  88. package/dist/modules/manager/npm/extract/post/locked-versions.js +2 -1
  89. package/dist/modules/manager/npm/extract/post/locked-versions.js.map +1 -1
  90. package/dist/modules/manager/npm/post-update/index.js +1 -1
  91. package/dist/modules/manager/npm/post-update/index.js.map +1 -1
  92. package/dist/modules/manager/npm/post-update/npm.js +2 -1
  93. package/dist/modules/manager/npm/post-update/npm.js.map +1 -1
  94. package/dist/modules/manager/npm/post-update/yarn.js +2 -2
  95. package/dist/modules/manager/npm/post-update/yarn.js.map +1 -1
  96. package/dist/modules/manager/npm/schema.js +2 -1
  97. package/dist/modules/manager/npm/schema.js.map +1 -1
  98. package/dist/modules/manager/npm/update/locked-dependency/yarn-lock/get-locked.js +2 -1
  99. package/dist/modules/manager/npm/update/locked-dependency/yarn-lock/get-locked.js.map +1 -1
  100. package/dist/modules/manager/npm/update/locked-dependency/yarn-lock/replace.js +1 -1
  101. package/dist/modules/manager/npm/update/locked-dependency/yarn-lock/replace.js.map +1 -1
  102. package/dist/modules/manager/nuget/extract.js +1 -1
  103. package/dist/modules/manager/nuget/extract.js.map +1 -1
  104. package/dist/modules/manager/nvm/extract.js +2 -1
  105. package/dist/modules/manager/nvm/extract.js.map +1 -1
  106. package/dist/modules/manager/osgi/extract.js +2 -1
  107. package/dist/modules/manager/osgi/extract.js.map +1 -1
  108. package/dist/modules/manager/pep621/processors/uv.js +2 -1
  109. package/dist/modules/manager/pep621/processors/uv.js.map +1 -1
  110. package/dist/modules/manager/pip_requirements/extract.js +1 -1
  111. package/dist/modules/manager/pip_requirements/extract.js.map +1 -1
  112. package/dist/modules/manager/pip_setup/extract.js +3 -3
  113. package/dist/modules/manager/pip_setup/extract.js.map +1 -1
  114. package/dist/modules/manager/pixi/schema.js +2 -1
  115. package/dist/modules/manager/pixi/schema.js.map +1 -1
  116. package/dist/modules/manager/setup-cfg/extract.js +1 -1
  117. package/dist/modules/manager/setup-cfg/extract.js.map +1 -1
  118. package/dist/modules/manager/sveltos/util.js +1 -1
  119. package/dist/modules/manager/sveltos/util.js.map +1 -1
  120. package/dist/modules/manager/typst/extract.js +2 -2
  121. package/dist/modules/manager/typst/extract.js.map +1 -1
  122. package/dist/modules/platform/azure/issue.js +2 -1
  123. package/dist/modules/platform/azure/issue.js.map +1 -1
  124. package/dist/modules/platform/bitbucket/index.js +1 -1
  125. package/dist/modules/platform/bitbucket/index.js.map +1 -1
  126. package/dist/modules/platform/bitbucket/schema.js +2 -1
  127. package/dist/modules/platform/bitbucket/schema.js.map +1 -1
  128. package/dist/modules/platform/codecommit/codecommit-client.js +2 -1
  129. package/dist/modules/platform/codecommit/codecommit-client.js.map +1 -1
  130. package/dist/modules/platform/gerrit/utils.js +1 -1
  131. package/dist/modules/platform/gerrit/utils.js.map +1 -1
  132. package/dist/modules/platform/github/index.js +8 -8
  133. package/dist/modules/platform/github/index.js.map +1 -1
  134. package/dist/modules/platform/github/massage-markdown-links.js +6 -3
  135. package/dist/modules/platform/github/massage-markdown-links.js.map +1 -1
  136. package/dist/modules/versioning/apk/index.js +15 -15
  137. package/dist/modules/versioning/apk/index.js.map +1 -1
  138. package/dist/modules/versioning/bazel-module/bzlmod-version.js +3 -2
  139. package/dist/modules/versioning/bazel-module/bzlmod-version.js.map +1 -1
  140. package/dist/modules/versioning/bazel-module/index.js +2 -1
  141. package/dist/modules/versioning/bazel-module/index.js.map +1 -1
  142. package/dist/modules/versioning/composer/index.js +2 -2
  143. package/dist/modules/versioning/composer/index.js.map +1 -1
  144. package/dist/modules/versioning/conan/range.js +4 -3
  145. package/dist/modules/versioning/conan/range.js.map +1 -1
  146. package/dist/modules/versioning/conda/index.js +4 -3
  147. package/dist/modules/versioning/conda/index.js.map +1 -1
  148. package/dist/modules/versioning/distro.js +2 -1
  149. package/dist/modules/versioning/distro.js.map +1 -1
  150. package/dist/modules/versioning/generic.js +2 -1
  151. package/dist/modules/versioning/generic.js.map +1 -1
  152. package/dist/modules/versioning/hashicorp/convertor.js +1 -1
  153. package/dist/modules/versioning/hashicorp/convertor.js.map +1 -1
  154. package/dist/modules/versioning/npm/range.js +1 -1
  155. package/dist/modules/versioning/npm/range.js.map +1 -1
  156. package/dist/modules/versioning/nuget/range.js +2 -1
  157. package/dist/modules/versioning/nuget/range.js.map +1 -1
  158. package/dist/modules/versioning/perl/index.js +1 -1
  159. package/dist/modules/versioning/perl/index.js.map +1 -1
  160. package/dist/modules/versioning/poetry/transform.js +2 -2
  161. package/dist/modules/versioning/poetry/transform.js.map +1 -1
  162. package/dist/modules/versioning/rez/pattern.js.map +1 -1
  163. package/dist/modules/versioning/ruby/index.js +1 -1
  164. package/dist/modules/versioning/ruby/index.js.map +1 -1
  165. package/dist/modules/versioning/semver/index.js +2 -1
  166. package/dist/modules/versioning/semver/index.js.map +1 -1
  167. package/dist/modules/versioning/semver-coerced/index.js +1 -1
  168. package/dist/modules/versioning/semver-coerced/index.js.map +1 -1
  169. package/dist/util/emoji.js.map +1 -1
  170. package/dist/util/exec/containerbase.js +2 -1
  171. package/dist/util/exec/containerbase.js.map +1 -1
  172. package/dist/util/exec/env.js +2 -1
  173. package/dist/util/exec/env.js.map +1 -1
  174. package/dist/util/git/private-key.js +1 -1
  175. package/dist/util/git/private-key.js.map +1 -1
  176. package/dist/util/github/graphql/datasource-fetcher.js +2 -1
  177. package/dist/util/github/graphql/datasource-fetcher.js.map +1 -1
  178. package/dist/util/http/forgejo.js +2 -1
  179. package/dist/util/http/forgejo.js.map +1 -1
  180. package/dist/util/http/gitea.js +2 -1
  181. package/dist/util/http/gitea.js.map +1 -1
  182. package/dist/util/number.js +2 -1
  183. package/dist/util/number.js.map +1 -1
  184. package/dist/util/string-match.js +1 -1
  185. package/dist/util/string-match.js.map +1 -1
  186. package/dist/util/url.js +2 -2
  187. package/dist/util/url.js.map +1 -1
  188. package/dist/workers/global/config/parse/cli.js +1 -1
  189. package/dist/workers/global/config/parse/cli.js.map +1 -1
  190. package/dist/workers/global/config/parse/coersions.js +2 -1
  191. package/dist/workers/global/config/parse/coersions.js.map +1 -1
  192. package/dist/workers/global/config/parse/host-rules-from-env.js +2 -1
  193. package/dist/workers/global/config/parse/host-rules-from-env.js.map +1 -1
  194. package/dist/workers/repository/model/commit-message.js +2 -1
  195. package/dist/workers/repository/model/commit-message.js.map +1 -1
  196. package/dist/workers/repository/model/semantic-commit-message.js +2 -1
  197. package/dist/workers/repository/model/semantic-commit-message.js.map +1 -1
  198. package/dist/workers/repository/update/pr/changelog/common.js +1 -1
  199. package/dist/workers/repository/update/pr/changelog/common.js.map +1 -1
  200. package/dist/workers/repository/updates/generate.js +1 -1
  201. package/dist/workers/repository/updates/generate.js.map +1 -1
  202. package/package.json +1 -1
  203. package/renovate-schema.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"artifacts.js","names":["query","q","gradleUpdateArtifacts"],"sources":["../../../../lib/modules/manager/gradle-wrapper/artifacts.ts"],"sourcesContent":["import { lang, query as q } from '@renovatebot/good-enough-parser';\nimport { isTruthy } from '@sindresorhus/is';\nimport { quote } from 'shlex';\nimport upath from 'upath';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport {\n exec,\n getToolSettingsOptions,\n gradleJvmArg,\n} from '../../../util/exec/index.ts';\nimport type { ExecOptions } from '../../../util/exec/types.ts';\nimport {\n localPathExists,\n readLocalFile,\n writeLocalFile,\n} from '../../../util/fs/index.ts';\nimport { getRepoStatus } from '../../../util/git/index.ts';\nimport type { StatusResult } from '../../../util/git/types.ts';\nimport { Http } from '../../../util/http/index.ts';\nimport { newlineRegex } from '../../../util/regex.ts';\nimport { replaceAt } from '../../../util/string.ts';\nimport { isGradleExecutionAllowed } from '../gradle/artifacts.ts';\nimport { updateArtifacts as gradleUpdateArtifacts } from '../gradle/index.ts';\nimport type {\n UpdateArtifact,\n UpdateArtifactsConfig,\n UpdateArtifactsResult,\n} from '../types.ts';\nimport {\n extraEnv,\n getJavaConstraint,\n gradleWrapperFileName,\n prepareGradleCommand,\n} from './utils.ts';\n\nconst http = new Http('gradle-wrapper');\nconst groovy = lang.createLang('groovy');\n\ntype Ctx = string[];\n\nasync function addIfUpdated(\n status: StatusResult,\n fileProjectPath: string,\n): Promise<UpdateArtifactsResult | null> {\n if (status.modified.includes(fileProjectPath)) {\n return {\n file: {\n type: 'addition',\n path: fileProjectPath,\n contents: await readLocalFile(fileProjectPath),\n },\n };\n }\n return null;\n}\n\nfunction getDistributionUrl(newPackageFileContent: string): string | null {\n const distributionUrlLine = newPackageFileContent\n .split(newlineRegex)\n .find((line) => line.startsWith('distributionUrl='));\n if (distributionUrlLine) {\n return distributionUrlLine\n .replace('distributionUrl=', '')\n .replace('https\\\\:', 'https:');\n }\n return null;\n}\n\nasync function getDistributionChecksum(url: string): Promise<string> {\n const { body } = await http.getText(`${url}.sha256`);\n return body;\n}\n\nexport async function updateBuildFile(\n localGradleDir: string,\n wrapperProperties: Record<string, string | undefined | null>,\n): Promise<string> {\n let buildFileName = upath.join(localGradleDir, 'build.gradle');\n if (!(await localPathExists(buildFileName))) {\n buildFileName = upath.join(localGradleDir, 'build.gradle.kts');\n }\n\n const buildFileContent = await readLocalFile(buildFileName, 'utf8');\n if (!buildFileContent) {\n logger.debug('build.gradle or build.gradle.kts not found');\n return buildFileName;\n }\n\n let buildFileUpdated = buildFileContent;\n for (const [propertyName, newValue] of Object.entries(wrapperProperties)) {\n if (!newValue) {\n continue;\n }\n\n const query = q.tree({\n type: 'wrapped-tree',\n maxDepth: 1,\n search: q\n .sym<Ctx>(propertyName)\n .op('=')\n .str((ctx, { value, offset }) => {\n buildFileUpdated = replaceAt(\n buildFileUpdated,\n offset,\n value,\n newValue,\n );\n return ctx;\n }),\n });\n groovy.query(buildFileUpdated, query, []);\n }\n\n await writeLocalFile(buildFileName, buildFileUpdated);\n\n return buildFileName;\n}\n\nexport async function updateLockFiles(\n buildFileName: string,\n config: UpdateArtifactsConfig,\n): Promise<UpdateArtifactsResult[] | null> {\n const buildFileContent = await readLocalFile(buildFileName, 'utf8');\n if (!buildFileContent) {\n logger.debug('build.gradle or build.gradle.kts not found');\n return null;\n }\n\n return await gradleUpdateArtifacts({\n packageFileName: buildFileName,\n updatedDeps: [],\n newPackageFileContent: buildFileContent,\n config,\n });\n}\n\nexport async function updateArtifacts({\n packageFileName,\n newPackageFileContent,\n updatedDeps,\n config,\n}: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> {\n try {\n logger.debug({ updatedDeps }, 'gradle-wrapper.updateArtifacts()');\n const localGradleDir = upath.join(upath.dirname(packageFileName), '../../');\n const gradlewFile = upath.join(localGradleDir, gradleWrapperFileName());\n\n let cmd = await prepareGradleCommand(gradlewFile);\n if (!cmd) {\n logger.info('No gradlew found - skipping Artifacts update');\n return null;\n }\n\n if (!isGradleExecutionAllowed(gradlewFile)) {\n logger.trace(\n 'Not allowed to execute gradle due to allowedUnsafeExecutions - aborting update',\n );\n\n return null;\n }\n\n // Limit the Gradle daemon Java heap memory size to prevent OOM errors\n // leading to Renovate kernel-OOMs and timeouts. See #39558\n cmd += gradleJvmArg(getToolSettingsOptions(config.toolSettings));\n cmd += ' :wrapper';\n\n let checksum: string | null = null;\n const distributionUrl = getDistributionUrl(newPackageFileContent);\n if (distributionUrl) {\n cmd += ` --gradle-distribution-url ${quote(distributionUrl)}`;\n if (newPackageFileContent.includes('distributionSha256Sum=')) {\n //update checksum in case of distributionSha256Sum in properties then run wrapper\n checksum = await getDistributionChecksum(distributionUrl);\n await writeLocalFile(\n packageFileName,\n newPackageFileContent.replace(\n /distributionSha256Sum=.*/,\n `distributionSha256Sum=${checksum}`,\n ),\n );\n cmd += ` --gradle-distribution-sha256-sum ${quote(checksum)}`;\n }\n } else {\n cmd += ` --gradle-version ${quote(config.newValue!)}`;\n }\n logger.debug(`Updating gradle wrapper: \"${cmd}\"`);\n const execOptions: ExecOptions = {\n cwdFile: gradlewFile,\n docker: {},\n extraEnv,\n toolConstraints: [\n {\n toolName: 'java',\n constraint:\n config.constraints?.java ??\n (await getJavaConstraint(config.currentValue, gradlewFile)),\n },\n ],\n };\n try {\n await exec(cmd, execOptions);\n } catch (err) {\n // istanbul ignore if\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.warn(\n { err },\n 'Error executing gradle wrapper update command. This may not necessarily be a blocker to the update, so please verify with the gradle wrapper output logs.',\n );\n }\n\n const buildFileName = await updateBuildFile(localGradleDir, {\n gradleVersion: config.newValue,\n distributionSha256Sum: checksum,\n distributionUrl,\n });\n const lockFiles = await updateLockFiles(buildFileName, config);\n\n const status = await getRepoStatus();\n const artifactFileNames = [\n packageFileName,\n buildFileName,\n ...['gradle/wrapper/gradle-wrapper.jar', 'gradlew', 'gradlew.bat'].map(\n (filename) => upath.join(localGradleDir, filename),\n ),\n ];\n const updateArtifactsResult = (\n await Promise.all(\n artifactFileNames.map((fileProjectPath) =>\n addIfUpdated(status, fileProjectPath),\n ),\n )\n ).filter(isTruthy);\n if (lockFiles) {\n updateArtifactsResult.push(...lockFiles);\n }\n\n logger.debug(\n { files: updateArtifactsResult.map((r) => r.file?.path) },\n `Returning updated gradle-wrapper files`,\n );\n return updateArtifactsResult;\n } catch (err) {\n logger.debug({ err }, 'Error setting new Gradle Wrapper release value');\n return [\n {\n artifactError: {\n fileName: packageFileName,\n stderr: err.message,\n },\n },\n ];\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"artifacts.js","names":["query","q","gradleUpdateArtifacts"],"sources":["../../../../lib/modules/manager/gradle-wrapper/artifacts.ts"],"sourcesContent":["import { lang, query as q } from '@renovatebot/good-enough-parser';\nimport { isTruthy } from '@sindresorhus/is';\nimport { quote } from 'shlex';\nimport upath from 'upath';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport {\n exec,\n getToolSettingsOptions,\n gradleJvmArg,\n} from '../../../util/exec/index.ts';\nimport type { ExecOptions } from '../../../util/exec/types.ts';\nimport {\n localPathExists,\n readLocalFile,\n writeLocalFile,\n} from '../../../util/fs/index.ts';\nimport { getRepoStatus } from '../../../util/git/index.ts';\nimport type { StatusResult } from '../../../util/git/types.ts';\nimport { Http } from '../../../util/http/index.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { replaceAt } from '../../../util/string.ts';\nimport { isGradleExecutionAllowed } from '../gradle/artifacts.ts';\nimport { updateArtifacts as gradleUpdateArtifacts } from '../gradle/index.ts';\nimport type {\n UpdateArtifact,\n UpdateArtifactsConfig,\n UpdateArtifactsResult,\n} from '../types.ts';\nimport {\n extraEnv,\n getJavaConstraint,\n gradleWrapperFileName,\n prepareGradleCommand,\n} from './utils.ts';\n\nconst http = new Http('gradle-wrapper');\nconst groovy = lang.createLang('groovy');\n\ntype Ctx = string[];\n\nasync function addIfUpdated(\n status: StatusResult,\n fileProjectPath: string,\n): Promise<UpdateArtifactsResult | null> {\n if (status.modified.includes(fileProjectPath)) {\n return {\n file: {\n type: 'addition',\n path: fileProjectPath,\n contents: await readLocalFile(fileProjectPath),\n },\n };\n }\n return null;\n}\n\nfunction getDistributionUrl(newPackageFileContent: string): string | null {\n const distributionUrlLine = newPackageFileContent\n .split(newlineRegex)\n .find((line) => line.startsWith('distributionUrl='));\n if (distributionUrlLine) {\n return distributionUrlLine\n .replace('distributionUrl=', '')\n .replace('https\\\\:', 'https:');\n }\n return null;\n}\n\nasync function getDistributionChecksum(url: string): Promise<string> {\n const { body } = await http.getText(`${url}.sha256`);\n return body;\n}\n\nexport async function updateBuildFile(\n localGradleDir: string,\n wrapperProperties: Record<string, string | undefined | null>,\n): Promise<string> {\n let buildFileName = upath.join(localGradleDir, 'build.gradle');\n if (!(await localPathExists(buildFileName))) {\n buildFileName = upath.join(localGradleDir, 'build.gradle.kts');\n }\n\n const buildFileContent = await readLocalFile(buildFileName, 'utf8');\n if (!buildFileContent) {\n logger.debug('build.gradle or build.gradle.kts not found');\n return buildFileName;\n }\n\n let buildFileUpdated = buildFileContent;\n for (const [propertyName, newValue] of Object.entries(wrapperProperties)) {\n if (!newValue) {\n continue;\n }\n\n const query = q.tree({\n type: 'wrapped-tree',\n maxDepth: 1,\n search: q\n .sym<Ctx>(propertyName)\n .op('=')\n .str((ctx, { value, offset }) => {\n buildFileUpdated = replaceAt(\n buildFileUpdated,\n offset,\n value,\n newValue,\n );\n return ctx;\n }),\n });\n groovy.query(buildFileUpdated, query, []);\n }\n\n await writeLocalFile(buildFileName, buildFileUpdated);\n\n return buildFileName;\n}\n\nexport async function updateLockFiles(\n buildFileName: string,\n config: UpdateArtifactsConfig,\n): Promise<UpdateArtifactsResult[] | null> {\n const buildFileContent = await readLocalFile(buildFileName, 'utf8');\n if (!buildFileContent) {\n logger.debug('build.gradle or build.gradle.kts not found');\n return null;\n }\n\n return await gradleUpdateArtifacts({\n packageFileName: buildFileName,\n updatedDeps: [],\n newPackageFileContent: buildFileContent,\n config,\n });\n}\n\nexport async function updateArtifacts({\n packageFileName,\n newPackageFileContent,\n updatedDeps,\n config,\n}: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> {\n try {\n logger.debug({ updatedDeps }, 'gradle-wrapper.updateArtifacts()');\n const localGradleDir = upath.join(upath.dirname(packageFileName), '../../');\n const gradlewFile = upath.join(localGradleDir, gradleWrapperFileName());\n\n let cmd = await prepareGradleCommand(gradlewFile);\n if (!cmd) {\n logger.info('No gradlew found - skipping Artifacts update');\n return null;\n }\n\n if (!isGradleExecutionAllowed(gradlewFile)) {\n logger.trace(\n 'Not allowed to execute gradle due to allowedUnsafeExecutions - aborting update',\n );\n\n return null;\n }\n\n // Limit the Gradle daemon Java heap memory size to prevent OOM errors\n // leading to Renovate kernel-OOMs and timeouts. See #39558\n cmd += gradleJvmArg(getToolSettingsOptions(config.toolSettings));\n cmd += ' :wrapper';\n\n let checksum: string | null = null;\n const distributionUrl = getDistributionUrl(newPackageFileContent);\n if (distributionUrl) {\n cmd += ` --gradle-distribution-url ${quote(distributionUrl)}`;\n if (newPackageFileContent.includes('distributionSha256Sum=')) {\n //update checksum in case of distributionSha256Sum in properties then run wrapper\n checksum = await getDistributionChecksum(distributionUrl);\n await writeLocalFile(\n packageFileName,\n newPackageFileContent.replace(\n regEx(/distributionSha256Sum=.*/),\n `distributionSha256Sum=${checksum}`,\n ),\n );\n cmd += ` --gradle-distribution-sha256-sum ${quote(checksum)}`;\n }\n } else {\n cmd += ` --gradle-version ${quote(config.newValue!)}`;\n }\n logger.debug(`Updating gradle wrapper: \"${cmd}\"`);\n const execOptions: ExecOptions = {\n cwdFile: gradlewFile,\n docker: {},\n extraEnv,\n toolConstraints: [\n {\n toolName: 'java',\n constraint:\n config.constraints?.java ??\n (await getJavaConstraint(config.currentValue, gradlewFile)),\n },\n ],\n };\n try {\n await exec(cmd, execOptions);\n } catch (err) {\n // istanbul ignore if\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.warn(\n { err },\n 'Error executing gradle wrapper update command. This may not necessarily be a blocker to the update, so please verify with the gradle wrapper output logs.',\n );\n }\n\n const buildFileName = await updateBuildFile(localGradleDir, {\n gradleVersion: config.newValue,\n distributionSha256Sum: checksum,\n distributionUrl,\n });\n const lockFiles = await updateLockFiles(buildFileName, config);\n\n const status = await getRepoStatus();\n const artifactFileNames = [\n packageFileName,\n buildFileName,\n ...['gradle/wrapper/gradle-wrapper.jar', 'gradlew', 'gradlew.bat'].map(\n (filename) => upath.join(localGradleDir, filename),\n ),\n ];\n const updateArtifactsResult = (\n await Promise.all(\n artifactFileNames.map((fileProjectPath) =>\n addIfUpdated(status, fileProjectPath),\n ),\n )\n ).filter(isTruthy);\n if (lockFiles) {\n updateArtifactsResult.push(...lockFiles);\n }\n\n logger.debug(\n { files: updateArtifactsResult.map((r) => r.file?.path) },\n `Returning updated gradle-wrapper files`,\n );\n return updateArtifactsResult;\n } catch (err) {\n logger.debug({ err }, 'Error setting new Gradle Wrapper release value');\n return [\n {\n artifactError: {\n fileName: packageFileName,\n stderr: err.message,\n },\n },\n ];\n }\n}\n"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { regEx } from "../../../util/regex.js";
1
2
  import { logger } from "../../../logger/index.js";
2
3
  import { parseUrl } from "../../../util/url.js";
3
4
  import { DockerDatasource } from "../../datasource/docker/index.js";
@@ -58,7 +59,7 @@ function isAlias(repository) {
58
59
  return repository.startsWith("@") || repository.startsWith("alias:");
59
60
  }
60
61
  function aliasRecordToRepositories(registryAliases) {
61
- return Object.entries(registryAliases).filter(([, url]) => /^(https?|oci):\/\/.+/.exec(url)).map(([alias, url]) => {
62
+ return Object.entries(registryAliases).filter(([, url]) => regEx(/^(https?|oci):\/\/.+/).exec(url)).map(([alias, url]) => {
62
63
  return {
63
64
  name: alias,
64
65
  repository: url
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../../../../lib/modules/manager/helmv3/utils.ts"],"sourcesContent":["import upath from 'upath';\nimport { logger } from '../../../logger/index.ts';\nimport { parseUrl } from '../../../util/url.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport type { PackageDependency } from '../types.ts';\nimport { removeOCIPrefix } from './oci.ts';\nimport type { ChartDefinition, Repository } from './types.ts';\n\nexport function parseRepository(\n depName: string,\n repositoryURL: string,\n): PackageDependency {\n const res: PackageDependency = {};\n\n const url = parseUrl(repositoryURL);\n if (!url) {\n logger.debug({ repositoryURL }, 'Error parsing url');\n res.skipReason = 'invalid-url';\n return res;\n }\n switch (url.protocol) {\n case 'oci:':\n res.datasource = DockerDatasource.id;\n res.packageName = `${removeOCIPrefix(repositoryURL)}/${depName}`;\n // https://github.com/helm/helm/issues/10312\n // https://github.com/helm/helm/issues/10678\n res.pinDigests = false;\n break;\n case 'file:':\n res.skipReason = 'local-dependency';\n break;\n default:\n res.registryUrls = [repositoryURL];\n }\n return res;\n}\n\n/**\n * Resolves alias in repository string.\n *\n * @param repository to be resolved string\n * @param registryAliases Records containing registryAliases as key and to be resolved URLs as values\n *\n * @returns resolved alias. If repository does not contain an alias the repository string will be returned. Should it contain an alias which can not be resolved using `registryAliases`, null will be returned\n */\nexport function resolveAlias(\n repository: string,\n registryAliases: Record<string, string>,\n): string | null {\n if (!isAlias(repository)) {\n return repository;\n }\n\n const repoWithPrefixRemoved = repository.slice(\n repository.startsWith('@') ? 1 : 6,\n );\n const alias = registryAliases[repoWithPrefixRemoved];\n if (alias) {\n return alias;\n }\n return null;\n}\n\nexport function getRepositories(definitions: ChartDefinition[]): Repository[] {\n const repositoryList = definitions\n .flatMap((value) => value.dependencies)\n .filter((dependency) => dependency.repository) // only keep non-local references --> if no repository is defined the chart will be searched in charts/<name>\n .filter((dependency) => !isAlias(dependency.repository)) // do not add registryAliases\n .filter((dependency) => !dependency.repository.startsWith('file:')) // skip repositories which are locally referenced\n .map((dependency) => {\n // remove additional keys to prevent interference at deduplication\n return {\n name: dependency.name,\n repository: dependency.repository,\n };\n });\n const dedup = new Set();\n return repositoryList.filter((el) => {\n const duplicate = dedup.has(el.repository);\n dedup.add(el.repository);\n return !duplicate;\n });\n}\n\nexport function isAlias(repository: string): boolean {\n if (!repository) {\n return false;\n }\n return repository.startsWith('@') || repository.startsWith('alias:');\n}\n\nexport function aliasRecordToRepositories(\n registryAliases: Record<string, string>,\n): Repository[] {\n return Object.entries(registryAliases)\n .filter(([, url]) => /^(https?|oci):\\/\\/.+/.exec(url))\n .map(([alias, url]) => {\n return {\n name: alias,\n repository: url,\n };\n });\n}\n\nexport function isFileInDir(dir: string, file: string): boolean {\n return upath.dirname(file) === dir;\n}\n"],"mappings":";;;;;;AAQA,SAAgB,gBACd,SACA,eACmB;CACnB,MAAM,MAAyB,CAAC;CAEhC,MAAM,MAAM,SAAS,aAAa;CAClC,IAAI,CAAC,KAAK;EACR,OAAO,MAAM,EAAE,cAAc,GAAG,mBAAmB;EACnD,IAAI,aAAa;EACjB,OAAO;CACT;CACA,QAAQ,IAAI,UAAZ;EACE,KAAK;GACH,IAAI,aAAa,iBAAiB;GAClC,IAAI,cAAc,GAAG,gBAAgB,aAAa,EAAE,GAAG;GAGvD,IAAI,aAAa;GACjB;EACF,KAAK;GACH,IAAI,aAAa;GACjB;EACF,SACE,IAAI,eAAe,CAAC,aAAa;CACrC;CACA,OAAO;AACT;;;;;;;;;AAUA,SAAgB,aACd,YACA,iBACe;CACf,IAAI,CAAC,QAAQ,UAAU,GACrB,OAAO;CAMT,MAAM,QAAQ,gBAHgB,WAAW,MACvC,WAAW,WAAW,GAAG,IAAI,IAAI,CAEe;CAClD,IAAI,OACF,OAAO;CAET,OAAO;AACT;AAEA,SAAgB,gBAAgB,aAA8C;CAC5E,MAAM,iBAAiB,YACpB,SAAS,UAAU,MAAM,YAAY,CAAC,CACtC,QAAQ,eAAe,WAAW,UAAU,CAAC,CAC7C,QAAQ,eAAe,CAAC,QAAQ,WAAW,UAAU,CAAC,CAAC,CACvD,QAAQ,eAAe,CAAC,WAAW,WAAW,WAAW,OAAO,CAAC,CAAC,CAClE,KAAK,eAAe;EAEnB,OAAO;GACL,MAAM,WAAW;GACjB,YAAY,WAAW;EACzB;CACF,CAAC;CACH,MAAM,wBAAQ,IAAI,IAAI;CACtB,OAAO,eAAe,QAAQ,OAAO;EACnC,MAAM,YAAY,MAAM,IAAI,GAAG,UAAU;EACzC,MAAM,IAAI,GAAG,UAAU;EACvB,OAAO,CAAC;CACV,CAAC;AACH;AAEA,SAAgB,QAAQ,YAA6B;CACnD,IAAI,CAAC,YACH,OAAO;CAET,OAAO,WAAW,WAAW,GAAG,KAAK,WAAW,WAAW,QAAQ;AACrE;AAEA,SAAgB,0BACd,iBACc;CACd,OAAO,OAAO,QAAQ,eAAe,CAAC,CACnC,QAAQ,GAAG,SAAS,uBAAuB,KAAK,GAAG,CAAC,CAAC,CACrD,KAAK,CAAC,OAAO,SAAS;EACrB,OAAO;GACL,MAAM;GACN,YAAY;EACd;CACF,CAAC;AACL;AAEA,SAAgB,YAAY,KAAa,MAAuB;CAC9D,OAAO,MAAM,QAAQ,IAAI,MAAM;AACjC"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../../../lib/modules/manager/helmv3/utils.ts"],"sourcesContent":["import upath from 'upath';\nimport { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { parseUrl } from '../../../util/url.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport type { PackageDependency } from '../types.ts';\nimport { removeOCIPrefix } from './oci.ts';\nimport type { ChartDefinition, Repository } from './types.ts';\n\nexport function parseRepository(\n depName: string,\n repositoryURL: string,\n): PackageDependency {\n const res: PackageDependency = {};\n\n const url = parseUrl(repositoryURL);\n if (!url) {\n logger.debug({ repositoryURL }, 'Error parsing url');\n res.skipReason = 'invalid-url';\n return res;\n }\n switch (url.protocol) {\n case 'oci:':\n res.datasource = DockerDatasource.id;\n res.packageName = `${removeOCIPrefix(repositoryURL)}/${depName}`;\n // https://github.com/helm/helm/issues/10312\n // https://github.com/helm/helm/issues/10678\n res.pinDigests = false;\n break;\n case 'file:':\n res.skipReason = 'local-dependency';\n break;\n default:\n res.registryUrls = [repositoryURL];\n }\n return res;\n}\n\n/**\n * Resolves alias in repository string.\n *\n * @param repository to be resolved string\n * @param registryAliases Records containing registryAliases as key and to be resolved URLs as values\n *\n * @returns resolved alias. If repository does not contain an alias the repository string will be returned. Should it contain an alias which can not be resolved using `registryAliases`, null will be returned\n */\nexport function resolveAlias(\n repository: string,\n registryAliases: Record<string, string>,\n): string | null {\n if (!isAlias(repository)) {\n return repository;\n }\n\n const repoWithPrefixRemoved = repository.slice(\n repository.startsWith('@') ? 1 : 6,\n );\n const alias = registryAliases[repoWithPrefixRemoved];\n if (alias) {\n return alias;\n }\n return null;\n}\n\nexport function getRepositories(definitions: ChartDefinition[]): Repository[] {\n const repositoryList = definitions\n .flatMap((value) => value.dependencies)\n .filter((dependency) => dependency.repository) // only keep non-local references --> if no repository is defined the chart will be searched in charts/<name>\n .filter((dependency) => !isAlias(dependency.repository)) // do not add registryAliases\n .filter((dependency) => !dependency.repository.startsWith('file:')) // skip repositories which are locally referenced\n .map((dependency) => {\n // remove additional keys to prevent interference at deduplication\n return {\n name: dependency.name,\n repository: dependency.repository,\n };\n });\n const dedup = new Set();\n return repositoryList.filter((el) => {\n const duplicate = dedup.has(el.repository);\n dedup.add(el.repository);\n return !duplicate;\n });\n}\n\nexport function isAlias(repository: string): boolean {\n if (!repository) {\n return false;\n }\n return repository.startsWith('@') || repository.startsWith('alias:');\n}\n\nexport function aliasRecordToRepositories(\n registryAliases: Record<string, string>,\n): Repository[] {\n return Object.entries(registryAliases)\n .filter(([, url]) => regEx(/^(https?|oci):\\/\\/.+/).exec(url))\n .map(([alias, url]) => {\n return {\n name: alias,\n repository: url,\n };\n });\n}\n\nexport function isFileInDir(dir: string, file: string): boolean {\n return upath.dirname(file) === dir;\n}\n"],"mappings":";;;;;;;AASA,SAAgB,gBACd,SACA,eACmB;CACnB,MAAM,MAAyB,CAAC;CAEhC,MAAM,MAAM,SAAS,aAAa;CAClC,IAAI,CAAC,KAAK;EACR,OAAO,MAAM,EAAE,cAAc,GAAG,mBAAmB;EACnD,IAAI,aAAa;EACjB,OAAO;CACT;CACA,QAAQ,IAAI,UAAZ;EACE,KAAK;GACH,IAAI,aAAa,iBAAiB;GAClC,IAAI,cAAc,GAAG,gBAAgB,aAAa,EAAE,GAAG;GAGvD,IAAI,aAAa;GACjB;EACF,KAAK;GACH,IAAI,aAAa;GACjB;EACF,SACE,IAAI,eAAe,CAAC,aAAa;CACrC;CACA,OAAO;AACT;;;;;;;;;AAUA,SAAgB,aACd,YACA,iBACe;CACf,IAAI,CAAC,QAAQ,UAAU,GACrB,OAAO;CAMT,MAAM,QAAQ,gBAHgB,WAAW,MACvC,WAAW,WAAW,GAAG,IAAI,IAAI,CAEe;CAClD,IAAI,OACF,OAAO;CAET,OAAO;AACT;AAEA,SAAgB,gBAAgB,aAA8C;CAC5E,MAAM,iBAAiB,YACpB,SAAS,UAAU,MAAM,YAAY,CAAC,CACtC,QAAQ,eAAe,WAAW,UAAU,CAAC,CAC7C,QAAQ,eAAe,CAAC,QAAQ,WAAW,UAAU,CAAC,CAAC,CACvD,QAAQ,eAAe,CAAC,WAAW,WAAW,WAAW,OAAO,CAAC,CAAC,CAClE,KAAK,eAAe;EAEnB,OAAO;GACL,MAAM,WAAW;GACjB,YAAY,WAAW;EACzB;CACF,CAAC;CACH,MAAM,wBAAQ,IAAI,IAAI;CACtB,OAAO,eAAe,QAAQ,OAAO;EACnC,MAAM,YAAY,MAAM,IAAI,GAAG,UAAU;EACzC,MAAM,IAAI,GAAG,UAAU;EACvB,OAAO,CAAC;CACV,CAAC;AACH;AAEA,SAAgB,QAAQ,YAA6B;CACnD,IAAI,CAAC,YACH,OAAO;CAET,OAAO,WAAW,WAAW,GAAG,KAAK,WAAW,WAAW,QAAQ;AACrE;AAEA,SAAgB,0BACd,iBACc;CACd,OAAO,OAAO,QAAQ,eAAe,CAAC,CACnC,QAAQ,GAAG,SAAS,MAAM,sBAAsB,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAC5D,KAAK,CAAC,OAAO,SAAS;EACrB,OAAO;GACL,MAAM;GACN,YAAY;EACd;CACF,CAAC;AACL;AAEA,SAAgB,YAAY,KAAa,MAAuB;CAC9D,OAAO,MAAM,QAAQ,IAAI,MAAM;AACjC"}
@@ -50,7 +50,7 @@ async function listHermitPackages(packageFile) {
50
50
  const out = [];
51
51
  for (const f of files) {
52
52
  if (!minimatch(".*.pkg").match(f)) continue;
53
- const fileName = f.replace(`${hermitFolder}/`, "").substring(1).replace(/\.pkg$/, "");
53
+ const fileName = f.replace(`${hermitFolder}/`, "").substring(1).replace(regEx(/\.pkg$/), "");
54
54
  const channelParts = fileName.split("@");
55
55
  if (channelParts.length > 1) out.push({
56
56
  Name: channelParts[0],
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/hermit/extract.ts"],"sourcesContent":["import upath from 'upath';\nimport { logger } from '../../../logger/index.ts';\nimport { readLocalDirectory } from '../../../util/fs/index.ts';\nimport { minimatch } from '../../../util/minimatch.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { HermitDatasource } from '../../datasource/hermit/index.ts';\nimport type { PackageDependency, PackageFileContent } from '../types.ts';\nimport type { HermitListItem } from './types.ts';\n\nconst pkgReferenceRegex = regEx(`(?<packageName>.*?)-(?<version>[0-9]{1}.*)`);\n\n/**\n * extractPackageFile scans the folder of the package files\n * and looking for .{packageName}-{version}.pkg\n */\nexport async function extractPackageFile(\n _content: string,\n packageFile: string,\n): Promise<PackageFileContent | null> {\n logger.trace(`hermit.extractPackageFile(${packageFile})`);\n const dependencies = [] as PackageDependency[];\n const packages = await listHermitPackages(packageFile);\n\n if (!packages?.length) {\n return null;\n }\n\n for (const p of packages) {\n // version of a hermit package is either a Version or a Channel\n // Channel will prepend with @ to distinguish from normal version\n const version = p.Version === '' ? `@${p.Channel}` : p.Version;\n\n const dep: PackageDependency = {\n datasource: HermitDatasource.id,\n depName: p.Name,\n currentValue: version,\n };\n\n dependencies.push(dep);\n }\n\n return { deps: dependencies };\n}\n\n/**\n * listHermitPackages will fetch all installed packages from the bin folder\n */\nasync function listHermitPackages(\n packageFile: string,\n): Promise<HermitListItem[] | null> {\n logger.trace('hermit.listHermitPackages()');\n const hermitFolder = upath.dirname(packageFile);\n\n let files: string[] = [];\n\n try {\n files = await readLocalDirectory(hermitFolder);\n } catch (err) {\n logger.debug(\n { hermitFolder, err, packageFile },\n 'error listing hermit package references',\n );\n return null;\n }\n\n logger.trace({ files, hermitFolder }, 'files for hermit package list');\n\n const out = [] as HermitListItem[];\n\n for (const f of files) {\n if (!minimatch('.*.pkg').match(f)) {\n continue;\n }\n\n const fileName = f\n .replace(`${hermitFolder}/`, '')\n .substring(1)\n .replace(/\\.pkg$/, '');\n const channelParts = fileName.split('@');\n\n if (channelParts.length > 1) {\n out.push({\n Name: channelParts[0],\n Channel: channelParts[1],\n Version: '',\n });\n }\n\n const groups = pkgReferenceRegex.exec(fileName)?.groups;\n if (!groups) {\n logger.debug(\n { fileName },\n 'invalid hermit package reference file name found',\n );\n continue;\n }\n\n out.push({\n Name: groups.packageName,\n Version: groups.version,\n Channel: '',\n });\n }\n\n return out;\n}\n"],"mappings":";;;;;;;AASA,MAAM,oBAAoB,MAAM,4CAA4C;;;;;AAM5E,eAAsB,mBACpB,UACA,aACoC;CACpC,OAAO,MAAM,6BAA6B,YAAY,EAAE;CACxD,MAAM,eAAe,CAAC;CACtB,MAAM,WAAW,MAAM,mBAAmB,WAAW;CAErD,IAAI,CAAC,UAAU,QACb,OAAO;CAGT,KAAK,MAAM,KAAK,UAAU;EAGxB,MAAM,UAAU,EAAE,YAAY,KAAK,IAAI,EAAE,YAAY,EAAE;EAEvD,MAAM,MAAyB;GAC7B,YAAY,iBAAiB;GAC7B,SAAS,EAAE;GACX,cAAc;EAChB;EAEA,aAAa,KAAK,GAAG;CACvB;CAEA,OAAO,EAAE,MAAM,aAAa;AAC9B;;;;AAKA,eAAe,mBACb,aACkC;CAClC,OAAO,MAAM,6BAA6B;CAC1C,MAAM,eAAe,MAAM,QAAQ,WAAW;CAE9C,IAAI,QAAkB,CAAC;CAEvB,IAAI;EACF,QAAQ,MAAM,mBAAmB,YAAY;CAC/C,SAAS,KAAK;EACZ,OAAO,MACL;GAAE;GAAc;GAAK;EAAY,GACjC,yCACF;EACA,OAAO;CACT;CAEA,OAAO,MAAM;EAAE;EAAO;CAAa,GAAG,+BAA+B;CAErE,MAAM,MAAM,CAAC;CAEb,KAAK,MAAM,KAAK,OAAO;EACrB,IAAI,CAAC,UAAU,QAAQ,CAAC,CAAC,MAAM,CAAC,GAC9B;EAGF,MAAM,WAAW,EACd,QAAQ,GAAG,aAAa,IAAI,EAAE,CAAC,CAC/B,UAAU,CAAC,CAAC,CACZ,QAAQ,UAAU,EAAE;EACvB,MAAM,eAAe,SAAS,MAAM,GAAG;EAEvC,IAAI,aAAa,SAAS,GACxB,IAAI,KAAK;GACP,MAAM,aAAa;GACnB,SAAS,aAAa;GACtB,SAAS;EACX,CAAC;EAGH,MAAM,SAAS,kBAAkB,KAAK,QAAQ,CAAC,EAAE;EACjD,IAAI,CAAC,QAAQ;GACX,OAAO,MACL,EAAE,SAAS,GACX,kDACF;GACA;EACF;EAEA,IAAI,KAAK;GACP,MAAM,OAAO;GACb,SAAS,OAAO;GAChB,SAAS;EACX,CAAC;CACH;CAEA,OAAO;AACT"}
1
+ {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/hermit/extract.ts"],"sourcesContent":["import upath from 'upath';\nimport { logger } from '../../../logger/index.ts';\nimport { readLocalDirectory } from '../../../util/fs/index.ts';\nimport { minimatch } from '../../../util/minimatch.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { HermitDatasource } from '../../datasource/hermit/index.ts';\nimport type { PackageDependency, PackageFileContent } from '../types.ts';\nimport type { HermitListItem } from './types.ts';\n\nconst pkgReferenceRegex = regEx(`(?<packageName>.*?)-(?<version>[0-9]{1}.*)`);\n\n/**\n * extractPackageFile scans the folder of the package files\n * and looking for .{packageName}-{version}.pkg\n */\nexport async function extractPackageFile(\n _content: string,\n packageFile: string,\n): Promise<PackageFileContent | null> {\n logger.trace(`hermit.extractPackageFile(${packageFile})`);\n const dependencies = [] as PackageDependency[];\n const packages = await listHermitPackages(packageFile);\n\n if (!packages?.length) {\n return null;\n }\n\n for (const p of packages) {\n // version of a hermit package is either a Version or a Channel\n // Channel will prepend with @ to distinguish from normal version\n const version = p.Version === '' ? `@${p.Channel}` : p.Version;\n\n const dep: PackageDependency = {\n datasource: HermitDatasource.id,\n depName: p.Name,\n currentValue: version,\n };\n\n dependencies.push(dep);\n }\n\n return { deps: dependencies };\n}\n\n/**\n * listHermitPackages will fetch all installed packages from the bin folder\n */\nasync function listHermitPackages(\n packageFile: string,\n): Promise<HermitListItem[] | null> {\n logger.trace('hermit.listHermitPackages()');\n const hermitFolder = upath.dirname(packageFile);\n\n let files: string[] = [];\n\n try {\n files = await readLocalDirectory(hermitFolder);\n } catch (err) {\n logger.debug(\n { hermitFolder, err, packageFile },\n 'error listing hermit package references',\n );\n return null;\n }\n\n logger.trace({ files, hermitFolder }, 'files for hermit package list');\n\n const out = [] as HermitListItem[];\n\n for (const f of files) {\n if (!minimatch('.*.pkg').match(f)) {\n continue;\n }\n\n const fileName = f\n .replace(`${hermitFolder}/`, '')\n .substring(1)\n .replace(regEx(/\\.pkg$/), '');\n const channelParts = fileName.split('@');\n\n if (channelParts.length > 1) {\n out.push({\n Name: channelParts[0],\n Channel: channelParts[1],\n Version: '',\n });\n }\n\n const groups = pkgReferenceRegex.exec(fileName)?.groups;\n if (!groups) {\n logger.debug(\n { fileName },\n 'invalid hermit package reference file name found',\n );\n continue;\n }\n\n out.push({\n Name: groups.packageName,\n Version: groups.version,\n Channel: '',\n });\n }\n\n return out;\n}\n"],"mappings":";;;;;;;AASA,MAAM,oBAAoB,MAAM,4CAA4C;;;;;AAM5E,eAAsB,mBACpB,UACA,aACoC;CACpC,OAAO,MAAM,6BAA6B,YAAY,EAAE;CACxD,MAAM,eAAe,CAAC;CACtB,MAAM,WAAW,MAAM,mBAAmB,WAAW;CAErD,IAAI,CAAC,UAAU,QACb,OAAO;CAGT,KAAK,MAAM,KAAK,UAAU;EAGxB,MAAM,UAAU,EAAE,YAAY,KAAK,IAAI,EAAE,YAAY,EAAE;EAEvD,MAAM,MAAyB;GAC7B,YAAY,iBAAiB;GAC7B,SAAS,EAAE;GACX,cAAc;EAChB;EAEA,aAAa,KAAK,GAAG;CACvB;CAEA,OAAO,EAAE,MAAM,aAAa;AAC9B;;;;AAKA,eAAe,mBACb,aACkC;CAClC,OAAO,MAAM,6BAA6B;CAC1C,MAAM,eAAe,MAAM,QAAQ,WAAW;CAE9C,IAAI,QAAkB,CAAC;CAEvB,IAAI;EACF,QAAQ,MAAM,mBAAmB,YAAY;CAC/C,SAAS,KAAK;EACZ,OAAO,MACL;GAAE;GAAc;GAAK;EAAY,GACjC,yCACF;EACA,OAAO;CACT;CAEA,OAAO,MAAM;EAAE;EAAO;CAAa,GAAG,+BAA+B;CAErE,MAAM,MAAM,CAAC;CAEb,KAAK,MAAM,KAAK,OAAO;EACrB,IAAI,CAAC,UAAU,QAAQ,CAAC,CAAC,MAAM,CAAC,GAC9B;EAGF,MAAM,WAAW,EACd,QAAQ,GAAG,aAAa,IAAI,EAAE,CAAC,CAC/B,UAAU,CAAC,CAAC,CACZ,QAAQ,MAAM,QAAQ,GAAG,EAAE;EAC9B,MAAM,eAAe,SAAS,MAAM,GAAG;EAEvC,IAAI,aAAa,SAAS,GACxB,IAAI,KAAK;GACP,MAAM,aAAa;GACnB,SAAS,aAAa;GACtB,SAAS;EACX,CAAC;EAGH,MAAM,SAAS,kBAAkB,KAAK,QAAQ,CAAC,EAAE;EACjD,IAAI,CAAC,QAAQ;GACX,OAAO,MACL,EAAE,SAAS,GACX,kDACF;GACA;EACF;EAEA,IAAI,KAAK;GACP,MAAM,OAAO;GACb,SAAS,OAAO;GAChB,SAAS;EACX,CAAC;CACH;CAEA,OAAO;AACT"}
@@ -1,13 +1,13 @@
1
1
  import { escapeRegExp, regEx } from "../../../util/regex.js";
2
2
  //#region lib/modules/manager/homebrew/utils.ts
3
3
  function extractRubyString(content, keyword) {
4
- const regex = regEx(new RegExp(`\\b${keyword}\\s+(?:"(?<double>[^"]+)"|'(?<single>[^']+)')`));
4
+ const regex = regEx(`\\b${keyword}\\s+(?:"(?<double>[^"]+)"|'(?<single>[^']+)')`);
5
5
  const match = content.match(regex);
6
6
  return match?.groups?.double ?? match?.groups?.single ?? null;
7
7
  }
8
8
  function updateRubyString(content, keyword, oldValue, newValue) {
9
- const doubleQuote = new RegExp(`(\\b${keyword}\\s+)"${escapeRegExp(oldValue)}"`, "g");
10
- const singleQuote = new RegExp(`(\\b${keyword}\\s+)'${escapeRegExp(oldValue)}'`, "g");
9
+ const doubleQuote = regEx(`(\\b${keyword}\\s+)"${escapeRegExp(oldValue)}"`, "g");
10
+ const singleQuote = regEx(`(\\b${keyword}\\s+)'${escapeRegExp(oldValue)}'`, "g");
11
11
  const result = content.replace(doubleQuote, `$1"${newValue}"`).replace(singleQuote, `$1'${newValue}'`);
12
12
  return result === content ? null : result;
13
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../../../../lib/modules/manager/homebrew/utils.ts"],"sourcesContent":["import { escapeRegExp, regEx } from '../../../util/regex.ts';\n\n// Extract Ruby string value (handles both quote styles)\nexport function extractRubyString(\n content: string,\n keyword: string,\n): string | null {\n const regex = regEx(\n new RegExp(`\\\\b${keyword}\\\\s+(?:\"(?<double>[^\"]+)\"|'(?<single>[^']+)')`),\n );\n const match = content.match(regex);\n return match?.groups?.double ?? match?.groups?.single ?? null;\n}\n\n// Update Ruby string value (preserves quote style)\nexport function updateRubyString(\n content: string,\n keyword: string,\n oldValue: string,\n newValue: string,\n): string | null {\n const doubleQuote = new RegExp(\n `(\\\\b${keyword}\\\\s+)\"${escapeRegExp(oldValue)}\"`,\n 'g',\n );\n const singleQuote = new RegExp(\n `(\\\\b${keyword}\\\\s+)'${escapeRegExp(oldValue)}'`,\n 'g',\n );\n const result = content\n .replace(doubleQuote, `$1\"${newValue}\"`)\n .replace(singleQuote, `$1'${newValue}'`);\n\n return result === content ? null : result;\n}\n"],"mappings":";;AAGA,SAAgB,kBACd,SACA,SACe;CACf,MAAM,QAAQ,MACZ,IAAI,OAAO,MAAM,QAAQ,8CAA8C,CACzE;CACA,MAAM,QAAQ,QAAQ,MAAM,KAAK;CACjC,OAAO,OAAO,QAAQ,UAAU,OAAO,QAAQ,UAAU;AAC3D;AAGA,SAAgB,iBACd,SACA,SACA,UACA,UACe;CACf,MAAM,cAAc,IAAI,OACtB,OAAO,QAAQ,QAAQ,aAAa,QAAQ,EAAE,IAC9C,GACF;CACA,MAAM,cAAc,IAAI,OACtB,OAAO,QAAQ,QAAQ,aAAa,QAAQ,EAAE,IAC9C,GACF;CACA,MAAM,SAAS,QACZ,QAAQ,aAAa,MAAM,SAAS,EAAE,CAAC,CACvC,QAAQ,aAAa,MAAM,SAAS,EAAE;CAEzC,OAAO,WAAW,UAAU,OAAO;AACrC"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../../../lib/modules/manager/homebrew/utils.ts"],"sourcesContent":["import { escapeRegExp, regEx } from '../../../util/regex.ts';\n\n// Extract Ruby string value (handles both quote styles)\nexport function extractRubyString(\n content: string,\n keyword: string,\n): string | null {\n const regex = regEx(\n `\\\\b${keyword}\\\\s+(?:\"(?<double>[^\"]+)\"|'(?<single>[^']+)')`,\n );\n const match = content.match(regex);\n return match?.groups?.double ?? match?.groups?.single ?? null;\n}\n\n// Update Ruby string value (preserves quote style)\nexport function updateRubyString(\n content: string,\n keyword: string,\n oldValue: string,\n newValue: string,\n): string | null {\n const doubleQuote = regEx(\n `(\\\\b${keyword}\\\\s+)\"${escapeRegExp(oldValue)}\"`,\n 'g',\n );\n const singleQuote = regEx(\n `(\\\\b${keyword}\\\\s+)'${escapeRegExp(oldValue)}'`,\n 'g',\n );\n const result = content\n .replace(doubleQuote, `$1\"${newValue}\"`)\n .replace(singleQuote, `$1'${newValue}'`);\n\n return result === content ? null : result;\n}\n"],"mappings":";;AAGA,SAAgB,kBACd,SACA,SACe;CACf,MAAM,QAAQ,MACZ,MAAM,QAAQ,8CAChB;CACA,MAAM,QAAQ,QAAQ,MAAM,KAAK;CACjC,OAAO,OAAO,QAAQ,UAAU,OAAO,QAAQ,UAAU;AAC3D;AAGA,SAAgB,iBACd,SACA,SACA,UACA,UACe;CACf,MAAM,cAAc,MAClB,OAAO,QAAQ,QAAQ,aAAa,QAAQ,EAAE,IAC9C,GACF;CACA,MAAM,cAAc,MAClB,OAAO,QAAQ,QAAQ,aAAa,QAAQ,EAAE,IAC9C,GACF;CACA,MAAM,SAAS,QACZ,QAAQ,aAAa,MAAM,SAAS,EAAE,CAAC,CACvC,QAAQ,aAAa,MAAM,SAAS,EAAE;CAEzC,OAAO,WAAW,UAAU,OAAO;AACrC"}
@@ -1,3 +1,4 @@
1
+ import { regEx } from "../../../util/regex.js";
1
2
  import { coerceString } from "../../../util/string.js";
2
3
  import { logger } from "../../../logger/index.js";
3
4
  import { parseUrl } from "../../../util/url.js";
@@ -30,7 +31,7 @@ function extractDependency(dependency) {
30
31
  return null;
31
32
  }
32
33
  return {
33
- depName: upath.join(gitRemote.host, gitRemote.pathname.replace(/\.git$/, ""), coerceString(dependency.source.git.subdir)),
34
+ depName: upath.join(gitRemote.host, gitRemote.pathname.replace(regEx(/\.git$/), ""), coerceString(dependency.source.git.subdir)),
34
35
  packageName: dependency.source.git.remote,
35
36
  currentValue: dependency.version,
36
37
  managerData: { subdir: dependency.source.git.subdir }
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/jsonnet-bundler/extract.ts"],"sourcesContent":["import upath from 'upath';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { coerceString } from '../../../util/string.ts';\nimport { parseUrl } from '../../../util/url.ts';\nimport type { PackageDependency, PackageFileContent } from '../types.ts';\nimport type { Dependency, JsonnetFile } from './types.ts';\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n): PackageFileContent | null {\n logger.trace({ packageFile }, 'jsonnet-bundler.extractPackageFile()');\n\n if (packageFile.includes('vendor/')) {\n return null;\n }\n\n const deps: PackageDependency[] = [];\n let jsonnetFile: JsonnetFile;\n try {\n jsonnetFile = JSON.parse(content) as JsonnetFile;\n } catch {\n logger.debug({ packageFile }, `Invalid JSON`);\n return null;\n }\n\n for (const dependency of coerceArray(jsonnetFile.dependencies)) {\n const dep = extractDependency(dependency);\n if (dep) {\n deps.push(dep);\n }\n }\n\n if (!deps.length) {\n return null;\n }\n\n return { deps };\n}\n\nfunction extractDependency(dependency: Dependency): PackageDependency | null {\n if (!dependency.source.git) {\n return null;\n }\n\n const gitRemote = parseUrl(dependency.source.git.remote);\n if (!gitRemote) {\n logger.debug({ dependency }, 'Invalid Git remote URL');\n return null;\n }\n\n const depName = upath.join(\n gitRemote.host,\n gitRemote.pathname.replace(/\\.git$/, ''),\n coerceString(dependency.source.git.subdir),\n );\n\n return {\n depName,\n packageName: dependency.source.git.remote,\n currentValue: dependency.version,\n managerData: { subdir: dependency.source.git.subdir },\n };\n}\n"],"mappings":";;;;;;AAQA,SAAgB,mBACd,SACA,aAC2B;CAC3B,OAAO,MAAM,EAAE,YAAY,GAAG,sCAAsC;CAEpE,IAAI,YAAY,SAAS,SAAS,GAChC,OAAO;CAGT,MAAM,OAA4B,CAAC;CACnC,IAAI;CACJ,IAAI;EACF,cAAc,KAAK,MAAM,OAAO;CAClC,QAAQ;EACN,OAAO,MAAM,EAAE,YAAY,GAAG,cAAc;EAC5C,OAAO;CACT;CAEA,KAAK,MAAM,cAAc,YAAY,YAAY,YAAY,GAAG;EAC9D,MAAM,MAAM,kBAAkB,UAAU;EACxC,IAAI,KACF,KAAK,KAAK,GAAG;CAEjB;CAEA,IAAI,CAAC,KAAK,QACR,OAAO;CAGT,OAAO,EAAE,KAAK;AAChB;AAEA,SAAS,kBAAkB,YAAkD;CAC3E,IAAI,CAAC,WAAW,OAAO,KACrB,OAAO;CAGT,MAAM,YAAY,SAAS,WAAW,OAAO,IAAI,MAAM;CACvD,IAAI,CAAC,WAAW;EACd,OAAO,MAAM,EAAE,WAAW,GAAG,wBAAwB;EACrD,OAAO;CACT;CAQA,OAAO;EACL,SAPc,MAAM,KACpB,UAAU,MACV,UAAU,SAAS,QAAQ,UAAU,EAAE,GACvC,aAAa,WAAW,OAAO,IAAI,MAAM,CAInC;EACN,aAAa,WAAW,OAAO,IAAI;EACnC,cAAc,WAAW;EACzB,aAAa,EAAE,QAAQ,WAAW,OAAO,IAAI,OAAO;CACtD;AACF"}
1
+ {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/jsonnet-bundler/extract.ts"],"sourcesContent":["import upath from 'upath';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { coerceString } from '../../../util/string.ts';\nimport { parseUrl } from '../../../util/url.ts';\nimport type { PackageDependency, PackageFileContent } from '../types.ts';\nimport type { Dependency, JsonnetFile } from './types.ts';\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n): PackageFileContent | null {\n logger.trace({ packageFile }, 'jsonnet-bundler.extractPackageFile()');\n\n if (packageFile.includes('vendor/')) {\n return null;\n }\n\n const deps: PackageDependency[] = [];\n let jsonnetFile: JsonnetFile;\n try {\n jsonnetFile = JSON.parse(content) as JsonnetFile;\n } catch {\n logger.debug({ packageFile }, `Invalid JSON`);\n return null;\n }\n\n for (const dependency of coerceArray(jsonnetFile.dependencies)) {\n const dep = extractDependency(dependency);\n if (dep) {\n deps.push(dep);\n }\n }\n\n if (!deps.length) {\n return null;\n }\n\n return { deps };\n}\n\nfunction extractDependency(dependency: Dependency): PackageDependency | null {\n if (!dependency.source.git) {\n return null;\n }\n\n const gitRemote = parseUrl(dependency.source.git.remote);\n if (!gitRemote) {\n logger.debug({ dependency }, 'Invalid Git remote URL');\n return null;\n }\n\n const depName = upath.join(\n gitRemote.host,\n gitRemote.pathname.replace(regEx(/\\.git$/), ''),\n coerceString(dependency.source.git.subdir),\n );\n\n return {\n depName,\n packageName: dependency.source.git.remote,\n currentValue: dependency.version,\n managerData: { subdir: dependency.source.git.subdir },\n };\n}\n"],"mappings":";;;;;;;AASA,SAAgB,mBACd,SACA,aAC2B;CAC3B,OAAO,MAAM,EAAE,YAAY,GAAG,sCAAsC;CAEpE,IAAI,YAAY,SAAS,SAAS,GAChC,OAAO;CAGT,MAAM,OAA4B,CAAC;CACnC,IAAI;CACJ,IAAI;EACF,cAAc,KAAK,MAAM,OAAO;CAClC,QAAQ;EACN,OAAO,MAAM,EAAE,YAAY,GAAG,cAAc;EAC5C,OAAO;CACT;CAEA,KAAK,MAAM,cAAc,YAAY,YAAY,YAAY,GAAG;EAC9D,MAAM,MAAM,kBAAkB,UAAU;EACxC,IAAI,KACF,KAAK,KAAK,GAAG;CAEjB;CAEA,IAAI,CAAC,KAAK,QACR,OAAO;CAGT,OAAO,EAAE,KAAK;AAChB;AAEA,SAAS,kBAAkB,YAAkD;CAC3E,IAAI,CAAC,WAAW,OAAO,KACrB,OAAO;CAGT,MAAM,YAAY,SAAS,WAAW,OAAO,IAAI,MAAM;CACvD,IAAI,CAAC,WAAW;EACd,OAAO,MAAM,EAAE,WAAW,GAAG,wBAAwB;EACrD,OAAO;CACT;CAQA,OAAO;EACL,SAPc,MAAM,KACpB,UAAU,MACV,UAAU,SAAS,QAAQ,MAAM,QAAQ,GAAG,EAAE,GAC9C,aAAa,WAAW,OAAO,IAAI,MAAM,CAInC;EACN,aAAa,WAAW,OAAO,IAAI;EACnC,cAAc,WAAW;EACzB,aAAa,EAAE,QAAQ,WAAW,OAAO,IAAI,OAAO;CACtD;AACF"}
@@ -3,7 +3,7 @@ import { coerceArray } from "../../../util/array.js";
3
3
  import { ClojureDatasource } from "../../datasource/clojure/index.js";
4
4
  //#region lib/modules/manager/leiningen/extract.ts
5
5
  function trimAtKey(str, kwName) {
6
- const regex = new RegExp(`:${kwName}(?=\\s)`);
6
+ const regex = regEx(`:${kwName}\\s`);
7
7
  const keyOffset = str.search(regex);
8
8
  if (keyOffset < 0) return null;
9
9
  const withSpaces = str.slice(keyOffset + kwName.length + 1);
@@ -81,7 +81,7 @@ function extractFromVectors(str, ctx = {}, vars = {}, dimensions = 2) {
81
81
  }
82
82
  function extractLeinRepos(content) {
83
83
  const result = [];
84
- const repoContent = trimAtKey(content.replace(/;;.*(?=[\r\n])/g, ""), "repositories");
84
+ const repoContent = trimAtKey(content.replace(regEx(/;;.*([\r\n])/g), "$1"), "repositories");
85
85
  if (repoContent) {
86
86
  let balance = 0;
87
87
  let endIdx = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/leiningen/extract.ts"],"sourcesContent":["import { coerceArray } from '../../../util/array.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { ClojureDatasource } from '../../datasource/clojure/index.ts';\nimport type { PackageDependency, PackageFileContent } from '../types.ts';\nimport type { ExtractContext, ExtractedVariables } from './types.ts';\n\nexport function trimAtKey(str: string, kwName: string): string | null {\n const regex = new RegExp(`:${kwName}(?=\\\\s)`); // TODO #12872 lookahead\n const keyOffset = str.search(regex);\n if (keyOffset < 0) {\n return null;\n }\n const withSpaces = str.slice(keyOffset + kwName.length + 1);\n const valueOffset = withSpaces.search(regEx(/[^\\s]/));\n if (valueOffset < 0) {\n return null;\n }\n return withSpaces.slice(valueOffset);\n}\n\nexport function expandDepName(name: string): string {\n return name.includes('/') ? name.replace('/', ':') : `${name}:${name}`;\n}\n\nexport function extractFromVectors(\n str: string,\n ctx: ExtractContext = {},\n vars: ExtractedVariables = {},\n dimensions: 1 | 2 = 2,\n): PackageDependency[] {\n if (!str.startsWith('[')) {\n return [];\n }\n let balance = 0;\n const result: PackageDependency[] = [];\n let idx = 0;\n let vecPos = 0;\n let artifactId = '';\n let version = '';\n // Are we currently parsing a comment? If so, at what depth?\n let commentLevel: number | null = null;\n\n function isSpace(ch: string | null): boolean {\n return !!ch && regEx(/[\\s,]/).test(ch);\n }\n\n function cleanStrLiteral(s: string): string {\n return s.replace(regEx(/^\"/), '').replace(regEx(/\"$/), '');\n }\n\n function yieldDep(): void {\n if (!commentLevel && artifactId && version) {\n const depName = expandDepName(cleanStrLiteral(artifactId));\n if (version.startsWith('~')) {\n const varName = version.replace(regEx(/^~\\s*/), '');\n const currentValue = vars[varName];\n if (currentValue) {\n result.push({\n ...ctx,\n datasource: ClojureDatasource.id,\n depName,\n currentValue,\n sharedVariableName: varName,\n });\n }\n } else {\n result.push({\n ...ctx,\n datasource: ClojureDatasource.id,\n depName,\n currentValue: cleanStrLiteral(version),\n });\n }\n }\n artifactId = '';\n version = '';\n }\n\n let prevChar: string | null = null;\n while (idx < str.length) {\n const char = str.charAt(idx);\n\n if (str.substring(idx).startsWith('#_[')) {\n commentLevel = balance;\n }\n\n if (char === '[') {\n balance += 1;\n if (balance === dimensions) {\n vecPos = 0;\n }\n } else if (char === ']') {\n balance -= 1;\n\n if (commentLevel === balance) {\n artifactId = '';\n version = '';\n commentLevel = null;\n }\n\n if (balance === dimensions - 1) {\n yieldDep();\n }\n\n if (balance === 0) {\n break;\n }\n } else if (balance === dimensions) {\n if (isSpace(char)) {\n if (!isSpace(prevChar)) {\n vecPos += 1;\n }\n } else if (vecPos === 0) {\n artifactId += char;\n } else if (vecPos === 1) {\n version += char;\n }\n }\n prevChar = char;\n idx += 1;\n }\n return result;\n}\n\nfunction extractLeinRepos(content: string): string[] {\n const result: string[] = [];\n\n const repoContent = trimAtKey(\n content.replace(/;;.*(?=[\\r\\n])/g, ''), // get rid of comments // TODO #12872 lookahead\n 'repositories',\n );\n\n if (repoContent) {\n let balance = 0;\n let endIdx = 0;\n for (let idx = 0; idx < repoContent.length; idx += 1) {\n const char = repoContent.charAt(idx);\n if (char === '[') {\n balance += 1;\n } else if (char === ']') {\n balance -= 1;\n if (balance <= 0) {\n endIdx = idx;\n break;\n }\n }\n }\n const repoSectionContent = repoContent.slice(0, endIdx);\n const matches = coerceArray(\n repoSectionContent.match(regEx(/\"https?:\\/\\/[^\"]*\"/g)),\n );\n const urls = matches.map((x) =>\n x.replace(regEx(/^\"/), '').replace(regEx(/\"$/), ''),\n );\n urls.forEach((url) => result.push(url));\n }\n\n return result;\n}\n\nconst defRegex = regEx(\n /^[\\s,]*\\([\\s,]*def[\\s,]+(?<varName>[-+*=<>.!?#$%&_|a-zA-Z][-+*=<>.!?#$%&_|a-zA-Z0-9']+)[\\s,]*\"(?<stringValue>[^\"]*)\"[\\s,]*\\)[\\s,]*$/,\n);\n\nexport function extractVariables(content: string): ExtractedVariables {\n const result: ExtractedVariables = {};\n const lines = content.split(newlineRegex);\n for (const line of lines) {\n const match = defRegex.exec(line);\n if (match?.groups) {\n const { varName: key, stringValue: val } = match.groups;\n result[key] = val;\n }\n }\n return result;\n}\n\ninterface CollectDepsOptions {\n nested: boolean;\n depType?: string;\n}\n\nfunction collectDeps(\n content: string,\n key: string,\n registryUrls: string[],\n vars: ExtractedVariables,\n options: CollectDepsOptions = {\n nested: true,\n },\n): PackageDependency[] {\n const ctx = {\n depType: options.depType ?? key,\n registryUrls,\n };\n // A vector like [[\"dep-1\" \"1.0.0\"] [\"dep-2\" \"0.0.0\"]] is nested\n // A vector like [\"dep-1\" \"1.0.0\"] is not\n const dimensions = options.nested ? 2 : 1;\n let result: PackageDependency[] = [];\n let restContent = trimAtKey(content, key);\n while (restContent) {\n result = [\n ...result,\n ...extractFromVectors(restContent, ctx, vars, dimensions),\n ];\n restContent = trimAtKey(restContent, key);\n }\n return result;\n}\n\nexport function extractPackageFile(content: string): PackageFileContent {\n const registryUrls = extractLeinRepos(content);\n const vars = extractVariables(content);\n\n const deps: PackageDependency[] = [\n ...collectDeps(content, 'dependencies', registryUrls, vars),\n ...collectDeps(content, 'managed-dependencies', registryUrls, vars),\n ...collectDeps(content, 'plugins', registryUrls, vars),\n ...collectDeps(content, 'pom-plugins', registryUrls, vars),\n // 'coords' is used in lein parent, and specifies zero or one\n // dependencies. These are not wrapped in a vector in the way other\n // dependencies are. The project.clj fragment looks like\n //\n // :parent-project {... :coords [\"parent\" \"version\"] ...}\n //\n // - https://github.com/achin/lein-parent\n ...collectDeps(content, 'coords', registryUrls, vars, {\n nested: false,\n // The top-level key is 'parent-project', but we skip directly to 'coords'.\n // So fix the dep type label\n depType: 'parent-project',\n }),\n ];\n\n return { deps };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/leiningen/extract.ts"],"sourcesContent":["import { coerceArray } from '../../../util/array.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { ClojureDatasource } from '../../datasource/clojure/index.ts';\nimport type { PackageDependency, PackageFileContent } from '../types.ts';\nimport type { ExtractContext, ExtractedVariables } from './types.ts';\n\nexport function trimAtKey(str: string, kwName: string): string | null {\n // matching the whitespace instead of a lookahead is equivalent here,\n // as only the match offset is used\n const regex = regEx(`:${kwName}\\\\s`);\n const keyOffset = str.search(regex);\n if (keyOffset < 0) {\n return null;\n }\n const withSpaces = str.slice(keyOffset + kwName.length + 1);\n const valueOffset = withSpaces.search(regEx(/[^\\s]/));\n if (valueOffset < 0) {\n return null;\n }\n return withSpaces.slice(valueOffset);\n}\n\nexport function expandDepName(name: string): string {\n return name.includes('/') ? name.replace('/', ':') : `${name}:${name}`;\n}\n\nexport function extractFromVectors(\n str: string,\n ctx: ExtractContext = {},\n vars: ExtractedVariables = {},\n dimensions: 1 | 2 = 2,\n): PackageDependency[] {\n if (!str.startsWith('[')) {\n return [];\n }\n let balance = 0;\n const result: PackageDependency[] = [];\n let idx = 0;\n let vecPos = 0;\n let artifactId = '';\n let version = '';\n // Are we currently parsing a comment? If so, at what depth?\n let commentLevel: number | null = null;\n\n function isSpace(ch: string | null): boolean {\n return !!ch && regEx(/[\\s,]/).test(ch);\n }\n\n function cleanStrLiteral(s: string): string {\n return s.replace(regEx(/^\"/), '').replace(regEx(/\"$/), '');\n }\n\n function yieldDep(): void {\n if (!commentLevel && artifactId && version) {\n const depName = expandDepName(cleanStrLiteral(artifactId));\n if (version.startsWith('~')) {\n const varName = version.replace(regEx(/^~\\s*/), '');\n const currentValue = vars[varName];\n if (currentValue) {\n result.push({\n ...ctx,\n datasource: ClojureDatasource.id,\n depName,\n currentValue,\n sharedVariableName: varName,\n });\n }\n } else {\n result.push({\n ...ctx,\n datasource: ClojureDatasource.id,\n depName,\n currentValue: cleanStrLiteral(version),\n });\n }\n }\n artifactId = '';\n version = '';\n }\n\n let prevChar: string | null = null;\n while (idx < str.length) {\n const char = str.charAt(idx);\n\n if (str.substring(idx).startsWith('#_[')) {\n commentLevel = balance;\n }\n\n if (char === '[') {\n balance += 1;\n if (balance === dimensions) {\n vecPos = 0;\n }\n } else if (char === ']') {\n balance -= 1;\n\n if (commentLevel === balance) {\n artifactId = '';\n version = '';\n commentLevel = null;\n }\n\n if (balance === dimensions - 1) {\n yieldDep();\n }\n\n if (balance === 0) {\n break;\n }\n } else if (balance === dimensions) {\n if (isSpace(char)) {\n if (!isSpace(prevChar)) {\n vecPos += 1;\n }\n } else if (vecPos === 0) {\n artifactId += char;\n } else if (vecPos === 1) {\n version += char;\n }\n }\n prevChar = char;\n idx += 1;\n }\n return result;\n}\n\nfunction extractLeinRepos(content: string): string[] {\n const result: string[] = [];\n\n const repoContent = trimAtKey(\n content.replace(regEx(/;;.*([\\r\\n])/g), '$1'), // get rid of comments\n 'repositories',\n );\n\n if (repoContent) {\n let balance = 0;\n let endIdx = 0;\n for (let idx = 0; idx < repoContent.length; idx += 1) {\n const char = repoContent.charAt(idx);\n if (char === '[') {\n balance += 1;\n } else if (char === ']') {\n balance -= 1;\n if (balance <= 0) {\n endIdx = idx;\n break;\n }\n }\n }\n const repoSectionContent = repoContent.slice(0, endIdx);\n const matches = coerceArray(\n repoSectionContent.match(regEx(/\"https?:\\/\\/[^\"]*\"/g)),\n );\n const urls = matches.map((x) =>\n x.replace(regEx(/^\"/), '').replace(regEx(/\"$/), ''),\n );\n urls.forEach((url) => result.push(url));\n }\n\n return result;\n}\n\nconst defRegex = regEx(\n /^[\\s,]*\\([\\s,]*def[\\s,]+(?<varName>[-+*=<>.!?#$%&_|a-zA-Z][-+*=<>.!?#$%&_|a-zA-Z0-9']+)[\\s,]*\"(?<stringValue>[^\"]*)\"[\\s,]*\\)[\\s,]*$/,\n);\n\nexport function extractVariables(content: string): ExtractedVariables {\n const result: ExtractedVariables = {};\n const lines = content.split(newlineRegex);\n for (const line of lines) {\n const match = defRegex.exec(line);\n if (match?.groups) {\n const { varName: key, stringValue: val } = match.groups;\n result[key] = val;\n }\n }\n return result;\n}\n\ninterface CollectDepsOptions {\n nested: boolean;\n depType?: string;\n}\n\nfunction collectDeps(\n content: string,\n key: string,\n registryUrls: string[],\n vars: ExtractedVariables,\n options: CollectDepsOptions = {\n nested: true,\n },\n): PackageDependency[] {\n const ctx = {\n depType: options.depType ?? key,\n registryUrls,\n };\n // A vector like [[\"dep-1\" \"1.0.0\"] [\"dep-2\" \"0.0.0\"]] is nested\n // A vector like [\"dep-1\" \"1.0.0\"] is not\n const dimensions = options.nested ? 2 : 1;\n let result: PackageDependency[] = [];\n let restContent = trimAtKey(content, key);\n while (restContent) {\n result = [\n ...result,\n ...extractFromVectors(restContent, ctx, vars, dimensions),\n ];\n restContent = trimAtKey(restContent, key);\n }\n return result;\n}\n\nexport function extractPackageFile(content: string): PackageFileContent {\n const registryUrls = extractLeinRepos(content);\n const vars = extractVariables(content);\n\n const deps: PackageDependency[] = [\n ...collectDeps(content, 'dependencies', registryUrls, vars),\n ...collectDeps(content, 'managed-dependencies', registryUrls, vars),\n ...collectDeps(content, 'plugins', registryUrls, vars),\n ...collectDeps(content, 'pom-plugins', registryUrls, vars),\n // 'coords' is used in lein parent, and specifies zero or one\n // dependencies. These are not wrapped in a vector in the way other\n // dependencies are. The project.clj fragment looks like\n //\n // :parent-project {... :coords [\"parent\" \"version\"] ...}\n //\n // - https://github.com/achin/lein-parent\n ...collectDeps(content, 'coords', registryUrls, vars, {\n nested: false,\n // The top-level key is 'parent-project', but we skip directly to 'coords'.\n // So fix the dep type label\n depType: 'parent-project',\n }),\n ];\n\n return { deps };\n}\n"],"mappings":"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"}
@@ -23,10 +23,10 @@ function getChecksumFromUrl(url) {
23
23
  }, () => hashStream(http.stream(url), "sha256"));
24
24
  }
25
25
  function getDistributionUrl(content) {
26
- return regEx(/^distributionUrl\s*=\s*(?<distributionUrl>.+)$/m).exec(content)?.groups?.distributionUrl?.replace(/\\:/g, ":").trim() ?? null;
26
+ return regEx(/^distributionUrl\s*=\s*(?<distributionUrl>.+)$/m).exec(content)?.groups?.distributionUrl?.replace(regEx(/\\:/g), ":").trim() ?? null;
27
27
  }
28
28
  function getWrapperUrl(content) {
29
- return regEx(/^wrapperUrl\s*=\s*(?<wrapperUrl>.+)$/m).exec(content)?.groups?.wrapperUrl?.replace(/\\:/g, ":").trim() ?? null;
29
+ return regEx(/^wrapperUrl\s*=\s*(?<wrapperUrl>.+)$/m).exec(content)?.groups?.wrapperUrl?.replace(regEx(/\\:/g), ":").trim() ?? null;
30
30
  }
31
31
  function constructWrapperUrl(version, repoUrl = DEFAULT_MAVEN_REPO_URL) {
32
32
  return `${repoUrl}/org/apache/maven/wrapper/maven-wrapper/${version}/maven-wrapper-${version}.jar`;
@@ -52,13 +52,13 @@ async function updateChecksums(content, updatedDeps, addDistributionChecksum, ad
52
52
  if (distUrl) try {
53
53
  const checksum = await getChecksumFromUrl(distUrl);
54
54
  if (existingChecksum) updatedContent = updatedContent.replace(regEx(/distributionSha256Sum=.*/), `distributionSha256Sum=${checksum}`);
55
- else updatedContent = addChecksumAfterLine(updatedContent, /^(distributionUrl\s*=\s*.+)$/m, "distributionSha256Sum", checksum);
55
+ else updatedContent = addChecksumAfterLine(updatedContent, regEx(/^(distributionUrl\s*=\s*.+)$/m), "distributionSha256Sum", checksum);
56
56
  } catch (err) {
57
57
  logger.warn({
58
58
  err,
59
59
  url: distUrl
60
60
  }, "Failed to fetch distribution checksum");
61
- if (!existingChecksum && fallbackChecksum) updatedContent = addChecksumAfterLine(updatedContent, /^(distributionUrl\s*=\s*.+)$/m, "distributionSha256Sum", fallbackChecksum);
61
+ if (!existingChecksum && fallbackChecksum) updatedContent = addChecksumAfterLine(updatedContent, regEx(/^(distributionUrl\s*=\s*.+)$/m), "distributionSha256Sum", fallbackChecksum);
62
62
  }
63
63
  }
64
64
  if (addWrapperChecksum) {
@@ -72,13 +72,13 @@ async function updateChecksums(content, updatedDeps, addDistributionChecksum, ad
72
72
  if (wrapperUrl) try {
73
73
  const checksum = await getChecksumFromUrl(wrapperUrl);
74
74
  if (existingChecksum) updatedContent = updatedContent.replace(regEx(/wrapperSha256Sum=.*/), `wrapperSha256Sum=${checksum}`);
75
- else updatedContent = addChecksumAfterLine(updatedContent, /^(wrapperUrl\s*=\s*.+|wrapperVersion\s*=\s*.+)$/m, "wrapperSha256Sum", checksum);
75
+ else updatedContent = addChecksumAfterLine(updatedContent, regEx(/^(wrapperUrl\s*=\s*.+|wrapperVersion\s*=\s*.+)$/m), "wrapperSha256Sum", checksum);
76
76
  } catch (err) {
77
77
  logger.warn({
78
78
  err,
79
79
  url: wrapperUrl
80
80
  }, "Failed to fetch wrapper checksum");
81
- if (!existingChecksum && fallbackChecksum) updatedContent = addChecksumAfterLine(updatedContent, /^(wrapperUrl\s*=\s*.+|wrapperVersion\s*=\s*.+)$/m, "wrapperSha256Sum", fallbackChecksum);
81
+ if (!existingChecksum && fallbackChecksum) updatedContent = addChecksumAfterLine(updatedContent, regEx(/^(wrapperUrl\s*=\s*.+|wrapperVersion\s*=\s*.+)$/m), "wrapperSha256Sum", fallbackChecksum);
82
82
  }
83
83
  }
84
84
  return updatedContent;
@@ -1 +1 @@
1
- {"version":3,"file":"artifacts.js","names":["mavenVersioning"],"sources":["../../../../lib/modules/manager/maven-wrapper/artifacts.ts"],"sourcesContent":["import type { Stats } from 'node:fs';\nimport os from 'node:os';\nimport { isTruthy } from '@sindresorhus/is';\nimport { quote } from 'shlex';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { exec } from '../../../util/exec/index.ts';\nimport type { ExecOptions, ExtraEnv } from '../../../util/exec/types.ts';\nimport {\n chmodLocalFile,\n deleteLocalFile,\n readLocalFile,\n statLocalFile,\n writeLocalFile,\n} from '../../../util/fs/index.ts';\nimport { getRepoStatus } from '../../../util/git/index.ts';\nimport type { StatusResult } from '../../../util/git/types.ts';\nimport { hashStream } from '../../../util/hash.ts';\nimport { Http } from '../../../util/http/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport mavenVersioning from '../../versioning/maven/index.ts';\nimport type {\n PackageDependency,\n UpdateArtifact,\n UpdateArtifactsConfig,\n UpdateArtifactsResult,\n} from '../types.ts';\n\nconst http = new Http('maven-wrapper');\nconst DEFAULT_MAVEN_REPO_URL = 'https://repo.maven.apache.org/maven2';\n\nfunction getChecksumFromUrl(url: string): Promise<string> {\n return withCache(\n {\n namespace: 'url-sha256',\n key: url,\n ttlMinutes: 3 * 24 * 60, // 3 days\n },\n () => hashStream(http.stream(url), 'sha256'),\n );\n}\n\nfunction getDistributionUrl(content: string): string | null {\n const match = regEx(/^distributionUrl\\s*=\\s*(?<distributionUrl>.+)$/m).exec(\n content,\n );\n return match?.groups?.distributionUrl?.replace(/\\\\:/g, ':').trim() ?? null;\n}\n\nfunction getWrapperUrl(content: string): string | null {\n const match = regEx(/^wrapperUrl\\s*=\\s*(?<wrapperUrl>.+)$/m).exec(content);\n return match?.groups?.wrapperUrl?.replace(/\\\\:/g, ':').trim() ?? null;\n}\n\nfunction constructWrapperUrl(\n version: string,\n repoUrl: string = DEFAULT_MAVEN_REPO_URL,\n): string {\n return `${repoUrl}/org/apache/maven/wrapper/maven-wrapper/${version}/maven-wrapper-${version}.jar`;\n}\n\nfunction getWrapperVersion(content: string): string | null {\n const match = regEx(/^wrapperVersion\\s*=\\s*(?<wrapperVersion>.+)$/m).exec(\n content,\n );\n return match?.groups?.wrapperVersion?.trim() ?? null;\n}\n\nfunction getDistributionType(content: string): string | null {\n const match = regEx(/^distributionType\\s*=\\s*(?<distributionType>.+)$/m).exec(\n content,\n );\n return match?.groups?.distributionType?.trim() ?? null;\n}\n\nfunction getChecksumValue(content: string, key: string): string | null {\n const match = regEx(`^${key}\\\\s*=\\\\s*(?<value>.+)$`, 'm').exec(content);\n return match?.groups?.value?.trim() ?? null;\n}\n\nfunction addChecksumAfterLine(\n content: string,\n lineRegex: RegExp,\n key: string,\n value: string,\n): string {\n return content.replace(\n regEx(lineRegex),\n (lineMatch) => `${lineMatch}\\n${key}=${value}`,\n );\n}\n\nasync function updateChecksums(\n content: string,\n updatedDeps: PackageDependency[],\n addDistributionChecksum: boolean,\n addWrapperChecksum: boolean,\n originalContent: string,\n): Promise<string> {\n let updatedContent = content;\n\n // Update or add distribution checksum\n if (addDistributionChecksum) {\n const existingChecksum = getChecksumValue(\n updatedContent,\n 'distributionSha256Sum',\n );\n const fallbackChecksum = getChecksumValue(\n originalContent,\n 'distributionSha256Sum',\n );\n const distUrl = getDistributionUrl(updatedContent);\n if (distUrl) {\n try {\n const checksum = await getChecksumFromUrl(distUrl);\n if (existingChecksum) {\n updatedContent = updatedContent.replace(\n regEx(/distributionSha256Sum=.*/),\n `distributionSha256Sum=${checksum}`,\n );\n } else {\n // Add checksum after distributionUrl\n updatedContent = addChecksumAfterLine(\n updatedContent,\n /^(distributionUrl\\s*=\\s*.+)$/m,\n 'distributionSha256Sum',\n checksum,\n );\n }\n } catch (err) {\n logger.warn(\n { err, url: distUrl },\n 'Failed to fetch distribution checksum',\n );\n if (!existingChecksum && fallbackChecksum) {\n updatedContent = addChecksumAfterLine(\n updatedContent,\n /^(distributionUrl\\s*=\\s*.+)$/m,\n 'distributionSha256Sum',\n fallbackChecksum,\n );\n }\n }\n }\n }\n\n // Update or add wrapper checksum\n if (addWrapperChecksum) {\n const existingChecksum = getChecksumValue(\n updatedContent,\n 'wrapperSha256Sum',\n );\n const fallbackChecksum = getChecksumValue(\n originalContent,\n 'wrapperSha256Sum',\n );\n let wrapperUrl = getWrapperUrl(updatedContent);\n\n // If no wrapperUrl, try to construct from wrapperVersion\n if (!wrapperUrl) {\n const wrapperVersion = getWrapperVersion(updatedContent);\n if (wrapperVersion) {\n const customRepoUrl = getCustomMavenWrapperRepoUrl(updatedDeps);\n wrapperUrl = constructWrapperUrl(\n wrapperVersion,\n customRepoUrl ?? DEFAULT_MAVEN_REPO_URL,\n );\n }\n }\n\n if (wrapperUrl) {\n try {\n const checksum = await getChecksumFromUrl(wrapperUrl);\n if (existingChecksum) {\n updatedContent = updatedContent.replace(\n regEx(/wrapperSha256Sum=.*/),\n `wrapperSha256Sum=${checksum}`,\n );\n } else {\n // Add checksum after wrapperUrl or wrapperVersion\n updatedContent = addChecksumAfterLine(\n updatedContent,\n /^(wrapperUrl\\s*=\\s*.+|wrapperVersion\\s*=\\s*.+)$/m,\n 'wrapperSha256Sum',\n checksum,\n );\n }\n } catch (err) {\n logger.warn(\n { err, url: wrapperUrl },\n 'Failed to fetch wrapper checksum',\n );\n if (!existingChecksum && fallbackChecksum) {\n updatedContent = addChecksumAfterLine(\n updatedContent,\n /^(wrapperUrl\\s*=\\s*.+|wrapperVersion\\s*=\\s*.+)$/m,\n 'wrapperSha256Sum',\n fallbackChecksum,\n );\n }\n }\n }\n }\n\n return updatedContent;\n}\n\ninterface MavenWrapperPaths {\n wrapperExecutableFileName: string;\n localProjectDir: string;\n wrapperFullyQualifiedPath: string;\n}\n\nasync function addIfUpdated(\n status: StatusResult,\n fileProjectPath: string,\n): Promise<UpdateArtifactsResult | null> {\n if (status.modified.includes(fileProjectPath)) {\n return {\n file: {\n type: 'addition',\n path: fileProjectPath,\n contents: await readLocalFile(fileProjectPath),\n },\n };\n }\n return null;\n}\n\nexport async function updateArtifacts({\n packageFileName,\n newPackageFileContent,\n updatedDeps,\n config,\n}: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> {\n try {\n logger.debug({ updatedDeps }, 'maven-wrapper.updateArtifacts()');\n\n const hasMavenUpdate = updatedDeps.some((dep) => dep.depName === 'maven');\n const hasWrapperUpdate = updatedDeps.some(\n (dep) => dep.depName === 'maven-wrapper',\n );\n // Remember original content properties - we'll restore them after wrapper:wrapper\n const hadDistributionChecksum = newPackageFileContent.includes(\n 'distributionSha256Sum=',\n );\n const hadWrapperChecksum =\n newPackageFileContent.includes('wrapperSha256Sum=');\n const originalDistributionType = getDistributionType(newPackageFileContent);\n\n // Skip if no relevant updates\n if (!hasWrapperUpdate && !(hasMavenUpdate && hadDistributionChecksum)) {\n logger.debug(\n 'No Maven wrapper or distribution checksum updates - skipping Artifacts update',\n );\n return null;\n }\n\n // If wrapper is being updated, check if mvnw exists first\n let cmd: string | null = null;\n if (hasWrapperUpdate) {\n cmd = await createWrapperCommand(\n packageFileName,\n originalDistributionType,\n );\n\n if (!cmd) {\n logger.info('No mvnw found - skipping Artifacts update');\n return null;\n }\n }\n\n // Delete old maven-wrapper.jar if checksums exist and wrapper:wrapper will run\n // This prevents checksum validation failure when wrapper:wrapper runs\n if (hasWrapperUpdate && (hadWrapperChecksum || hadDistributionChecksum)) {\n const jarPath = packageFileName.replace(\n 'maven-wrapper.properties',\n 'maven-wrapper.jar',\n );\n if (jarPath.endsWith('maven-wrapper.jar')) {\n try {\n await deleteLocalFile(jarPath);\n logger.debug({ jarPath }, 'Deleted old maven-wrapper.jar');\n } catch {\n // File may not exist, ignore\n }\n }\n }\n\n // Strip checksum lines before running wrapper:wrapper to avoid validation failure\n // (mvnw would try to validate NEW jar against OLD checksum)\n let contentToWrite = newPackageFileContent;\n if (hasWrapperUpdate && (hadWrapperChecksum || hadDistributionChecksum)) {\n contentToWrite = contentToWrite\n .replace(regEx(/^distributionSha256Sum=.*\\n?/m), '')\n .replace(regEx(/^wrapperSha256Sum=.*\\n?/m), '');\n }\n\n // Write the properties file\n await writeLocalFile(packageFileName, contentToWrite);\n\n // Run wrapper:wrapper if the wrapper itself is being updated\n if (hasWrapperUpdate && cmd) {\n const extraEnv = getExtraEnvOptions(updatedDeps);\n await executeWrapperCommand(cmd, config, packageFileName, extraEnv);\n }\n\n // Now update checksums AFTER wrapper:wrapper has run (if it ran)\n // This ensures we compute checksums for the actual generated content\n if (hadDistributionChecksum || hadWrapperChecksum) {\n const currentContent = await readLocalFile(packageFileName, 'utf8');\n if (currentContent) {\n const contentWithChecksums = await updateChecksums(\n currentContent,\n updatedDeps,\n hadDistributionChecksum,\n hadWrapperChecksum,\n newPackageFileContent,\n );\n await writeLocalFile(packageFileName, contentWithChecksums);\n }\n }\n\n const status = await getRepoStatus();\n const artifactFileNames = [\n '.mvn/wrapper/maven-wrapper.properties',\n '.mvn/wrapper/maven-wrapper.jar',\n '.mvn/wrapper/MavenWrapperDownloader.java',\n 'mvnw',\n 'mvnw.cmd',\n ].map(\n (filename) =>\n packageFileName.replace('.mvn/wrapper/maven-wrapper.properties', '') +\n filename,\n );\n const updateArtifactsResult = (\n await getUpdatedArtifacts(status, artifactFileNames)\n ).filter(isTruthy);\n\n logger.debug(\n { files: updateArtifactsResult.map((r) => r.file?.path) },\n `Returning updated maven-wrapper files`,\n );\n return updateArtifactsResult;\n } catch (err) {\n logger.debug({ err }, 'Error setting new Maven Wrapper release value');\n return [\n {\n artifactError: {\n fileName: packageFileName,\n stderr: err.message,\n },\n },\n ];\n }\n}\n\nasync function getUpdatedArtifacts(\n status: StatusResult,\n artifactFileNames: string[],\n): Promise<UpdateArtifactsResult[]> {\n const updatedResults: UpdateArtifactsResult[] = [];\n for (const artifactFileName of artifactFileNames) {\n const updatedResult = await addIfUpdated(status, artifactFileName);\n if (updatedResult !== null) {\n updatedResults.push(updatedResult);\n }\n }\n return updatedResults;\n}\n\n/**\n * Find compatible java version for maven.\n * see https://maven.apache.org/developers/compatibility-plan.html\n * @param mavenWrapperVersion current maven version\n * @returns A Java semver range\n */\nexport function getJavaConstraint(\n mavenWrapperVersion: string | null | undefined,\n): string | null {\n const major = mavenWrapperVersion\n ? mavenVersioning.getMajor(mavenWrapperVersion)\n : null;\n\n if (major && major >= 3) {\n return '^17.0.0';\n }\n\n return '^8.0.0';\n}\n\nasync function executeWrapperCommand(\n cmd: string,\n config: UpdateArtifactsConfig,\n packageFileName: string,\n extraEnv: ExtraEnv,\n): Promise<void> {\n logger.debug(`Updating maven wrapper: \"${cmd}\"`);\n const { wrapperFullyQualifiedPath } = getMavenPaths(packageFileName);\n\n const execOptions: ExecOptions = {\n cwdFile: wrapperFullyQualifiedPath,\n docker: {},\n extraEnv,\n toolConstraints: [\n {\n toolName: 'java',\n constraint:\n config.constraints?.java ?? getJavaConstraint(config.currentValue),\n },\n ],\n };\n\n try {\n await exec(cmd, execOptions);\n } catch (err) {\n logger.error({ err }, 'Error executing maven wrapper update command.');\n throw err;\n }\n}\n\nfunction getExtraEnvOptions(deps: PackageDependency[]): ExtraEnv {\n const customMavenWrapperUrl = getCustomMavenWrapperRepoUrl(deps);\n if (customMavenWrapperUrl) {\n return { MVNW_REPOURL: customMavenWrapperUrl };\n }\n return {};\n}\n\nfunction getCustomMavenWrapperRepoUrl(\n deps: PackageDependency[],\n): string | null {\n const replaceString = deps.find(\n (dep) => dep.depName === 'maven-wrapper',\n )?.replaceString;\n\n if (!replaceString) {\n return null;\n }\n\n const match = regEx(/^(.*?)\\/org\\/apache\\/maven\\/wrapper\\//).exec(\n replaceString,\n );\n\n if (!match) {\n return null;\n }\n\n return match[1] === DEFAULT_MAVEN_REPO_URL ? null : match[1];\n}\n\nasync function createWrapperCommand(\n packageFileName: string,\n distributionType: string | null,\n): Promise<string | null> {\n const {\n wrapperExecutableFileName,\n localProjectDir,\n wrapperFullyQualifiedPath,\n } = getMavenPaths(packageFileName);\n\n // Use existing distributionType or default to 'script' to preserve JAR-based mode\n // (prevents Maven 3.3.x from defaulting to only-script which doesn't support checksums)\n const type = distributionType ?? 'script';\n const args = `wrapper:wrapper -Dtype=${quote(type)}`;\n\n return await prepareCommand(\n wrapperExecutableFileName,\n localProjectDir,\n await statLocalFile(wrapperFullyQualifiedPath),\n args,\n );\n}\n\nfunction mavenWrapperFileName(): string {\n if (\n os.platform() === 'win32' &&\n GlobalConfig.get('binarySource') !== 'docker'\n ) {\n return 'mvnw.cmd';\n }\n return './mvnw';\n}\n\nfunction getMavenPaths(packageFileName: string): MavenWrapperPaths {\n const wrapperExecutableFileName = mavenWrapperFileName();\n const localProjectDir = upath.join(\n upath.dirname(packageFileName),\n packageFileName.includes('mvnw') ? '.' : '../../',\n );\n const wrapperFullyQualifiedPath = upath.join(\n localProjectDir,\n wrapperExecutableFileName,\n );\n return {\n wrapperExecutableFileName,\n localProjectDir,\n wrapperFullyQualifiedPath,\n };\n}\n\nasync function prepareCommand(\n fileName: string,\n cwd: string | undefined,\n pathFileStats: Stats | null,\n args: string | null,\n): Promise<string | null> {\n /* v8 ignore next -- hard to test */\n if (pathFileStats?.isFile() === true) {\n // if the file is not executable by others\n if (os.platform() !== 'win32' && (pathFileStats.mode & 0o1) === 0) {\n // add the execution permission to the owner, group and others\n logger.warn('Maven wrapper is missing the executable bit');\n await chmodLocalFile(\n // TODO: types (#22198)\n upath.join(cwd!, fileName),\n pathFileStats.mode | 0o111,\n );\n }\n if (args === null) {\n return fileName;\n }\n return `${fileName} ${args}`;\n }\n return null;\n}\n"],"mappings":";;;;;;;;;;;;;;;AA8BA,MAAM,OAAO,IAAI,KAAK,eAAe;AACrC,MAAM,yBAAyB;AAE/B,SAAS,mBAAmB,KAA8B;CACxD,OAAO,UACL;EACE,WAAW;EACX,KAAK;EACL,YAAY;CACd,SACM,WAAW,KAAK,OAAO,GAAG,GAAG,QAAQ,CAC7C;AACF;AAEA,SAAS,mBAAmB,SAAgC;CAI1D,OAHc,MAAM,iDAAiD,CAAC,CAAC,KACrE,OAES,CAAC,EAAE,QAAQ,iBAAiB,QAAQ,QAAQ,GAAG,CAAC,CAAC,KAAK,KAAK;AACxE;AAEA,SAAS,cAAc,SAAgC;CAErD,OADc,MAAM,uCAAuC,CAAC,CAAC,KAAK,OACvD,CAAC,EAAE,QAAQ,YAAY,QAAQ,QAAQ,GAAG,CAAC,CAAC,KAAK,KAAK;AACnE;AAEA,SAAS,oBACP,SACA,UAAkB,wBACV;CACR,OAAO,GAAG,QAAQ,0CAA0C,QAAQ,iBAAiB,QAAQ;AAC/F;AAEA,SAAS,kBAAkB,SAAgC;CAIzD,OAHc,MAAM,+CAA+C,CAAC,CAAC,KACnE,OAES,CAAC,EAAE,QAAQ,gBAAgB,KAAK,KAAK;AAClD;AAEA,SAAS,oBAAoB,SAAgC;CAI3D,OAHc,MAAM,mDAAmD,CAAC,CAAC,KACvE,OAES,CAAC,EAAE,QAAQ,kBAAkB,KAAK,KAAK;AACpD;AAEA,SAAS,iBAAiB,SAAiB,KAA4B;CAErE,OADc,MAAM,IAAI,IAAI,yBAAyB,GAAG,CAAC,CAAC,KAAK,OACpD,CAAC,EAAE,QAAQ,OAAO,KAAK,KAAK;AACzC;AAEA,SAAS,qBACP,SACA,WACA,KACA,OACQ;CACR,OAAO,QAAQ,QACb,MAAM,SAAS,IACd,cAAc,GAAG,UAAU,IAAI,IAAI,GAAG,OACzC;AACF;AAEA,eAAe,gBACb,SACA,aACA,yBACA,oBACA,iBACiB;CACjB,IAAI,iBAAiB;CAGrB,IAAI,yBAAyB;EAC3B,MAAM,mBAAmB,iBACvB,gBACA,uBACF;EACA,MAAM,mBAAmB,iBACvB,iBACA,uBACF;EACA,MAAM,UAAU,mBAAmB,cAAc;EACjD,IAAI,SACF,IAAI;GACF,MAAM,WAAW,MAAM,mBAAmB,OAAO;GACjD,IAAI,kBACF,iBAAiB,eAAe,QAC9B,MAAM,0BAA0B,GAChC,yBAAyB,UAC3B;QAGA,iBAAiB,qBACf,gBACA,iCACA,yBACA,QACF;EAEJ,SAAS,KAAK;GACZ,OAAO,KACL;IAAE;IAAK,KAAK;GAAQ,GACpB,uCACF;GACA,IAAI,CAAC,oBAAoB,kBACvB,iBAAiB,qBACf,gBACA,iCACA,yBACA,gBACF;EAEJ;CAEJ;CAGA,IAAI,oBAAoB;EACtB,MAAM,mBAAmB,iBACvB,gBACA,kBACF;EACA,MAAM,mBAAmB,iBACvB,iBACA,kBACF;EACA,IAAI,aAAa,cAAc,cAAc;EAG7C,IAAI,CAAC,YAAY;GACf,MAAM,iBAAiB,kBAAkB,cAAc;GACvD,IAAI,gBAEF,aAAa,oBACX,gBAFoB,6BAA6B,WAGrC,KAAK,sBACnB;EAEJ;EAEA,IAAI,YACF,IAAI;GACF,MAAM,WAAW,MAAM,mBAAmB,UAAU;GACpD,IAAI,kBACF,iBAAiB,eAAe,QAC9B,MAAM,qBAAqB,GAC3B,oBAAoB,UACtB;QAGA,iBAAiB,qBACf,gBACA,oDACA,oBACA,QACF;EAEJ,SAAS,KAAK;GACZ,OAAO,KACL;IAAE;IAAK,KAAK;GAAW,GACvB,kCACF;GACA,IAAI,CAAC,oBAAoB,kBACvB,iBAAiB,qBACf,gBACA,oDACA,oBACA,gBACF;EAEJ;CAEJ;CAEA,OAAO;AACT;AAQA,eAAe,aACb,QACA,iBACuC;CACvC,IAAI,OAAO,SAAS,SAAS,eAAe,GAC1C,OAAO,EACL,MAAM;EACJ,MAAM;EACN,MAAM;EACN,UAAU,MAAM,cAAc,eAAe;CAC/C,EACF;CAEF,OAAO;AACT;AAEA,eAAsB,gBAAgB,EACpC,iBACA,uBACA,aACA,UAC0D;CAC1D,IAAI;EACF,OAAO,MAAM,EAAE,YAAY,GAAG,iCAAiC;EAE/D,MAAM,iBAAiB,YAAY,MAAM,QAAQ,IAAI,YAAY,OAAO;EACxE,MAAM,mBAAmB,YAAY,MAClC,QAAQ,IAAI,YAAY,eAC3B;EAEA,MAAM,0BAA0B,sBAAsB,SACpD,wBACF;EACA,MAAM,qBACJ,sBAAsB,SAAS,mBAAmB;EACpD,MAAM,2BAA2B,oBAAoB,qBAAqB;EAG1E,IAAI,CAAC,oBAAoB,EAAE,kBAAkB,0BAA0B;GACrE,OAAO,MACL,+EACF;GACA,OAAO;EACT;EAGA,IAAI,MAAqB;EACzB,IAAI,kBAAkB;GACpB,MAAM,MAAM,qBACV,iBACA,wBACF;GAEA,IAAI,CAAC,KAAK;IACR,OAAO,KAAK,2CAA2C;IACvD,OAAO;GACT;EACF;EAIA,IAAI,qBAAqB,sBAAsB,0BAA0B;GACvE,MAAM,UAAU,gBAAgB,QAC9B,4BACA,mBACF;GACA,IAAI,QAAQ,SAAS,mBAAmB,GACtC,IAAI;IACF,MAAM,gBAAgB,OAAO;IAC7B,OAAO,MAAM,EAAE,QAAQ,GAAG,+BAA+B;GAC3D,QAAQ,CAER;EAEJ;EAIA,IAAI,iBAAiB;EACrB,IAAI,qBAAqB,sBAAsB,0BAC7C,iBAAiB,eACd,QAAQ,MAAM,+BAA+B,GAAG,EAAE,CAAC,CACnD,QAAQ,MAAM,0BAA0B,GAAG,EAAE;EAIlD,MAAM,eAAe,iBAAiB,cAAc;EAGpD,IAAI,oBAAoB,KAAK;GAC3B,MAAM,WAAW,mBAAmB,WAAW;GAC/C,MAAM,sBAAsB,KAAK,QAAQ,iBAAiB,QAAQ;EACpE;EAIA,IAAI,2BAA2B,oBAAoB;GACjD,MAAM,iBAAiB,MAAM,cAAc,iBAAiB,MAAM;GAClE,IAAI,gBAAgB;IAClB,MAAM,uBAAuB,MAAM,gBACjC,gBACA,aACA,yBACA,oBACA,qBACF;IACA,MAAM,eAAe,iBAAiB,oBAAoB;GAC5D;EACF;EAcA,MAAM,yBACJ,MAAM,oBAAoB,MAbP,cAAc,GACT;GACxB;GACA;GACA;GACA;GACA;EACF,CAAC,CAAC,KACC,aACC,gBAAgB,QAAQ,yCAAyC,EAAE,IACnE,QAGgD,CAAC,EAAA,CACnD,OAAO,QAAQ;EAEjB,OAAO,MACL,EAAE,OAAO,sBAAsB,KAAK,MAAM,EAAE,MAAM,IAAI,EAAE,GACxD,uCACF;EACA,OAAO;CACT,SAAS,KAAK;EACZ,OAAO,MAAM,EAAE,IAAI,GAAG,+CAA+C;EACrE,OAAO,CACL,EACE,eAAe;GACb,UAAU;GACV,QAAQ,IAAI;EACd,EACF,CACF;CACF;AACF;AAEA,eAAe,oBACb,QACA,mBACkC;CAClC,MAAM,iBAA0C,CAAC;CACjD,KAAK,MAAM,oBAAoB,mBAAmB;EAChD,MAAM,gBAAgB,MAAM,aAAa,QAAQ,gBAAgB;EACjE,IAAI,kBAAkB,MACpB,eAAe,KAAK,aAAa;CAErC;CACA,OAAO;AACT;;;;;;;AAQA,SAAgB,kBACd,qBACe;CACf,MAAM,QAAQ,sBACVA,IAAgB,SAAS,mBAAmB,IAC5C;CAEJ,IAAI,SAAS,SAAS,GACpB,OAAO;CAGT,OAAO;AACT;AAEA,eAAe,sBACb,KACA,QACA,iBACA,UACe;CACf,OAAO,MAAM,4BAA4B,IAAI,EAAE;CAC/C,MAAM,EAAE,8BAA8B,cAAc,eAAe;CAEnE,MAAM,cAA2B;EAC/B,SAAS;EACT,QAAQ,CAAC;EACT;EACA,iBAAiB,CACf;GACE,UAAU;GACV,YACE,OAAO,aAAa,QAAQ,kBAAkB,OAAO,YAAY;EACrE,CACF;CACF;CAEA,IAAI;EACF,MAAM,KAAK,KAAK,WAAW;CAC7B,SAAS,KAAK;EACZ,OAAO,MAAM,EAAE,IAAI,GAAG,+CAA+C;EACrE,MAAM;CACR;AACF;AAEA,SAAS,mBAAmB,MAAqC;CAC/D,MAAM,wBAAwB,6BAA6B,IAAI;CAC/D,IAAI,uBACF,OAAO,EAAE,cAAc,sBAAsB;CAE/C,OAAO,CAAC;AACV;AAEA,SAAS,6BACP,MACe;CACf,MAAM,gBAAgB,KAAK,MACxB,QAAQ,IAAI,YAAY,eAC3B,CAAC,EAAE;CAEH,IAAI,CAAC,eACH,OAAO;CAGT,MAAM,QAAQ,MAAM,uCAAuC,CAAC,CAAC,KAC3D,aACF;CAEA,IAAI,CAAC,OACH,OAAO;CAGT,OAAO,MAAM,OAAO,yBAAyB,OAAO,MAAM;AAC5D;AAEA,eAAe,qBACb,iBACA,kBACwB;CACxB,MAAM,EACJ,2BACA,iBACA,8BACE,cAAc,eAAe;CAKjC,MAAM,OAAO,0BAA0B,MAD1B,oBAAoB,QACgB;CAEjD,OAAO,MAAM,eACX,2BACA,iBACA,MAAM,cAAc,yBAAyB,GAC7C,IACF;AACF;AAEA,SAAS,uBAA+B;CACtC,IACE,GAAG,SAAS,MAAM,WAClB,aAAa,IAAI,cAAc,MAAM,UAErC,OAAO;CAET,OAAO;AACT;AAEA,SAAS,cAAc,iBAA4C;CACjE,MAAM,4BAA4B,qBAAqB;CACvD,MAAM,kBAAkB,MAAM,KAC5B,MAAM,QAAQ,eAAe,GAC7B,gBAAgB,SAAS,MAAM,IAAI,MAAM,QAC3C;CAKA,OAAO;EACL;EACA;EACA,2BAPgC,MAAM,KACtC,iBACA,yBAKwB;CAC1B;AACF;AAEA,eAAe,eACb,UACA,KACA,eACA,MACwB;;CAExB,IAAI,eAAe,OAAO,MAAM,MAAM;EAEpC,IAAI,GAAG,SAAS,MAAM,YAAY,cAAc,OAAO,OAAS,GAAG;GAEjE,OAAO,KAAK,6CAA6C;GACzD,MAAM,eAEJ,MAAM,KAAK,KAAM,QAAQ,GACzB,cAAc,OAAO,EACvB;EACF;EACA,IAAI,SAAS,MACX,OAAO;EAET,OAAO,GAAG,SAAS,GAAG;CACxB;CACA,OAAO;AACT"}
1
+ {"version":3,"file":"artifacts.js","names":["mavenVersioning"],"sources":["../../../../lib/modules/manager/maven-wrapper/artifacts.ts"],"sourcesContent":["import type { Stats } from 'node:fs';\nimport os from 'node:os';\nimport { isTruthy } from '@sindresorhus/is';\nimport { quote } from 'shlex';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { exec } from '../../../util/exec/index.ts';\nimport type { ExecOptions, ExtraEnv } from '../../../util/exec/types.ts';\nimport {\n chmodLocalFile,\n deleteLocalFile,\n readLocalFile,\n statLocalFile,\n writeLocalFile,\n} from '../../../util/fs/index.ts';\nimport { getRepoStatus } from '../../../util/git/index.ts';\nimport type { StatusResult } from '../../../util/git/types.ts';\nimport { hashStream } from '../../../util/hash.ts';\nimport { Http } from '../../../util/http/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport mavenVersioning from '../../versioning/maven/index.ts';\nimport type {\n PackageDependency,\n UpdateArtifact,\n UpdateArtifactsConfig,\n UpdateArtifactsResult,\n} from '../types.ts';\n\nconst http = new Http('maven-wrapper');\nconst DEFAULT_MAVEN_REPO_URL = 'https://repo.maven.apache.org/maven2';\n\nfunction getChecksumFromUrl(url: string): Promise<string> {\n return withCache(\n {\n namespace: 'url-sha256',\n key: url,\n ttlMinutes: 3 * 24 * 60, // 3 days\n },\n () => hashStream(http.stream(url), 'sha256'),\n );\n}\n\nfunction getDistributionUrl(content: string): string | null {\n const match = regEx(/^distributionUrl\\s*=\\s*(?<distributionUrl>.+)$/m).exec(\n content,\n );\n return (\n match?.groups?.distributionUrl?.replace(regEx(/\\\\:/g), ':').trim() ?? null\n );\n}\n\nfunction getWrapperUrl(content: string): string | null {\n const match = regEx(/^wrapperUrl\\s*=\\s*(?<wrapperUrl>.+)$/m).exec(content);\n return match?.groups?.wrapperUrl?.replace(regEx(/\\\\:/g), ':').trim() ?? null;\n}\n\nfunction constructWrapperUrl(\n version: string,\n repoUrl: string = DEFAULT_MAVEN_REPO_URL,\n): string {\n return `${repoUrl}/org/apache/maven/wrapper/maven-wrapper/${version}/maven-wrapper-${version}.jar`;\n}\n\nfunction getWrapperVersion(content: string): string | null {\n const match = regEx(/^wrapperVersion\\s*=\\s*(?<wrapperVersion>.+)$/m).exec(\n content,\n );\n return match?.groups?.wrapperVersion?.trim() ?? null;\n}\n\nfunction getDistributionType(content: string): string | null {\n const match = regEx(/^distributionType\\s*=\\s*(?<distributionType>.+)$/m).exec(\n content,\n );\n return match?.groups?.distributionType?.trim() ?? null;\n}\n\nfunction getChecksumValue(content: string, key: string): string | null {\n const match = regEx(`^${key}\\\\s*=\\\\s*(?<value>.+)$`, 'm').exec(content);\n return match?.groups?.value?.trim() ?? null;\n}\n\nfunction addChecksumAfterLine(\n content: string,\n lineRegex: RegExp,\n key: string,\n value: string,\n): string {\n return content.replace(\n regEx(lineRegex),\n (lineMatch) => `${lineMatch}\\n${key}=${value}`,\n );\n}\n\nasync function updateChecksums(\n content: string,\n updatedDeps: PackageDependency[],\n addDistributionChecksum: boolean,\n addWrapperChecksum: boolean,\n originalContent: string,\n): Promise<string> {\n let updatedContent = content;\n\n // Update or add distribution checksum\n if (addDistributionChecksum) {\n const existingChecksum = getChecksumValue(\n updatedContent,\n 'distributionSha256Sum',\n );\n const fallbackChecksum = getChecksumValue(\n originalContent,\n 'distributionSha256Sum',\n );\n const distUrl = getDistributionUrl(updatedContent);\n if (distUrl) {\n try {\n const checksum = await getChecksumFromUrl(distUrl);\n if (existingChecksum) {\n updatedContent = updatedContent.replace(\n regEx(/distributionSha256Sum=.*/),\n `distributionSha256Sum=${checksum}`,\n );\n } else {\n // Add checksum after distributionUrl\n updatedContent = addChecksumAfterLine(\n updatedContent,\n regEx(/^(distributionUrl\\s*=\\s*.+)$/m),\n 'distributionSha256Sum',\n checksum,\n );\n }\n } catch (err) {\n logger.warn(\n { err, url: distUrl },\n 'Failed to fetch distribution checksum',\n );\n if (!existingChecksum && fallbackChecksum) {\n updatedContent = addChecksumAfterLine(\n updatedContent,\n regEx(/^(distributionUrl\\s*=\\s*.+)$/m),\n 'distributionSha256Sum',\n fallbackChecksum,\n );\n }\n }\n }\n }\n\n // Update or add wrapper checksum\n if (addWrapperChecksum) {\n const existingChecksum = getChecksumValue(\n updatedContent,\n 'wrapperSha256Sum',\n );\n const fallbackChecksum = getChecksumValue(\n originalContent,\n 'wrapperSha256Sum',\n );\n let wrapperUrl = getWrapperUrl(updatedContent);\n\n // If no wrapperUrl, try to construct from wrapperVersion\n if (!wrapperUrl) {\n const wrapperVersion = getWrapperVersion(updatedContent);\n if (wrapperVersion) {\n const customRepoUrl = getCustomMavenWrapperRepoUrl(updatedDeps);\n wrapperUrl = constructWrapperUrl(\n wrapperVersion,\n customRepoUrl ?? DEFAULT_MAVEN_REPO_URL,\n );\n }\n }\n\n if (wrapperUrl) {\n try {\n const checksum = await getChecksumFromUrl(wrapperUrl);\n if (existingChecksum) {\n updatedContent = updatedContent.replace(\n regEx(/wrapperSha256Sum=.*/),\n `wrapperSha256Sum=${checksum}`,\n );\n } else {\n // Add checksum after wrapperUrl or wrapperVersion\n updatedContent = addChecksumAfterLine(\n updatedContent,\n regEx(/^(wrapperUrl\\s*=\\s*.+|wrapperVersion\\s*=\\s*.+)$/m),\n 'wrapperSha256Sum',\n checksum,\n );\n }\n } catch (err) {\n logger.warn(\n { err, url: wrapperUrl },\n 'Failed to fetch wrapper checksum',\n );\n if (!existingChecksum && fallbackChecksum) {\n updatedContent = addChecksumAfterLine(\n updatedContent,\n regEx(/^(wrapperUrl\\s*=\\s*.+|wrapperVersion\\s*=\\s*.+)$/m),\n 'wrapperSha256Sum',\n fallbackChecksum,\n );\n }\n }\n }\n }\n\n return updatedContent;\n}\n\ninterface MavenWrapperPaths {\n wrapperExecutableFileName: string;\n localProjectDir: string;\n wrapperFullyQualifiedPath: string;\n}\n\nasync function addIfUpdated(\n status: StatusResult,\n fileProjectPath: string,\n): Promise<UpdateArtifactsResult | null> {\n if (status.modified.includes(fileProjectPath)) {\n return {\n file: {\n type: 'addition',\n path: fileProjectPath,\n contents: await readLocalFile(fileProjectPath),\n },\n };\n }\n return null;\n}\n\nexport async function updateArtifacts({\n packageFileName,\n newPackageFileContent,\n updatedDeps,\n config,\n}: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> {\n try {\n logger.debug({ updatedDeps }, 'maven-wrapper.updateArtifacts()');\n\n const hasMavenUpdate = updatedDeps.some((dep) => dep.depName === 'maven');\n const hasWrapperUpdate = updatedDeps.some(\n (dep) => dep.depName === 'maven-wrapper',\n );\n // Remember original content properties - we'll restore them after wrapper:wrapper\n const hadDistributionChecksum = newPackageFileContent.includes(\n 'distributionSha256Sum=',\n );\n const hadWrapperChecksum =\n newPackageFileContent.includes('wrapperSha256Sum=');\n const originalDistributionType = getDistributionType(newPackageFileContent);\n\n // Skip if no relevant updates\n if (!hasWrapperUpdate && !(hasMavenUpdate && hadDistributionChecksum)) {\n logger.debug(\n 'No Maven wrapper or distribution checksum updates - skipping Artifacts update',\n );\n return null;\n }\n\n // If wrapper is being updated, check if mvnw exists first\n let cmd: string | null = null;\n if (hasWrapperUpdate) {\n cmd = await createWrapperCommand(\n packageFileName,\n originalDistributionType,\n );\n\n if (!cmd) {\n logger.info('No mvnw found - skipping Artifacts update');\n return null;\n }\n }\n\n // Delete old maven-wrapper.jar if checksums exist and wrapper:wrapper will run\n // This prevents checksum validation failure when wrapper:wrapper runs\n if (hasWrapperUpdate && (hadWrapperChecksum || hadDistributionChecksum)) {\n const jarPath = packageFileName.replace(\n 'maven-wrapper.properties',\n 'maven-wrapper.jar',\n );\n if (jarPath.endsWith('maven-wrapper.jar')) {\n try {\n await deleteLocalFile(jarPath);\n logger.debug({ jarPath }, 'Deleted old maven-wrapper.jar');\n } catch {\n // File may not exist, ignore\n }\n }\n }\n\n // Strip checksum lines before running wrapper:wrapper to avoid validation failure\n // (mvnw would try to validate NEW jar against OLD checksum)\n let contentToWrite = newPackageFileContent;\n if (hasWrapperUpdate && (hadWrapperChecksum || hadDistributionChecksum)) {\n contentToWrite = contentToWrite\n .replace(regEx(/^distributionSha256Sum=.*\\n?/m), '')\n .replace(regEx(/^wrapperSha256Sum=.*\\n?/m), '');\n }\n\n // Write the properties file\n await writeLocalFile(packageFileName, contentToWrite);\n\n // Run wrapper:wrapper if the wrapper itself is being updated\n if (hasWrapperUpdate && cmd) {\n const extraEnv = getExtraEnvOptions(updatedDeps);\n await executeWrapperCommand(cmd, config, packageFileName, extraEnv);\n }\n\n // Now update checksums AFTER wrapper:wrapper has run (if it ran)\n // This ensures we compute checksums for the actual generated content\n if (hadDistributionChecksum || hadWrapperChecksum) {\n const currentContent = await readLocalFile(packageFileName, 'utf8');\n if (currentContent) {\n const contentWithChecksums = await updateChecksums(\n currentContent,\n updatedDeps,\n hadDistributionChecksum,\n hadWrapperChecksum,\n newPackageFileContent,\n );\n await writeLocalFile(packageFileName, contentWithChecksums);\n }\n }\n\n const status = await getRepoStatus();\n const artifactFileNames = [\n '.mvn/wrapper/maven-wrapper.properties',\n '.mvn/wrapper/maven-wrapper.jar',\n '.mvn/wrapper/MavenWrapperDownloader.java',\n 'mvnw',\n 'mvnw.cmd',\n ].map(\n (filename) =>\n packageFileName.replace('.mvn/wrapper/maven-wrapper.properties', '') +\n filename,\n );\n const updateArtifactsResult = (\n await getUpdatedArtifacts(status, artifactFileNames)\n ).filter(isTruthy);\n\n logger.debug(\n { files: updateArtifactsResult.map((r) => r.file?.path) },\n `Returning updated maven-wrapper files`,\n );\n return updateArtifactsResult;\n } catch (err) {\n logger.debug({ err }, 'Error setting new Maven Wrapper release value');\n return [\n {\n artifactError: {\n fileName: packageFileName,\n stderr: err.message,\n },\n },\n ];\n }\n}\n\nasync function getUpdatedArtifacts(\n status: StatusResult,\n artifactFileNames: string[],\n): Promise<UpdateArtifactsResult[]> {\n const updatedResults: UpdateArtifactsResult[] = [];\n for (const artifactFileName of artifactFileNames) {\n const updatedResult = await addIfUpdated(status, artifactFileName);\n if (updatedResult !== null) {\n updatedResults.push(updatedResult);\n }\n }\n return updatedResults;\n}\n\n/**\n * Find compatible java version for maven.\n * see https://maven.apache.org/developers/compatibility-plan.html\n * @param mavenWrapperVersion current maven version\n * @returns A Java semver range\n */\nexport function getJavaConstraint(\n mavenWrapperVersion: string | null | undefined,\n): string | null {\n const major = mavenWrapperVersion\n ? mavenVersioning.getMajor(mavenWrapperVersion)\n : null;\n\n if (major && major >= 3) {\n return '^17.0.0';\n }\n\n return '^8.0.0';\n}\n\nasync function executeWrapperCommand(\n cmd: string,\n config: UpdateArtifactsConfig,\n packageFileName: string,\n extraEnv: ExtraEnv,\n): Promise<void> {\n logger.debug(`Updating maven wrapper: \"${cmd}\"`);\n const { wrapperFullyQualifiedPath } = getMavenPaths(packageFileName);\n\n const execOptions: ExecOptions = {\n cwdFile: wrapperFullyQualifiedPath,\n docker: {},\n extraEnv,\n toolConstraints: [\n {\n toolName: 'java',\n constraint:\n config.constraints?.java ?? getJavaConstraint(config.currentValue),\n },\n ],\n };\n\n try {\n await exec(cmd, execOptions);\n } catch (err) {\n logger.error({ err }, 'Error executing maven wrapper update command.');\n throw err;\n }\n}\n\nfunction getExtraEnvOptions(deps: PackageDependency[]): ExtraEnv {\n const customMavenWrapperUrl = getCustomMavenWrapperRepoUrl(deps);\n if (customMavenWrapperUrl) {\n return { MVNW_REPOURL: customMavenWrapperUrl };\n }\n return {};\n}\n\nfunction getCustomMavenWrapperRepoUrl(\n deps: PackageDependency[],\n): string | null {\n const replaceString = deps.find(\n (dep) => dep.depName === 'maven-wrapper',\n )?.replaceString;\n\n if (!replaceString) {\n return null;\n }\n\n const match = regEx(/^(.*?)\\/org\\/apache\\/maven\\/wrapper\\//).exec(\n replaceString,\n );\n\n if (!match) {\n return null;\n }\n\n return match[1] === DEFAULT_MAVEN_REPO_URL ? null : match[1];\n}\n\nasync function createWrapperCommand(\n packageFileName: string,\n distributionType: string | null,\n): Promise<string | null> {\n const {\n wrapperExecutableFileName,\n localProjectDir,\n wrapperFullyQualifiedPath,\n } = getMavenPaths(packageFileName);\n\n // Use existing distributionType or default to 'script' to preserve JAR-based mode\n // (prevents Maven 3.3.x from defaulting to only-script which doesn't support checksums)\n const type = distributionType ?? 'script';\n const args = `wrapper:wrapper -Dtype=${quote(type)}`;\n\n return await prepareCommand(\n wrapperExecutableFileName,\n localProjectDir,\n await statLocalFile(wrapperFullyQualifiedPath),\n args,\n );\n}\n\nfunction mavenWrapperFileName(): string {\n if (\n os.platform() === 'win32' &&\n GlobalConfig.get('binarySource') !== 'docker'\n ) {\n return 'mvnw.cmd';\n }\n return './mvnw';\n}\n\nfunction getMavenPaths(packageFileName: string): MavenWrapperPaths {\n const wrapperExecutableFileName = mavenWrapperFileName();\n const localProjectDir = upath.join(\n upath.dirname(packageFileName),\n packageFileName.includes('mvnw') ? '.' : '../../',\n );\n const wrapperFullyQualifiedPath = upath.join(\n localProjectDir,\n wrapperExecutableFileName,\n );\n return {\n wrapperExecutableFileName,\n localProjectDir,\n wrapperFullyQualifiedPath,\n };\n}\n\nasync function prepareCommand(\n fileName: string,\n cwd: string | undefined,\n pathFileStats: Stats | null,\n args: string | null,\n): Promise<string | null> {\n /* v8 ignore next -- hard to test */\n if (pathFileStats?.isFile() === true) {\n // if the file is not executable by others\n if (os.platform() !== 'win32' && (pathFileStats.mode & 0o1) === 0) {\n // add the execution permission to the owner, group and others\n logger.warn('Maven wrapper is missing the executable bit');\n await chmodLocalFile(\n // TODO: types (#22198)\n upath.join(cwd!, fileName),\n pathFileStats.mode | 0o111,\n );\n }\n if (args === null) {\n return fileName;\n }\n return `${fileName} ${args}`;\n }\n return null;\n}\n"],"mappings":"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"}
@@ -131,7 +131,7 @@ function createPipxToolConfig(name) {
131
131
  if (isGitSyntax) {
132
132
  repoName = pipxGitHubRegex.exec(name)?.groups?.repo;
133
133
  if (isUndefined(repoName)) return {
134
- packageName: name.replace(/^git\+/g, "").replaceAll(/\.git$/g, ""),
134
+ packageName: name.replace(regEx(/^git\+/g), "").replaceAll(regEx(/\.git$/g), ""),
135
135
  datasource: GitRefsDatasource.id
136
136
  };
137
137
  } else repoName = name;
@@ -174,8 +174,8 @@ function createUbiToolConfig(name, version, toolOptions) {
174
174
  if (!hasVPrefix || isString(toolOptions.tag_regex)) {
175
175
  let tagRegex = ".+";
176
176
  if (isString(toolOptions.tag_regex)) {
177
- tagRegex = toolOptions.tag_regex.replace(/^\^/, "");
178
- if (!hasVPrefix) tagRegex = tagRegex.replace(/^v\??/, "");
177
+ tagRegex = toolOptions.tag_regex.replace(regEx(/^\^/), "");
178
+ if (!hasVPrefix) tagRegex = tagRegex.replace(regEx(/^v\??/), "");
179
179
  }
180
180
  extractVersion = `^${hasVPrefix ? "" : "v?"}(?<version>${tagRegex})`;
181
181
  }
@@ -1 +1 @@
1
- {"version":3,"file":"backends.js","names":["semverVersioning.id"],"sources":["../../../../lib/modules/manager/mise/backends.ts"],"sourcesContent":["import {\n isNonEmptyString,\n isString,\n isUndefined,\n isUrlString,\n} from '@sindresorhus/is';\nimport { escapeRegExp, regEx } from '../../../util/regex.ts';\nimport { CrateDatasource } from '../../datasource/crate/index.ts';\nimport { GitRefsDatasource } from '../../datasource/git-refs/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubReleasesDatasource } from '../../datasource/github-releases/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport { GoDatasource } from '../../datasource/go/index.ts';\nimport { NpmDatasource } from '../../datasource/npm/index.ts';\nimport { NugetDatasource } from '../../datasource/nuget/index.ts';\nimport { normalizePythonDepName } from '../../datasource/pypi/common.ts';\nimport { PypiDatasource } from '../../datasource/pypi/index.ts';\nimport { RubygemsDatasource } from '../../datasource/rubygems/index.ts';\nimport * as semverVersioning from '../../versioning/semver/index.ts';\nimport type { PackageDependency } from '../types.ts';\nimport type { MiseToolOptions } from './schema.ts';\n\nexport type BackendToolingConfig = Omit<PackageDependency, 'depName'> &\n Required<\n | Pick<PackageDependency, 'packageName' | 'datasource'>\n | Pick<PackageDependency, 'packageName' | 'skipReason'>\n >;\n\n/**\n * Create a tooling config for aqua backend\n * @link https://mise.jdx.dev/dev-tools/backends/aqua.html\n */\nexport function createAquaToolConfig(\n name: string,\n version: string,\n): BackendToolingConfig {\n // mise supports http aqua package type but we cannot determine it from the tool name\n // An error will be thrown afterwards if the package type is http\n // ref: https://github.com/jdx/mise/blob/d1b9749d8f3e13ef705c1ea471d96c5935b79136/src/aqua/aqua_registry.rs#L39-L45\n return {\n packageName: name,\n datasource: GithubTagsDatasource.id,\n // Trim the leading 'v' from both the current and extracted version\n currentValue: version.replace(regEx(/^v/), ''),\n extractVersion: '^v?(?<version>.+)',\n };\n}\n\nconst cargoGitVersionRegex = regEx(/^(?<type>tag|branch|rev):(?<version>.+)$/);\n\n/**\n * Create a tooling config for cargo backend\n * @link https://mise.jdx.dev/dev-tools/backends/cargo.html\n */\nexport function createCargoToolConfig(\n name: string,\n version: string,\n): BackendToolingConfig {\n if (!isUrlString(name)) {\n return {\n packageName: name,\n datasource: CrateDatasource.id,\n // A mise tool version is a concrete version, not a Cargo dependency requirement,\n // so the crate datasource default of cargo versioning does not apply\n versioning: semverVersioning.id,\n };\n }\n // tag: branch: or rev: is required for git repository url\n // e.g. branch:main, tag:0.1.0, rev:abcdef\n const matchGroups = cargoGitVersionRegex.exec(version)?.groups;\n if (isUndefined(matchGroups)) {\n return {\n packageName: name,\n skipReason: 'invalid-version',\n };\n }\n const { type, version: gitVersion } = matchGroups;\n switch (type as 'tag' | 'branch' | 'rev') {\n case 'tag':\n return {\n packageName: name,\n datasource: GitTagsDatasource.id,\n currentValue: gitVersion,\n };\n case 'branch':\n return {\n packageName: name,\n datasource: GitRefsDatasource.id,\n currentValue: gitVersion,\n };\n case 'rev':\n return {\n packageName: name,\n datasource: GitRefsDatasource.id,\n currentValue: gitVersion,\n };\n }\n}\n\n/**\n * Create a tooling config for dotnet backend\n * @link https://mise.jdx.dev/dev-tools/backends/dotnet.html\n */\nexport function createDotnetToolConfig(name: string): BackendToolingConfig {\n return {\n packageName: name,\n datasource: NugetDatasource.id,\n };\n}\n\n/**\n * Create a tooling config for gem backend\n * @link https://mise.jdx.dev/dev-tools/backends/gem.html\n */\nexport function createGemToolConfig(name: string): BackendToolingConfig {\n return {\n packageName: name,\n datasource: RubygemsDatasource.id,\n };\n}\n\n/**\n * Create a tooling config for github backend\n * @link https://mise.jdx.dev/dev-tools/backends/github.html\n */\nexport function createGithubToolConfig(\n name: string,\n version: string,\n toolOptions: MiseToolOptions,\n): BackendToolingConfig {\n let extractVersion: string | undefined = undefined;\n const prefix = toolOptions.version_prefix;\n\n if (isNonEmptyString(prefix)) {\n extractVersion = `^${escapeRegExp(prefix)}(?<version>.+)`;\n }\n\n return {\n packageName: name,\n datasource: GithubReleasesDatasource.id,\n currentValue: version,\n ...(extractVersion && { extractVersion }),\n };\n}\n\n/**\n * Create a tooling config for go backend\n * @link https://mise.jdx.dev/dev-tools/backends/go.html\n */\nexport function createGoToolConfig(name: string): BackendToolingConfig {\n return {\n packageName: name,\n datasource: GoDatasource.id,\n };\n}\n\n/**\n * Create a tooling config for npm backend\n * @link https://mise.jdx.dev/dev-tools/backends/npm.html\n */\nexport function createNpmToolConfig(name: string): BackendToolingConfig {\n return {\n packageName: name,\n datasource: NpmDatasource.id,\n };\n}\n\nconst pipxGitHubRegex = regEx(/^git\\+https:\\/\\/github\\.com\\/(?<repo>.+)\\.git$/);\n\n/**\n * Create a tooling config for pipx backend\n * @link https://mise.jdx.dev/dev-tools/backends/pipx.html\n */\nexport function createPipxToolConfig(name: string): BackendToolingConfig {\n const isGitSyntax = name.startsWith('git+');\n // Does not support zip file url\n // Avoid type narrowing to prevent type error\n if (!isGitSyntax && (isUrlString as (value: unknown) => boolean)(name)) {\n return {\n packageName: name,\n skipReason: 'unsupported-url',\n };\n }\n if (isGitSyntax || name.includes('/')) {\n let repoName: string | undefined;\n if (isGitSyntax) {\n repoName = pipxGitHubRegex.exec(name)?.groups?.repo;\n // If the url is not a github repo, treat the version as a git ref\n if (isUndefined(repoName)) {\n return {\n packageName: name.replace(/^git\\+/g, '').replaceAll(/\\.git$/g, ''),\n datasource: GitRefsDatasource.id,\n };\n }\n } else {\n repoName = name;\n }\n return {\n packageName: repoName,\n datasource: GithubTagsDatasource.id,\n };\n }\n return {\n packageName: normalizePythonDepName(name),\n datasource: PypiDatasource.id,\n };\n}\n\nconst spmGitHubRegex = regEx(/^https:\\/\\/github.com\\/(?<repo>.+).git$/);\n\n/**\n * Create a tooling config for spm backend\n * @link https://mise.jdx.dev/dev-tools/backends/spm.html\n */\nexport function createSpmToolConfig(name: string): BackendToolingConfig {\n let repoName: string | undefined;\n // Avoid type narrowing to prevent type error\n if ((isUrlString as (value: unknown) => boolean)(name)) {\n repoName = spmGitHubRegex.exec(name)?.groups?.repo;\n // spm backend only supports github repos\n if (!repoName) {\n return {\n packageName: name,\n skipReason: 'unsupported-url',\n };\n }\n }\n return {\n packageName: repoName ?? name,\n datasource: GithubReleasesDatasource.id,\n };\n}\n\n/**\n * Create a tooling config for ubi backend\n * @link https://mise.jdx.dev/dev-tools/backends/ubi.html\n */\nexport function createUbiToolConfig(\n name: string,\n version: string,\n toolOptions: MiseToolOptions,\n): BackendToolingConfig {\n let extractVersion: string | undefined = undefined;\n\n const hasVPrefix = version.startsWith('v');\n const setsTagRegex = !hasVPrefix || isString(toolOptions.tag_regex);\n\n if (setsTagRegex) {\n // By default, use a regex that matches any tag\n let tagRegex = '.+';\n // Filter versions by tag_regex if it is specified\n // ref: https://mise.jdx.dev/dev-tools/backends/ubi.html#ubi-uses-weird-versions\n if (isString(toolOptions.tag_regex)) {\n // Remove the leading '^' if it exists to avoid duplication\n tagRegex = toolOptions.tag_regex.replace(/^\\^/, '');\n if (!hasVPrefix) {\n // Remove the leading 'v?' if it exists to avoid duplication\n tagRegex = tagRegex.replace(/^v\\??/, '');\n }\n }\n\n // Trim the 'v' prefix if the current version does not have it\n extractVersion = `^${hasVPrefix ? '' : 'v?'}(?<version>${tagRegex})`;\n }\n\n return {\n packageName: name,\n datasource: GithubReleasesDatasource.id,\n currentValue: version,\n ...(isString(extractVersion) ? { extractVersion } : {}),\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"backends.js","names":["semverVersioning.id"],"sources":["../../../../lib/modules/manager/mise/backends.ts"],"sourcesContent":["import {\n isNonEmptyString,\n isString,\n isUndefined,\n isUrlString,\n} from '@sindresorhus/is';\nimport { escapeRegExp, regEx } from '../../../util/regex.ts';\nimport { CrateDatasource } from '../../datasource/crate/index.ts';\nimport { GitRefsDatasource } from '../../datasource/git-refs/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubReleasesDatasource } from '../../datasource/github-releases/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport { GoDatasource } from '../../datasource/go/index.ts';\nimport { NpmDatasource } from '../../datasource/npm/index.ts';\nimport { NugetDatasource } from '../../datasource/nuget/index.ts';\nimport { normalizePythonDepName } from '../../datasource/pypi/common.ts';\nimport { PypiDatasource } from '../../datasource/pypi/index.ts';\nimport { RubygemsDatasource } from '../../datasource/rubygems/index.ts';\nimport * as semverVersioning from '../../versioning/semver/index.ts';\nimport type { PackageDependency } from '../types.ts';\nimport type { MiseToolOptions } from './schema.ts';\n\nexport type BackendToolingConfig = Omit<PackageDependency, 'depName'> &\n Required<\n | Pick<PackageDependency, 'packageName' | 'datasource'>\n | Pick<PackageDependency, 'packageName' | 'skipReason'>\n >;\n\n/**\n * Create a tooling config for aqua backend\n * @link https://mise.jdx.dev/dev-tools/backends/aqua.html\n */\nexport function createAquaToolConfig(\n name: string,\n version: string,\n): BackendToolingConfig {\n // mise supports http aqua package type but we cannot determine it from the tool name\n // An error will be thrown afterwards if the package type is http\n // ref: https://github.com/jdx/mise/blob/d1b9749d8f3e13ef705c1ea471d96c5935b79136/src/aqua/aqua_registry.rs#L39-L45\n return {\n packageName: name,\n datasource: GithubTagsDatasource.id,\n // Trim the leading 'v' from both the current and extracted version\n currentValue: version.replace(regEx(/^v/), ''),\n extractVersion: '^v?(?<version>.+)',\n };\n}\n\nconst cargoGitVersionRegex = regEx(/^(?<type>tag|branch|rev):(?<version>.+)$/);\n\n/**\n * Create a tooling config for cargo backend\n * @link https://mise.jdx.dev/dev-tools/backends/cargo.html\n */\nexport function createCargoToolConfig(\n name: string,\n version: string,\n): BackendToolingConfig {\n if (!isUrlString(name)) {\n return {\n packageName: name,\n datasource: CrateDatasource.id,\n // A mise tool version is a concrete version, not a Cargo dependency requirement,\n // so the crate datasource default of cargo versioning does not apply\n versioning: semverVersioning.id,\n };\n }\n // tag: branch: or rev: is required for git repository url\n // e.g. branch:main, tag:0.1.0, rev:abcdef\n const matchGroups = cargoGitVersionRegex.exec(version)?.groups;\n if (isUndefined(matchGroups)) {\n return {\n packageName: name,\n skipReason: 'invalid-version',\n };\n }\n const { type, version: gitVersion } = matchGroups;\n switch (type as 'tag' | 'branch' | 'rev') {\n case 'tag':\n return {\n packageName: name,\n datasource: GitTagsDatasource.id,\n currentValue: gitVersion,\n };\n case 'branch':\n return {\n packageName: name,\n datasource: GitRefsDatasource.id,\n currentValue: gitVersion,\n };\n case 'rev':\n return {\n packageName: name,\n datasource: GitRefsDatasource.id,\n currentValue: gitVersion,\n };\n }\n}\n\n/**\n * Create a tooling config for dotnet backend\n * @link https://mise.jdx.dev/dev-tools/backends/dotnet.html\n */\nexport function createDotnetToolConfig(name: string): BackendToolingConfig {\n return {\n packageName: name,\n datasource: NugetDatasource.id,\n };\n}\n\n/**\n * Create a tooling config for gem backend\n * @link https://mise.jdx.dev/dev-tools/backends/gem.html\n */\nexport function createGemToolConfig(name: string): BackendToolingConfig {\n return {\n packageName: name,\n datasource: RubygemsDatasource.id,\n };\n}\n\n/**\n * Create a tooling config for github backend\n * @link https://mise.jdx.dev/dev-tools/backends/github.html\n */\nexport function createGithubToolConfig(\n name: string,\n version: string,\n toolOptions: MiseToolOptions,\n): BackendToolingConfig {\n let extractVersion: string | undefined = undefined;\n const prefix = toolOptions.version_prefix;\n\n if (isNonEmptyString(prefix)) {\n extractVersion = `^${escapeRegExp(prefix)}(?<version>.+)`;\n }\n\n return {\n packageName: name,\n datasource: GithubReleasesDatasource.id,\n currentValue: version,\n ...(extractVersion && { extractVersion }),\n };\n}\n\n/**\n * Create a tooling config for go backend\n * @link https://mise.jdx.dev/dev-tools/backends/go.html\n */\nexport function createGoToolConfig(name: string): BackendToolingConfig {\n return {\n packageName: name,\n datasource: GoDatasource.id,\n };\n}\n\n/**\n * Create a tooling config for npm backend\n * @link https://mise.jdx.dev/dev-tools/backends/npm.html\n */\nexport function createNpmToolConfig(name: string): BackendToolingConfig {\n return {\n packageName: name,\n datasource: NpmDatasource.id,\n };\n}\n\nconst pipxGitHubRegex = regEx(/^git\\+https:\\/\\/github\\.com\\/(?<repo>.+)\\.git$/);\n\n/**\n * Create a tooling config for pipx backend\n * @link https://mise.jdx.dev/dev-tools/backends/pipx.html\n */\nexport function createPipxToolConfig(name: string): BackendToolingConfig {\n const isGitSyntax = name.startsWith('git+');\n // Does not support zip file url\n // Avoid type narrowing to prevent type error\n if (!isGitSyntax && (isUrlString as (value: unknown) => boolean)(name)) {\n return {\n packageName: name,\n skipReason: 'unsupported-url',\n };\n }\n if (isGitSyntax || name.includes('/')) {\n let repoName: string | undefined;\n if (isGitSyntax) {\n repoName = pipxGitHubRegex.exec(name)?.groups?.repo;\n // If the url is not a github repo, treat the version as a git ref\n if (isUndefined(repoName)) {\n return {\n packageName: name\n .replace(regEx(/^git\\+/g), '')\n .replaceAll(regEx(/\\.git$/g), ''),\n datasource: GitRefsDatasource.id,\n };\n }\n } else {\n repoName = name;\n }\n return {\n packageName: repoName,\n datasource: GithubTagsDatasource.id,\n };\n }\n return {\n packageName: normalizePythonDepName(name),\n datasource: PypiDatasource.id,\n };\n}\n\nconst spmGitHubRegex = regEx(/^https:\\/\\/github.com\\/(?<repo>.+).git$/);\n\n/**\n * Create a tooling config for spm backend\n * @link https://mise.jdx.dev/dev-tools/backends/spm.html\n */\nexport function createSpmToolConfig(name: string): BackendToolingConfig {\n let repoName: string | undefined;\n // Avoid type narrowing to prevent type error\n if ((isUrlString as (value: unknown) => boolean)(name)) {\n repoName = spmGitHubRegex.exec(name)?.groups?.repo;\n // spm backend only supports github repos\n if (!repoName) {\n return {\n packageName: name,\n skipReason: 'unsupported-url',\n };\n }\n }\n return {\n packageName: repoName ?? name,\n datasource: GithubReleasesDatasource.id,\n };\n}\n\n/**\n * Create a tooling config for ubi backend\n * @link https://mise.jdx.dev/dev-tools/backends/ubi.html\n */\nexport function createUbiToolConfig(\n name: string,\n version: string,\n toolOptions: MiseToolOptions,\n): BackendToolingConfig {\n let extractVersion: string | undefined = undefined;\n\n const hasVPrefix = version.startsWith('v');\n const setsTagRegex = !hasVPrefix || isString(toolOptions.tag_regex);\n\n if (setsTagRegex) {\n // By default, use a regex that matches any tag\n let tagRegex = '.+';\n // Filter versions by tag_regex if it is specified\n // ref: https://mise.jdx.dev/dev-tools/backends/ubi.html#ubi-uses-weird-versions\n if (isString(toolOptions.tag_regex)) {\n // Remove the leading '^' if it exists to avoid duplication\n tagRegex = toolOptions.tag_regex.replace(regEx(/^\\^/), '');\n if (!hasVPrefix) {\n // Remove the leading 'v?' if it exists to avoid duplication\n tagRegex = tagRegex.replace(regEx(/^v\\??/), '');\n }\n }\n\n // Trim the 'v' prefix if the current version does not have it\n extractVersion = `^${hasVPrefix ? '' : 'v?'}(?<version>${tagRegex})`;\n }\n\n return {\n packageName: name,\n datasource: GithubReleasesDatasource.id,\n currentValue: version,\n ...(isString(extractVersion) ? { extractVersion } : {}),\n };\n}\n"],"mappings":"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"}
@@ -287,7 +287,7 @@ const miseRegistryTooling = {
287
287
  kafka: {
288
288
  misePluginUrl: "https://mise.jdx.dev/registry.html#tools",
289
289
  config: (version) => {
290
- const apacheMatches = /^apache-(?<version>\d\S+)/.exec(version)?.groups;
290
+ const apacheMatches = regEx(/^apache-(?<version>\d\S+)/).exec(version)?.groups;
291
291
  if (apacheMatches) return {
292
292
  datasource: GithubTagsDatasource.id,
293
293
  packageName: "apache/kafka",