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
@@ -64,12 +64,12 @@ var ApkVersioningApi = class extends GenericVersioningApi {
64
64
  for (let i = 0; i < matches; i++) {
65
65
  const matchv1 = matchesv1[i];
66
66
  const matchv2 = matchesv2[i];
67
- if (matchv1 && /^\d+$/.test(matchv1)) {
68
- if (!matchv2 || !/^\d+$/.test(matchv2)) return 1;
67
+ if (matchv1 && regEx(/^\d+$/).test(matchv1)) {
68
+ if (!matchv2 || !regEx(/^\d+$/).test(matchv2)) return 1;
69
69
  const num1 = parseInt(matchv1, 10);
70
70
  const num2 = parseInt(matchv2, 10);
71
71
  if (num1 !== num2) return num1 - num2;
72
- } else if (matchv2 && /^\d+$/.test(matchv2)) return -1;
72
+ } else if (matchv2 && regEx(/^\d+$/).test(matchv2)) return -1;
73
73
  else if (matchv1 !== matchv2) return matchv1.localeCompare(matchv2);
74
74
  }
75
75
  if (matchesv1.length !== matchesv2.length) {
@@ -77,8 +77,8 @@ var ApkVersioningApi = class extends GenericVersioningApi {
77
77
  for (let i = matches; i < maxLength; i++) {
78
78
  const matchv1 = matchesv1[i];
79
79
  const matchv2 = matchesv2[i];
80
- if (matchv1 && /^\d+$/.test(matchv1)) return 1;
81
- if (matchv2 && /^\d+$/.test(matchv2)) return -1;
80
+ if (matchv1 && regEx(/^\d+$/).test(matchv1)) return 1;
81
+ if (matchv2 && regEx(/^\d+$/).test(matchv2)) return -1;
82
82
  if (matchv1) return -1;
83
83
  return 1;
84
84
  }
@@ -87,23 +87,23 @@ var ApkVersioningApi = class extends GenericVersioningApi {
87
87
  }
88
88
  isValid(version) {
89
89
  if (!version) return false;
90
- const cleanVersion = version.replace(/^[=><~][=]?/, "");
90
+ const cleanVersion = version.replace(regEx(/^[=><~][=]?/), "");
91
91
  return this._parse(cleanVersion) !== null;
92
92
  }
93
93
  isSingleVersion(version) {
94
94
  if (!version) return false;
95
- if (/^[><~]/.test(version)) return false;
95
+ if (regEx(/^[><~]/).test(version)) return false;
96
96
  return this.isValid(version);
97
97
  }
98
98
  isStable(version) {
99
99
  if (!version) return false;
100
- const cleanVersion = version.replace(/^[=><~][=]?/, "");
100
+ const cleanVersion = version.replace(regEx(/^[=><~][=]?/), "");
101
101
  const parsed = this._parse(cleanVersion);
102
102
  if (!parsed) return false;
103
103
  return !parsed.prerelease;
104
104
  }
105
105
  getSatisfyingVersion(versions, range) {
106
- const rangeMatch = /^([><=~]+)(.+)$/.exec(range);
106
+ const rangeMatch = regEx(/^([><=~]+)(.+)$/).exec(range);
107
107
  if (!rangeMatch) return versions.find((v) => this.equals(v, range)) ?? null;
108
108
  const [, operator, targetVersion] = rangeMatch;
109
109
  const satisfyingVersions = versions.filter((version) => {
@@ -129,28 +129,28 @@ var ApkVersioningApi = class extends GenericVersioningApi {
129
129
  }
130
130
  getMajor(version) {
131
131
  if (!version) return null;
132
- const cleanVersion = version.replace(/^[=><~][=]?/, "");
132
+ const cleanVersion = version.replace(regEx(/^[=><~][=]?/), "");
133
133
  return this._parse(cleanVersion)?.release[0] ?? null;
134
134
  }
135
135
  getMinor(version) {
136
136
  if (!version) return null;
137
- const cleanVersion = version.replace(/^[=><~][=]?/, "");
137
+ const cleanVersion = version.replace(regEx(/^[=><~][=]?/), "");
138
138
  return this._parse(cleanVersion)?.release[1] ?? null;
139
139
  }
140
140
  getPatch(version) {
141
141
  if (!version) return null;
142
- const cleanVersion = version.replace(/^[=><~][=]?/, "");
142
+ const cleanVersion = version.replace(regEx(/^[=><~][=]?/), "");
143
143
  const parsed = this._parse(cleanVersion);
144
144
  if (!parsed) return null;
145
145
  return parsed.release[2] ?? null;
146
146
  }
147
147
  getNewValue({ currentValue, newVersion }) {
148
- if (!/-r\d+$/.test(currentValue)) return newVersion.replace(/-r\d+$/, "");
148
+ if (!regEx(/-r\d+$/).test(currentValue)) return newVersion.replace(regEx(/-r\d+$/), "");
149
149
  return newVersion;
150
150
  }
151
151
  sortVersions(a, b) {
152
- const cleanA = a.replace(/^=/, "");
153
- const cleanB = b.replace(/^=/, "");
152
+ const cleanA = a.replace(regEx(/^=/), "");
153
+ const cleanB = b.replace(regEx(/^=/), "");
154
154
  return super.sortVersions(cleanA, cleanB);
155
155
  }
156
156
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/apk/index.ts"],"sourcesContent":["import { isTruthy } from '@sindresorhus/is';\nimport { regEx } from '../../../util/regex.ts';\nimport type { GenericVersion } from '../generic.ts';\nimport { GenericVersioningApi } from '../generic.ts';\nimport type { VersioningApi } from '../types.ts';\n\nexport const id = 'apk';\nexport const displayName = 'Alpine Package Keeper (APK)';\nexport const urls = [\n '[Alpine Linux package policies](https://wiki.alpinelinux.org/wiki/Package_policies)',\n '[Alpine Package Keeper - Package pinning](https://wiki.alpinelinux.org/wiki/Alpine_Package_Keeper#Package_pinning)',\n];\nexport const supportsRanges = false;\n\n// Regex with named capture groups for APK version parsing\nconst versionRegex = regEx(\n /^v?(?<major>[0-9]+)(?:\\.(?<minor>[0-9]+))?(?:\\.(?<patch>[0-9]+))?(?<extra>(?:\\.[0-9]+)*)(?<letter>[a-z])?(?:(?<prereleaseType>_alpha|_beta|_pre|_rc)(?<prereleaseNum>[0-9]*))?(?:(?<packageFixType>_cvs|_svn|_git|_hg|_p)(?<packageFixNum>[0-9]*))?(?:-r(?<releaseNum>[0-9]+))?$/,\n);\n\n// Regex for splitting version strings into alphanumeric parts\nconst alphaNumRegex = regEx(/([a-zA-Z]+)|(\\d+)/g);\n\nexport interface ApkVersion extends GenericVersion {\n /**\n * version is the main version part: it defines the version of origin software\n * that was packaged.\n */\n version: string;\n /**\n * releaseString is used to distinguish between different versions of packaging for the\n * same upstream version.\n */\n releaseString: string;\n}\n\nclass ApkVersioningApi extends GenericVersioningApi {\n /**\n * Parse APK version format using apko's version parsing patterns\n * Based on `Apache-2.0` code in https://github.com/chainguard-dev/apko/blob/v0.30.35/pkg/apk/apk/version.go\n */\n protected _parse(version: string): ApkVersion | null {\n const match = versionRegex.exec(version);\n if (!match?.groups) {\n return null;\n }\n\n const {\n major,\n minor,\n patch,\n extra,\n letter,\n prereleaseType,\n prereleaseNum,\n packageFixType,\n packageFixNum,\n releaseNum,\n } = match.groups;\n\n const packageFixFull = packageFixType ? packageFixType + packageFixNum : '';\n\n const minorPatchStr =\n (minor ? `.${minor}` : '') + (patch ? `.${patch}` : '') + extra;\n\n // For version comparison, we only include the base version + package fix, not prerelease\n const versionStr = major + minorPatchStr + (letter ?? '') + packageFixFull;\n\n let prerelease: string | undefined;\n if (prereleaseType) {\n prerelease = prereleaseType.substring(1) + prereleaseNum;\n }\n\n // Extract numeric parts for major/minor/patch/extra\n const release = [parseInt(major, 10)];\n if (minor) {\n release.push(parseInt(minor, 10));\n }\n if (patch) {\n release.push(parseInt(patch, 10));\n }\n // Handle any additional version parts (e.g., 1.2.3.4.5)\n if (extra) {\n const extraParts = extra\n .substring(1)\n .split('.')\n .filter(isTruthy)\n .map(Number);\n release.push(...extraParts);\n }\n\n // Extract release string (just the number part)\n const releaseString = releaseNum ?? '';\n\n return {\n version: versionStr,\n releaseString,\n release,\n prerelease,\n };\n }\n\n /**\n * Compare two APK versions according to Alpine Linux rules\n */\n protected override _compare(version: string, other: string): number {\n const parsed1 = this._parse(version);\n const parsed2 = this._parse(other);\n\n if (!(parsed1 && parsed2)) {\n return 1;\n }\n\n // Compare version parts (without release number)\n const versionCompare = this._compareVersionParts(\n parsed1.version,\n parsed2.version,\n );\n if (versionCompare !== 0) {\n return versionCompare;\n }\n\n // Compare prerelease identifiers\n const prerelease1 = parsed1.prerelease;\n const prerelease2 = parsed2.prerelease;\n\n if (prerelease1 || prerelease2) {\n if (!prerelease1) {\n return -1; // Version without prerelease < version with prerelease (APK-specific)\n }\n if (!prerelease2) {\n return 1; // Version with prerelease > version without (APK-specific)\n }\n // Both have prerelease identifiers, compare them\n const prereleaseCompare = prerelease1.localeCompare(prerelease2);\n if (prereleaseCompare !== 0) {\n return prereleaseCompare;\n }\n }\n\n // Compare release numbers\n const release1 = parsed1.releaseString || '';\n const release2 = parsed2.releaseString || '';\n\n // If one has a release number and the other doesn't, the one with release number is greater\n if (release1 && !release2) {\n return 1;\n }\n if (!release1 && release2) {\n return -1;\n }\n\n // If both have release numbers or neither has release numbers, compare them\n const releaseCompare = this._compareVersionParts(\n release1 || '0',\n release2 || '0',\n );\n return releaseCompare;\n }\n\n /**\n * Compare version parts using APK's version comparison rules\n */\n private _compareVersionParts(v1: string, v2: string): number {\n if (v1 === v2) {\n return 0;\n }\n const matchesv1 = v1.match(alphaNumRegex)!;\n const matchesv2 = v2.match(alphaNumRegex)!;\n const matches = Math.min(matchesv1.length, matchesv2.length);\n\n for (let i = 0; i < matches; i++) {\n const matchv1 = matchesv1[i];\n const matchv2 = matchesv2[i];\n\n if (matchv1 && /^\\d+$/.test(matchv1)) {\n if (!matchv2 || !/^\\d+$/.test(matchv2)) {\n return 1;\n }\n const num1 = parseInt(matchv1, 10);\n const num2 = parseInt(matchv2, 10);\n if (num1 !== num2) {\n return num1 - num2;\n }\n } else if (matchv2 && /^\\d+$/.test(matchv2)) {\n return -1;\n } else if (matchv1 !== matchv2) {\n return matchv1.localeCompare(matchv2);\n }\n }\n\n if (matchesv1.length !== matchesv2.length) {\n const maxLength = Math.max(matchesv1.length, matchesv2.length);\n for (let i = matches; i < maxLength; i++) {\n const matchv1 = matchesv1[i];\n const matchv2 = matchesv2[i];\n\n if (matchv1 && /^\\d+$/.test(matchv1)) {\n return 1;\n }\n if (matchv2 && /^\\d+$/.test(matchv2)) {\n return -1;\n }\n if (matchv1) {\n return -1;\n }\n return 1;\n }\n }\n\n return 0;\n }\n\n override isValid(version: string): boolean {\n if (!version) {\n return false;\n }\n // Strip any operators (=, >, <, ~) before validation\n const cleanVersion = version.replace(/^[=><~][=]?/, '');\n const parsed = this._parse(cleanVersion);\n return parsed !== null;\n }\n\n override isSingleVersion(version: string): boolean {\n if (!version) {\n return false;\n }\n // Range constraints (>, >=, <, <=, ~) are not single versions\n if (/^[><~]/.test(version)) {\n return false;\n }\n // Exact versions (starting with = or no operator) are single versions\n return this.isValid(version);\n }\n\n override isStable(version: string): boolean {\n if (!version) {\n return false;\n }\n // Strip any operators (=, >, <, ~) before checking stability\n const cleanVersion = version.replace(/^[=><~][=]?/, '');\n const parsed = this._parse(cleanVersion);\n if (!parsed) {\n return false;\n }\n // Consider versions without prerelease identifiers as stable\n return !parsed.prerelease;\n }\n\n override getSatisfyingVersion(\n versions: string[],\n range: string,\n ): string | null {\n // Handle range expressions like >5.2.37-r0, <5.2.37-r0, ~5.2.37-r0, etc.\n const rangeMatch = /^([><=~]+)(.+)$/.exec(range);\n if (!rangeMatch) {\n // If no range operator, look for exact match\n return versions.find((v) => this.equals(v, range)) ?? null;\n }\n\n const [, operator, targetVersion] = rangeMatch;\n\n // Filter versions that satisfy the range\n const satisfyingVersions = versions.filter((version) => {\n if (!this.isValid(version) || !this.isValid(targetVersion)) {\n return false;\n }\n\n switch (operator) {\n case '>':\n return this.isGreaterThan(version, targetVersion);\n case '>=':\n return (\n this.isGreaterThan(version, targetVersion) ||\n this.equals(version, targetVersion)\n );\n case '<':\n return this.isLessThanRange(version, targetVersion);\n case '<=':\n return (\n this.isLessThanRange(version, targetVersion) ||\n this.equals(version, targetVersion)\n );\n case '=':\n case '==':\n return this.equals(version, targetVersion);\n case '~': {\n const targetParsed = this._parse(targetVersion)!;\n const versionParsed = this._parse(version)!;\n\n // Must have same major and minor versions\n if (\n targetParsed.release[0] !== versionParsed.release[0] ||\n targetParsed.release[1] !== versionParsed.release[1]\n ) {\n return false;\n }\n\n // Version must be >= target\n return (\n this.isGreaterThan(version, targetVersion) ||\n this.equals(version, targetVersion)\n );\n }\n }\n // Fallback for unhandled operator combinations like >>, <>, ><, ~~~\n // These match the regex but aren't semantically valid APK range operators\n return false;\n });\n\n if (satisfyingVersions.length === 0) {\n return null;\n }\n\n // Return the highest satisfying version\n return satisfyingVersions.sort((a, b) => this.sortVersions(b, a))[0];\n }\n\n override getMajor(version: string): number | null {\n if (!version) {\n return null;\n }\n // Strip any operators (=, >, <, ~) before parsing\n const cleanVersion = version.replace(/^[=><~][=]?/, '');\n const parsed = this._parse(cleanVersion);\n return parsed?.release[0] ?? null;\n }\n\n override getMinor(version: string): number | null {\n if (!version) {\n return null;\n }\n // Strip any operators (=, >, <, ~) before parsing\n const cleanVersion = version.replace(/^[=><~][=]?/, '');\n const parsed = this._parse(cleanVersion);\n return parsed?.release[1] ?? null;\n }\n\n override getPatch(version: string): number | null {\n if (!version) {\n return null;\n }\n // Strip any operators (=, >, <, ~) before parsing\n const cleanVersion = version.replace(/^[=><~][=]?/, '');\n const parsed = this._parse(cleanVersion);\n if (!parsed) {\n return null;\n }\n return parsed.release[2] ?? null;\n }\n\n override getNewValue({\n currentValue,\n newVersion,\n }: {\n currentValue: string;\n rangeStrategy?: string;\n currentVersion?: string;\n newVersion: string;\n }): string | null {\n // APK packages in apko.yaml only use exact versions\n // currentValue is stored without the = operator for cleaner PR display\n const hasRevision = /-r\\d+$/.test(currentValue);\n\n // If current version has no revision, strip revision from newVersion\n // This ensures both newValue and the displayed version are clean\n if (!hasRevision) {\n return newVersion.replace(/-r\\d+$/, '');\n }\n\n // If current version has revision, keep revision in newVersion\n return newVersion;\n }\n\n // Override to provide clean version for PR titles and display\n override sortVersions(a: string, b: string): number {\n // Strip = prefix if present for comparison\n const cleanA = a.replace(/^=/, '');\n const cleanB = b.replace(/^=/, '');\n return super.sortVersions(cleanA, cleanB);\n }\n}\n\nexport const api: VersioningApi = new ApkVersioningApi();\n\nexport default api;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/apk/index.ts"],"sourcesContent":["import { isTruthy } from '@sindresorhus/is';\nimport { regEx } from '../../../util/regex.ts';\nimport type { GenericVersion } from '../generic.ts';\nimport { GenericVersioningApi } from '../generic.ts';\nimport type { VersioningApi } from '../types.ts';\n\nexport const id = 'apk';\nexport const displayName = 'Alpine Package Keeper (APK)';\nexport const urls = [\n '[Alpine Linux package policies](https://wiki.alpinelinux.org/wiki/Package_policies)',\n '[Alpine Package Keeper - Package pinning](https://wiki.alpinelinux.org/wiki/Alpine_Package_Keeper#Package_pinning)',\n];\nexport const supportsRanges = false;\n\n// Regex with named capture groups for APK version parsing\nconst versionRegex = regEx(\n /^v?(?<major>[0-9]+)(?:\\.(?<minor>[0-9]+))?(?:\\.(?<patch>[0-9]+))?(?<extra>(?:\\.[0-9]+)*)(?<letter>[a-z])?(?:(?<prereleaseType>_alpha|_beta|_pre|_rc)(?<prereleaseNum>[0-9]*))?(?:(?<packageFixType>_cvs|_svn|_git|_hg|_p)(?<packageFixNum>[0-9]*))?(?:-r(?<releaseNum>[0-9]+))?$/,\n);\n\n// Regex for splitting version strings into alphanumeric parts\nconst alphaNumRegex = regEx(/([a-zA-Z]+)|(\\d+)/g);\n\nexport interface ApkVersion extends GenericVersion {\n /**\n * version is the main version part: it defines the version of origin software\n * that was packaged.\n */\n version: string;\n /**\n * releaseString is used to distinguish between different versions of packaging for the\n * same upstream version.\n */\n releaseString: string;\n}\n\nclass ApkVersioningApi extends GenericVersioningApi {\n /**\n * Parse APK version format using apko's version parsing patterns\n * Based on `Apache-2.0` code in https://github.com/chainguard-dev/apko/blob/v0.30.35/pkg/apk/apk/version.go\n */\n protected _parse(version: string): ApkVersion | null {\n const match = versionRegex.exec(version);\n if (!match?.groups) {\n return null;\n }\n\n const {\n major,\n minor,\n patch,\n extra,\n letter,\n prereleaseType,\n prereleaseNum,\n packageFixType,\n packageFixNum,\n releaseNum,\n } = match.groups;\n\n const packageFixFull = packageFixType ? packageFixType + packageFixNum : '';\n\n const minorPatchStr =\n (minor ? `.${minor}` : '') + (patch ? `.${patch}` : '') + extra;\n\n // For version comparison, we only include the base version + package fix, not prerelease\n const versionStr = major + minorPatchStr + (letter ?? '') + packageFixFull;\n\n let prerelease: string | undefined;\n if (prereleaseType) {\n prerelease = prereleaseType.substring(1) + prereleaseNum;\n }\n\n // Extract numeric parts for major/minor/patch/extra\n const release = [parseInt(major, 10)];\n if (minor) {\n release.push(parseInt(minor, 10));\n }\n if (patch) {\n release.push(parseInt(patch, 10));\n }\n // Handle any additional version parts (e.g., 1.2.3.4.5)\n if (extra) {\n const extraParts = extra\n .substring(1)\n .split('.')\n .filter(isTruthy)\n .map(Number);\n release.push(...extraParts);\n }\n\n // Extract release string (just the number part)\n const releaseString = releaseNum ?? '';\n\n return {\n version: versionStr,\n releaseString,\n release,\n prerelease,\n };\n }\n\n /**\n * Compare two APK versions according to Alpine Linux rules\n */\n protected override _compare(version: string, other: string): number {\n const parsed1 = this._parse(version);\n const parsed2 = this._parse(other);\n\n if (!(parsed1 && parsed2)) {\n return 1;\n }\n\n // Compare version parts (without release number)\n const versionCompare = this._compareVersionParts(\n parsed1.version,\n parsed2.version,\n );\n if (versionCompare !== 0) {\n return versionCompare;\n }\n\n // Compare prerelease identifiers\n const prerelease1 = parsed1.prerelease;\n const prerelease2 = parsed2.prerelease;\n\n if (prerelease1 || prerelease2) {\n if (!prerelease1) {\n return -1; // Version without prerelease < version with prerelease (APK-specific)\n }\n if (!prerelease2) {\n return 1; // Version with prerelease > version without (APK-specific)\n }\n // Both have prerelease identifiers, compare them\n const prereleaseCompare = prerelease1.localeCompare(prerelease2);\n if (prereleaseCompare !== 0) {\n return prereleaseCompare;\n }\n }\n\n // Compare release numbers\n const release1 = parsed1.releaseString || '';\n const release2 = parsed2.releaseString || '';\n\n // If one has a release number and the other doesn't, the one with release number is greater\n if (release1 && !release2) {\n return 1;\n }\n if (!release1 && release2) {\n return -1;\n }\n\n // If both have release numbers or neither has release numbers, compare them\n const releaseCompare = this._compareVersionParts(\n release1 || '0',\n release2 || '0',\n );\n return releaseCompare;\n }\n\n /**\n * Compare version parts using APK's version comparison rules\n */\n private _compareVersionParts(v1: string, v2: string): number {\n if (v1 === v2) {\n return 0;\n }\n const matchesv1 = v1.match(alphaNumRegex)!;\n const matchesv2 = v2.match(alphaNumRegex)!;\n const matches = Math.min(matchesv1.length, matchesv2.length);\n\n for (let i = 0; i < matches; i++) {\n const matchv1 = matchesv1[i];\n const matchv2 = matchesv2[i];\n\n if (matchv1 && regEx(/^\\d+$/).test(matchv1)) {\n if (!matchv2 || !regEx(/^\\d+$/).test(matchv2)) {\n return 1;\n }\n const num1 = parseInt(matchv1, 10);\n const num2 = parseInt(matchv2, 10);\n if (num1 !== num2) {\n return num1 - num2;\n }\n } else if (matchv2 && regEx(/^\\d+$/).test(matchv2)) {\n return -1;\n } else if (matchv1 !== matchv2) {\n return matchv1.localeCompare(matchv2);\n }\n }\n\n if (matchesv1.length !== matchesv2.length) {\n const maxLength = Math.max(matchesv1.length, matchesv2.length);\n for (let i = matches; i < maxLength; i++) {\n const matchv1 = matchesv1[i];\n const matchv2 = matchesv2[i];\n\n if (matchv1 && regEx(/^\\d+$/).test(matchv1)) {\n return 1;\n }\n if (matchv2 && regEx(/^\\d+$/).test(matchv2)) {\n return -1;\n }\n if (matchv1) {\n return -1;\n }\n return 1;\n }\n }\n\n return 0;\n }\n\n override isValid(version: string): boolean {\n if (!version) {\n return false;\n }\n // Strip any operators (=, >, <, ~) before validation\n const cleanVersion = version.replace(regEx(/^[=><~][=]?/), '');\n const parsed = this._parse(cleanVersion);\n return parsed !== null;\n }\n\n override isSingleVersion(version: string): boolean {\n if (!version) {\n return false;\n }\n // Range constraints (>, >=, <, <=, ~) are not single versions\n if (regEx(/^[><~]/).test(version)) {\n return false;\n }\n // Exact versions (starting with = or no operator) are single versions\n return this.isValid(version);\n }\n\n override isStable(version: string): boolean {\n if (!version) {\n return false;\n }\n // Strip any operators (=, >, <, ~) before checking stability\n const cleanVersion = version.replace(regEx(/^[=><~][=]?/), '');\n const parsed = this._parse(cleanVersion);\n if (!parsed) {\n return false;\n }\n // Consider versions without prerelease identifiers as stable\n return !parsed.prerelease;\n }\n\n override getSatisfyingVersion(\n versions: string[],\n range: string,\n ): string | null {\n // Handle range expressions like >5.2.37-r0, <5.2.37-r0, ~5.2.37-r0, etc.\n const rangeMatch = regEx(/^([><=~]+)(.+)$/).exec(range);\n if (!rangeMatch) {\n // If no range operator, look for exact match\n return versions.find((v) => this.equals(v, range)) ?? null;\n }\n\n const [, operator, targetVersion] = rangeMatch;\n\n // Filter versions that satisfy the range\n const satisfyingVersions = versions.filter((version) => {\n if (!this.isValid(version) || !this.isValid(targetVersion)) {\n return false;\n }\n\n switch (operator) {\n case '>':\n return this.isGreaterThan(version, targetVersion);\n case '>=':\n return (\n this.isGreaterThan(version, targetVersion) ||\n this.equals(version, targetVersion)\n );\n case '<':\n return this.isLessThanRange(version, targetVersion);\n case '<=':\n return (\n this.isLessThanRange(version, targetVersion) ||\n this.equals(version, targetVersion)\n );\n case '=':\n case '==':\n return this.equals(version, targetVersion);\n case '~': {\n const targetParsed = this._parse(targetVersion)!;\n const versionParsed = this._parse(version)!;\n\n // Must have same major and minor versions\n if (\n targetParsed.release[0] !== versionParsed.release[0] ||\n targetParsed.release[1] !== versionParsed.release[1]\n ) {\n return false;\n }\n\n // Version must be >= target\n return (\n this.isGreaterThan(version, targetVersion) ||\n this.equals(version, targetVersion)\n );\n }\n }\n // Fallback for unhandled operator combinations like >>, <>, ><, ~~~\n // These match the regex but aren't semantically valid APK range operators\n return false;\n });\n\n if (satisfyingVersions.length === 0) {\n return null;\n }\n\n // Return the highest satisfying version\n return satisfyingVersions.sort((a, b) => this.sortVersions(b, a))[0];\n }\n\n override getMajor(version: string): number | null {\n if (!version) {\n return null;\n }\n // Strip any operators (=, >, <, ~) before parsing\n const cleanVersion = version.replace(regEx(/^[=><~][=]?/), '');\n const parsed = this._parse(cleanVersion);\n return parsed?.release[0] ?? null;\n }\n\n override getMinor(version: string): number | null {\n if (!version) {\n return null;\n }\n // Strip any operators (=, >, <, ~) before parsing\n const cleanVersion = version.replace(regEx(/^[=><~][=]?/), '');\n const parsed = this._parse(cleanVersion);\n return parsed?.release[1] ?? null;\n }\n\n override getPatch(version: string): number | null {\n if (!version) {\n return null;\n }\n // Strip any operators (=, >, <, ~) before parsing\n const cleanVersion = version.replace(regEx(/^[=><~][=]?/), '');\n const parsed = this._parse(cleanVersion);\n if (!parsed) {\n return null;\n }\n return parsed.release[2] ?? null;\n }\n\n override getNewValue({\n currentValue,\n newVersion,\n }: {\n currentValue: string;\n rangeStrategy?: string;\n currentVersion?: string;\n newVersion: string;\n }): string | null {\n // APK packages in apko.yaml only use exact versions\n // currentValue is stored without the = operator for cleaner PR display\n const hasRevision = regEx(/-r\\d+$/).test(currentValue);\n\n // If current version has no revision, strip revision from newVersion\n // This ensures both newValue and the displayed version are clean\n if (!hasRevision) {\n return newVersion.replace(regEx(/-r\\d+$/), '');\n }\n\n // If current version has revision, keep revision in newVersion\n return newVersion;\n }\n\n // Override to provide clean version for PR titles and display\n override sortVersions(a: string, b: string): number {\n // Strip = prefix if present for comparison\n const cleanA = a.replace(regEx(/^=/), '');\n const cleanB = b.replace(regEx(/^=/), '');\n return super.sortVersions(cleanA, cleanB);\n }\n}\n\nexport const api: VersioningApi = new ApkVersioningApi();\n\nexport default api;\n"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { regEx } from "../../../util/regex.js";
1
2
  import { isString } from "@sindresorhus/is";
2
3
  //#region lib/modules/versioning/bazel-module/bzlmod-version.ts
3
4
  /**
@@ -25,7 +26,7 @@ var Identifier = class Identifier {
25
26
  * Regular expression used to identify whether an identifier value only
26
27
  * contains digits.
27
28
  */
28
- static digitsOnlyMatcher = /^[0-9]+$/;
29
+ static digitsOnlyMatcher = regEx(/^[0-9]+$/);
29
30
  /**
30
31
  * @param value The value that is parsed for the Bazel module version parts.
31
32
  */
@@ -159,7 +160,7 @@ var BzlmodVersion = class BzlmodVersion {
159
160
  /**
160
161
  * The regular expression that identifies a valid Bazel module version.
161
162
  */
162
- static versionMatcher = /^(?<release>[a-zA-Z0-9.]+)(?:-(?<prerelease>[a-zA-Z0-9.-]+))?(?:\+(?<build>[a-zA-Z0-9.-]+))?$/;
163
+ static versionMatcher = regEx(/^(?<release>[a-zA-Z0-9.]+)(?:-(?<prerelease>[a-zA-Z0-9.-]+))?(?:\+(?<build>[a-zA-Z0-9.-]+))?$/);
163
164
  /**
164
165
  * @param version The string that is parsed for the Bazel module version
165
166
  * values.
@@ -1 +1 @@
1
- {"version":3,"file":"bzlmod-version.js","names":[],"sources":["../../../../lib/modules/versioning/bazel-module/bzlmod-version.ts"],"sourcesContent":["/**\n * @fileoverview Contains classes that represent a Bazel module version.\n */\nimport { isString } from '@sindresorhus/is';\n\n/**\n * Represents a single value in a VersionPart. For example, the version string\n * `1.2.3` has three identifiers: `1`, `2`, `3`.\n */\nexport class Identifier {\n /**\n * Returns the identifier as a string.\n */\n readonly asString: string;\n\n /**\n * If the identifier only contains digits, this is the numeric value.\n * Otherwise, it is `0`.\n */\n readonly asNumber: number;\n\n /**\n * Specifies whether the identifier only contains digits.\n */\n readonly isDigitsOnly: boolean;\n\n /**\n * Regular expression used to identify whether an identifier value only\n * contains digits.\n */\n static readonly digitsOnlyMatcher = /^[0-9]+$/;\n\n /**\n * @param value The value that is parsed for the Bazel module version parts.\n */\n constructor(value: string) {\n if (value === '') {\n throw new Error('Identifier value cannot be empty.');\n }\n this.asString = value;\n if (Identifier.digitsOnlyMatcher.test(value)) {\n this.isDigitsOnly = true;\n this.asNumber = parseInt(value, 10);\n } else {\n this.isDigitsOnly = false;\n this.asNumber = 0;\n }\n }\n\n /**\n * Determines whether this identifier and another identifier are equal.\n */\n equals(other: Identifier): boolean {\n return this.asString === other.asString;\n }\n\n /**\n * Determines whether this identifier comes before the other identifier.\n */\n isLessThan(other: Identifier): boolean {\n // This logic mirrors the comparison logic in\n // https://cs.opensource.google/bazel/bazel/+/refs/heads/master:src/main/java/com/google/devtools/build/lib/bazel/bzlmod/Version.java\n // isDigitsOnly: true first\n if (this.isDigitsOnly !== other.isDigitsOnly) {\n return this.isDigitsOnly;\n }\n if (this.asNumber !== other.asNumber) {\n return this.asNumber < other.asNumber;\n }\n return this.asString < other.asString;\n }\n}\n\n/**\n * A collection of {@link Identifier} values that represent a portion of a\n * Bazel module version.\n */\nexport class VersionPart extends Array<Identifier> {\n /**\n * Creates a {@link VersionPart} populated with the provided identifiers.\n */\n static create(...items: (Identifier | string)[]): VersionPart {\n const idents = items.map((item) => {\n if (isString(item)) {\n return new Identifier(item);\n }\n return item;\n });\n const vp = new VersionPart();\n vp.push(...idents);\n return vp;\n }\n\n /**\n * The string representation of the version part.\n */\n get asString(): string {\n return this.map((ident) => ident.asString).join('.');\n }\n\n /**\n * Specifies whether this contains any identifiers.\n */\n get isEmpty(): boolean {\n return this.length === 0;\n }\n\n /**\n * Returns the equivalent of the a Semver major value.\n */\n get major(): number {\n return this.length > 0 ? this[0].asNumber : 0;\n }\n\n /**\n * Returns the equivalent of the a Semver minor value.\n */\n get minor(): number {\n return this.length > 1 ? this[1].asNumber : 0;\n }\n\n /**\n * Returns the equivalent of the a Semver patch value.\n */\n get patch(): number {\n return this.length > 2 ? this[2].asNumber : 0;\n }\n\n /**\n * Determines whether this version part is equal to the other.\n */\n equals(other: VersionPart): boolean {\n if (this.length !== other.length) {\n return false;\n }\n for (let i = 0; i < this.length; i++) {\n const a = this[i];\n const b = other[i];\n if (!a.equals(b)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Determines whether this version part comes before the other.\n */\n isLessThan(other: VersionPart): boolean {\n // This logic mirrors the comparison logic in\n // https://cs.opensource.google/bazel/bazel/+/refs/heads/master:src/main/java/com/google/devtools/build/lib/bazel/bzlmod/Version.java\n if (this.equals(other)) {\n return false;\n }\n // Non-empty are first\n if (this.length === 0 && other.length !== 0) {\n return false;\n }\n if (other.length === 0 && this.length !== 0) {\n return true;\n }\n const shortestLen = this.length < other.length ? this.length : other.length;\n for (let i = 0; i < shortestLen; i++) {\n const a = this[i];\n const b = other[i];\n if (!a.equals(b)) {\n return a.isLessThan(b);\n }\n }\n return this.length < other.length;\n }\n}\n\n// Represents the capture groups produced by BzlmodVersion.versionMatcher.\ninterface VersionRegexResult {\n release: string;\n prerelease: string | undefined;\n build: string | undefined;\n}\n\n/**\n * Represents a version in the Bazel module system. The version format we support is\n * `RELEASE[-PRERELEASE][+BUILD]`, where `RELEASE`, `PRERELEASE`, and `BUILD` are\n * each a sequence of \"identifiers\" (defined as a non-empty sequence of ASCII alphanumerical\n * characters and hyphens) separated by dots. The `RELEASE` part may not contain hyphens.\n *\n * Otherwise, this format is identical to SemVer, especially in terms of the comparison algorithm\n * (https://semver.org/#spec-item-11). In other words, this format is intentionally looser than\n * SemVer; in particular:\n *\n * - the \"release\" part isn't limited to exactly 3 segments (major, minor, patch), but can be\n * fewer or more;\n * - each segment in the \"release\" part can be identifiers instead of just numbers (so letters\n * are also allowed -- although hyphens are not).\n *\n * Any valid SemVer version is a valid Bazel module version. Additionally, two SemVer versions\n * `a` and `b` compare `a < b` iff the same holds when they're compared as Bazel * module versions.\n *\n * The special \"empty string\" version can also be used, and compares higher than everything else.\n * It signifies that there is a NonRegistryOverride for a module.\n */\nexport class BzlmodVersion {\n readonly original: string;\n readonly release: VersionPart;\n readonly prerelease: VersionPart;\n readonly build: VersionPart;\n\n /**\n * The regular expression that identifies a valid Bazel module version.\n */\n static readonly versionMatcher =\n /^(?<release>[a-zA-Z0-9.]+)(?:-(?<prerelease>[a-zA-Z0-9.-]+))?(?:\\+(?<build>[a-zA-Z0-9.-]+))?$/;\n\n /**\n * @param version The string that is parsed for the Bazel module version\n * values.\n */\n constructor(version: string) {\n this.original = version;\n if (version === '') {\n this.release = VersionPart.create();\n this.prerelease = VersionPart.create();\n this.build = VersionPart.create();\n return;\n }\n const vparts: Partial<VersionRegexResult> | undefined =\n BzlmodVersion.versionMatcher.exec(version)?.groups;\n if (!vparts) {\n throw new Error(`Invalid Bazel module version: ${version}`);\n }\n // The regex check above ensures that we will have a release group.\n const rparts = vparts.release!.split('.');\n this.release = VersionPart.create(...rparts);\n const pparts = vparts.prerelease ? vparts.prerelease.split('.') : [];\n this.prerelease = VersionPart.create(...pparts);\n // Do not parse the build value. Treat it as a single value.\n const bparts = vparts.build ? [vparts.build] : [];\n this.build = VersionPart.create(...bparts);\n }\n\n /**\n * Specifies whether this is a pre-release version.\n */\n get isPrerelease(): boolean {\n return !this.prerelease.isEmpty;\n }\n\n // Comparison\n\n /**\n * Determines whether this Bazel module version is equal to the other.\n *\n * @param other The other version for the comparison.\n * @param ignoreBuild? If specified, determines whether the build value is\n * evaluated as part of the equality check. This is useful when\n * determining precedence.\n */\n equals(other: BzlmodVersion, ignoreBuild?: boolean): boolean {\n if (ignoreBuild) {\n return (\n this.release.equals(other.release) &&\n this.prerelease.equals(other.prerelease)\n );\n }\n return (\n this.release.equals(other.release) &&\n this.prerelease.equals(other.prerelease) &&\n this.build.equals(other.build)\n );\n }\n\n /**\n * Determines whether this Bazel module version comes before the other.\n */\n isLessThan(other: BzlmodVersion): boolean {\n // This logic mirrors the comparison logic in\n // https://cs.opensource.google/bazel/bazel/+/refs/heads/master:src/main/java/com/google/devtools/build/lib/bazel/bzlmod/Version.java\n if (this.release.isLessThan(other.release)) {\n return true;\n }\n // Ensure that prerelease is listed before regular releases\n if (this.isPrerelease && !other.isPrerelease) {\n return true;\n }\n if (this.prerelease.isLessThan(other.prerelease)) {\n return true;\n }\n // NOTE: We ignore the build value for precedence comparison per the Semver spec.\n // https://semver.org/#spec-item-10\n return false;\n }\n\n /**\n * Determines whether this Bazel module version comes after the other.\n */\n isGreaterThan(other: BzlmodVersion): boolean {\n return BzlmodVersion.defaultCompare(this, other) === 1;\n }\n\n /**\n * Evaluates two Bazel module versions and returns a value specifying whether\n * a < b (-1), a == b (0), or a > b (1).\n */\n static defaultCompare(a: BzlmodVersion, b: BzlmodVersion): number {\n if (a.equals(b, true)) {\n return 0;\n }\n if (a.isLessThan(b)) {\n return -1;\n }\n return 1;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"bzlmod-version.js","names":[],"sources":["../../../../lib/modules/versioning/bazel-module/bzlmod-version.ts"],"sourcesContent":["/**\n * @fileoverview Contains classes that represent a Bazel module version.\n */\nimport { isString } from '@sindresorhus/is';\nimport { regEx } from '../../../util/regex.ts';\n\n/**\n * Represents a single value in a VersionPart. For example, the version string\n * `1.2.3` has three identifiers: `1`, `2`, `3`.\n */\nexport class Identifier {\n /**\n * Returns the identifier as a string.\n */\n readonly asString: string;\n\n /**\n * If the identifier only contains digits, this is the numeric value.\n * Otherwise, it is `0`.\n */\n readonly asNumber: number;\n\n /**\n * Specifies whether the identifier only contains digits.\n */\n readonly isDigitsOnly: boolean;\n\n /**\n * Regular expression used to identify whether an identifier value only\n * contains digits.\n */\n static readonly digitsOnlyMatcher = regEx(/^[0-9]+$/);\n\n /**\n * @param value The value that is parsed for the Bazel module version parts.\n */\n constructor(value: string) {\n if (value === '') {\n throw new Error('Identifier value cannot be empty.');\n }\n this.asString = value;\n if (Identifier.digitsOnlyMatcher.test(value)) {\n this.isDigitsOnly = true;\n this.asNumber = parseInt(value, 10);\n } else {\n this.isDigitsOnly = false;\n this.asNumber = 0;\n }\n }\n\n /**\n * Determines whether this identifier and another identifier are equal.\n */\n equals(other: Identifier): boolean {\n return this.asString === other.asString;\n }\n\n /**\n * Determines whether this identifier comes before the other identifier.\n */\n isLessThan(other: Identifier): boolean {\n // This logic mirrors the comparison logic in\n // https://cs.opensource.google/bazel/bazel/+/refs/heads/master:src/main/java/com/google/devtools/build/lib/bazel/bzlmod/Version.java\n // isDigitsOnly: true first\n if (this.isDigitsOnly !== other.isDigitsOnly) {\n return this.isDigitsOnly;\n }\n if (this.asNumber !== other.asNumber) {\n return this.asNumber < other.asNumber;\n }\n return this.asString < other.asString;\n }\n}\n\n/**\n * A collection of {@link Identifier} values that represent a portion of a\n * Bazel module version.\n */\nexport class VersionPart extends Array<Identifier> {\n /**\n * Creates a {@link VersionPart} populated with the provided identifiers.\n */\n static create(...items: (Identifier | string)[]): VersionPart {\n const idents = items.map((item) => {\n if (isString(item)) {\n return new Identifier(item);\n }\n return item;\n });\n const vp = new VersionPart();\n vp.push(...idents);\n return vp;\n }\n\n /**\n * The string representation of the version part.\n */\n get asString(): string {\n return this.map((ident) => ident.asString).join('.');\n }\n\n /**\n * Specifies whether this contains any identifiers.\n */\n get isEmpty(): boolean {\n return this.length === 0;\n }\n\n /**\n * Returns the equivalent of the a Semver major value.\n */\n get major(): number {\n return this.length > 0 ? this[0].asNumber : 0;\n }\n\n /**\n * Returns the equivalent of the a Semver minor value.\n */\n get minor(): number {\n return this.length > 1 ? this[1].asNumber : 0;\n }\n\n /**\n * Returns the equivalent of the a Semver patch value.\n */\n get patch(): number {\n return this.length > 2 ? this[2].asNumber : 0;\n }\n\n /**\n * Determines whether this version part is equal to the other.\n */\n equals(other: VersionPart): boolean {\n if (this.length !== other.length) {\n return false;\n }\n for (let i = 0; i < this.length; i++) {\n const a = this[i];\n const b = other[i];\n if (!a.equals(b)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Determines whether this version part comes before the other.\n */\n isLessThan(other: VersionPart): boolean {\n // This logic mirrors the comparison logic in\n // https://cs.opensource.google/bazel/bazel/+/refs/heads/master:src/main/java/com/google/devtools/build/lib/bazel/bzlmod/Version.java\n if (this.equals(other)) {\n return false;\n }\n // Non-empty are first\n if (this.length === 0 && other.length !== 0) {\n return false;\n }\n if (other.length === 0 && this.length !== 0) {\n return true;\n }\n const shortestLen = this.length < other.length ? this.length : other.length;\n for (let i = 0; i < shortestLen; i++) {\n const a = this[i];\n const b = other[i];\n if (!a.equals(b)) {\n return a.isLessThan(b);\n }\n }\n return this.length < other.length;\n }\n}\n\n// Represents the capture groups produced by BzlmodVersion.versionMatcher.\ninterface VersionRegexResult {\n release: string;\n prerelease: string | undefined;\n build: string | undefined;\n}\n\n/**\n * Represents a version in the Bazel module system. The version format we support is\n * `RELEASE[-PRERELEASE][+BUILD]`, where `RELEASE`, `PRERELEASE`, and `BUILD` are\n * each a sequence of \"identifiers\" (defined as a non-empty sequence of ASCII alphanumerical\n * characters and hyphens) separated by dots. The `RELEASE` part may not contain hyphens.\n *\n * Otherwise, this format is identical to SemVer, especially in terms of the comparison algorithm\n * (https://semver.org/#spec-item-11). In other words, this format is intentionally looser than\n * SemVer; in particular:\n *\n * - the \"release\" part isn't limited to exactly 3 segments (major, minor, patch), but can be\n * fewer or more;\n * - each segment in the \"release\" part can be identifiers instead of just numbers (so letters\n * are also allowed -- although hyphens are not).\n *\n * Any valid SemVer version is a valid Bazel module version. Additionally, two SemVer versions\n * `a` and `b` compare `a < b` iff the same holds when they're compared as Bazel * module versions.\n *\n * The special \"empty string\" version can also be used, and compares higher than everything else.\n * It signifies that there is a NonRegistryOverride for a module.\n */\nexport class BzlmodVersion {\n readonly original: string;\n readonly release: VersionPart;\n readonly prerelease: VersionPart;\n readonly build: VersionPart;\n\n /**\n * The regular expression that identifies a valid Bazel module version.\n */\n static readonly versionMatcher = regEx(\n /^(?<release>[a-zA-Z0-9.]+)(?:-(?<prerelease>[a-zA-Z0-9.-]+))?(?:\\+(?<build>[a-zA-Z0-9.-]+))?$/,\n );\n\n /**\n * @param version The string that is parsed for the Bazel module version\n * values.\n */\n constructor(version: string) {\n this.original = version;\n if (version === '') {\n this.release = VersionPart.create();\n this.prerelease = VersionPart.create();\n this.build = VersionPart.create();\n return;\n }\n const vparts: Partial<VersionRegexResult> | undefined =\n BzlmodVersion.versionMatcher.exec(version)?.groups;\n if (!vparts) {\n throw new Error(`Invalid Bazel module version: ${version}`);\n }\n // The regex check above ensures that we will have a release group.\n const rparts = vparts.release!.split('.');\n this.release = VersionPart.create(...rparts);\n const pparts = vparts.prerelease ? vparts.prerelease.split('.') : [];\n this.prerelease = VersionPart.create(...pparts);\n // Do not parse the build value. Treat it as a single value.\n const bparts = vparts.build ? [vparts.build] : [];\n this.build = VersionPart.create(...bparts);\n }\n\n /**\n * Specifies whether this is a pre-release version.\n */\n get isPrerelease(): boolean {\n return !this.prerelease.isEmpty;\n }\n\n // Comparison\n\n /**\n * Determines whether this Bazel module version is equal to the other.\n *\n * @param other The other version for the comparison.\n * @param ignoreBuild? If specified, determines whether the build value is\n * evaluated as part of the equality check. This is useful when\n * determining precedence.\n */\n equals(other: BzlmodVersion, ignoreBuild?: boolean): boolean {\n if (ignoreBuild) {\n return (\n this.release.equals(other.release) &&\n this.prerelease.equals(other.prerelease)\n );\n }\n return (\n this.release.equals(other.release) &&\n this.prerelease.equals(other.prerelease) &&\n this.build.equals(other.build)\n );\n }\n\n /**\n * Determines whether this Bazel module version comes before the other.\n */\n isLessThan(other: BzlmodVersion): boolean {\n // This logic mirrors the comparison logic in\n // https://cs.opensource.google/bazel/bazel/+/refs/heads/master:src/main/java/com/google/devtools/build/lib/bazel/bzlmod/Version.java\n if (this.release.isLessThan(other.release)) {\n return true;\n }\n // Ensure that prerelease is listed before regular releases\n if (this.isPrerelease && !other.isPrerelease) {\n return true;\n }\n if (this.prerelease.isLessThan(other.prerelease)) {\n return true;\n }\n // NOTE: We ignore the build value for precedence comparison per the Semver spec.\n // https://semver.org/#spec-item-10\n return false;\n }\n\n /**\n * Determines whether this Bazel module version comes after the other.\n */\n isGreaterThan(other: BzlmodVersion): boolean {\n return BzlmodVersion.defaultCompare(this, other) === 1;\n }\n\n /**\n * Evaluates two Bazel module versions and returns a value specifying whether\n * a < b (-1), a == b (0), or a > b (1).\n */\n static defaultCompare(a: BzlmodVersion, b: BzlmodVersion): number {\n if (a.equals(b, true)) {\n return 0;\n }\n if (a.isLessThan(b)) {\n return -1;\n }\n return 1;\n }\n}\n"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { regEx } from "../../../util/regex.js";
1
2
  import { BzlmodVersion } from "./bzlmod-version.js";
2
3
  import { isNullOrUndefined } from "@sindresorhus/is";
3
4
  //#region lib/modules/versioning/bazel-module/index.ts
@@ -65,7 +66,7 @@ function minSatisfyingVersion(versions, range) {
65
66
  * `rangeStrategy` option, and the current and new version.
66
67
  */
67
68
  function getNewValue({ currentValue, currentVersion, newVersion }) {
68
- if (currentVersion === `v${currentValue}`) return newVersion.replace(/^v/, "");
69
+ if (currentVersion === `v${currentValue}`) return newVersion.replace(regEx(/^v/), "");
69
70
  return newVersion;
70
71
  }
71
72
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/bazel-module/index.ts"],"sourcesContent":["import { isNullOrUndefined } from '@sindresorhus/is';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\nimport { BzlmodVersion } from './bzlmod-version.ts';\n\nexport const id = 'bazel-module';\nexport const displayName = 'Bazel Module';\nexport const urls = ['[Bazel modules](https://bazel.build/external/module)'];\nexport const supportsRanges = false;\n\nfunction getBzlmodVersion(version: string): BzlmodVersion {\n return new BzlmodVersion(version);\n}\n\nfunction getMajor(version: string): null | number {\n return getBzlmodVersion(version).release.major;\n}\n\nfunction getMinor(version: string): null | number {\n return getBzlmodVersion(version).release.minor;\n}\n\nfunction getPatch(version: string): null | number {\n return getBzlmodVersion(version).release.patch;\n}\n\n/**\n * Check whether `version` and `other` are logically equivalent, even if\n * they're not the exact same string.\n *\n * For example, with Semver the build metadata should be ignored when comparing.\n */\nfunction equals(version: string, other: string): boolean {\n const abv = new BzlmodVersion(version);\n const bbv = new BzlmodVersion(other);\n return abv.equals(bbv);\n}\n\n/**\n * Check whether `version` is \"greater\" than the `other` version.\n */\nfunction isGreaterThan(version: string, other: string): boolean {\n const abv = new BzlmodVersion(version);\n const bbv = new BzlmodVersion(other);\n return abv.isGreaterThan(bbv);\n}\n\n/**\n * Check whether the `version` is \"less\" than all the versions possible in\n * the `range`.\n */\nfunction isLessThanRange(version: string, range: string): boolean {\n const abv = new BzlmodVersion(version);\n const bbv = new BzlmodVersion(range);\n return abv.isLessThan(bbv);\n}\n\n/**\n * Select the highest version from `versions` that is within the given\n * `range` constraint, or return `null` if there is no matching version.\n */\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n const target = new BzlmodVersion(range);\n const result = versions.find((ver) => {\n const bv = new BzlmodVersion(ver);\n return target.equals(bv);\n });\n return result ? range : null;\n}\n\n/**\n * Select the lowest version from `versions` that is within the given\n * `range` constraint, or return `null` if there is no matching version.\n */\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return getSatisfyingVersion(versions, range);\n}\n\n/**\n * Calculate a new version constraint based on the current constraint, the\n * `rangeStrategy` option, and the current and new version.\n */\nfunction getNewValue({\n currentValue,\n currentVersion,\n newVersion,\n}: NewValueConfig): string {\n if (currentVersion === `v${currentValue}`) {\n return newVersion.replace(/^v/, '');\n }\n return newVersion;\n}\n\n/**\n * Compare two versions. Return `0` if `v1 == v2`, or `1` if `v1` is\n * greater, or `-1` if `v2` is greater.\n */\nfunction sortVersions(version: string, other: string): number {\n const abv = new BzlmodVersion(version);\n const bbv = new BzlmodVersion(other);\n return BzlmodVersion.defaultCompare(abv, bbv);\n}\n\n/**\n * Check whether the `version` satisfies the `range` constraint.\n */\nfunction matches(version: string, range: string): boolean {\n return equals(version, range);\n}\n\n/**\n * Check whether the `version` is compatible with the `current` value\n * constraint.\n */\nfunction isCompatible(version: string, _current?: string): boolean {\n return isValid(version);\n}\n\n/**\n * Check whether the `version` constraint is not a range, i.e. it only allows a\n * single specific version.\n */\nfunction isSingleVersion(version: string): boolean {\n return isValid(version);\n}\n\n/**\n * Check whether the `version` is considered to be \"stable\".\n *\n * Example: in SemVer the version must not have a pre-release marker.\n */\nfunction isStable(version: string): boolean {\n const abv = new BzlmodVersion(version);\n return !abv.isPrerelease;\n}\n\n/**\n * Check whether the `input` is a valid version or a valid version range constraint.\n */\nfunction isValid(input: string): boolean {\n try {\n new BzlmodVersion(input);\n } catch {\n return false;\n }\n return true;\n}\n\n/**\n * Check whether the `input` is a valid version string.\n */\nfunction isVersion(input: string | undefined | null): boolean {\n if (isNullOrUndefined(input)) {\n return false;\n }\n return isValid(input);\n}\n\nexport const api: VersioningApi = {\n equals,\n getMajor,\n getMinor,\n getPatch,\n isCompatible,\n isGreaterThan,\n isLessThanRange,\n isSingleVersion,\n isStable,\n isValid,\n isVersion,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n getNewValue,\n sortVersions,\n};\nexport default api;\n"],"mappings":";;;AAIA,MAAa,KAAK;AAKlB,SAAS,iBAAiB,SAAgC;CACxD,OAAO,IAAI,cAAc,OAAO;AAClC;AAEA,SAAS,SAAS,SAAgC;CAChD,OAAO,iBAAiB,OAAO,CAAC,CAAC,QAAQ;AAC3C;AAEA,SAAS,SAAS,SAAgC;CAChD,OAAO,iBAAiB,OAAO,CAAC,CAAC,QAAQ;AAC3C;AAEA,SAAS,SAAS,SAAgC;CAChD,OAAO,iBAAiB,OAAO,CAAC,CAAC,QAAQ;AAC3C;;;;;;;AAQA,SAAS,OAAO,SAAiB,OAAwB;CACvD,MAAM,MAAM,IAAI,cAAc,OAAO;CACrC,MAAM,MAAM,IAAI,cAAc,KAAK;CACnC,OAAO,IAAI,OAAO,GAAG;AACvB;;;;AAKA,SAAS,cAAc,SAAiB,OAAwB;CAC9D,MAAM,MAAM,IAAI,cAAc,OAAO;CACrC,MAAM,MAAM,IAAI,cAAc,KAAK;CACnC,OAAO,IAAI,cAAc,GAAG;AAC9B;;;;;AAMA,SAAS,gBAAgB,SAAiB,OAAwB;CAChE,MAAM,MAAM,IAAI,cAAc,OAAO;CACrC,MAAM,MAAM,IAAI,cAAc,KAAK;CACnC,OAAO,IAAI,WAAW,GAAG;AAC3B;;;;;AAMA,SAAS,qBACP,UACA,OACe;CACf,MAAM,SAAS,IAAI,cAAc,KAAK;CAKtC,OAJe,SAAS,MAAM,QAAQ;EACpC,MAAM,KAAK,IAAI,cAAc,GAAG;EAChC,OAAO,OAAO,OAAO,EAAE;CACzB,CACY,IAAI,QAAQ;AAC1B;;;;;AAMA,SAAS,qBACP,UACA,OACe;CACf,OAAO,qBAAqB,UAAU,KAAK;AAC7C;;;;;AAMA,SAAS,YAAY,EACnB,cACA,gBACA,cACyB;CACzB,IAAI,mBAAmB,IAAI,gBACzB,OAAO,WAAW,QAAQ,MAAM,EAAE;CAEpC,OAAO;AACT;;;;;AAMA,SAAS,aAAa,SAAiB,OAAuB;CAC5D,MAAM,MAAM,IAAI,cAAc,OAAO;CACrC,MAAM,MAAM,IAAI,cAAc,KAAK;CACnC,OAAO,cAAc,eAAe,KAAK,GAAG;AAC9C;;;;AAKA,SAAS,QAAQ,SAAiB,OAAwB;CACxD,OAAO,OAAO,SAAS,KAAK;AAC9B;;;;;AAMA,SAAS,aAAa,SAAiB,UAA4B;CACjE,OAAO,QAAQ,OAAO;AACxB;;;;;AAMA,SAAS,gBAAgB,SAA0B;CACjD,OAAO,QAAQ,OAAO;AACxB;;;;;;AAOA,SAAS,SAAS,SAA0B;CAE1C,OAAO,CAAC,IADQ,cAAc,OACpB,CAAC,CAAC;AACd;;;;AAKA,SAAS,QAAQ,OAAwB;CACvC,IAAI;EACF,IAAI,cAAc,KAAK;CACzB,QAAQ;EACN,OAAO;CACT;CACA,OAAO;AACT;;;;AAKA,SAAS,UAAU,OAA2C;CAC5D,IAAI,kBAAkB,KAAK,GACzB,OAAO;CAET,OAAO,QAAQ,KAAK;AACtB;AAEA,MAAa,MAAqB;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/bazel-module/index.ts"],"sourcesContent":["import { isNullOrUndefined } from '@sindresorhus/is';\nimport { regEx } from '../../../util/regex.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\nimport { BzlmodVersion } from './bzlmod-version.ts';\n\nexport const id = 'bazel-module';\nexport const displayName = 'Bazel Module';\nexport const urls = ['[Bazel modules](https://bazel.build/external/module)'];\nexport const supportsRanges = false;\n\nfunction getBzlmodVersion(version: string): BzlmodVersion {\n return new BzlmodVersion(version);\n}\n\nfunction getMajor(version: string): null | number {\n return getBzlmodVersion(version).release.major;\n}\n\nfunction getMinor(version: string): null | number {\n return getBzlmodVersion(version).release.minor;\n}\n\nfunction getPatch(version: string): null | number {\n return getBzlmodVersion(version).release.patch;\n}\n\n/**\n * Check whether `version` and `other` are logically equivalent, even if\n * they're not the exact same string.\n *\n * For example, with Semver the build metadata should be ignored when comparing.\n */\nfunction equals(version: string, other: string): boolean {\n const abv = new BzlmodVersion(version);\n const bbv = new BzlmodVersion(other);\n return abv.equals(bbv);\n}\n\n/**\n * Check whether `version` is \"greater\" than the `other` version.\n */\nfunction isGreaterThan(version: string, other: string): boolean {\n const abv = new BzlmodVersion(version);\n const bbv = new BzlmodVersion(other);\n return abv.isGreaterThan(bbv);\n}\n\n/**\n * Check whether the `version` is \"less\" than all the versions possible in\n * the `range`.\n */\nfunction isLessThanRange(version: string, range: string): boolean {\n const abv = new BzlmodVersion(version);\n const bbv = new BzlmodVersion(range);\n return abv.isLessThan(bbv);\n}\n\n/**\n * Select the highest version from `versions` that is within the given\n * `range` constraint, or return `null` if there is no matching version.\n */\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n const target = new BzlmodVersion(range);\n const result = versions.find((ver) => {\n const bv = new BzlmodVersion(ver);\n return target.equals(bv);\n });\n return result ? range : null;\n}\n\n/**\n * Select the lowest version from `versions` that is within the given\n * `range` constraint, or return `null` if there is no matching version.\n */\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return getSatisfyingVersion(versions, range);\n}\n\n/**\n * Calculate a new version constraint based on the current constraint, the\n * `rangeStrategy` option, and the current and new version.\n */\nfunction getNewValue({\n currentValue,\n currentVersion,\n newVersion,\n}: NewValueConfig): string {\n if (currentVersion === `v${currentValue}`) {\n return newVersion.replace(regEx(/^v/), '');\n }\n return newVersion;\n}\n\n/**\n * Compare two versions. Return `0` if `v1 == v2`, or `1` if `v1` is\n * greater, or `-1` if `v2` is greater.\n */\nfunction sortVersions(version: string, other: string): number {\n const abv = new BzlmodVersion(version);\n const bbv = new BzlmodVersion(other);\n return BzlmodVersion.defaultCompare(abv, bbv);\n}\n\n/**\n * Check whether the `version` satisfies the `range` constraint.\n */\nfunction matches(version: string, range: string): boolean {\n return equals(version, range);\n}\n\n/**\n * Check whether the `version` is compatible with the `current` value\n * constraint.\n */\nfunction isCompatible(version: string, _current?: string): boolean {\n return isValid(version);\n}\n\n/**\n * Check whether the `version` constraint is not a range, i.e. it only allows a\n * single specific version.\n */\nfunction isSingleVersion(version: string): boolean {\n return isValid(version);\n}\n\n/**\n * Check whether the `version` is considered to be \"stable\".\n *\n * Example: in SemVer the version must not have a pre-release marker.\n */\nfunction isStable(version: string): boolean {\n const abv = new BzlmodVersion(version);\n return !abv.isPrerelease;\n}\n\n/**\n * Check whether the `input` is a valid version or a valid version range constraint.\n */\nfunction isValid(input: string): boolean {\n try {\n new BzlmodVersion(input);\n } catch {\n return false;\n }\n return true;\n}\n\n/**\n * Check whether the `input` is a valid version string.\n */\nfunction isVersion(input: string | undefined | null): boolean {\n if (isNullOrUndefined(input)) {\n return false;\n }\n return isValid(input);\n}\n\nexport const api: VersioningApi = {\n equals,\n getMajor,\n getMinor,\n getPatch,\n isCompatible,\n isGreaterThan,\n isLessThanRange,\n isSingleVersion,\n isStable,\n isValid,\n isVersion,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n getNewValue,\n sortVersions,\n};\nexport default api;\n"],"mappings":";;;;AAKA,MAAa,KAAK;AAKlB,SAAS,iBAAiB,SAAgC;CACxD,OAAO,IAAI,cAAc,OAAO;AAClC;AAEA,SAAS,SAAS,SAAgC;CAChD,OAAO,iBAAiB,OAAO,CAAC,CAAC,QAAQ;AAC3C;AAEA,SAAS,SAAS,SAAgC;CAChD,OAAO,iBAAiB,OAAO,CAAC,CAAC,QAAQ;AAC3C;AAEA,SAAS,SAAS,SAAgC;CAChD,OAAO,iBAAiB,OAAO,CAAC,CAAC,QAAQ;AAC3C;;;;;;;AAQA,SAAS,OAAO,SAAiB,OAAwB;CACvD,MAAM,MAAM,IAAI,cAAc,OAAO;CACrC,MAAM,MAAM,IAAI,cAAc,KAAK;CACnC,OAAO,IAAI,OAAO,GAAG;AACvB;;;;AAKA,SAAS,cAAc,SAAiB,OAAwB;CAC9D,MAAM,MAAM,IAAI,cAAc,OAAO;CACrC,MAAM,MAAM,IAAI,cAAc,KAAK;CACnC,OAAO,IAAI,cAAc,GAAG;AAC9B;;;;;AAMA,SAAS,gBAAgB,SAAiB,OAAwB;CAChE,MAAM,MAAM,IAAI,cAAc,OAAO;CACrC,MAAM,MAAM,IAAI,cAAc,KAAK;CACnC,OAAO,IAAI,WAAW,GAAG;AAC3B;;;;;AAMA,SAAS,qBACP,UACA,OACe;CACf,MAAM,SAAS,IAAI,cAAc,KAAK;CAKtC,OAJe,SAAS,MAAM,QAAQ;EACpC,MAAM,KAAK,IAAI,cAAc,GAAG;EAChC,OAAO,OAAO,OAAO,EAAE;CACzB,CACY,IAAI,QAAQ;AAC1B;;;;;AAMA,SAAS,qBACP,UACA,OACe;CACf,OAAO,qBAAqB,UAAU,KAAK;AAC7C;;;;;AAMA,SAAS,YAAY,EACnB,cACA,gBACA,cACyB;CACzB,IAAI,mBAAmB,IAAI,gBACzB,OAAO,WAAW,QAAQ,MAAM,IAAI,GAAG,EAAE;CAE3C,OAAO;AACT;;;;;AAMA,SAAS,aAAa,SAAiB,OAAuB;CAC5D,MAAM,MAAM,IAAI,cAAc,OAAO;CACrC,MAAM,MAAM,IAAI,cAAc,KAAK;CACnC,OAAO,cAAc,eAAe,KAAK,GAAG;AAC9C;;;;AAKA,SAAS,QAAQ,SAAiB,OAAwB;CACxD,OAAO,OAAO,SAAS,KAAK;AAC9B;;;;;AAMA,SAAS,aAAa,SAAiB,UAA4B;CACjE,OAAO,QAAQ,OAAO;AACxB;;;;;AAMA,SAAS,gBAAgB,SAA0B;CACjD,OAAO,QAAQ,OAAO;AACxB;;;;;;AAOA,SAAS,SAAS,SAA0B;CAE1C,OAAO,CAAC,IADQ,cAAc,OACpB,CAAC,CAAC;AACd;;;;AAKA,SAAS,QAAQ,OAAwB;CACvC,IAAI;EACF,IAAI,cAAc,KAAK;CACzB,QAAQ;EACN,OAAO;CACT;CACA,OAAO;AACT;;;;AAKA,SAAS,UAAU,OAA2C;CAC5D,IAAI,kBAAkB,KAAK,GACzB,OAAO;CAET,OAAO,QAAQ,KAAK;AACtB;AAEA,MAAa,MAAqB;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
@@ -53,7 +53,7 @@ function calculateSatisfyingVersionIntenal(versions, range, minMode) {
53
53
  * @returns If input contains the specific patch, it returns the input with removed the patch and true, otherwise it retunrs the same string and false.
54
54
  */
55
55
  function removeComposerSpecificPatchPart(input) {
56
- const match = /^v?\d+(\.\d+(\.\d+(\.\d+)?)?)?(?<suffix>-p[1-9]\d*)$/gi.exec(input);
56
+ const match = regEx(/^v?\d+(\.\d+(\.\d+(\.\d+)?)?)?(?<suffix>-p[1-9]\d*)$/gi).exec(input);
57
57
  return match ? [input.replace(match.groups.suffix, ""), true] : [input, false];
58
58
  }
59
59
  function composer2npm(input) {
@@ -67,7 +67,7 @@ function composer2npm(input) {
67
67
  output = output.replace(regEx(/(?:^|\s)~(0\.[1-9][0-9]*)(?: |$)/g), ">=$1 <1");
68
68
  output = output.replace(regEx(/^(<\d+(\.\d+)?)$/g), "$1.0").replace(regEx(/^(<\d+(\.\d+)?)$/g), "$1.0");
69
69
  return output + stability;
70
- }).map((part) => part.replace(/([a-z])([0-9])/gi, "$1.$2")).join(" || ");
70
+ }).map((part) => part.replace(regEx(/([a-z])([0-9])/gi), "$1.$2")).join(" || ");
71
71
  }
72
72
  function equals(a, b) {
73
73
  return api$1.equals(composer2npm(a), composer2npm(b));
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["npm"],"sources":["../../../../lib/modules/versioning/composer/index.ts"],"sourcesContent":["import { isNumber } from '@sindresorhus/is';\nimport semver from 'semver';\nimport { parseRange } from 'semver-utils';\nimport { logger } from '../../../logger/index.ts';\nimport type { RangeStrategy } from '../../../types/versioning.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { api as npm } from '../npm/index.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\n\nexport const id = 'composer';\nexport const displayName = 'Composer';\nexport const urls = [\n '[Composer versions](https://getcomposer.org/doc/articles/versions.md)',\n '[composer/semver package](https://packagist.org/packages/composer/semver)',\n '[Tilde and caret constraints](https://madewithlove.be/tilde-and-caret-constraints/)',\n '[Composer semver checker](https://semver.mwl.be)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = [\n 'bump',\n 'widen',\n 'replace',\n 'update-lockfile',\n];\n\nfunction getVersionParts(input: string): [string, string] {\n const versionParts = input.split('-');\n if (versionParts.length === 1) {\n return [input, ''];\n }\n\n return [versionParts[0], `-${versionParts[1]}`];\n}\n\nfunction padZeroes(input: string): string {\n const [output, stability] = getVersionParts(input);\n\n const sections = output.split('.');\n while (sections.length < 3) {\n sections.push('0');\n }\n return `${sections.join('.')}${stability}`;\n}\n\nfunction convertStabilityModifier(input: string): string {\n // Handle stability modifiers.\n const versionParts = input.split('@');\n if (versionParts.length === 1) {\n return input;\n }\n\n // 1.0@beta2 to 1.0-beta.2\n const stability = versionParts[1].replace(\n regEx(/(?:^|\\s)(beta|alpha|rc)([1-9][0-9]*)(?: |$)/gi),\n '$1.$2',\n );\n\n // If there is a stability part, npm semver expects the version\n // to be full\n return `${padZeroes(versionParts[0])}-${stability}`;\n}\n\nfunction normalizeVersion(input: string): string {\n let output = input;\n // Strip leading + prefix (not a valid composer constraint operator)\n output = output.replace(regEx(/^\\+/), '');\n output = output.replace(regEx(/(^|>|>=|\\^|~)v/i), '$1');\n return convertStabilityModifier(output);\n}\n\n/**\n * @param versions Version list in any format, it recognizes the specific patch format x.x.x-pXX\n * @param range Range in composer format\n * @param minMode If true, it will calculate minSatisfyingVersion, if false, it calculates the maxSatisfyingVersion\n * @returns min or max satisfyingVersion from the input\n */\nfunction calculateSatisfyingVersionIntenal(\n versions: string[],\n range: string,\n minMode: boolean,\n): string | null {\n // Because composer -p versions are considered stable, we have to remove the suffix for the npm.XXX functions.\n const versionsMapped = versions.map((x) => {\n return {\n origianl: x,\n cleaned: removeComposerSpecificPatchPart(x),\n npmVariant: composer2npm(removeComposerSpecificPatchPart(x)[0]),\n };\n });\n\n const npmVersions = versionsMapped.map((x) => x.npmVariant);\n const npmVersion = minMode\n ? npm.minSatisfyingVersion(npmVersions, composer2npm(range))\n : npm.getSatisfyingVersion(npmVersions, composer2npm(range));\n\n if (!npmVersion) {\n return null;\n }\n\n // After we find the npm versions, we select from them back in the mapping the possible patches.\n const candidates = versionsMapped\n .filter((x) => x.npmVariant === npmVersion)\n .sort((a, b) => (minMode ? 1 : -1) * sortVersions(a.origianl, b.origianl));\n\n return candidates[0].origianl;\n}\n\n/**\n * @param intput Version in any format, it recognizes the specific patch format x.x.x-pXX\n * @returns If input contains the specific patch, it returns the input with removed the patch and true, otherwise it retunrs the same string and false.\n */\nfunction removeComposerSpecificPatchPart(input: string): [string, boolean] {\n // the regex is based on the original from composer implementation https://github.com/composer/semver/blob/fa1ec24f0ab1efe642671ec15c51a3ab879f59bf/src/VersionParser.php#L137\n const pattern = /^v?\\d+(\\.\\d+(\\.\\d+(\\.\\d+)?)?)?(?<suffix>-p[1-9]\\d*)$/gi;\n const match = pattern.exec(input);\n\n return match\n ? [input.replace(match.groups!.suffix, ''), true]\n : [input, false];\n}\n\nfunction composer2npm(input: string): string {\n return input\n .split(regEx(/\\s*\\|\\|?\\s*/g))\n .map((part): string => {\n const cleanInput = normalizeVersion(part);\n if (npm.isVersion(cleanInput)) {\n return cleanInput;\n }\n if (npm.isVersion(padZeroes(cleanInput))) {\n return padZeroes(cleanInput);\n }\n const [versionId, stability] = getVersionParts(cleanInput);\n let output = versionId;\n\n // ~4 to ^4 and ~4.1 to ^4.1\n output = output.replace(\n regEx(/(?:^|\\s)~([1-9][0-9]*(?:\\.[0-9]*)?)(?: |$)/g),\n '^$1',\n );\n // ~0.4 to >=0.4 <1\n output = output.replace(\n regEx(/(?:^|\\s)~(0\\.[1-9][0-9]*)(?: |$)/g),\n '>=$1 <1',\n );\n\n // add extra digits to <8-DEV and <8.0-DEV\n output = output\n .replace(regEx(/^(<\\d+(\\.\\d+)?)$/g), '$1.0')\n .replace(regEx(/^(<\\d+(\\.\\d+)?)$/g), '$1.0');\n\n return output + stability;\n })\n .map((part) => part.replace(/([a-z])([0-9])/gi, '$1.$2'))\n .join(' || ');\n}\n\nfunction equals(a: string, b: string): boolean {\n return npm.equals(composer2npm(a), composer2npm(b));\n}\n\nfunction getMajor(version: string): number | null {\n const semverVersion = semver.coerce(composer2npm(version));\n return semverVersion ? npm.getMajor(semverVersion) : null;\n}\n\nfunction getMinor(version: string): number | null {\n const semverVersion = semver.coerce(composer2npm(version));\n return semverVersion ? npm.getMinor(semverVersion) : null;\n}\n\nfunction getPatch(version: string): number | null {\n const semverVersion = semver.coerce(composer2npm(version));\n\n // This returns only the numbers without the optional `-pXX` patch version supported by composer. Fixing that would require a bigger\n // refactoring, because the API supports only numbers.\n return semverVersion ? npm.getPatch(semverVersion) : null;\n}\n\nfunction isGreaterThan(a: string, b: string): boolean {\n return sortVersions(a, b) === 1;\n}\n\nfunction isLessThanRange(version: string, range: string): boolean {\n return !!npm.isLessThanRange?.(composer2npm(version), composer2npm(range));\n}\n\nfunction isSingleVersion(input: string): boolean {\n return !!input && npm.isSingleVersion(composer2npm(input));\n}\n\nfunction isStable(version: string): boolean {\n if (version) {\n // Composer considers patches `-pXX` as stable: https://github.com/composer/semver/blob/fa1ec24f0ab1efe642671ec15c51a3ab879f59bf/src/VersionParser.php#L568 but npm not.\n // In order to be able to use the standard npm.isStable function, we remove the potential patch version for the check.\n const [withoutPatch] = removeComposerSpecificPatchPart(version);\n return npm.isStable(composer2npm(withoutPatch));\n }\n\n return false;\n}\n\nexport function isValid(input: string): boolean {\n return !!input && npm.isValid(composer2npm(input));\n}\n\nexport function isVersion(input: string): boolean {\n return !!input && npm.isVersion(composer2npm(input));\n}\n\nfunction matches(version: string, range: string): boolean {\n return npm.matches(composer2npm(version), composer2npm(range));\n}\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return calculateSatisfyingVersionIntenal(versions, range, false);\n}\n\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return calculateSatisfyingVersionIntenal(versions, range, true);\n}\n\nfunction subset(subRange: string, superRange: string): boolean | undefined {\n try {\n return npm.subset!(composer2npm(subRange), composer2npm(superRange));\n } catch (err) {\n logger.trace({ err }, 'composer.subset error');\n return false;\n }\n}\n\nfunction intersects(subRange: string, superRange: string): boolean {\n try {\n return npm.intersects!(composer2npm(subRange), composer2npm(superRange));\n } catch (err) {\n logger.trace({ err }, 'composer.intersects error');\n return false;\n }\n}\n\nfunction getNewValue({\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n}: NewValueConfig): string | null {\n if (rangeStrategy === 'update-lockfile') {\n if (matches(newVersion, currentValue)) {\n return currentValue;\n }\n return getNewValue({\n currentValue,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n }\n const currentMajor = currentVersion ? getMajor(currentVersion) : null;\n const toMajor = getMajor(newVersion);\n const toMinor = getMinor(newVersion);\n let newValue: string | null = null;\n if (isVersion(currentValue)) {\n newValue = newVersion;\n } else if (regEx(/^[~^](0\\.[1-9][0-9]*)$/).test(currentValue)) {\n const operator = currentValue.substring(0, 1);\n // handle ~0.4 case first\n if (toMajor === 0) {\n // TODO: types (#22198)\n newValue = `${operator}0.${toMinor!}`;\n } else {\n // TODO: types (#22198)\n newValue = `${operator}${toMajor!}.0`;\n }\n } else if (regEx(/^[~^]([0-9]*)$/).test(currentValue)) {\n // handle ~4 case\n const operator = currentValue.substring(0, 1);\n // TODO: types (#22198)\n newValue = `${operator}${toMajor!}`;\n } else if (\n toMajor &&\n regEx(/^[~^]([0-9]*(?:\\.[0-9]*)?)$/).test(currentValue)\n ) {\n const operator = currentValue.substring(0, 1);\n if (rangeStrategy === 'bump') {\n newValue = `${operator}${newVersion}`;\n } else if ((isNumber(currentMajor) && toMajor > currentMajor) || !toMinor) {\n // handle ~4.1 case\n newValue = `${operator}${toMajor}.0`;\n } else {\n newValue = `${operator}${toMajor}.${toMinor}`;\n }\n } else if (\n currentVersion &&\n npm.isVersion(padZeroes(normalizeVersion(newVersion))) &&\n npm.isValid(normalizeVersion(currentValue)) &&\n composer2npm(currentValue) === normalizeVersion(currentValue)\n ) {\n newValue = npm.getNewValue({\n currentValue: normalizeVersion(currentValue),\n rangeStrategy,\n currentVersion: padZeroes(normalizeVersion(currentVersion)),\n newVersion: padZeroes(normalizeVersion(newVersion)),\n });\n }\n\n if (rangeStrategy === 'widen' && matches(newVersion, currentValue)) {\n newValue = currentValue;\n } else {\n const hasOr = currentValue.includes(' || ');\n if (hasOr || rangeStrategy === 'widen') {\n const splitValues = currentValue.split('||');\n const lastValue = splitValues.at(-1)!;\n const replacementValue = getNewValue({\n currentValue: lastValue.trim(),\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n if (rangeStrategy === 'replace') {\n newValue = replacementValue;\n } else if (replacementValue) {\n const parsedRange = parseRange(replacementValue);\n const element = parsedRange.at(-1)!;\n if (element.operator?.startsWith('<')) {\n const splitCurrent = currentValue.split(element.operator);\n splitCurrent.pop();\n newValue = `${splitCurrent.join(element.operator)}${replacementValue}`;\n } else {\n newValue = `${currentValue} || ${replacementValue}`;\n }\n }\n }\n }\n\n if (!newValue) {\n logger.warn(\n { currentValue, rangeStrategy, currentVersion, newVersion },\n 'Unsupported composer value',\n );\n newValue = newVersion;\n }\n if (currentValue.split('.')[0].includes('v')) {\n newValue = newValue.replace(regEx(/([0-9])/), 'v$1');\n }\n\n // Preserve original min-stability specifier\n if (currentValue.includes('@')) {\n newValue += `@${currentValue.split('@')[1]}`;\n }\n\n return newValue;\n}\n\nfunction sortVersions(a: string, b: string): number {\n const [aWithoutPatch, aContainsPatch] = removeComposerSpecificPatchPart(a);\n const [bWithoutPatch, bContainsPatch] = removeComposerSpecificPatchPart(b);\n\n if (aContainsPatch === bContainsPatch) {\n // If both [a and b] contain patch version or both [a and b] do not contain patch version, then npm comparison deliveres correct results\n return npm.sortVersions(composer2npm(a), composer2npm(b));\n }\n if (npm.equals(composer2npm(aWithoutPatch), composer2npm(bWithoutPatch))) {\n // If only one [a or b] contains patch version and the parts without patch versions are equal, then the version with patch is greater (this is the case where npm comparison fails)\n return aContainsPatch ? 1 : -1;\n }\n // All other cases can be compared correctly by npm\n return npm.sortVersions(composer2npm(a), composer2npm(b));\n}\n\nfunction isCompatible(version: string): boolean {\n return isVersion(version);\n}\n\nfunction isBreaking(current: string, version: string): boolean {\n return npm.isBreaking!(composer2npm(current), composer2npm(version));\n}\n\nexport const api: VersioningApi = {\n equals,\n getMajor,\n getMinor,\n getPatch,\n isBreaking,\n isCompatible,\n isGreaterThan,\n isLessThanRange,\n isSingleVersion,\n isStable,\n isValid,\n isVersion,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n getNewValue,\n sortVersions,\n subset,\n intersects,\n};\nexport default api;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["npm"],"sources":["../../../../lib/modules/versioning/composer/index.ts"],"sourcesContent":["import { isNumber } from '@sindresorhus/is';\nimport semver from 'semver';\nimport { parseRange } from 'semver-utils';\nimport { logger } from '../../../logger/index.ts';\nimport type { RangeStrategy } from '../../../types/versioning.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { api as npm } from '../npm/index.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\n\nexport const id = 'composer';\nexport const displayName = 'Composer';\nexport const urls = [\n '[Composer versions](https://getcomposer.org/doc/articles/versions.md)',\n '[composer/semver package](https://packagist.org/packages/composer/semver)',\n '[Tilde and caret constraints](https://madewithlove.be/tilde-and-caret-constraints/)',\n '[Composer semver checker](https://semver.mwl.be)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = [\n 'bump',\n 'widen',\n 'replace',\n 'update-lockfile',\n];\n\nfunction getVersionParts(input: string): [string, string] {\n const versionParts = input.split('-');\n if (versionParts.length === 1) {\n return [input, ''];\n }\n\n return [versionParts[0], `-${versionParts[1]}`];\n}\n\nfunction padZeroes(input: string): string {\n const [output, stability] = getVersionParts(input);\n\n const sections = output.split('.');\n while (sections.length < 3) {\n sections.push('0');\n }\n return `${sections.join('.')}${stability}`;\n}\n\nfunction convertStabilityModifier(input: string): string {\n // Handle stability modifiers.\n const versionParts = input.split('@');\n if (versionParts.length === 1) {\n return input;\n }\n\n // 1.0@beta2 to 1.0-beta.2\n const stability = versionParts[1].replace(\n regEx(/(?:^|\\s)(beta|alpha|rc)([1-9][0-9]*)(?: |$)/gi),\n '$1.$2',\n );\n\n // If there is a stability part, npm semver expects the version\n // to be full\n return `${padZeroes(versionParts[0])}-${stability}`;\n}\n\nfunction normalizeVersion(input: string): string {\n let output = input;\n // Strip leading + prefix (not a valid composer constraint operator)\n output = output.replace(regEx(/^\\+/), '');\n output = output.replace(regEx(/(^|>|>=|\\^|~)v/i), '$1');\n return convertStabilityModifier(output);\n}\n\n/**\n * @param versions Version list in any format, it recognizes the specific patch format x.x.x-pXX\n * @param range Range in composer format\n * @param minMode If true, it will calculate minSatisfyingVersion, if false, it calculates the maxSatisfyingVersion\n * @returns min or max satisfyingVersion from the input\n */\nfunction calculateSatisfyingVersionIntenal(\n versions: string[],\n range: string,\n minMode: boolean,\n): string | null {\n // Because composer -p versions are considered stable, we have to remove the suffix for the npm.XXX functions.\n const versionsMapped = versions.map((x) => {\n return {\n origianl: x,\n cleaned: removeComposerSpecificPatchPart(x),\n npmVariant: composer2npm(removeComposerSpecificPatchPart(x)[0]),\n };\n });\n\n const npmVersions = versionsMapped.map((x) => x.npmVariant);\n const npmVersion = minMode\n ? npm.minSatisfyingVersion(npmVersions, composer2npm(range))\n : npm.getSatisfyingVersion(npmVersions, composer2npm(range));\n\n if (!npmVersion) {\n return null;\n }\n\n // After we find the npm versions, we select from them back in the mapping the possible patches.\n const candidates = versionsMapped\n .filter((x) => x.npmVariant === npmVersion)\n .sort((a, b) => (minMode ? 1 : -1) * sortVersions(a.origianl, b.origianl));\n\n return candidates[0].origianl;\n}\n\n/**\n * @param intput Version in any format, it recognizes the specific patch format x.x.x-pXX\n * @returns If input contains the specific patch, it returns the input with removed the patch and true, otherwise it retunrs the same string and false.\n */\nfunction removeComposerSpecificPatchPart(input: string): [string, boolean] {\n // the regex is based on the original from composer implementation https://github.com/composer/semver/blob/fa1ec24f0ab1efe642671ec15c51a3ab879f59bf/src/VersionParser.php#L137\n const pattern = regEx(\n /^v?\\d+(\\.\\d+(\\.\\d+(\\.\\d+)?)?)?(?<suffix>-p[1-9]\\d*)$/gi,\n );\n const match = pattern.exec(input);\n\n return match\n ? [input.replace(match.groups!.suffix, ''), true]\n : [input, false];\n}\n\nfunction composer2npm(input: string): string {\n return input\n .split(regEx(/\\s*\\|\\|?\\s*/g))\n .map((part): string => {\n const cleanInput = normalizeVersion(part);\n if (npm.isVersion(cleanInput)) {\n return cleanInput;\n }\n if (npm.isVersion(padZeroes(cleanInput))) {\n return padZeroes(cleanInput);\n }\n const [versionId, stability] = getVersionParts(cleanInput);\n let output = versionId;\n\n // ~4 to ^4 and ~4.1 to ^4.1\n output = output.replace(\n regEx(/(?:^|\\s)~([1-9][0-9]*(?:\\.[0-9]*)?)(?: |$)/g),\n '^$1',\n );\n // ~0.4 to >=0.4 <1\n output = output.replace(\n regEx(/(?:^|\\s)~(0\\.[1-9][0-9]*)(?: |$)/g),\n '>=$1 <1',\n );\n\n // add extra digits to <8-DEV and <8.0-DEV\n output = output\n .replace(regEx(/^(<\\d+(\\.\\d+)?)$/g), '$1.0')\n .replace(regEx(/^(<\\d+(\\.\\d+)?)$/g), '$1.0');\n\n return output + stability;\n })\n .map((part) => part.replace(regEx(/([a-z])([0-9])/gi), '$1.$2'))\n .join(' || ');\n}\n\nfunction equals(a: string, b: string): boolean {\n return npm.equals(composer2npm(a), composer2npm(b));\n}\n\nfunction getMajor(version: string): number | null {\n const semverVersion = semver.coerce(composer2npm(version));\n return semverVersion ? npm.getMajor(semverVersion) : null;\n}\n\nfunction getMinor(version: string): number | null {\n const semverVersion = semver.coerce(composer2npm(version));\n return semverVersion ? npm.getMinor(semverVersion) : null;\n}\n\nfunction getPatch(version: string): number | null {\n const semverVersion = semver.coerce(composer2npm(version));\n\n // This returns only the numbers without the optional `-pXX` patch version supported by composer. Fixing that would require a bigger\n // refactoring, because the API supports only numbers.\n return semverVersion ? npm.getPatch(semverVersion) : null;\n}\n\nfunction isGreaterThan(a: string, b: string): boolean {\n return sortVersions(a, b) === 1;\n}\n\nfunction isLessThanRange(version: string, range: string): boolean {\n return !!npm.isLessThanRange?.(composer2npm(version), composer2npm(range));\n}\n\nfunction isSingleVersion(input: string): boolean {\n return !!input && npm.isSingleVersion(composer2npm(input));\n}\n\nfunction isStable(version: string): boolean {\n if (version) {\n // Composer considers patches `-pXX` as stable: https://github.com/composer/semver/blob/fa1ec24f0ab1efe642671ec15c51a3ab879f59bf/src/VersionParser.php#L568 but npm not.\n // In order to be able to use the standard npm.isStable function, we remove the potential patch version for the check.\n const [withoutPatch] = removeComposerSpecificPatchPart(version);\n return npm.isStable(composer2npm(withoutPatch));\n }\n\n return false;\n}\n\nexport function isValid(input: string): boolean {\n return !!input && npm.isValid(composer2npm(input));\n}\n\nexport function isVersion(input: string): boolean {\n return !!input && npm.isVersion(composer2npm(input));\n}\n\nfunction matches(version: string, range: string): boolean {\n return npm.matches(composer2npm(version), composer2npm(range));\n}\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return calculateSatisfyingVersionIntenal(versions, range, false);\n}\n\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return calculateSatisfyingVersionIntenal(versions, range, true);\n}\n\nfunction subset(subRange: string, superRange: string): boolean | undefined {\n try {\n return npm.subset!(composer2npm(subRange), composer2npm(superRange));\n } catch (err) {\n logger.trace({ err }, 'composer.subset error');\n return false;\n }\n}\n\nfunction intersects(subRange: string, superRange: string): boolean {\n try {\n return npm.intersects!(composer2npm(subRange), composer2npm(superRange));\n } catch (err) {\n logger.trace({ err }, 'composer.intersects error');\n return false;\n }\n}\n\nfunction getNewValue({\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n}: NewValueConfig): string | null {\n if (rangeStrategy === 'update-lockfile') {\n if (matches(newVersion, currentValue)) {\n return currentValue;\n }\n return getNewValue({\n currentValue,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n }\n const currentMajor = currentVersion ? getMajor(currentVersion) : null;\n const toMajor = getMajor(newVersion);\n const toMinor = getMinor(newVersion);\n let newValue: string | null = null;\n if (isVersion(currentValue)) {\n newValue = newVersion;\n } else if (regEx(/^[~^](0\\.[1-9][0-9]*)$/).test(currentValue)) {\n const operator = currentValue.substring(0, 1);\n // handle ~0.4 case first\n if (toMajor === 0) {\n // TODO: types (#22198)\n newValue = `${operator}0.${toMinor!}`;\n } else {\n // TODO: types (#22198)\n newValue = `${operator}${toMajor!}.0`;\n }\n } else if (regEx(/^[~^]([0-9]*)$/).test(currentValue)) {\n // handle ~4 case\n const operator = currentValue.substring(0, 1);\n // TODO: types (#22198)\n newValue = `${operator}${toMajor!}`;\n } else if (\n toMajor &&\n regEx(/^[~^]([0-9]*(?:\\.[0-9]*)?)$/).test(currentValue)\n ) {\n const operator = currentValue.substring(0, 1);\n if (rangeStrategy === 'bump') {\n newValue = `${operator}${newVersion}`;\n } else if ((isNumber(currentMajor) && toMajor > currentMajor) || !toMinor) {\n // handle ~4.1 case\n newValue = `${operator}${toMajor}.0`;\n } else {\n newValue = `${operator}${toMajor}.${toMinor}`;\n }\n } else if (\n currentVersion &&\n npm.isVersion(padZeroes(normalizeVersion(newVersion))) &&\n npm.isValid(normalizeVersion(currentValue)) &&\n composer2npm(currentValue) === normalizeVersion(currentValue)\n ) {\n newValue = npm.getNewValue({\n currentValue: normalizeVersion(currentValue),\n rangeStrategy,\n currentVersion: padZeroes(normalizeVersion(currentVersion)),\n newVersion: padZeroes(normalizeVersion(newVersion)),\n });\n }\n\n if (rangeStrategy === 'widen' && matches(newVersion, currentValue)) {\n newValue = currentValue;\n } else {\n const hasOr = currentValue.includes(' || ');\n if (hasOr || rangeStrategy === 'widen') {\n const splitValues = currentValue.split('||');\n const lastValue = splitValues.at(-1)!;\n const replacementValue = getNewValue({\n currentValue: lastValue.trim(),\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n if (rangeStrategy === 'replace') {\n newValue = replacementValue;\n } else if (replacementValue) {\n const parsedRange = parseRange(replacementValue);\n const element = parsedRange.at(-1)!;\n if (element.operator?.startsWith('<')) {\n const splitCurrent = currentValue.split(element.operator);\n splitCurrent.pop();\n newValue = `${splitCurrent.join(element.operator)}${replacementValue}`;\n } else {\n newValue = `${currentValue} || ${replacementValue}`;\n }\n }\n }\n }\n\n if (!newValue) {\n logger.warn(\n { currentValue, rangeStrategy, currentVersion, newVersion },\n 'Unsupported composer value',\n );\n newValue = newVersion;\n }\n if (currentValue.split('.')[0].includes('v')) {\n newValue = newValue.replace(regEx(/([0-9])/), 'v$1');\n }\n\n // Preserve original min-stability specifier\n if (currentValue.includes('@')) {\n newValue += `@${currentValue.split('@')[1]}`;\n }\n\n return newValue;\n}\n\nfunction sortVersions(a: string, b: string): number {\n const [aWithoutPatch, aContainsPatch] = removeComposerSpecificPatchPart(a);\n const [bWithoutPatch, bContainsPatch] = removeComposerSpecificPatchPart(b);\n\n if (aContainsPatch === bContainsPatch) {\n // If both [a and b] contain patch version or both [a and b] do not contain patch version, then npm comparison deliveres correct results\n return npm.sortVersions(composer2npm(a), composer2npm(b));\n }\n if (npm.equals(composer2npm(aWithoutPatch), composer2npm(bWithoutPatch))) {\n // If only one [a or b] contains patch version and the parts without patch versions are equal, then the version with patch is greater (this is the case where npm comparison fails)\n return aContainsPatch ? 1 : -1;\n }\n // All other cases can be compared correctly by npm\n return npm.sortVersions(composer2npm(a), composer2npm(b));\n}\n\nfunction isCompatible(version: string): boolean {\n return isVersion(version);\n}\n\nfunction isBreaking(current: string, version: string): boolean {\n return npm.isBreaking!(composer2npm(current), composer2npm(version));\n}\n\nexport const api: VersioningApi = {\n equals,\n getMajor,\n getMinor,\n getPatch,\n isBreaking,\n isCompatible,\n isGreaterThan,\n isLessThanRange,\n isSingleVersion,\n isStable,\n isValid,\n isVersion,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n getNewValue,\n sortVersions,\n subset,\n intersects,\n};\nexport default api;\n"],"mappings":"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"}
@@ -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 { cleanVersion, containsOperators, getOptions, makeVersion, matchesWithOptions } from "./common.js";
@@ -40,7 +41,7 @@ function fixParsedRange(range) {
40
41
  else if (i !== originalSplit.length && originalSplit[i + 1] === "||") ordValues.push(`${originalSplit[i]} ||`);
41
42
  } else ordValues.push(originalSplit[i]);
42
43
  const parsedRange = parseRange(range);
43
- const splitRange = range.replace(/([<=>^~])( )?/g, "").split(" ");
44
+ const splitRange = range.replace(regEx(/([<=>^~])( )?/g), "").split(" ");
44
45
  const semverRange = [];
45
46
  for (let i = 0; i < splitRange.length; i += 1) if (!splitRange[i].includes("||")) {
46
47
  const splitVersion = splitRange[i].split(".");
@@ -94,7 +95,7 @@ function replaceRange({ currentValue, newVersion }) {
94
95
  else if (element.patch) res = `<${semver$1.inc(newVersion, "patch")}`;
95
96
  else if (element.minor && toVersionMinor) res = `<${toVersionMajor}.${toVersionMinor + 1}`;
96
97
  else res = `<${toVersionMajor + 1}`;
97
- if (currentValue.includes("< ")) res = res.replace(/</g, "< ");
98
+ if (currentValue.includes("< ")) res = res.replace(regEx(/</g), "< ");
98
99
  return res;
99
100
  }
100
101
  if (element.operator === ">") {
@@ -103,7 +104,7 @@ function replaceRange({ currentValue, newVersion }) {
103
104
  else if (element.patch) res = `>${toVersionMajor}.${toVersionMinor}.${toVersionPatch}`;
104
105
  else if (element.minor) res = `>${toVersionMajor}.${toVersionMinor}`;
105
106
  else res = `>${toVersionMajor}`;
106
- if (currentValue.includes("> ")) res = res.replace(/</g, "> ");
107
+ if (currentValue.includes("> ")) res = res.replace(regEx(/</g), "> ");
107
108
  return res;
108
109
  }
109
110
  if (!element.operator) {
@@ -1 +1 @@
1
- {"version":3,"file":"range.js","names":["semver"],"sources":["../../../../lib/modules/versioning/conan/range.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport * as semver from 'semver';\nimport type { SemVer } from 'semver-utils';\nimport { parseRange } from 'semver-utils';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceString } from '../../../util/string.ts';\nimport type { NewValueConfig } from '../types.ts';\nimport {\n cleanVersion,\n containsOperators,\n getOptions,\n makeVersion,\n matchesWithOptions,\n} from './common.ts';\n\n// always include prereleases\nexport function getMajor(version: string): null | number {\n const cleanedVersion = cleanVersion(version);\n const options = getOptions(version);\n options.includePrerelease = true;\n const cleanerVersion = makeVersion(cleanedVersion, options);\n if (isString(cleanerVersion)) {\n return Number(cleanerVersion.split('.')[0]);\n }\n return null;\n}\n\n// always include prereleases\nexport function getMinor(version: string): null | number {\n const cleanedVersion = cleanVersion(version);\n const options = getOptions(version);\n options.includePrerelease = true;\n const cleanerVersion = makeVersion(cleanedVersion, options);\n if (isString(cleanerVersion)) {\n return Number(cleanerVersion.split('.')[1]);\n }\n return null;\n}\n\n// always include prereleases\nexport function getPatch(version: string): null | number {\n const cleanedVersion = cleanVersion(version);\n const options = getOptions(version);\n options.includePrerelease = true;\n const cleanerVersion = makeVersion(cleanedVersion, options);\n\n if (isString(cleanerVersion)) {\n const newVersion = semver.valid(\n semver.coerce(cleanedVersion, {\n loose: false,\n }),\n options,\n );\n return Number(newVersion?.split('.')[2]);\n }\n return null;\n}\n\nexport function fixParsedRange(range: string): any {\n const ordValues = [];\n\n // don't bump or'd single version values\n const originalSplit = range.split(' ');\n for (let i = 0; i < originalSplit.length; i += 1) {\n if (\n !containsOperators(originalSplit[i]) &&\n !originalSplit[i].includes('||')\n ) {\n if (i !== 0 && originalSplit[i - 1].includes('||')) {\n ordValues.push(`|| ${originalSplit[i]}`);\n } else if (i !== originalSplit.length && originalSplit[i + 1] === '||') {\n ordValues.push(`${originalSplit[i]} ||`);\n }\n } else {\n ordValues.push(originalSplit[i]);\n }\n }\n\n const parsedRange = parseRange(range);\n const cleanRange = range.replace(/([<=>^~])( )?/g, '');\n const splitRange = cleanRange.split(' ');\n const semverRange: SemVer[] = [];\n\n for (let i = 0; i < splitRange.length; i += 1) {\n if (!splitRange[i].includes('||')) {\n const splitVersion = splitRange[i].split('.');\n const major = splitVersion[0];\n const minor = splitVersion[1];\n const patch = splitVersion[2];\n const operator = ordValues[i].includes('||')\n ? '||'\n : parsedRange[i].operator;\n const NewSemVer: SemVer = {\n major,\n };\n\n let full = `${coerceString(operator)}${major}`;\n if (minor) {\n NewSemVer.minor = minor;\n full = `${full}.${minor}`;\n if (patch) {\n NewSemVer.patch = patch;\n full = `${full}.${patch}`;\n }\n }\n if (operator) {\n NewSemVer.operator = operator;\n full = range.includes(`${operator} `)\n ? `${operator} ${full.replace(operator, '')}`\n : `${operator}${full.replace(operator, '')}`;\n }\n\n full = ordValues[i].includes('||') ? ordValues[i] : full;\n\n NewSemVer.semver = full;\n\n semverRange.push(NewSemVer);\n }\n }\n return semverRange;\n}\n\nexport function replaceRange({\n currentValue,\n newVersion,\n}: NewValueConfig): string {\n const parsedRange = parseRange(currentValue);\n const element = parsedRange.at(-1)!;\n const toVersionMajor = getMajor(newVersion);\n const toVersionMinor = getMinor(newVersion);\n const toVersionPatch = getPatch(newVersion);\n const suffix = semver.prerelease(newVersion)\n ? `-${String(semver.prerelease(newVersion)?.[0])}`\n : '';\n\n if (element.operator === '~>') {\n return `~> ${toVersionMajor}.${toVersionMinor}.0`;\n }\n if (element.operator === '=') {\n return `=${newVersion}`;\n }\n if (element.operator === '~') {\n if (suffix.length) {\n return `~${toVersionMajor}.${toVersionMinor}.${toVersionPatch}${suffix}`;\n }\n return `~${toVersionMajor}.${toVersionMinor}.0`;\n }\n if (element.operator === '<=') {\n let res;\n if (!!element.patch || suffix.length) {\n res = `<=${newVersion}`;\n } else if (element.minor) {\n res = `<=${toVersionMajor}.${toVersionMinor}`;\n } else {\n res = `<=${toVersionMajor}`;\n }\n if (currentValue.includes('<= ')) {\n res = res.replace('<=', '<= ');\n }\n return res;\n }\n if (element.operator === '<' && toVersionMajor) {\n let res;\n if (currentValue.endsWith('.0.0')) {\n const newMajor = toVersionMajor + 1;\n res = `<${newMajor}.0.0`;\n } else if (element.patch) {\n res = `<${semver.inc(newVersion, 'patch')}`;\n } else if (element.minor && toVersionMinor) {\n res = `<${toVersionMajor}.${toVersionMinor + 1}`;\n } else {\n res = `<${toVersionMajor + 1}`;\n }\n if (currentValue.includes('< ')) {\n res = res.replace(/</g, '< ');\n }\n return res;\n }\n if (element.operator === '>') {\n let res;\n if (currentValue.endsWith('.0.0') && toVersionMajor) {\n const newMajor = toVersionMajor + 1;\n res = `>${newMajor}.0.0`;\n } else if (element.patch) {\n res = `>${toVersionMajor}.${toVersionMinor}.${toVersionPatch}`;\n } else if (element.minor) {\n res = `>${toVersionMajor}.${toVersionMinor}`;\n } else {\n res = `>${toVersionMajor}`;\n }\n if (currentValue.includes('> ')) {\n res = res.replace(/</g, '> ');\n }\n return res;\n }\n if (!element.operator) {\n if (element.minor) {\n if (element.minor === 'x') {\n return `${toVersionMajor}.x`;\n }\n if (element.minor === '*') {\n return `${toVersionMajor}.*`;\n }\n if (element.patch === 'x') {\n return `${toVersionMajor}.${toVersionMinor}.x`;\n }\n if (element.patch === '*') {\n return `${toVersionMajor}.${toVersionMinor}.*`;\n }\n return `${newVersion}`;\n }\n return `${toVersionMajor}`;\n }\n return newVersion;\n}\n\nexport function widenRange(\n { currentValue, currentVersion, newVersion }: NewValueConfig,\n options: semver.Options,\n): string | null {\n const parsedRange = parseRange(currentValue);\n const element = parsedRange.at(-1)!;\n\n if (matchesWithOptions(newVersion, currentValue, options)) {\n return currentValue;\n }\n const newValue = replaceRange({\n currentValue,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n if (element.operator?.startsWith('<')) {\n const splitCurrent = currentValue.split(element.operator);\n splitCurrent.pop();\n return splitCurrent.join(element.operator) + newValue;\n }\n if (parsedRange.length > 1) {\n const previousElement = parsedRange.at(-2)!;\n if (previousElement.operator === '-') {\n const splitCurrent = currentValue.split('-');\n splitCurrent.pop();\n return `${splitCurrent.join('-')}- ${newValue}`;\n }\n if (element.operator?.startsWith('>')) {\n logger.warn(`Complex ranges ending in greater than are not supported`);\n return null;\n }\n }\n return `${currentValue} || ${newValue}`;\n}\n\nexport function bumpRange(\n { currentValue, currentVersion, newVersion }: NewValueConfig,\n options: semver.Options,\n): string | null {\n if (!containsOperators(currentValue) && currentValue.includes('||')) {\n return widenRange(\n {\n currentValue,\n rangeStrategy: 'widen',\n currentVersion,\n newVersion,\n },\n options,\n );\n }\n const parsedRange = parseRange(currentValue);\n const element = parsedRange.at(-1)!;\n\n const toVersionMajor = getMajor(newVersion);\n const toVersionMinor = getMinor(newVersion);\n const suffix = semver.prerelease(newVersion)\n ? `-${String(semver.prerelease(newVersion)?.[0])}`\n : '';\n\n if (parsedRange.length === 1) {\n if (!element.operator) {\n return replaceRange({\n currentValue,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n }\n if (element.operator.startsWith('~')) {\n const split = currentValue.split('.');\n if (suffix.length) {\n return `${element.operator}${newVersion}`;\n }\n if (split.length === 1) {\n // ~4\n return `${element.operator}${toVersionMajor}`;\n }\n if (split.length === 2) {\n // ~4.1\n return `${element.operator}${toVersionMajor}.${toVersionMinor}`;\n }\n return `${element.operator}${newVersion}`;\n }\n if (element.operator === '=') {\n return `=${newVersion}`;\n }\n if (element.operator === '>=') {\n return currentValue.includes('>= ')\n ? `>= ${newVersion}`\n : `>=${newVersion}`;\n }\n if (element.operator.startsWith('<')) {\n return currentValue;\n }\n } else {\n const newRange = fixParsedRange(currentValue);\n const versions = newRange.map((x: any) => {\n // don't bump or'd single version values\n if (x.operator === '||') {\n return x.semver;\n }\n if (x.operator) {\n const bumpedSubRange = bumpRange(\n {\n currentValue: x.semver,\n rangeStrategy: 'bump',\n currentVersion,\n newVersion,\n },\n options,\n );\n if (\n bumpedSubRange &&\n matchesWithOptions(newVersion, bumpedSubRange, options)\n ) {\n return bumpedSubRange;\n }\n }\n\n return replaceRange({\n currentValue: x.semver,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n });\n return versions.filter((x: any) => x !== null && x !== '').join(' ');\n }\n logger.debug(\n `Unsupported range type for rangeStrategy=bump: ${currentValue}`,\n );\n return null;\n}\n"],"mappings":";;;;;;;AAgBA,SAAgB,SAAS,SAAgC;CACvD,MAAM,iBAAiB,aAAa,OAAO;CAC3C,MAAM,UAAU,WAAW,OAAO;CAClC,QAAQ,oBAAoB;CAC5B,MAAM,iBAAiB,YAAY,gBAAgB,OAAO;CAC1D,IAAI,SAAS,cAAc,GACzB,OAAO,OAAO,eAAe,MAAM,GAAG,CAAC,CAAC,EAAE;CAE5C,OAAO;AACT;AAGA,SAAgB,SAAS,SAAgC;CACvD,MAAM,iBAAiB,aAAa,OAAO;CAC3C,MAAM,UAAU,WAAW,OAAO;CAClC,QAAQ,oBAAoB;CAC5B,MAAM,iBAAiB,YAAY,gBAAgB,OAAO;CAC1D,IAAI,SAAS,cAAc,GACzB,OAAO,OAAO,eAAe,MAAM,GAAG,CAAC,CAAC,EAAE;CAE5C,OAAO;AACT;AAGA,SAAgB,SAAS,SAAgC;CACvD,MAAM,iBAAiB,aAAa,OAAO;CAC3C,MAAM,UAAU,WAAW,OAAO;CAClC,QAAQ,oBAAoB;CAC5B,MAAM,iBAAiB,YAAY,gBAAgB,OAAO;CAE1D,IAAI,SAAS,cAAc,GAAG;EAC5B,MAAM,aAAaA,SAAO,MACxBA,SAAO,OAAO,gBAAgB,EAC5B,OAAO,MACT,CAAC,GACD,OACF;EACA,OAAO,OAAO,YAAY,MAAM,GAAG,CAAC,CAAC,EAAE;CACzC;CACA,OAAO;AACT;AAEA,SAAgB,eAAe,OAAoB;CACjD,MAAM,YAAY,CAAC;CAGnB,MAAM,gBAAgB,MAAM,MAAM,GAAG;CACrC,KAAK,IAAI,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK,GAC7C,IACE,CAAC,kBAAkB,cAAc,EAAE,KACnC,CAAC,cAAc,EAAE,CAAC,SAAS,IAAI,GAE3B;MAAA,MAAM,KAAK,cAAc,IAAI,EAAE,CAAC,SAAS,IAAI,GAC/C,UAAU,KAAK,MAAM,cAAc,IAAI;OAClC,IAAI,MAAM,cAAc,UAAU,cAAc,IAAI,OAAO,MAChE,UAAU,KAAK,GAAG,cAAc,GAAG,IAAI;CAAA,OAGzC,UAAU,KAAK,cAAc,EAAE;CAInC,MAAM,cAAc,WAAW,KAAK;CAEpC,MAAM,aADa,MAAM,QAAQ,kBAAkB,EACvB,CAAC,CAAC,MAAM,GAAG;CACvC,MAAM,cAAwB,CAAC;CAE/B,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK,GAC1C,IAAI,CAAC,WAAW,EAAE,CAAC,SAAS,IAAI,GAAG;EACjC,MAAM,eAAe,WAAW,EAAE,CAAC,MAAM,GAAG;EAC5C,MAAM,QAAQ,aAAa;EAC3B,MAAM,QAAQ,aAAa;EAC3B,MAAM,QAAQ,aAAa;EAC3B,MAAM,WAAW,UAAU,EAAE,CAAC,SAAS,IAAI,IACvC,OACA,YAAY,EAAE,CAAC;EACnB,MAAM,YAAoB,EACxB,MACF;EAEA,IAAI,OAAO,GAAG,aAAa,QAAQ,IAAI;EACvC,IAAI,OAAO;GACT,UAAU,QAAQ;GAClB,OAAO,GAAG,KAAK,GAAG;GAClB,IAAI,OAAO;IACT,UAAU,QAAQ;IAClB,OAAO,GAAG,KAAK,GAAG;GACpB;EACF;EACA,IAAI,UAAU;GACZ,UAAU,WAAW;GACrB,OAAO,MAAM,SAAS,GAAG,SAAS,EAAE,IAChC,GAAG,SAAS,GAAG,KAAK,QAAQ,UAAU,EAAE,MACxC,GAAG,WAAW,KAAK,QAAQ,UAAU,EAAE;EAC7C;EAEA,OAAO,UAAU,EAAE,CAAC,SAAS,IAAI,IAAI,UAAU,KAAK;EAEpD,UAAU,SAAS;EAEnB,YAAY,KAAK,SAAS;CAC5B;CAEF,OAAO;AACT;AAEA,SAAgB,aAAa,EAC3B,cACA,cACyB;CAEzB,MAAM,UADc,WAAW,YACL,CAAC,CAAC,GAAG,EAAE;CACjC,MAAM,iBAAiB,SAAS,UAAU;CAC1C,MAAM,iBAAiB,SAAS,UAAU;CAC1C,MAAM,iBAAiB,SAAS,UAAU;CAC1C,MAAM,SAASA,SAAO,WAAW,UAAU,IACvC,IAAI,OAAOA,SAAO,WAAW,UAAU,CAAC,GAAG,EAAE,MAC7C;CAEJ,IAAI,QAAQ,aAAa,MACvB,OAAO,MAAM,eAAe,GAAG,eAAe;CAEhD,IAAI,QAAQ,aAAa,KACvB,OAAO,IAAI;CAEb,IAAI,QAAQ,aAAa,KAAK;EAC5B,IAAI,OAAO,QACT,OAAO,IAAI,eAAe,GAAG,eAAe,GAAG,iBAAiB;EAElE,OAAO,IAAI,eAAe,GAAG,eAAe;CAC9C;CACA,IAAI,QAAQ,aAAa,MAAM;EAC7B,IAAI;EACJ,IAAI,CAAC,CAAC,QAAQ,SAAS,OAAO,QAC5B,MAAM,KAAK;OACN,IAAI,QAAQ,OACjB,MAAM,KAAK,eAAe,GAAG;OAE7B,MAAM,KAAK;EAEb,IAAI,aAAa,SAAS,KAAK,GAC7B,MAAM,IAAI,QAAQ,MAAM,KAAK;EAE/B,OAAO;CACT;CACA,IAAI,QAAQ,aAAa,OAAO,gBAAgB;EAC9C,IAAI;EACJ,IAAI,aAAa,SAAS,MAAM,GAE9B,MAAM,IADW,iBAAiB,EACf;OACd,IAAI,QAAQ,OACjB,MAAM,IAAIA,SAAO,IAAI,YAAY,OAAO;OACnC,IAAI,QAAQ,SAAS,gBAC1B,MAAM,IAAI,eAAe,GAAG,iBAAiB;OAE7C,MAAM,IAAI,iBAAiB;EAE7B,IAAI,aAAa,SAAS,IAAI,GAC5B,MAAM,IAAI,QAAQ,MAAM,IAAI;EAE9B,OAAO;CACT;CACA,IAAI,QAAQ,aAAa,KAAK;EAC5B,IAAI;EACJ,IAAI,aAAa,SAAS,MAAM,KAAK,gBAEnC,MAAM,IADW,iBAAiB,EACf;OACd,IAAI,QAAQ,OACjB,MAAM,IAAI,eAAe,GAAG,eAAe,GAAG;OACzC,IAAI,QAAQ,OACjB,MAAM,IAAI,eAAe,GAAG;OAE5B,MAAM,IAAI;EAEZ,IAAI,aAAa,SAAS,IAAI,GAC5B,MAAM,IAAI,QAAQ,MAAM,IAAI;EAE9B,OAAO;CACT;CACA,IAAI,CAAC,QAAQ,UAAU;EACrB,IAAI,QAAQ,OAAO;GACjB,IAAI,QAAQ,UAAU,KACpB,OAAO,GAAG,eAAe;GAE3B,IAAI,QAAQ,UAAU,KACpB,OAAO,GAAG,eAAe;GAE3B,IAAI,QAAQ,UAAU,KACpB,OAAO,GAAG,eAAe,GAAG,eAAe;GAE7C,IAAI,QAAQ,UAAU,KACpB,OAAO,GAAG,eAAe,GAAG,eAAe;GAE7C,OAAO,GAAG;EACZ;EACA,OAAO,GAAG;CACZ;CACA,OAAO;AACT;AAEA,SAAgB,WACd,EAAE,cAAc,gBAAgB,cAChC,SACe;CACf,MAAM,cAAc,WAAW,YAAY;CAC3C,MAAM,UAAU,YAAY,GAAG,EAAE;CAEjC,IAAI,mBAAmB,YAAY,cAAc,OAAO,GACtD,OAAO;CAET,MAAM,WAAW,aAAa;EAC5B;EACA,eAAe;EACf;EACA;CACF,CAAC;CACD,IAAI,QAAQ,UAAU,WAAW,GAAG,GAAG;EACrC,MAAM,eAAe,aAAa,MAAM,QAAQ,QAAQ;EACxD,aAAa,IAAI;EACjB,OAAO,aAAa,KAAK,QAAQ,QAAQ,IAAI;CAC/C;CACA,IAAI,YAAY,SAAS,GAAG;EAE1B,IADwB,YAAY,GAAG,EACrB,CAAC,CAAC,aAAa,KAAK;GACpC,MAAM,eAAe,aAAa,MAAM,GAAG;GAC3C,aAAa,IAAI;GACjB,OAAO,GAAG,aAAa,KAAK,GAAG,EAAE,IAAI;EACvC;EACA,IAAI,QAAQ,UAAU,WAAW,GAAG,GAAG;GACrC,OAAO,KAAK,yDAAyD;GACrE,OAAO;EACT;CACF;CACA,OAAO,GAAG,aAAa,MAAM;AAC/B;AAEA,SAAgB,UACd,EAAE,cAAc,gBAAgB,cAChC,SACe;CACf,IAAI,CAAC,kBAAkB,YAAY,KAAK,aAAa,SAAS,IAAI,GAChE,OAAO,WACL;EACE;EACA,eAAe;EACf;EACA;CACF,GACA,OACF;CAEF,MAAM,cAAc,WAAW,YAAY;CAC3C,MAAM,UAAU,YAAY,GAAG,EAAE;CAEjC,MAAM,iBAAiB,SAAS,UAAU;CAC1C,MAAM,iBAAiB,SAAS,UAAU;CAC1C,MAAM,SAASA,SAAO,WAAW,UAAU,IACvC,IAAI,OAAOA,SAAO,WAAW,UAAU,CAAC,GAAG,EAAE,MAC7C;CAEJ,IAAI,YAAY,WAAW,GAAG;EAC5B,IAAI,CAAC,QAAQ,UACX,OAAO,aAAa;GAClB;GACA,eAAe;GACf;GACA;EACF,CAAC;EAEH,IAAI,QAAQ,SAAS,WAAW,GAAG,GAAG;GACpC,MAAM,QAAQ,aAAa,MAAM,GAAG;GACpC,IAAI,OAAO,QACT,OAAO,GAAG,QAAQ,WAAW;GAE/B,IAAI,MAAM,WAAW,GAEnB,OAAO,GAAG,QAAQ,WAAW;GAE/B,IAAI,MAAM,WAAW,GAEnB,OAAO,GAAG,QAAQ,WAAW,eAAe,GAAG;GAEjD,OAAO,GAAG,QAAQ,WAAW;EAC/B;EACA,IAAI,QAAQ,aAAa,KACvB,OAAO,IAAI;EAEb,IAAI,QAAQ,aAAa,MACvB,OAAO,aAAa,SAAS,KAAK,IAC9B,MAAM,eACN,KAAK;EAEX,IAAI,QAAQ,SAAS,WAAW,GAAG,GACjC,OAAO;CAEX,OAgCE,OA/BiB,eAAe,YACR,CAAC,CAAC,KAAK,MAAW;EAExC,IAAI,EAAE,aAAa,MACjB,OAAO,EAAE;EAEX,IAAI,EAAE,UAAU;GACd,MAAM,iBAAiB,UACrB;IACE,cAAc,EAAE;IAChB,eAAe;IACf;IACA;GACF,GACA,OACF;GACA,IACE,kBACA,mBAAmB,YAAY,gBAAgB,OAAO,GAEtD,OAAO;EAEX;EAEA,OAAO,aAAa;GAClB,cAAc,EAAE;GAChB,eAAe;GACf;GACA;EACF,CAAC;CACH,CACc,CAAC,CAAC,QAAQ,MAAW,MAAM,QAAQ,MAAM,EAAE,CAAC,CAAC,KAAK,GAAG;CAErE,OAAO,MACL,kDAAkD,cACpD;CACA,OAAO;AACT"}
1
+ {"version":3,"file":"range.js","names":["semver"],"sources":["../../../../lib/modules/versioning/conan/range.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport * as semver from 'semver';\nimport type { SemVer } from 'semver-utils';\nimport { parseRange } from 'semver-utils';\nimport { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { coerceString } from '../../../util/string.ts';\nimport type { NewValueConfig } from '../types.ts';\nimport {\n cleanVersion,\n containsOperators,\n getOptions,\n makeVersion,\n matchesWithOptions,\n} from './common.ts';\n\n// always include prereleases\nexport function getMajor(version: string): null | number {\n const cleanedVersion = cleanVersion(version);\n const options = getOptions(version);\n options.includePrerelease = true;\n const cleanerVersion = makeVersion(cleanedVersion, options);\n if (isString(cleanerVersion)) {\n return Number(cleanerVersion.split('.')[0]);\n }\n return null;\n}\n\n// always include prereleases\nexport function getMinor(version: string): null | number {\n const cleanedVersion = cleanVersion(version);\n const options = getOptions(version);\n options.includePrerelease = true;\n const cleanerVersion = makeVersion(cleanedVersion, options);\n if (isString(cleanerVersion)) {\n return Number(cleanerVersion.split('.')[1]);\n }\n return null;\n}\n\n// always include prereleases\nexport function getPatch(version: string): null | number {\n const cleanedVersion = cleanVersion(version);\n const options = getOptions(version);\n options.includePrerelease = true;\n const cleanerVersion = makeVersion(cleanedVersion, options);\n\n if (isString(cleanerVersion)) {\n const newVersion = semver.valid(\n semver.coerce(cleanedVersion, {\n loose: false,\n }),\n options,\n );\n return Number(newVersion?.split('.')[2]);\n }\n return null;\n}\n\nexport function fixParsedRange(range: string): any {\n const ordValues = [];\n\n // don't bump or'd single version values\n const originalSplit = range.split(' ');\n for (let i = 0; i < originalSplit.length; i += 1) {\n if (\n !containsOperators(originalSplit[i]) &&\n !originalSplit[i].includes('||')\n ) {\n if (i !== 0 && originalSplit[i - 1].includes('||')) {\n ordValues.push(`|| ${originalSplit[i]}`);\n } else if (i !== originalSplit.length && originalSplit[i + 1] === '||') {\n ordValues.push(`${originalSplit[i]} ||`);\n }\n } else {\n ordValues.push(originalSplit[i]);\n }\n }\n\n const parsedRange = parseRange(range);\n const cleanRange = range.replace(regEx(/([<=>^~])( )?/g), '');\n const splitRange = cleanRange.split(' ');\n const semverRange: SemVer[] = [];\n\n for (let i = 0; i < splitRange.length; i += 1) {\n if (!splitRange[i].includes('||')) {\n const splitVersion = splitRange[i].split('.');\n const major = splitVersion[0];\n const minor = splitVersion[1];\n const patch = splitVersion[2];\n const operator = ordValues[i].includes('||')\n ? '||'\n : parsedRange[i].operator;\n const NewSemVer: SemVer = {\n major,\n };\n\n let full = `${coerceString(operator)}${major}`;\n if (minor) {\n NewSemVer.minor = minor;\n full = `${full}.${minor}`;\n if (patch) {\n NewSemVer.patch = patch;\n full = `${full}.${patch}`;\n }\n }\n if (operator) {\n NewSemVer.operator = operator;\n full = range.includes(`${operator} `)\n ? `${operator} ${full.replace(operator, '')}`\n : `${operator}${full.replace(operator, '')}`;\n }\n\n full = ordValues[i].includes('||') ? ordValues[i] : full;\n\n NewSemVer.semver = full;\n\n semverRange.push(NewSemVer);\n }\n }\n return semverRange;\n}\n\nexport function replaceRange({\n currentValue,\n newVersion,\n}: NewValueConfig): string {\n const parsedRange = parseRange(currentValue);\n const element = parsedRange.at(-1)!;\n const toVersionMajor = getMajor(newVersion);\n const toVersionMinor = getMinor(newVersion);\n const toVersionPatch = getPatch(newVersion);\n const suffix = semver.prerelease(newVersion)\n ? `-${String(semver.prerelease(newVersion)?.[0])}`\n : '';\n\n if (element.operator === '~>') {\n return `~> ${toVersionMajor}.${toVersionMinor}.0`;\n }\n if (element.operator === '=') {\n return `=${newVersion}`;\n }\n if (element.operator === '~') {\n if (suffix.length) {\n return `~${toVersionMajor}.${toVersionMinor}.${toVersionPatch}${suffix}`;\n }\n return `~${toVersionMajor}.${toVersionMinor}.0`;\n }\n if (element.operator === '<=') {\n let res;\n if (!!element.patch || suffix.length) {\n res = `<=${newVersion}`;\n } else if (element.minor) {\n res = `<=${toVersionMajor}.${toVersionMinor}`;\n } else {\n res = `<=${toVersionMajor}`;\n }\n if (currentValue.includes('<= ')) {\n res = res.replace('<=', '<= ');\n }\n return res;\n }\n if (element.operator === '<' && toVersionMajor) {\n let res;\n if (currentValue.endsWith('.0.0')) {\n const newMajor = toVersionMajor + 1;\n res = `<${newMajor}.0.0`;\n } else if (element.patch) {\n res = `<${semver.inc(newVersion, 'patch')}`;\n } else if (element.minor && toVersionMinor) {\n res = `<${toVersionMajor}.${toVersionMinor + 1}`;\n } else {\n res = `<${toVersionMajor + 1}`;\n }\n if (currentValue.includes('< ')) {\n res = res.replace(regEx(/</g), '< ');\n }\n return res;\n }\n if (element.operator === '>') {\n let res;\n if (currentValue.endsWith('.0.0') && toVersionMajor) {\n const newMajor = toVersionMajor + 1;\n res = `>${newMajor}.0.0`;\n } else if (element.patch) {\n res = `>${toVersionMajor}.${toVersionMinor}.${toVersionPatch}`;\n } else if (element.minor) {\n res = `>${toVersionMajor}.${toVersionMinor}`;\n } else {\n res = `>${toVersionMajor}`;\n }\n if (currentValue.includes('> ')) {\n res = res.replace(regEx(/</g), '> ');\n }\n return res;\n }\n if (!element.operator) {\n if (element.minor) {\n if (element.minor === 'x') {\n return `${toVersionMajor}.x`;\n }\n if (element.minor === '*') {\n return `${toVersionMajor}.*`;\n }\n if (element.patch === 'x') {\n return `${toVersionMajor}.${toVersionMinor}.x`;\n }\n if (element.patch === '*') {\n return `${toVersionMajor}.${toVersionMinor}.*`;\n }\n return `${newVersion}`;\n }\n return `${toVersionMajor}`;\n }\n return newVersion;\n}\n\nexport function widenRange(\n { currentValue, currentVersion, newVersion }: NewValueConfig,\n options: semver.Options,\n): string | null {\n const parsedRange = parseRange(currentValue);\n const element = parsedRange.at(-1)!;\n\n if (matchesWithOptions(newVersion, currentValue, options)) {\n return currentValue;\n }\n const newValue = replaceRange({\n currentValue,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n if (element.operator?.startsWith('<')) {\n const splitCurrent = currentValue.split(element.operator);\n splitCurrent.pop();\n return splitCurrent.join(element.operator) + newValue;\n }\n if (parsedRange.length > 1) {\n const previousElement = parsedRange.at(-2)!;\n if (previousElement.operator === '-') {\n const splitCurrent = currentValue.split('-');\n splitCurrent.pop();\n return `${splitCurrent.join('-')}- ${newValue}`;\n }\n if (element.operator?.startsWith('>')) {\n logger.warn(`Complex ranges ending in greater than are not supported`);\n return null;\n }\n }\n return `${currentValue} || ${newValue}`;\n}\n\nexport function bumpRange(\n { currentValue, currentVersion, newVersion }: NewValueConfig,\n options: semver.Options,\n): string | null {\n if (!containsOperators(currentValue) && currentValue.includes('||')) {\n return widenRange(\n {\n currentValue,\n rangeStrategy: 'widen',\n currentVersion,\n newVersion,\n },\n options,\n );\n }\n const parsedRange = parseRange(currentValue);\n const element = parsedRange.at(-1)!;\n\n const toVersionMajor = getMajor(newVersion);\n const toVersionMinor = getMinor(newVersion);\n const suffix = semver.prerelease(newVersion)\n ? `-${String(semver.prerelease(newVersion)?.[0])}`\n : '';\n\n if (parsedRange.length === 1) {\n if (!element.operator) {\n return replaceRange({\n currentValue,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n }\n if (element.operator.startsWith('~')) {\n const split = currentValue.split('.');\n if (suffix.length) {\n return `${element.operator}${newVersion}`;\n }\n if (split.length === 1) {\n // ~4\n return `${element.operator}${toVersionMajor}`;\n }\n if (split.length === 2) {\n // ~4.1\n return `${element.operator}${toVersionMajor}.${toVersionMinor}`;\n }\n return `${element.operator}${newVersion}`;\n }\n if (element.operator === '=') {\n return `=${newVersion}`;\n }\n if (element.operator === '>=') {\n return currentValue.includes('>= ')\n ? `>= ${newVersion}`\n : `>=${newVersion}`;\n }\n if (element.operator.startsWith('<')) {\n return currentValue;\n }\n } else {\n const newRange = fixParsedRange(currentValue);\n const versions = newRange.map((x: any) => {\n // don't bump or'd single version values\n if (x.operator === '||') {\n return x.semver;\n }\n if (x.operator) {\n const bumpedSubRange = bumpRange(\n {\n currentValue: x.semver,\n rangeStrategy: 'bump',\n currentVersion,\n newVersion,\n },\n options,\n );\n if (\n bumpedSubRange &&\n matchesWithOptions(newVersion, bumpedSubRange, options)\n ) {\n return bumpedSubRange;\n }\n }\n\n return replaceRange({\n currentValue: x.semver,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n });\n return versions.filter((x: any) => x !== null && x !== '').join(' ');\n }\n logger.debug(\n `Unsupported range type for rangeStrategy=bump: ${currentValue}`,\n );\n return null;\n}\n"],"mappings":";;;;;;;;AAiBA,SAAgB,SAAS,SAAgC;CACvD,MAAM,iBAAiB,aAAa,OAAO;CAC3C,MAAM,UAAU,WAAW,OAAO;CAClC,QAAQ,oBAAoB;CAC5B,MAAM,iBAAiB,YAAY,gBAAgB,OAAO;CAC1D,IAAI,SAAS,cAAc,GACzB,OAAO,OAAO,eAAe,MAAM,GAAG,CAAC,CAAC,EAAE;CAE5C,OAAO;AACT;AAGA,SAAgB,SAAS,SAAgC;CACvD,MAAM,iBAAiB,aAAa,OAAO;CAC3C,MAAM,UAAU,WAAW,OAAO;CAClC,QAAQ,oBAAoB;CAC5B,MAAM,iBAAiB,YAAY,gBAAgB,OAAO;CAC1D,IAAI,SAAS,cAAc,GACzB,OAAO,OAAO,eAAe,MAAM,GAAG,CAAC,CAAC,EAAE;CAE5C,OAAO;AACT;AAGA,SAAgB,SAAS,SAAgC;CACvD,MAAM,iBAAiB,aAAa,OAAO;CAC3C,MAAM,UAAU,WAAW,OAAO;CAClC,QAAQ,oBAAoB;CAC5B,MAAM,iBAAiB,YAAY,gBAAgB,OAAO;CAE1D,IAAI,SAAS,cAAc,GAAG;EAC5B,MAAM,aAAaA,SAAO,MACxBA,SAAO,OAAO,gBAAgB,EAC5B,OAAO,MACT,CAAC,GACD,OACF;EACA,OAAO,OAAO,YAAY,MAAM,GAAG,CAAC,CAAC,EAAE;CACzC;CACA,OAAO;AACT;AAEA,SAAgB,eAAe,OAAoB;CACjD,MAAM,YAAY,CAAC;CAGnB,MAAM,gBAAgB,MAAM,MAAM,GAAG;CACrC,KAAK,IAAI,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK,GAC7C,IACE,CAAC,kBAAkB,cAAc,EAAE,KACnC,CAAC,cAAc,EAAE,CAAC,SAAS,IAAI,GAE3B;MAAA,MAAM,KAAK,cAAc,IAAI,EAAE,CAAC,SAAS,IAAI,GAC/C,UAAU,KAAK,MAAM,cAAc,IAAI;OAClC,IAAI,MAAM,cAAc,UAAU,cAAc,IAAI,OAAO,MAChE,UAAU,KAAK,GAAG,cAAc,GAAG,IAAI;CAAA,OAGzC,UAAU,KAAK,cAAc,EAAE;CAInC,MAAM,cAAc,WAAW,KAAK;CAEpC,MAAM,aADa,MAAM,QAAQ,MAAM,gBAAgB,GAAG,EAC9B,CAAC,CAAC,MAAM,GAAG;CACvC,MAAM,cAAwB,CAAC;CAE/B,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK,GAC1C,IAAI,CAAC,WAAW,EAAE,CAAC,SAAS,IAAI,GAAG;EACjC,MAAM,eAAe,WAAW,EAAE,CAAC,MAAM,GAAG;EAC5C,MAAM,QAAQ,aAAa;EAC3B,MAAM,QAAQ,aAAa;EAC3B,MAAM,QAAQ,aAAa;EAC3B,MAAM,WAAW,UAAU,EAAE,CAAC,SAAS,IAAI,IACvC,OACA,YAAY,EAAE,CAAC;EACnB,MAAM,YAAoB,EACxB,MACF;EAEA,IAAI,OAAO,GAAG,aAAa,QAAQ,IAAI;EACvC,IAAI,OAAO;GACT,UAAU,QAAQ;GAClB,OAAO,GAAG,KAAK,GAAG;GAClB,IAAI,OAAO;IACT,UAAU,QAAQ;IAClB,OAAO,GAAG,KAAK,GAAG;GACpB;EACF;EACA,IAAI,UAAU;GACZ,UAAU,WAAW;GACrB,OAAO,MAAM,SAAS,GAAG,SAAS,EAAE,IAChC,GAAG,SAAS,GAAG,KAAK,QAAQ,UAAU,EAAE,MACxC,GAAG,WAAW,KAAK,QAAQ,UAAU,EAAE;EAC7C;EAEA,OAAO,UAAU,EAAE,CAAC,SAAS,IAAI,IAAI,UAAU,KAAK;EAEpD,UAAU,SAAS;EAEnB,YAAY,KAAK,SAAS;CAC5B;CAEF,OAAO;AACT;AAEA,SAAgB,aAAa,EAC3B,cACA,cACyB;CAEzB,MAAM,UADc,WAAW,YACL,CAAC,CAAC,GAAG,EAAE;CACjC,MAAM,iBAAiB,SAAS,UAAU;CAC1C,MAAM,iBAAiB,SAAS,UAAU;CAC1C,MAAM,iBAAiB,SAAS,UAAU;CAC1C,MAAM,SAASA,SAAO,WAAW,UAAU,IACvC,IAAI,OAAOA,SAAO,WAAW,UAAU,CAAC,GAAG,EAAE,MAC7C;CAEJ,IAAI,QAAQ,aAAa,MACvB,OAAO,MAAM,eAAe,GAAG,eAAe;CAEhD,IAAI,QAAQ,aAAa,KACvB,OAAO,IAAI;CAEb,IAAI,QAAQ,aAAa,KAAK;EAC5B,IAAI,OAAO,QACT,OAAO,IAAI,eAAe,GAAG,eAAe,GAAG,iBAAiB;EAElE,OAAO,IAAI,eAAe,GAAG,eAAe;CAC9C;CACA,IAAI,QAAQ,aAAa,MAAM;EAC7B,IAAI;EACJ,IAAI,CAAC,CAAC,QAAQ,SAAS,OAAO,QAC5B,MAAM,KAAK;OACN,IAAI,QAAQ,OACjB,MAAM,KAAK,eAAe,GAAG;OAE7B,MAAM,KAAK;EAEb,IAAI,aAAa,SAAS,KAAK,GAC7B,MAAM,IAAI,QAAQ,MAAM,KAAK;EAE/B,OAAO;CACT;CACA,IAAI,QAAQ,aAAa,OAAO,gBAAgB;EAC9C,IAAI;EACJ,IAAI,aAAa,SAAS,MAAM,GAE9B,MAAM,IADW,iBAAiB,EACf;OACd,IAAI,QAAQ,OACjB,MAAM,IAAIA,SAAO,IAAI,YAAY,OAAO;OACnC,IAAI,QAAQ,SAAS,gBAC1B,MAAM,IAAI,eAAe,GAAG,iBAAiB;OAE7C,MAAM,IAAI,iBAAiB;EAE7B,IAAI,aAAa,SAAS,IAAI,GAC5B,MAAM,IAAI,QAAQ,MAAM,IAAI,GAAG,IAAI;EAErC,OAAO;CACT;CACA,IAAI,QAAQ,aAAa,KAAK;EAC5B,IAAI;EACJ,IAAI,aAAa,SAAS,MAAM,KAAK,gBAEnC,MAAM,IADW,iBAAiB,EACf;OACd,IAAI,QAAQ,OACjB,MAAM,IAAI,eAAe,GAAG,eAAe,GAAG;OACzC,IAAI,QAAQ,OACjB,MAAM,IAAI,eAAe,GAAG;OAE5B,MAAM,IAAI;EAEZ,IAAI,aAAa,SAAS,IAAI,GAC5B,MAAM,IAAI,QAAQ,MAAM,IAAI,GAAG,IAAI;EAErC,OAAO;CACT;CACA,IAAI,CAAC,QAAQ,UAAU;EACrB,IAAI,QAAQ,OAAO;GACjB,IAAI,QAAQ,UAAU,KACpB,OAAO,GAAG,eAAe;GAE3B,IAAI,QAAQ,UAAU,KACpB,OAAO,GAAG,eAAe;GAE3B,IAAI,QAAQ,UAAU,KACpB,OAAO,GAAG,eAAe,GAAG,eAAe;GAE7C,IAAI,QAAQ,UAAU,KACpB,OAAO,GAAG,eAAe,GAAG,eAAe;GAE7C,OAAO,GAAG;EACZ;EACA,OAAO,GAAG;CACZ;CACA,OAAO;AACT;AAEA,SAAgB,WACd,EAAE,cAAc,gBAAgB,cAChC,SACe;CACf,MAAM,cAAc,WAAW,YAAY;CAC3C,MAAM,UAAU,YAAY,GAAG,EAAE;CAEjC,IAAI,mBAAmB,YAAY,cAAc,OAAO,GACtD,OAAO;CAET,MAAM,WAAW,aAAa;EAC5B;EACA,eAAe;EACf;EACA;CACF,CAAC;CACD,IAAI,QAAQ,UAAU,WAAW,GAAG,GAAG;EACrC,MAAM,eAAe,aAAa,MAAM,QAAQ,QAAQ;EACxD,aAAa,IAAI;EACjB,OAAO,aAAa,KAAK,QAAQ,QAAQ,IAAI;CAC/C;CACA,IAAI,YAAY,SAAS,GAAG;EAE1B,IADwB,YAAY,GAAG,EACrB,CAAC,CAAC,aAAa,KAAK;GACpC,MAAM,eAAe,aAAa,MAAM,GAAG;GAC3C,aAAa,IAAI;GACjB,OAAO,GAAG,aAAa,KAAK,GAAG,EAAE,IAAI;EACvC;EACA,IAAI,QAAQ,UAAU,WAAW,GAAG,GAAG;GACrC,OAAO,KAAK,yDAAyD;GACrE,OAAO;EACT;CACF;CACA,OAAO,GAAG,aAAa,MAAM;AAC/B;AAEA,SAAgB,UACd,EAAE,cAAc,gBAAgB,cAChC,SACe;CACf,IAAI,CAAC,kBAAkB,YAAY,KAAK,aAAa,SAAS,IAAI,GAChE,OAAO,WACL;EACE;EACA,eAAe;EACf;EACA;CACF,GACA,OACF;CAEF,MAAM,cAAc,WAAW,YAAY;CAC3C,MAAM,UAAU,YAAY,GAAG,EAAE;CAEjC,MAAM,iBAAiB,SAAS,UAAU;CAC1C,MAAM,iBAAiB,SAAS,UAAU;CAC1C,MAAM,SAASA,SAAO,WAAW,UAAU,IACvC,IAAI,OAAOA,SAAO,WAAW,UAAU,CAAC,GAAG,EAAE,MAC7C;CAEJ,IAAI,YAAY,WAAW,GAAG;EAC5B,IAAI,CAAC,QAAQ,UACX,OAAO,aAAa;GAClB;GACA,eAAe;GACf;GACA;EACF,CAAC;EAEH,IAAI,QAAQ,SAAS,WAAW,GAAG,GAAG;GACpC,MAAM,QAAQ,aAAa,MAAM,GAAG;GACpC,IAAI,OAAO,QACT,OAAO,GAAG,QAAQ,WAAW;GAE/B,IAAI,MAAM,WAAW,GAEnB,OAAO,GAAG,QAAQ,WAAW;GAE/B,IAAI,MAAM,WAAW,GAEnB,OAAO,GAAG,QAAQ,WAAW,eAAe,GAAG;GAEjD,OAAO,GAAG,QAAQ,WAAW;EAC/B;EACA,IAAI,QAAQ,aAAa,KACvB,OAAO,IAAI;EAEb,IAAI,QAAQ,aAAa,MACvB,OAAO,aAAa,SAAS,KAAK,IAC9B,MAAM,eACN,KAAK;EAEX,IAAI,QAAQ,SAAS,WAAW,GAAG,GACjC,OAAO;CAEX,OAgCE,OA/BiB,eAAe,YACR,CAAC,CAAC,KAAK,MAAW;EAExC,IAAI,EAAE,aAAa,MACjB,OAAO,EAAE;EAEX,IAAI,EAAE,UAAU;GACd,MAAM,iBAAiB,UACrB;IACE,cAAc,EAAE;IAChB,eAAe;IACf;IACA;GACF,GACA,OACF;GACA,IACE,kBACA,mBAAmB,YAAY,gBAAgB,OAAO,GAEtD,OAAO;EAEX;EAEA,OAAO,aAAa;GAClB,cAAc,EAAE;GAChB,eAAe;GACf;GACA;EACF,CAAC;CACH,CACc,CAAC,CAAC,QAAQ,MAAW,MAAM,QAAQ,MAAM,EAAE,CAAC,CAAC,KAAK,GAAG;CAErE,OAAO,MACL,kDAAkD,cACpD;CACA,OAAO;AACT"}
@@ -1,3 +1,4 @@
1
+ import { regEx } from "../../../util/regex.js";
1
2
  import { api as api$1 } from "../pep440/index.js";
2
3
  import { Version, VersionSpec } from "@baszalmstra/rattler";
3
4
  //#region lib/modules/versioning/conda/index.ts
@@ -37,7 +38,7 @@ function matches(version, range) {
37
38
  }
38
39
  function isSingleVersion(input) {
39
40
  if (!input.startsWith("=")) return false;
40
- return isValidVersion(input.replace(/^==/, "").trimStart());
41
+ return isValidVersion(input.replace(regEx(/^==/), "").trimStart());
41
42
  }
42
43
  function getPinnedValue(newVersion) {
43
44
  return `==${newVersion}`;
@@ -48,13 +49,13 @@ function getNewValue({ currentValue, rangeStrategy, currentVersion, newVersion,
48
49
  return null;
49
50
  }
50
51
  const normalizedCurrentValue = new VersionSpec(currentValue).toString();
51
- if (/^(\d+\.)+\*$/.test(normalizedCurrentValue)) return api$1.getNewValue({
52
+ if (regEx(/^(\d+\.)+\*$/).test(normalizedCurrentValue)) return api$1.getNewValue({
52
53
  currentValue: `==${normalizedCurrentValue}`,
53
54
  rangeStrategy,
54
55
  currentVersion,
55
56
  newVersion,
56
57
  isReplacement
57
- })?.replace(/^==/, "") ?? null;
58
+ })?.replace(regEx(/^==/), "") ?? null;
58
59
  return api$1.getNewValue({
59
60
  currentValue: normalizedCurrentValue,
60
61
  rangeStrategy,