renovate 43.263.0 → 43.263.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.
- package/dist/config/app-strings.js +1 -1
- package/dist/config/app-strings.js.map +1 -1
- package/dist/config/decrypt/bcpgp.js +7 -4
- package/dist/config/decrypt/bcpgp.js.map +1 -1
- package/dist/config/migration.js +4 -6
- package/dist/config/migration.js.map +1 -1
- package/dist/config/options/index.js +1 -1
- package/dist/config/options/index.js.map +1 -1
- package/dist/config/validation-helpers/match-base-branches.js +4 -6
- package/dist/config/validation-helpers/match-base-branches.js.map +1 -1
- package/dist/config/validation-helpers/regex-glob-matchers.js +4 -6
- package/dist/config/validation-helpers/regex-glob-matchers.js.map +1 -1
- package/dist/config/validation-helpers/utils.js +2 -4
- package/dist/config/validation-helpers/utils.js.map +1 -1
- package/dist/config/validation.js +4 -6
- package/dist/config/validation.js.map +1 -1
- package/dist/config-validator.js +1 -3
- package/dist/config-validator.js.map +1 -1
- package/dist/global-config-option-defaults.generated.js +1 -1
- package/dist/global-config-option-defaults.generated.js.map +1 -1
- package/dist/modules/datasource/artifactory/index.js +6 -8
- package/dist/modules/datasource/artifactory/index.js.map +1 -1
- package/dist/modules/datasource/aws-machine-image/index.js +1 -2
- package/dist/modules/datasource/aws-machine-image/index.js.map +1 -1
- package/dist/modules/datasource/azure-pipelines-tasks/index.js +2 -3
- package/dist/modules/datasource/azure-pipelines-tasks/index.js.map +1 -1
- package/dist/modules/datasource/conda/index.js +1 -3
- package/dist/modules/datasource/conda/index.js.map +1 -1
- package/dist/modules/datasource/dart-version/index.js +1 -2
- package/dist/modules/datasource/dart-version/index.js.map +1 -1
- package/dist/modules/datasource/datasource.js +1 -3
- package/dist/modules/datasource/datasource.js.map +1 -1
- package/dist/modules/datasource/devbox/index.js +1 -3
- package/dist/modules/datasource/devbox/index.js.map +1 -1
- package/dist/modules/datasource/docker/ecr.js +2 -1
- package/dist/modules/datasource/docker/ecr.js.map +1 -1
- package/dist/modules/datasource/docker/index.js +1 -1
- package/dist/modules/datasource/docker/index.js.map +1 -1
- package/dist/modules/datasource/galaxy-collection/index.js +1 -1
- package/dist/modules/datasource/galaxy-collection/index.js.map +1 -1
- package/dist/modules/datasource/go/releases-goproxy.js +2 -2
- package/dist/modules/datasource/go/releases-goproxy.js.map +1 -1
- package/dist/modules/datasource/java-version/index.js +1 -3
- package/dist/modules/datasource/java-version/index.js.map +1 -1
- package/dist/modules/datasource/maven/util.js +2 -1
- package/dist/modules/datasource/maven/util.js.map +1 -1
- package/dist/modules/datasource/nuget/common.js +6 -4
- package/dist/modules/datasource/nuget/common.js.map +1 -1
- package/dist/modules/datasource/util.js +3 -2
- package/dist/modules/datasource/util.js.map +1 -1
- package/dist/modules/manager/azure-pipelines/extract.js +1 -1
- package/dist/modules/manager/azure-pipelines/extract.js.map +1 -1
- package/dist/modules/manager/bazel/extract.js +1 -3
- package/dist/modules/manager/bazel/extract.js.map +1 -1
- package/dist/modules/manager/bazel/parser.js +1 -1
- package/dist/modules/manager/bazel/parser.js.map +1 -1
- package/dist/modules/manager/buildpacks/extract.js +1 -1
- package/dist/modules/manager/buildpacks/extract.js.map +1 -1
- package/dist/modules/manager/bundler/common.js +23 -25
- package/dist/modules/manager/bundler/common.js.map +1 -1
- package/dist/modules/manager/bundler/extract.js +2 -6
- package/dist/modules/manager/bundler/extract.js.map +1 -1
- package/dist/modules/manager/cargo/extract.js +4 -6
- package/dist/modules/manager/cargo/extract.js.map +1 -1
- package/dist/modules/manager/dockerfile/extract.js +3 -3
- package/dist/modules/manager/dockerfile/extract.js.map +1 -1
- package/dist/modules/manager/fingerprint.generated.js +13 -13
- package/dist/modules/manager/fingerprint.generated.js.map +1 -1
- package/dist/modules/manager/flux/extract.js +2 -1
- package/dist/modules/manager/flux/extract.js.map +1 -1
- package/dist/modules/manager/github-actions/parse.js +1 -1
- package/dist/modules/manager/github-actions/parse.js.map +1 -1
- package/dist/modules/manager/gradle/extract/catalog.js +4 -3
- package/dist/modules/manager/gradle/extract/catalog.js.map +1 -1
- package/dist/modules/manager/gradle/extract.js +2 -2
- package/dist/modules/manager/gradle/extract.js.map +1 -1
- package/dist/modules/manager/gradle/parser/common.js +1 -1
- package/dist/modules/manager/gradle/parser/common.js.map +1 -1
- package/dist/modules/manager/gradle/parser/handlers.js +1 -1
- package/dist/modules/manager/gradle/parser/handlers.js.map +1 -1
- package/dist/modules/manager/helm-values/extract.js.map +1 -1
- package/dist/modules/manager/helmfile/extract.js +1 -1
- package/dist/modules/manager/helmfile/extract.js.map +1 -1
- package/dist/modules/manager/maven/extract.js.map +1 -1
- package/dist/modules/manager/maven/update.js +2 -1
- package/dist/modules/manager/maven/update.js.map +1 -1
- package/dist/modules/manager/mise/utils.js +5 -7
- package/dist/modules/manager/mise/utils.js.map +1 -1
- package/dist/modules/manager/mix/extract.js +3 -6
- package/dist/modules/manager/mix/extract.js.map +1 -1
- package/dist/modules/manager/npm/extract/common/overrides.js +1 -1
- package/dist/modules/manager/npm/extract/common/overrides.js.map +1 -1
- package/dist/modules/manager/npm/extract/yarn.js +1 -1
- package/dist/modules/manager/npm/extract/yarn.js.map +1 -1
- package/dist/modules/manager/npm/npmrc.js +1 -3
- package/dist/modules/manager/npm/npmrc.js.map +1 -1
- package/dist/modules/manager/npm/update/dependency/common.js +2 -3
- package/dist/modules/manager/npm/update/dependency/common.js.map +1 -1
- package/dist/modules/manager/npm/update/dependency/index.js +1 -1
- package/dist/modules/manager/npm/update/dependency/index.js.map +1 -1
- package/dist/modules/manager/npm/update/dependency/pnpm.js +1 -1
- package/dist/modules/manager/npm/update/dependency/pnpm.js.map +1 -1
- package/dist/modules/manager/npm/update/dependency/yarn.js +1 -1
- package/dist/modules/manager/npm/update/dependency/yarn.js.map +1 -1
- package/dist/modules/manager/osgi/extract.js +1 -1
- package/dist/modules/manager/osgi/extract.js.map +1 -1
- package/dist/modules/manager/pep621/processors/uv.js +1 -1
- package/dist/modules/manager/pep621/processors/uv.js.map +1 -1
- package/dist/modules/manager/pep621/schema.js.map +1 -1
- package/dist/modules/manager/pip_setup/extract.js +1 -1
- package/dist/modules/manager/pip_setup/extract.js.map +1 -1
- package/dist/modules/manager/pipenv/artifacts.js.map +1 -1
- package/dist/modules/manager/poetry/schema.js +2 -2
- package/dist/modules/manager/poetry/schema.js.map +1 -1
- package/dist/modules/manager/pub/artifacts.js +4 -6
- package/dist/modules/manager/pub/artifacts.js.map +1 -1
- package/dist/modules/manager/pub/utils.js +2 -2
- package/dist/modules/manager/pub/utils.js.map +1 -1
- package/dist/modules/manager/puppet/common.js +4 -6
- package/dist/modules/manager/puppet/common.js.map +1 -1
- package/dist/modules/manager/sbt/extract.js +1 -1
- package/dist/modules/manager/sbt/extract.js.map +1 -1
- package/dist/modules/manager/sbt/util.js +4 -2
- package/dist/modules/manager/sbt/util.js.map +1 -1
- package/dist/modules/manager/terraform/lockfile/util.js +1 -1
- package/dist/modules/manager/terraform/lockfile/util.js.map +1 -1
- package/dist/modules/platform/azure/index.js +15 -19
- package/dist/modules/platform/azure/index.js.map +1 -1
- package/dist/modules/platform/azure/issue.js +67 -17
- package/dist/modules/platform/azure/issue.js.map +1 -1
- package/dist/modules/platform/bitbucket/index.js +1 -3
- package/dist/modules/platform/bitbucket/index.js.map +1 -1
- package/dist/modules/platform/forgejo/index.js +5 -3
- package/dist/modules/platform/forgejo/index.js.map +1 -1
- package/dist/modules/platform/forgejo/utils.js +1 -1
- package/dist/modules/platform/forgejo/utils.js.map +1 -1
- package/dist/modules/platform/gerrit/scm.js +5 -7
- package/dist/modules/platform/gerrit/scm.js.map +1 -1
- package/dist/modules/platform/gitea/index.js +5 -3
- package/dist/modules/platform/gitea/index.js.map +1 -1
- package/dist/modules/platform/gitea/utils.js +1 -1
- package/dist/modules/platform/gitea/utils.js.map +1 -1
- package/dist/modules/platform/github/index.js +5 -7
- package/dist/modules/platform/github/index.js.map +1 -1
- package/dist/modules/platform/github/pr.js +1 -1
- package/dist/modules/platform/github/pr.js.map +1 -1
- package/dist/modules/platform/gitlab/index.js +2 -1
- package/dist/modules/platform/gitlab/index.js.map +1 -1
- package/dist/modules/platform/utils/pr-body.js +2 -1
- package/dist/modules/platform/utils/pr-body.js.map +1 -1
- package/dist/modules/versioning/apk/index.js +3 -3
- package/dist/modules/versioning/apk/index.js.map +1 -1
- package/dist/modules/versioning/composer/index.js +4 -7
- package/dist/modules/versioning/composer/index.js.map +1 -1
- package/dist/modules/versioning/conan/common.js +4 -6
- package/dist/modules/versioning/conan/common.js.map +1 -1
- package/dist/modules/versioning/conan/index.js +1 -3
- package/dist/modules/versioning/conan/index.js.map +1 -1
- package/dist/modules/versioning/conan/range.js +4 -5
- package/dist/modules/versioning/conan/range.js.map +1 -1
- package/dist/modules/versioning/conda/index.js +1 -1
- package/dist/modules/versioning/conda/index.js.map +1 -1
- package/dist/modules/versioning/gradle/index.js +7 -3
- package/dist/modules/versioning/gradle/index.js.map +1 -1
- package/dist/modules/versioning/hermit/index.js +2 -2
- package/dist/modules/versioning/hermit/index.js.map +1 -1
- package/dist/modules/versioning/ivy/index.js +1 -1
- package/dist/modules/versioning/ivy/index.js.map +1 -1
- package/dist/modules/versioning/maven/compare.js +4 -6
- package/dist/modules/versioning/maven/compare.js.map +1 -1
- package/dist/modules/versioning/npm/range.js +5 -7
- package/dist/modules/versioning/npm/range.js.map +1 -1
- package/dist/modules/versioning/nuget/version.js +6 -6
- package/dist/modules/versioning/nuget/version.js.map +1 -1
- package/dist/modules/versioning/pep440/index.js +1 -1
- package/dist/modules/versioning/pep440/index.js.map +1 -1
- package/dist/modules/versioning/pep440/range.js +2 -6
- package/dist/modules/versioning/pep440/range.js.map +1 -1
- package/dist/modules/versioning/poetry/index.js +1 -1
- package/dist/modules/versioning/poetry/index.js.map +1 -1
- package/dist/modules/versioning/pvp/index.js +2 -2
- package/dist/modules/versioning/pvp/index.js.map +1 -1
- package/dist/modules/versioning/rpm/index.js +4 -3
- package/dist/modules/versioning/rpm/index.js.map +1 -1
- package/dist/modules/versioning/ruby/range.js +2 -2
- package/dist/modules/versioning/ruby/range.js.map +1 -1
- package/dist/modules/versioning/ruby/strategies/bump.js +1 -1
- package/dist/modules/versioning/ruby/strategies/bump.js.map +1 -1
- package/dist/modules/versioning/ruby/strategies/replace.js +13 -12
- package/dist/modules/versioning/ruby/strategies/replace.js.map +1 -1
- package/dist/modules/versioning/ruby/version.js +1 -1
- package/dist/modules/versioning/ruby/version.js.map +1 -1
- package/dist/modules/versioning/rust-release-channel/index.js +1 -1
- package/dist/modules/versioning/rust-release-channel/index.js.map +1 -1
- package/dist/modules/versioning/rust-release-channel/util.js +4 -4
- package/dist/modules/versioning/rust-release-channel/util.js.map +1 -1
- package/dist/util/common.js +1 -3
- package/dist/util/common.js.map +1 -1
- package/dist/util/exec/common.js +4 -6
- package/dist/util/exec/common.js.map +1 -1
- package/dist/util/exec/containerbase.js +1 -3
- package/dist/util/exec/containerbase.js.map +1 -1
- package/dist/util/git/instrument.js +3 -3
- package/dist/util/git/instrument.js.map +1 -1
- package/dist/util/github/graphql/datasource-fetcher.js +5 -4
- package/dist/util/github/graphql/datasource-fetcher.js.map +1 -1
- package/dist/util/http/cache/package-http-cache-provider.js.map +1 -1
- package/dist/util/http/github.js +3 -2
- package/dist/util/http/github.js.map +1 -1
- package/dist/util/http/http.d.ts +1 -1
- package/dist/util/http/http.js.map +1 -1
- package/dist/util/result.d.ts +8 -8
- package/dist/util/result.js +1 -1
- package/dist/util/result.js.map +1 -1
- package/dist/util/url.js +2 -2
- package/dist/util/url.js.map +1 -1
- package/dist/workers/global/config/parse/cli.js +18 -20
- package/dist/workers/global/config/parse/cli.js.map +1 -1
- package/dist/workers/global/config/parse/env.js +3 -5
- package/dist/workers/global/config/parse/env.js.map +1 -1
- package/dist/workers/repository/config-migration/branch/index.js +3 -5
- package/dist/workers/repository/config-migration/branch/index.js.map +1 -1
- package/dist/workers/repository/init/merge.js +2 -3
- package/dist/workers/repository/init/merge.js.map +1 -1
- package/dist/workers/repository/onboarding/branch/check.js +7 -9
- package/dist/workers/repository/onboarding/branch/check.js.map +1 -1
- package/dist/workers/repository/onboarding/branch/index.js +4 -8
- package/dist/workers/repository/onboarding/branch/index.js.map +1 -1
- package/dist/workers/repository/onboarding/branch/onboarding-branch-cache.js +2 -2
- package/dist/workers/repository/onboarding/branch/onboarding-branch-cache.js.map +1 -1
- package/dist/workers/repository/process/extract-update.js.map +1 -1
- package/dist/workers/repository/process/fetch.js.map +1 -1
- package/dist/workers/repository/process/libyear.js +1 -3
- package/dist/workers/repository/process/libyear.js.map +1 -1
- package/dist/workers/repository/process/lookup/filter-checks.js +9 -11
- package/dist/workers/repository/process/lookup/filter-checks.js.map +1 -1
- package/dist/workers/repository/process/lookup/index.js +5 -8
- package/dist/workers/repository/process/lookup/index.js.map +1 -1
- package/dist/workers/repository/process/vulnerabilities.js +3 -3
- package/dist/workers/repository/process/vulnerabilities.js.map +1 -1
- package/dist/workers/repository/reconfigure/index.js +3 -5
- package/dist/workers/repository/reconfigure/index.js.map +1 -1
- package/dist/workers/repository/update/branch/bump-versions.js +1 -1
- package/dist/workers/repository/update/branch/bump-versions.js.map +1 -1
- package/dist/workers/repository/update/branch/get-updated.js +3 -5
- package/dist/workers/repository/update/branch/get-updated.js.map +1 -1
- package/dist/workers/repository/update/pr/body/updates-table.js +1 -3
- package/dist/workers/repository/update/pr/body/updates-table.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/common.js +1 -1
- package/dist/workers/repository/update/pr/changelog/common.js.map +1 -1
- package/dist/workers/repository/update/pr/index.js +6 -7
- package/dist/workers/repository/update/pr/index.js.map +1 -1
- package/dist/workers/repository/updates/flatten.js +1 -1
- package/dist/workers/repository/updates/flatten.js.map +1 -1
- package/dist/workers/repository/updates/generate.js +1 -1
- package/dist/workers/repository/updates/generate.js.map +1 -1
- package/package.json +2 -2
- package/renovate-schema.json +2 -2
|
@@ -27,11 +27,9 @@ function replaceCaretValue(oldValue, newValue) {
|
|
|
27
27
|
const oldVal = oldTuple[idx];
|
|
28
28
|
const newVal = newTuple[idx];
|
|
29
29
|
let leadingDigit = false;
|
|
30
|
-
if (oldVal !== 0 || newVal !== 0) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
leadingDigit = true;
|
|
34
|
-
}
|
|
30
|
+
if ((oldVal !== 0 || newVal !== 0) && leadingZero) {
|
|
31
|
+
leadingZero = false;
|
|
32
|
+
leadingDigit = true;
|
|
35
33
|
}
|
|
36
34
|
if (leadingDigit && newVal > oldVal) needReplace = true;
|
|
37
35
|
if (!needReplace && newVal < oldVal) return newValue;
|
|
@@ -58,7 +56,7 @@ function getNewValue({ currentValue, rangeStrategy, currentVersion, newVersion }
|
|
|
58
56
|
});
|
|
59
57
|
}
|
|
60
58
|
const parsedRange = semverUtils.parseRange(currentValue);
|
|
61
|
-
const element = parsedRange
|
|
59
|
+
const element = parsedRange.at(-1);
|
|
62
60
|
if (rangeStrategy === "widen") {
|
|
63
61
|
if (satisfiesRange(newVersion, currentValue)) return currentValue;
|
|
64
62
|
const newValue = getNewValue({
|
|
@@ -73,7 +71,7 @@ function getNewValue({ currentValue, rangeStrategy, currentVersion, newVersion }
|
|
|
73
71
|
return `${splitCurrent.join(element.operator)}${newValue}`;
|
|
74
72
|
}
|
|
75
73
|
if (parsedRange.length > 1) {
|
|
76
|
-
if (parsedRange
|
|
74
|
+
if (parsedRange.at(-2).operator === "-") {
|
|
77
75
|
const splitCurrent = currentValue.split("-");
|
|
78
76
|
splitCurrent.pop();
|
|
79
77
|
return `${splitCurrent.join("-")}- ${newValue}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"range.js","names":["major","minor","satisfies"],"sources":["../../../../lib/modules/versioning/npm/range.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport semver from 'semver';\nimport semverUtils from 'semver-utils';\nimport { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { isSemVerXRange, normalizeLegacyXRanges } from '../semver/common.ts';\nimport type { NewValueConfig } from '../types.ts';\n\nconst {\n inc: increment,\n valid: isVersion,\n major,\n minor,\n patch,\n prerelease,\n satisfies,\n} = semver;\n\nfunction replaceCaretValue(oldValue: string, newValue: string): string {\n const toVersionMajor = major(newValue);\n const toVersionMinor = minor(newValue);\n const toVersionPatch = patch(newValue);\n\n const currentMajor = major(oldValue);\n const currentMinor = minor(oldValue);\n const currentPatch = patch(oldValue);\n\n const oldTuple = [currentMajor, currentMinor, currentPatch];\n const newTuple = [toVersionMajor, toVersionMinor, toVersionPatch];\n const resultTuple = [];\n\n let leadingZero = true;\n let needReplace = false;\n for (let idx = 0; idx < 3; idx += 1) {\n const oldVal = oldTuple[idx];\n const newVal = newTuple[idx];\n\n let leadingDigit = false;\n if (oldVal !== 0 || newVal !== 0) {\n if (leadingZero) {\n leadingZero = false;\n leadingDigit = true;\n }\n }\n\n if (leadingDigit && newVal > oldVal) {\n needReplace = true;\n }\n\n if (!needReplace && newVal < oldVal) {\n return newValue;\n }\n\n resultTuple.push(leadingDigit ? newVal : 0);\n }\n\n return needReplace ? resultTuple.join('.') : oldValue;\n}\n\nfunction stripV(value: string): string {\n return value.replace(/^v/, '');\n}\n\nfunction satisfiesRange(version: string, range: string): boolean {\n return satisfies(version, normalizeLegacyXRanges(range));\n}\n\n// TODO: #22198\nexport function getNewValue({\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n}: NewValueConfig): string | null {\n if (rangeStrategy !== 'update-lockfile' && isSemVerXRange(currentValue)) {\n return null;\n }\n if (isVersion(currentValue)) {\n return newVersion;\n }\n if (rangeStrategy === 'update-lockfile') {\n if (satisfiesRange(newVersion, currentValue)) {\n return currentValue;\n }\n return getNewValue({\n currentValue,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n }\n const parsedRange = semverUtils.parseRange(currentValue);\n const element = parsedRange[parsedRange.length - 1];\n if (rangeStrategy === 'widen') {\n if (satisfiesRange(newVersion, currentValue)) {\n return currentValue;\n }\n const newValue = getNewValue({\n currentValue,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n if (element.operator?.startsWith('<')) {\n // TODO fix this\n const splitCurrent = currentValue.split(element.operator);\n splitCurrent.pop();\n // TODO: types (#22198)\n return `${splitCurrent.join(element.operator)}${newValue!}`;\n }\n if (parsedRange.length > 1) {\n const previousElement = parsedRange[parsedRange.length - 2];\n if (previousElement.operator === '-') {\n const splitCurrent = currentValue.split('-');\n splitCurrent.pop();\n // TODO: types (#22198)\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 // TODO: types (#22198)\n return `${currentValue} || ${newValue!}`;\n }\n const toVersionMajor = major(newVersion);\n const toVersionMinor = minor(newVersion);\n const toVersionPatch = patch(newVersion);\n const toNewVersion = prerelease(newVersion);\n const suffix = toNewVersion ? `-${toNewVersion[0]}` : '';\n // Simple range\n if (rangeStrategy === 'bump') {\n if (parsedRange.length === 1) {\n if (!element.operator) {\n return stripV(newVersion);\n }\n if (element.operator === '^') {\n return `^${stripV(newVersion)}`;\n }\n if (element.operator === '~') {\n return `~${stripV(newVersion)}`;\n }\n if (element.operator === '=') {\n return `=${stripV(newVersion)}`;\n }\n if (element.operator === '>=') {\n return currentValue.includes('>= ')\n ? `>= ${stripV(newVersion)}`\n : `>=${stripV(newVersion)}`;\n }\n if (element.operator.startsWith('<')) {\n return currentValue;\n }\n } else {\n return semverUtils\n .parseRange(currentValue)\n .map((x) => x.semver)\n .filter(isString)\n .map((subRange) => {\n const bumpedSubRange = getNewValue({\n currentValue: subRange,\n rangeStrategy: 'bump',\n currentVersion,\n newVersion,\n });\n if (bumpedSubRange && satisfiesRange(newVersion, bumpedSubRange)) {\n return bumpedSubRange;\n }\n\n return getNewValue({\n currentValue: subRange,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n })\n .filter((x) => x !== null && x !== '')\n .join(' ');\n }\n logger.debug(\n `Unsupported range type for rangeStrategy=bump: ${currentValue}`,\n );\n return null;\n }\n if (element.operator === '~>') {\n return `~> ${toVersionMajor}.${toVersionMinor}.0`;\n }\n if (element.operator === '^') {\n if (suffix.length || !currentVersion) {\n return `^${toVersionMajor}.${toVersionMinor}.${toVersionPatch}${suffix}`;\n }\n return `^${replaceCaretValue(currentVersion, newVersion)}`;\n }\n if (element.operator === '=') {\n return `=${stripV(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 = `<=${stripV(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 === '<') {\n let res;\n if (currentValue.endsWith('.0.0')) {\n const newMajor = toVersionMajor + 1;\n res = `<${newMajor}.0.0`;\n } else if (currentValue.endsWith('.0')) {\n const newMinor = toVersionMinor + 1;\n res = `<${toVersionMajor}.${newMinor}${element.patch ? '.0' : ''}`;\n } else if (element.patch) {\n // TODO: types (#22198)\n res = `<${increment(newVersion, 'patch')!}`;\n } else if (element.minor) {\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 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 `${toVersionMajor}.${toVersionMinor}`;\n }\n return `${toVersionMajor}`;\n }\n return newVersion;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"range.js","names":["major","minor","satisfies"],"sources":["../../../../lib/modules/versioning/npm/range.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport semver from 'semver';\nimport semverUtils from 'semver-utils';\nimport { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { isSemVerXRange, normalizeLegacyXRanges } from '../semver/common.ts';\nimport type { NewValueConfig } from '../types.ts';\n\nconst {\n inc: increment,\n valid: isVersion,\n major,\n minor,\n patch,\n prerelease,\n satisfies,\n} = semver;\n\nfunction replaceCaretValue(oldValue: string, newValue: string): string {\n const toVersionMajor = major(newValue);\n const toVersionMinor = minor(newValue);\n const toVersionPatch = patch(newValue);\n\n const currentMajor = major(oldValue);\n const currentMinor = minor(oldValue);\n const currentPatch = patch(oldValue);\n\n const oldTuple = [currentMajor, currentMinor, currentPatch];\n const newTuple = [toVersionMajor, toVersionMinor, toVersionPatch];\n const resultTuple = [];\n\n let leadingZero = true;\n let needReplace = false;\n for (let idx = 0; idx < 3; idx += 1) {\n const oldVal = oldTuple[idx];\n const newVal = newTuple[idx];\n\n let leadingDigit = false;\n if ((oldVal !== 0 || newVal !== 0) && leadingZero) {\n leadingZero = false;\n leadingDigit = true;\n }\n\n if (leadingDigit && newVal > oldVal) {\n needReplace = true;\n }\n\n if (!needReplace && newVal < oldVal) {\n return newValue;\n }\n\n resultTuple.push(leadingDigit ? newVal : 0);\n }\n\n return needReplace ? resultTuple.join('.') : oldValue;\n}\n\nfunction stripV(value: string): string {\n return value.replace(/^v/, '');\n}\n\nfunction satisfiesRange(version: string, range: string): boolean {\n return satisfies(version, normalizeLegacyXRanges(range));\n}\n\n// TODO: #22198\nexport function getNewValue({\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n}: NewValueConfig): string | null {\n if (rangeStrategy !== 'update-lockfile' && isSemVerXRange(currentValue)) {\n return null;\n }\n if (isVersion(currentValue)) {\n return newVersion;\n }\n if (rangeStrategy === 'update-lockfile') {\n if (satisfiesRange(newVersion, currentValue)) {\n return currentValue;\n }\n return getNewValue({\n currentValue,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n }\n const parsedRange = semverUtils.parseRange(currentValue);\n const element = parsedRange.at(-1)!;\n if (rangeStrategy === 'widen') {\n if (satisfiesRange(newVersion, currentValue)) {\n return currentValue;\n }\n const newValue = getNewValue({\n currentValue,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n if (element.operator?.startsWith('<')) {\n // TODO fix this\n const splitCurrent = currentValue.split(element.operator);\n splitCurrent.pop();\n // TODO: types (#22198)\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 // TODO: types (#22198)\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 // TODO: types (#22198)\n return `${currentValue} || ${newValue!}`;\n }\n const toVersionMajor = major(newVersion);\n const toVersionMinor = minor(newVersion);\n const toVersionPatch = patch(newVersion);\n const toNewVersion = prerelease(newVersion);\n const suffix = toNewVersion ? `-${toNewVersion[0]}` : '';\n // Simple range\n if (rangeStrategy === 'bump') {\n if (parsedRange.length === 1) {\n if (!element.operator) {\n return stripV(newVersion);\n }\n if (element.operator === '^') {\n return `^${stripV(newVersion)}`;\n }\n if (element.operator === '~') {\n return `~${stripV(newVersion)}`;\n }\n if (element.operator === '=') {\n return `=${stripV(newVersion)}`;\n }\n if (element.operator === '>=') {\n return currentValue.includes('>= ')\n ? `>= ${stripV(newVersion)}`\n : `>=${stripV(newVersion)}`;\n }\n if (element.operator.startsWith('<')) {\n return currentValue;\n }\n } else {\n return semverUtils\n .parseRange(currentValue)\n .map((x) => x.semver)\n .filter(isString)\n .map((subRange) => {\n const bumpedSubRange = getNewValue({\n currentValue: subRange,\n rangeStrategy: 'bump',\n currentVersion,\n newVersion,\n });\n if (bumpedSubRange && satisfiesRange(newVersion, bumpedSubRange)) {\n return bumpedSubRange;\n }\n\n return getNewValue({\n currentValue: subRange,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n })\n .filter((x) => x !== null && x !== '')\n .join(' ');\n }\n logger.debug(\n `Unsupported range type for rangeStrategy=bump: ${currentValue}`,\n );\n return null;\n }\n if (element.operator === '~>') {\n return `~> ${toVersionMajor}.${toVersionMinor}.0`;\n }\n if (element.operator === '^') {\n if (suffix.length || !currentVersion) {\n return `^${toVersionMajor}.${toVersionMinor}.${toVersionPatch}${suffix}`;\n }\n return `^${replaceCaretValue(currentVersion, newVersion)}`;\n }\n if (element.operator === '=') {\n return `=${stripV(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 = `<=${stripV(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 === '<') {\n let res;\n if (currentValue.endsWith('.0.0')) {\n const newMajor = toVersionMajor + 1;\n res = `<${newMajor}.0.0`;\n } else if (currentValue.endsWith('.0')) {\n const newMinor = toVersionMinor + 1;\n res = `<${toVersionMajor}.${newMinor}${element.patch ? '.0' : ''}`;\n } else if (element.patch) {\n // TODO: types (#22198)\n res = `<${increment(newVersion, 'patch')!}`;\n } else if (element.minor) {\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 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 `${toVersionMajor}.${toVersionMinor}`;\n }\n return `${toVersionMajor}`;\n }\n return newVersion;\n}\n"],"mappings":"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"}
|
|
@@ -28,12 +28,12 @@ function compare(x, y) {
|
|
|
28
28
|
const xRevision = x.revision ?? 0;
|
|
29
29
|
const yRevision = y.revision ?? 0;
|
|
30
30
|
if (xMajor !== yMajor) return Math.sign(xMajor - yMajor);
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
31
|
+
if (xMinor !== yMinor) return Math.sign(xMinor - yMinor);
|
|
32
|
+
if (xPatch !== yPatch) return Math.sign(xPatch - yPatch);
|
|
33
|
+
if (xRevision !== yRevision) return Math.sign(xRevision - yRevision);
|
|
34
|
+
if (x.prerelease && !y.prerelease) return -1;
|
|
35
|
+
if (!x.prerelease && y.prerelease) return 1;
|
|
36
|
+
if (x.prerelease && y.prerelease) return comparePrereleases(x.prerelease, y.prerelease);
|
|
37
37
|
return 0;
|
|
38
38
|
}
|
|
39
39
|
function versionToString(version) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","names":[],"sources":["../../../../lib/modules/versioning/nuget/version.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport type { NugetVersion } from './types.ts';\n\n// We can't just use `Number.parseInt()` beacause it parses `123abc` as `123`,\n// which leads to incorrect version comparison.\nfunction ensureNumber(input: string): number | null {\n if (!regEx(/^\\d+$/).test(input)) {\n return null;\n }\n\n return Number.parseInt(input, 10);\n}\n\nfunction comparePrereleases(x: string, y: string): number {\n const xParts = x.split('.');\n const yParts = y.split('.');\n\n const maxLen = Math.max(xParts.length, yParts.length);\n for (let i = 0; i < maxLen; i += 1) {\n const xPart = xParts[i] ?? '';\n const yPart = yParts[i] ?? '';\n const xNum = ensureNumber(xPart);\n const yNum = ensureNumber(yPart);\n\n const res =\n xNum !== null && yNum !== null\n ? Math.sign(xNum - yNum)\n : xPart.localeCompare(yPart, undefined, { sensitivity: 'base' });\n\n if (res !== 0) {\n return res;\n }\n }\n\n return 0;\n}\n\nexport function compare(x: NugetVersion, y: NugetVersion): number {\n const xMajor = x.major;\n const yMajor = y.major;\n\n const xMinor = x.minor ?? 0;\n const yMinor = y.minor ?? 0;\n\n const xPatch = x.patch ?? 0;\n const yPatch = y.patch ?? 0;\n\n const xRevision = x.revision ?? 0;\n const yRevision = y.revision ?? 0;\n\n if (xMajor !== yMajor) {\n return Math.sign(xMajor - yMajor);\n }
|
|
1
|
+
{"version":3,"file":"version.js","names":[],"sources":["../../../../lib/modules/versioning/nuget/version.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport type { NugetVersion } from './types.ts';\n\n// We can't just use `Number.parseInt()` beacause it parses `123abc` as `123`,\n// which leads to incorrect version comparison.\nfunction ensureNumber(input: string): number | null {\n if (!regEx(/^\\d+$/).test(input)) {\n return null;\n }\n\n return Number.parseInt(input, 10);\n}\n\nfunction comparePrereleases(x: string, y: string): number {\n const xParts = x.split('.');\n const yParts = y.split('.');\n\n const maxLen = Math.max(xParts.length, yParts.length);\n for (let i = 0; i < maxLen; i += 1) {\n const xPart = xParts[i] ?? '';\n const yPart = yParts[i] ?? '';\n const xNum = ensureNumber(xPart);\n const yNum = ensureNumber(yPart);\n\n const res =\n xNum !== null && yNum !== null\n ? Math.sign(xNum - yNum)\n : xPart.localeCompare(yPart, undefined, { sensitivity: 'base' });\n\n if (res !== 0) {\n return res;\n }\n }\n\n return 0;\n}\n\nexport function compare(x: NugetVersion, y: NugetVersion): number {\n const xMajor = x.major;\n const yMajor = y.major;\n\n const xMinor = x.minor ?? 0;\n const yMinor = y.minor ?? 0;\n\n const xPatch = x.patch ?? 0;\n const yPatch = y.patch ?? 0;\n\n const xRevision = x.revision ?? 0;\n const yRevision = y.revision ?? 0;\n\n if (xMajor !== yMajor) {\n return Math.sign(xMajor - yMajor);\n }\n if (xMinor !== yMinor) {\n return Math.sign(xMinor - yMinor);\n }\n if (xPatch !== yPatch) {\n return Math.sign(xPatch - yPatch);\n }\n if (xRevision !== yRevision) {\n return Math.sign(xRevision - yRevision);\n }\n if (x.prerelease && !y.prerelease) {\n return -1;\n }\n if (!x.prerelease && y.prerelease) {\n return 1;\n }\n if (x.prerelease && y.prerelease) {\n return comparePrereleases(x.prerelease, y.prerelease);\n }\n\n return 0;\n}\n\nexport function versionToString(version: NugetVersion): string {\n let res = `${version.major}`;\n\n if (version.minor !== undefined) {\n res += `.${version.minor}`;\n }\n\n if (version.patch !== undefined) {\n res += `.${version.patch}`;\n }\n\n if (version.revision !== undefined) {\n res += `.${version.revision}`;\n }\n\n if (version.prerelease) {\n res += `-${version.prerelease}`;\n }\n\n if (version.metadata) {\n res += `+${version.metadata}`;\n }\n\n return res;\n}\n"],"mappings":";;AAKA,SAAS,aAAa,OAA8B;CAClD,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC,KAAK,KAAK,GAC5B,OAAO;CAGT,OAAO,OAAO,SAAS,OAAO,EAAE;AAClC;AAEA,SAAS,mBAAmB,GAAW,GAAmB;CACxD,MAAM,SAAS,EAAE,MAAM,GAAG;CAC1B,MAAM,SAAS,EAAE,MAAM,GAAG;CAE1B,MAAM,SAAS,KAAK,IAAI,OAAO,QAAQ,OAAO,MAAM;CACpD,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK,GAAG;EAClC,MAAM,QAAQ,OAAO,MAAM;EAC3B,MAAM,QAAQ,OAAO,MAAM;EAC3B,MAAM,OAAO,aAAa,KAAK;EAC/B,MAAM,OAAO,aAAa,KAAK;EAE/B,MAAM,MACJ,SAAS,QAAQ,SAAS,OACtB,KAAK,KAAK,OAAO,IAAI,IACrB,MAAM,cAAc,OAAO,KAAA,GAAW,EAAE,aAAa,OAAO,CAAC;EAEnE,IAAI,QAAQ,GACV,OAAO;CAEX;CAEA,OAAO;AACT;AAEA,SAAgB,QAAQ,GAAiB,GAAyB;CAChE,MAAM,SAAS,EAAE;CACjB,MAAM,SAAS,EAAE;CAEjB,MAAM,SAAS,EAAE,SAAS;CAC1B,MAAM,SAAS,EAAE,SAAS;CAE1B,MAAM,SAAS,EAAE,SAAS;CAC1B,MAAM,SAAS,EAAE,SAAS;CAE1B,MAAM,YAAY,EAAE,YAAY;CAChC,MAAM,YAAY,EAAE,YAAY;CAEhC,IAAI,WAAW,QACb,OAAO,KAAK,KAAK,SAAS,MAAM;CAElC,IAAI,WAAW,QACb,OAAO,KAAK,KAAK,SAAS,MAAM;CAElC,IAAI,WAAW,QACb,OAAO,KAAK,KAAK,SAAS,MAAM;CAElC,IAAI,cAAc,WAChB,OAAO,KAAK,KAAK,YAAY,SAAS;CAExC,IAAI,EAAE,cAAc,CAAC,EAAE,YACrB,OAAO;CAET,IAAI,CAAC,EAAE,cAAc,EAAE,YACrB,OAAO;CAET,IAAI,EAAE,cAAc,EAAE,YACpB,OAAO,mBAAmB,EAAE,YAAY,EAAE,UAAU;CAGtD,OAAO;AACT;AAEA,SAAgB,gBAAgB,SAA+B;CAC7D,IAAI,MAAM,GAAG,QAAQ;CAErB,IAAI,QAAQ,UAAU,KAAA,GACpB,OAAO,IAAI,QAAQ;CAGrB,IAAI,QAAQ,UAAU,KAAA,GACpB,OAAO,IAAI,QAAQ;CAGrB,IAAI,QAAQ,aAAa,KAAA,GACvB,OAAO,IAAI,QAAQ;CAGrB,IAAI,QAAQ,YACV,OAAO,IAAI,QAAQ;CAGrB,IAAI,QAAQ,UACV,OAAO,IAAI,QAAQ;CAGrB,OAAO;AACT"}
|
|
@@ -16,7 +16,7 @@ function isValid(input) {
|
|
|
16
16
|
}
|
|
17
17
|
function getSatisfyingVersion(versions, range) {
|
|
18
18
|
const found = pep440.filter(versions, range).sort(sortVersions);
|
|
19
|
-
return found.length === 0 ? null : found
|
|
19
|
+
return found.length === 0 ? null : found.at(-1);
|
|
20
20
|
}
|
|
21
21
|
function minSatisfyingVersion(versions, range) {
|
|
22
22
|
const found = pep440.filter(versions, range).sort(sortVersions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["satisfies"],"sources":["../../../../lib/modules/versioning/pep440/index.ts"],"sourcesContent":["import * as pep440 from '@renovatebot/pep440';\nimport type { RangeStrategy } from '../../../types/versioning.ts';\nimport type { VersioningApi } from '../types.ts';\nimport { getNewValue, getPinnedValue, isLessThanRange } from './range.ts';\n\nexport const id = 'pep440';\nexport const displayName = 'PEP440';\nexport const urls = [\n '[PEP 440 - Version Identification](https://www.python.org/dev/peps/pep-0440/)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = [\n 'bump',\n 'widen',\n 'replace',\n];\n\nconst {\n compare: sortVersions,\n satisfies,\n valid,\n validRange,\n explain,\n gt: isGreaterThan,\n major: getMajor,\n minor: getMinor,\n patch: getPatch,\n eq,\n} = pep440;\n\nfunction isVersion(input: string | undefined | null): boolean {\n // @renovatebot/pep440 isn't strict null save\n // oxlint-disable-next-line typescript/no-unnecessary-type-assertion\n return !!valid(input!);\n}\n\nconst isStable = (input: string): boolean => {\n const version = explain(input);\n if (!version) {\n return false;\n }\n return !version.is_prerelease;\n};\n\n// If this is left as an alias, inputs like \"17.04.0\" throw errors\nexport function isValid(input: string): boolean {\n return validRange(input) || isVersion(input);\n}\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n const found = pep440.filter(versions, range).sort(sortVersions);\n return found.length === 0 ? null : found
|
|
1
|
+
{"version":3,"file":"index.js","names":["satisfies"],"sources":["../../../../lib/modules/versioning/pep440/index.ts"],"sourcesContent":["import * as pep440 from '@renovatebot/pep440';\nimport type { RangeStrategy } from '../../../types/versioning.ts';\nimport type { VersioningApi } from '../types.ts';\nimport { getNewValue, getPinnedValue, isLessThanRange } from './range.ts';\n\nexport const id = 'pep440';\nexport const displayName = 'PEP440';\nexport const urls = [\n '[PEP 440 - Version Identification](https://www.python.org/dev/peps/pep-0440/)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = [\n 'bump',\n 'widen',\n 'replace',\n];\n\nconst {\n compare: sortVersions,\n satisfies,\n valid,\n validRange,\n explain,\n gt: isGreaterThan,\n major: getMajor,\n minor: getMinor,\n patch: getPatch,\n eq,\n} = pep440;\n\nfunction isVersion(input: string | undefined | null): boolean {\n // @renovatebot/pep440 isn't strict null save\n // oxlint-disable-next-line typescript/no-unnecessary-type-assertion\n return !!valid(input!);\n}\n\nconst isStable = (input: string): boolean => {\n const version = explain(input);\n if (!version) {\n return false;\n }\n return !version.is_prerelease;\n};\n\n// If this is left as an alias, inputs like \"17.04.0\" throw errors\nexport function isValid(input: string): boolean {\n return validRange(input) || isVersion(input);\n}\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n const found = pep440.filter(versions, range).sort(sortVersions);\n return found.length === 0 ? null : found.at(-1)!;\n}\n\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n const found = pep440.filter(versions, range).sort(sortVersions);\n return found.length === 0 ? null : found[0];\n}\n\nexport function isSingleVersion(constraint: string): boolean {\n return (\n isVersion(constraint) ||\n (constraint?.startsWith('==') && isVersion(constraint.substring(2).trim()))\n );\n}\n\nexport { isVersion, matches };\n\nconst equals = (version1: string, version2: string): boolean =>\n isVersion(version1) && isVersion(version2) && eq(version1, version2);\n\nfunction matches(version: string, range: string): boolean {\n if (!isVersion(version)) {\n return false;\n }\n if (isVersion(range)) {\n return equals(version, range);\n }\n return isValid(range) && satisfies(version, range, { prereleases: true });\n}\n\nexport const api: VersioningApi = {\n equals,\n getMajor,\n getMinor,\n getPatch,\n isCompatible: isVersion,\n isGreaterThan,\n isSingleVersion,\n isStable,\n isValid,\n isVersion,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n getNewValue,\n getPinnedValue,\n sortVersions,\n isLessThanRange,\n};\n\nexport default api;\n"],"mappings":";;;AAKA,MAAa,KAAK;AAYlB,MAAM,EACJ,SAAS,cACT,WAAA,aACA,OACA,YACA,SACA,IAAI,eACJ,OAAO,UACP,OAAO,UACP,OAAO,UACP,OACE;AAEJ,SAAS,UAAU,OAA2C;CAG5D,OAAO,CAAC,CAAC,MAAM,KAAM;AACvB;AAEA,MAAM,YAAY,UAA2B;CAC3C,MAAM,UAAU,QAAQ,KAAK;CAC7B,IAAI,CAAC,SACH,OAAO;CAET,OAAO,CAAC,QAAQ;AAClB;AAGA,SAAgB,QAAQ,OAAwB;CAC9C,OAAO,WAAW,KAAK,KAAK,UAAU,KAAK;AAC7C;AAEA,SAAS,qBACP,UACA,OACe;CACf,MAAM,QAAQ,OAAO,OAAO,UAAU,KAAK,CAAC,CAAC,KAAK,YAAY;CAC9D,OAAO,MAAM,WAAW,IAAI,OAAO,MAAM,GAAG,EAAE;AAChD;AAEA,SAAS,qBACP,UACA,OACe;CACf,MAAM,QAAQ,OAAO,OAAO,UAAU,KAAK,CAAC,CAAC,KAAK,YAAY;CAC9D,OAAO,MAAM,WAAW,IAAI,OAAO,MAAM;AAC3C;AAEA,SAAgB,gBAAgB,YAA6B;CAC3D,OACE,UAAU,UAAU,KACnB,YAAY,WAAW,IAAI,KAAK,UAAU,WAAW,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;AAE7E;AAIA,MAAM,UAAU,UAAkB,aAChC,UAAU,QAAQ,KAAK,UAAU,QAAQ,KAAK,GAAG,UAAU,QAAQ;AAErE,SAAS,QAAQ,SAAiB,OAAwB;CACxD,IAAI,CAAC,UAAU,OAAO,GACpB,OAAO;CAET,IAAI,UAAU,KAAK,GACjB,OAAO,OAAO,SAAS,KAAK;CAE9B,OAAO,QAAQ,KAAK,KAAKA,YAAU,SAAS,OAAO,EAAE,aAAa,KAAK,CAAC;AAC1E;AAEA,MAAa,MAAqB;CAChC;CACA;CACA;CACA;CACA,cAAc;CACd;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
|
|
@@ -285,9 +285,7 @@ function handleReplaceStrategy({ currentValue, rangeStrategy, currentVersion, ne
|
|
|
285
285
|
if (lte(newVersion, range.version)) return `>=${newVersion}`;
|
|
286
286
|
let newBase = getFutureVersion(coerceArray(parse$1(range.version)?.release).length - 1, newVersion);
|
|
287
287
|
if (trimZeros) newBase = trimTrailingZeros(newBase);
|
|
288
|
-
if (range.operator === ">")
|
|
289
|
-
if (newVersion === newBase.join(".") && newBase.length > 1) newBase.pop();
|
|
290
|
-
}
|
|
288
|
+
if (range.operator === ">" && newVersion === newBase.join(".") && newBase.length > 1) newBase.pop();
|
|
291
289
|
return range.operator + newBase.join(".");
|
|
292
290
|
}
|
|
293
291
|
return updateRangeValue({
|
|
@@ -313,9 +311,7 @@ function checkRangeAndRemoveUnnecessaryRangeLimit(rangeInput, newVersion) {
|
|
|
313
311
|
let newRange = rangeInput;
|
|
314
312
|
if (rangeInput.includes(",")) {
|
|
315
313
|
const newRes = rangeInput.split(",");
|
|
316
|
-
if (newRes[0].includes(".*") && newRes[0].includes("==") && newRes[1].includes(">="))
|
|
317
|
-
if (satisfies(newVersion, newRes[0])) newRange = newRes[0];
|
|
318
|
-
}
|
|
314
|
+
if (newRes[0].includes(".*") && newRes[0].includes("==") && newRes[1].includes(">=") && satisfies(newVersion, newRes[0])) newRange = newRes[0];
|
|
319
315
|
} else return rangeInput;
|
|
320
316
|
return newRange;
|
|
321
317
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"range.js","names":["parseVersion","parseRange"],"sources":["../../../../lib/modules/versioning/pep440/range.ts"],"sourcesContent":["import { gte, lt, lte, satisfies } from '@renovatebot/pep440';\nimport { parse as parseRange } from '@renovatebot/pep440/lib/specifier.js';\nimport { parse as parseVersion } from '@renovatebot/pep440/lib/version.js';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type { NewValueConfig } from '../types.ts';\n\nconst UserPolicyPrecisionMap = {\n Major: 0,\n Minor: 1,\n Micro: 2,\n Bug: 3,\n None: Infinity,\n} as const;\nconst PrecisionUserPolicyMap = {\n 0: 'Major',\n 1: 'Minor',\n 2: 'Micro',\n 3: 'Bug',\n} as const;\n\ntype UserPolicy =\n (typeof UserPolicyPrecisionMap)[keyof typeof UserPolicyPrecisionMap];\n\n/**\n * Calculate current update range precision.\n * @param ranges A {@link Range} consists of current range\n * @returns A {@link UserPolicy}\n */\nfunction getRangePrecision(ranges: Range[]): UserPolicy {\n const bound = coerceArray(\n parseVersion((ranges[1] || ranges[0]).version)?.release,\n );\n let rangePrecision = -1;\n // range is defined by a single bound.\n // ie. <1.2.2.3,\n // >=7\n if (ranges.length === 1) {\n rangePrecision = bound.length - 1;\n }\n // Range is defined by both upper and lower bounds.\n if (ranges.length === 2) {\n const lowerBound = coerceArray(parseVersion(ranges[0].version)?.release);\n rangePrecision = bound.findIndex((el, index) => el > lowerBound[index]);\n }\n // Tune down Major precision if followed by a zero\n if (\n rangePrecision === UserPolicyPrecisionMap.Major &&\n rangePrecision + 1 < bound.length &&\n bound[rangePrecision + 1] === 0\n ) {\n rangePrecision++;\n }\n // Could not calculate user precision\n // Default to the smallest possible\n // istanbul ignore next\n if (rangePrecision === -1) {\n rangePrecision = bound.length - 1;\n }\n const key =\n PrecisionUserPolicyMap[\n rangePrecision as keyof typeof PrecisionUserPolicyMap\n ];\n return UserPolicyPrecisionMap[key as keyof typeof UserPolicyPrecisionMap];\n}\n\n/**\n * @param policy Required range precision\n * @param newVersion The newly accepted version\n * @param baseVersion Optional Current upper bound\n * @returns A string represents a future version upper bound.\n */\nfunction getFutureVersion(\n policy: UserPolicy,\n newVersion: string,\n baseVersion?: string,\n): number[] {\n const toRelease = coerceArray(parseVersion(newVersion)?.release);\n const baseRelease = coerceArray(\n parseVersion(baseVersion ?? newVersion)?.release,\n );\n return baseRelease.map((_, index) => {\n const toPart = toRelease[index] ?? 0;\n if (index < policy) {\n return toPart;\n }\n if (index === policy) {\n return toPart + (baseVersion === undefined ? 0 : 1);\n }\n return 0;\n });\n}\n\ninterface Range {\n operator: string;\n prefix?: string;\n version: string;\n}\n\nexport function getPinnedValue(newVersion: string): string {\n return `==${newVersion}`;\n}\n\nexport function getNewValue({\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n isReplacement,\n}: NewValueConfig): string | null {\n let ranges: Range[];\n let updatedRange: (string | null)[];\n\n // no symbol: accept only that specific version specified\n if (currentValue === currentVersion || isReplacement) {\n return newVersion;\n }\n\n // Handle bare versions (e.g., \"v0.7.15\") that don't strictly equal\n // currentVersion due to normalization, treating them as pinned while\n // preserving the v-prefix.\n if (parseVersion(currentValue)) {\n const vPrefix = regEx(/^(?<prefix>[vV])/).exec(currentValue);\n if (vPrefix) {\n return `${vPrefix.groups!.prefix}${newVersion}`;\n }\n return newVersion;\n }\n\n try {\n ranges = parseCurrentRange(currentValue);\n if (!ranges.length) {\n // an empty string is an allowed value for PEP440 range\n // it means get any version\n logger.warn({ currentValue }, 'Empty currentValue');\n return currentValue;\n }\n } catch (err) {\n logger.warn({ currentValue, err }, 'Unexpected range error');\n return null;\n }\n\n // return early if newVersion is excluded from range\n if (\n ranges.some(\n (range) => range.operator === '!=' && range.version === newVersion,\n )\n ) {\n logger.debug(\n `Cannot calculate new value as the newVersion:\\`${newVersion}\\` is excluded from range: \\`${currentValue}\\``,\n );\n return null;\n }\n\n switch (rangeStrategy) {\n case 'auto':\n case 'replace':\n updatedRange = handleReplaceStrategy(\n {\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n },\n ranges,\n );\n break;\n case 'widen':\n updatedRange = handleWidenStrategy(\n {\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n },\n ranges,\n );\n break;\n case 'bump':\n updatedRange = handleBumpStrategy(\n {\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n },\n ranges,\n );\n break;\n default:\n // Unsupported rangeStrategy\n // Valid rangeStrategy values are: bump, extend, pin, replace.\n // https://docs.renovatebot.com/modules/versioning/#pep440-versioning\n logger.debug(\n `Unsupported rangeStrategy: ${rangeStrategy}. Using \"replace\" instead.`,\n );\n return getNewValue({\n currentValue,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n }\n\n let result = updatedRange.filter(Boolean).join(', ');\n\n if (result.includes(', ') && !currentValue.includes(', ')) {\n result = result.replace(regEx(/, /g), ',');\n }\n const checkedResult = checkRangeAndRemoveUnnecessaryRangeLimit(\n result,\n newVersion,\n );\n\n // istanbul ignore if\n if (!satisfies(newVersion, checkedResult)) {\n // we failed at creating the range\n logger.warn(\n { result, newVersion, currentValue },\n 'pep440: failed to calculate newValue',\n );\n return null;\n }\n return checkedResult;\n}\n\nexport function isLessThanRange(input: string, range: string): boolean {\n try {\n let invertResult = true;\n\n const results = range\n .split(',')\n .map((x) =>\n x\n .replace(regEx(/\\s*/g), '')\n .split(regEx(/(~=|==|!=|<=|>=|<|>|===)/))\n .slice(1),\n )\n .map(([op, version]) => {\n if (['!=', '<=', '<'].includes(op)) {\n return true;\n }\n invertResult = false;\n if (['~=', '==', '>=', '==='].includes(op)) {\n return lt(input, version);\n }\n if (op === '>') {\n return lte(input, version);\n }\n // istanbul ignore next\n return false;\n });\n\n const result = results.every((res) => res === true);\n\n return invertResult ? !result : result;\n } catch /* istanbul ignore next */ {\n return false;\n }\n}\n\nfunction parseCurrentRange(currentValue: string): Range[] {\n const ranges: Range[] = parseRange(currentValue);\n if (!ranges) {\n throw new TypeError('Invalid pep440 currentValue');\n }\n if (ranges.some((range) => range.operator === '===')) {\n // the operator \"===\" is used for legacy non PEP440 versions\n throw new TypeError('PEP440 arbitrary equality (===) not supported');\n }\n return ranges;\n}\n\nfunction handleLowerBound(range: Range, newVersion: string): string | null {\n // used to mark minimum supported version\n // lower the bound if the new version is lower than current range\n if (['>', '>='].includes(range.operator)) {\n if (lte(newVersion, range.version)) {\n // this looks like a rollback\n return `>=${newVersion}`;\n }\n // otherwise, treat it same as exclude\n return range.operator + range.version;\n }\n // istanbul ignore next\n return null;\n}\n\nfunction handleUpperBound(range: Range, newVersion: string): string | null {\n // this is used to exclude future versions\n if (range.operator === '<') {\n // if newVersion is that future version\n if (gte(newVersion, range.version)) {\n // now here things get tricky\n // we calculate the new future version\n const precision = getRangePrecision([range]);\n const futureVersion = getFutureVersion(\n precision,\n newVersion,\n range.version,\n );\n return range.operator + futureVersion.join('.');\n }\n // newVersion is in range, for other than \"replace\" strategies\n return range.operator + range.version;\n }\n // istanbul ignore next\n return null;\n}\n\nfunction updateRangeValue(\n { currentValue, newVersion }: NewValueConfig,\n range: Range,\n): string | null {\n // used to exclude versions,\n // we assume that's for a good reason\n if (range.operator === '!=') {\n return range.operator + range.version;\n }\n\n // keep the .* suffix\n if (range.prefix) {\n const futureVersion = getFutureVersion(\n UserPolicyPrecisionMap.None,\n newVersion,\n range.version,\n ).join('.');\n return `${range.operator}${futureVersion}.*`;\n }\n if (range.operator === '~=') {\n const baseVersion = coerceArray(parseVersion(range.version)?.release);\n const futureVersion = coerceArray(parseVersion(newVersion)?.release);\n const baseLen = baseVersion.length;\n const newVerLen = futureVersion.length;\n // trim redundant trailing version specifiers\n if (baseLen < newVerLen) {\n return (\n range.operator + futureVersion.slice(0, baseVersion.length).join('.')\n );\n }\n // pad with specifiers\n if (baseLen > newVerLen) {\n for (let i = baseLen - newVerLen - 1; i >= 0; i--) {\n futureVersion.push(0);\n }\n return range.operator + futureVersion.join('.');\n }\n return range.operator + newVersion;\n }\n if (['==', '<='].includes(range.operator)) {\n if (lte(newVersion, range.version)) {\n return range.operator + range.version;\n }\n return range.operator + newVersion;\n }\n\n let output = handleUpperBound(range, newVersion);\n if (output) {\n // manged to update upperbound\n // no need to try anything else\n return output;\n }\n output = handleLowerBound(range, newVersion);\n if (output) {\n return output;\n }\n\n // unless PEP440 changes, this won't happen\n // istanbul ignore next\n logger.error(\n { newVersion, currentValue, range },\n 'pep440: failed to process range',\n );\n // istanbul ignore next\n return null;\n}\n\n/**\n * Checks for zero specifiers.\n * returns true if one of the bounds' length is < 3.\n * @param ranges A {@link Range} array.\n * @returns A boolean value\n * Used mainly for cosmetics for the rez versioning syntax.\n */\nfunction hasZeroSpecifier(ranges: Range[]): boolean {\n return ranges.some((range) => {\n const release = parseVersion(range.version)?.release;\n return release && release.length < 3;\n });\n}\n\nfunction trimTrailingZeros(numbers: number[]): number[] {\n let i = numbers.length - 1;\n while (numbers[i] === 0) {\n i--;\n }\n return numbers.slice(0, i + 1);\n}\n\nfunction divideCompatibleReleaseRange(currentRange: Range): Range[] {\n const currentVersionUpperBound = currentRange.version\n .split('.')\n .map((num) => parseInt(num, 10));\n if (currentVersionUpperBound.length > 1) {\n currentVersionUpperBound.splice(-1);\n }\n currentVersionUpperBound[currentVersionUpperBound.length - 1] += 1;\n return [\n { operator: '>=', version: currentRange.version },\n {\n operator: '<',\n version: currentVersionUpperBound.join('.'),\n },\n ];\n}\n\nfunction handleWidenStrategy(\n { currentValue, rangeStrategy, currentVersion, newVersion }: NewValueConfig,\n ranges: Range[],\n): (string | null)[] {\n // newVersion is within range\n if (satisfies(newVersion, currentValue)) {\n return [currentValue];\n }\n let rangePrecision = getRangePrecision(ranges);\n const trimZeros = hasZeroSpecifier(ranges);\n let newRanges: Range[] = [];\n if (ranges.length === 1 && ranges[0].operator === '~=') {\n // If range operator is '~=', divide the range into its logical equivalent.\n // Example: ~=1.0 --> >=1.0,<2\n newRanges = divideCompatibleReleaseRange(ranges[0]);\n } else {\n newRanges = ranges;\n }\n return newRanges.map((range) => {\n // newVersion is over the upper bound\n if (range.operator === '<' && gte(newVersion, range.version)) {\n const upperBound = coerceArray(parseVersion(range.version)?.release);\n const len = upperBound.length;\n // Match the precision of the smallest specifier if other than 0\n if (upperBound[len - 1] !== 0) {\n const key =\n PrecisionUserPolicyMap[\n (len - 1) as keyof typeof PrecisionUserPolicyMap\n ];\n rangePrecision =\n UserPolicyPrecisionMap[key as keyof typeof UserPolicyPrecisionMap];\n }\n let futureVersion = getFutureVersion(\n rangePrecision,\n newVersion,\n range.version,\n );\n if (trimZeros) {\n futureVersion = trimTrailingZeros(futureVersion);\n }\n return range.operator + futureVersion.join('.');\n }\n // default\n return updateRangeValue(\n {\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n },\n range,\n );\n });\n}\n\nfunction handleReplaceStrategy(\n { currentValue, rangeStrategy, currentVersion, newVersion }: NewValueConfig,\n ranges: Range[],\n): (string | null)[] {\n // newVersion is within range\n if (satisfies(newVersion, currentValue)) {\n return [currentValue];\n }\n const trimZeros = hasZeroSpecifier(ranges);\n return ranges.map((range) => {\n // newVersion is over the upper bound\n if (range.operator === '<' && gte(newVersion, range.version)) {\n const rangePrecision = getRangePrecision(ranges);\n let futureVersion = getFutureVersion(\n rangePrecision,\n newVersion,\n range.version,\n );\n if (trimZeros) {\n futureVersion = trimTrailingZeros(futureVersion);\n }\n return range.operator + futureVersion.join('.');\n }\n // handle lower bound\n if (['>', '>='].includes(range.operator)) {\n if (lte(newVersion, range.version)) {\n // this looks like a rollback\n return `>=${newVersion}`;\n }\n // update the lower bound to reflect the accepted new version\n const lowerBound = coerceArray(parseVersion(range.version)?.release);\n const rangePrecision = lowerBound.length - 1;\n let newBase = getFutureVersion(rangePrecision, newVersion);\n if (trimZeros) {\n newBase = trimTrailingZeros(newBase);\n }\n // trim last element of the newBase when new accepted version is out of range.\n // example: let new bound be >8.2.5 & newVersion be 8.2.5\n // return value will be: >8.2\n if (range.operator === '>') {\n if (newVersion === newBase.join('.') && newBase.length > 1) {\n newBase.pop();\n }\n }\n return range.operator + newBase.join('.');\n }\n // default\n return updateRangeValue(\n {\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n },\n range,\n );\n });\n}\n\nfunction handleBumpStrategy(\n { currentValue, rangeStrategy, currentVersion, newVersion }: NewValueConfig,\n ranges: Range[],\n): (string | null)[] {\n return ranges.map((range) => {\n // bump lower bound to current new version\n if (range.operator === '>=') {\n return range.operator + newVersion;\n }\n return updateRangeValue(\n {\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n },\n range,\n );\n });\n}\n\nexport function checkRangeAndRemoveUnnecessaryRangeLimit(\n rangeInput: string,\n newVersion: string,\n): string {\n let newRange: string = rangeInput;\n if (rangeInput.includes(',')) {\n const newRes = rangeInput.split(',');\n if (\n newRes[0].includes('.*') &&\n newRes[0].includes('==') &&\n newRes[1].includes('>=')\n ) {\n if (satisfies(newVersion, newRes[0])) {\n newRange = newRes[0];\n }\n }\n } else {\n return rangeInput;\n }\n\n return newRange;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"range.js","names":["parseVersion","parseRange"],"sources":["../../../../lib/modules/versioning/pep440/range.ts"],"sourcesContent":["import { gte, lt, lte, satisfies } from '@renovatebot/pep440';\nimport { parse as parseRange } from '@renovatebot/pep440/lib/specifier.js';\nimport { parse as parseVersion } from '@renovatebot/pep440/lib/version.js';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type { NewValueConfig } from '../types.ts';\n\nconst UserPolicyPrecisionMap = {\n Major: 0,\n Minor: 1,\n Micro: 2,\n Bug: 3,\n None: Infinity,\n} as const;\nconst PrecisionUserPolicyMap = {\n 0: 'Major',\n 1: 'Minor',\n 2: 'Micro',\n 3: 'Bug',\n} as const;\n\ntype UserPolicy =\n (typeof UserPolicyPrecisionMap)[keyof typeof UserPolicyPrecisionMap];\n\n/**\n * Calculate current update range precision.\n * @param ranges A {@link Range} consists of current range\n * @returns A {@link UserPolicy}\n */\nfunction getRangePrecision(ranges: Range[]): UserPolicy {\n const bound = coerceArray(\n parseVersion((ranges[1] || ranges[0]).version)?.release,\n );\n let rangePrecision = -1;\n // range is defined by a single bound.\n // ie. <1.2.2.3,\n // >=7\n if (ranges.length === 1) {\n rangePrecision = bound.length - 1;\n }\n // Range is defined by both upper and lower bounds.\n if (ranges.length === 2) {\n const lowerBound = coerceArray(parseVersion(ranges[0].version)?.release);\n rangePrecision = bound.findIndex((el, index) => el > lowerBound[index]);\n }\n // Tune down Major precision if followed by a zero\n if (\n rangePrecision === UserPolicyPrecisionMap.Major &&\n rangePrecision + 1 < bound.length &&\n bound[rangePrecision + 1] === 0\n ) {\n rangePrecision++;\n }\n // Could not calculate user precision\n // Default to the smallest possible\n // istanbul ignore next\n if (rangePrecision === -1) {\n rangePrecision = bound.length - 1;\n }\n const key =\n PrecisionUserPolicyMap[\n rangePrecision as keyof typeof PrecisionUserPolicyMap\n ];\n return UserPolicyPrecisionMap[key as keyof typeof UserPolicyPrecisionMap];\n}\n\n/**\n * @param policy Required range precision\n * @param newVersion The newly accepted version\n * @param baseVersion Optional Current upper bound\n * @returns A string represents a future version upper bound.\n */\nfunction getFutureVersion(\n policy: UserPolicy,\n newVersion: string,\n baseVersion?: string,\n): number[] {\n const toRelease = coerceArray(parseVersion(newVersion)?.release);\n const baseRelease = coerceArray(\n parseVersion(baseVersion ?? newVersion)?.release,\n );\n return baseRelease.map((_, index) => {\n const toPart = toRelease[index] ?? 0;\n if (index < policy) {\n return toPart;\n }\n if (index === policy) {\n return toPart + (baseVersion === undefined ? 0 : 1);\n }\n return 0;\n });\n}\n\ninterface Range {\n operator: string;\n prefix?: string;\n version: string;\n}\n\nexport function getPinnedValue(newVersion: string): string {\n return `==${newVersion}`;\n}\n\nexport function getNewValue({\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n isReplacement,\n}: NewValueConfig): string | null {\n let ranges: Range[];\n let updatedRange: (string | null)[];\n\n // no symbol: accept only that specific version specified\n if (currentValue === currentVersion || isReplacement) {\n return newVersion;\n }\n\n // Handle bare versions (e.g., \"v0.7.15\") that don't strictly equal\n // currentVersion due to normalization, treating them as pinned while\n // preserving the v-prefix.\n if (parseVersion(currentValue)) {\n const vPrefix = regEx(/^(?<prefix>[vV])/).exec(currentValue);\n if (vPrefix) {\n return `${vPrefix.groups!.prefix}${newVersion}`;\n }\n return newVersion;\n }\n\n try {\n ranges = parseCurrentRange(currentValue);\n if (!ranges.length) {\n // an empty string is an allowed value for PEP440 range\n // it means get any version\n logger.warn({ currentValue }, 'Empty currentValue');\n return currentValue;\n }\n } catch (err) {\n logger.warn({ currentValue, err }, 'Unexpected range error');\n return null;\n }\n\n // return early if newVersion is excluded from range\n if (\n ranges.some(\n (range) => range.operator === '!=' && range.version === newVersion,\n )\n ) {\n logger.debug(\n `Cannot calculate new value as the newVersion:\\`${newVersion}\\` is excluded from range: \\`${currentValue}\\``,\n );\n return null;\n }\n\n switch (rangeStrategy) {\n case 'auto':\n case 'replace':\n updatedRange = handleReplaceStrategy(\n {\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n },\n ranges,\n );\n break;\n case 'widen':\n updatedRange = handleWidenStrategy(\n {\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n },\n ranges,\n );\n break;\n case 'bump':\n updatedRange = handleBumpStrategy(\n {\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n },\n ranges,\n );\n break;\n default:\n // Unsupported rangeStrategy\n // Valid rangeStrategy values are: bump, extend, pin, replace.\n // https://docs.renovatebot.com/modules/versioning/#pep440-versioning\n logger.debug(\n `Unsupported rangeStrategy: ${rangeStrategy}. Using \"replace\" instead.`,\n );\n return getNewValue({\n currentValue,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n }\n\n let result = updatedRange.filter(Boolean).join(', ');\n\n if (result.includes(', ') && !currentValue.includes(', ')) {\n result = result.replace(regEx(/, /g), ',');\n }\n const checkedResult = checkRangeAndRemoveUnnecessaryRangeLimit(\n result,\n newVersion,\n );\n\n // istanbul ignore if\n if (!satisfies(newVersion, checkedResult)) {\n // we failed at creating the range\n logger.warn(\n { result, newVersion, currentValue },\n 'pep440: failed to calculate newValue',\n );\n return null;\n }\n return checkedResult;\n}\n\nexport function isLessThanRange(input: string, range: string): boolean {\n try {\n let invertResult = true;\n\n const results = range\n .split(',')\n .map((x) =>\n x\n .replace(regEx(/\\s*/g), '')\n .split(regEx(/(~=|==|!=|<=|>=|<|>|===)/))\n .slice(1),\n )\n .map(([op, version]) => {\n if (['!=', '<=', '<'].includes(op)) {\n return true;\n }\n invertResult = false;\n if (['~=', '==', '>=', '==='].includes(op)) {\n return lt(input, version);\n }\n if (op === '>') {\n return lte(input, version);\n }\n // istanbul ignore next\n return false;\n });\n\n const result = results.every((res) => res === true);\n\n return invertResult ? !result : result;\n } catch /* istanbul ignore next */ {\n return false;\n }\n}\n\nfunction parseCurrentRange(currentValue: string): Range[] {\n const ranges: Range[] = parseRange(currentValue);\n if (!ranges) {\n throw new TypeError('Invalid pep440 currentValue');\n }\n if (ranges.some((range) => range.operator === '===')) {\n // the operator \"===\" is used for legacy non PEP440 versions\n throw new TypeError('PEP440 arbitrary equality (===) not supported');\n }\n return ranges;\n}\n\nfunction handleLowerBound(range: Range, newVersion: string): string | null {\n // used to mark minimum supported version\n // lower the bound if the new version is lower than current range\n if (['>', '>='].includes(range.operator)) {\n if (lte(newVersion, range.version)) {\n // this looks like a rollback\n return `>=${newVersion}`;\n }\n // otherwise, treat it same as exclude\n return range.operator + range.version;\n }\n // istanbul ignore next\n return null;\n}\n\nfunction handleUpperBound(range: Range, newVersion: string): string | null {\n // this is used to exclude future versions\n if (range.operator === '<') {\n // if newVersion is that future version\n if (gte(newVersion, range.version)) {\n // now here things get tricky\n // we calculate the new future version\n const precision = getRangePrecision([range]);\n const futureVersion = getFutureVersion(\n precision,\n newVersion,\n range.version,\n );\n return range.operator + futureVersion.join('.');\n }\n // newVersion is in range, for other than \"replace\" strategies\n return range.operator + range.version;\n }\n // istanbul ignore next\n return null;\n}\n\nfunction updateRangeValue(\n { currentValue, newVersion }: NewValueConfig,\n range: Range,\n): string | null {\n // used to exclude versions,\n // we assume that's for a good reason\n if (range.operator === '!=') {\n return range.operator + range.version;\n }\n\n // keep the .* suffix\n if (range.prefix) {\n const futureVersion = getFutureVersion(\n UserPolicyPrecisionMap.None,\n newVersion,\n range.version,\n ).join('.');\n return `${range.operator}${futureVersion}.*`;\n }\n if (range.operator === '~=') {\n const baseVersion = coerceArray(parseVersion(range.version)?.release);\n const futureVersion = coerceArray(parseVersion(newVersion)?.release);\n const baseLen = baseVersion.length;\n const newVerLen = futureVersion.length;\n // trim redundant trailing version specifiers\n if (baseLen < newVerLen) {\n return (\n range.operator + futureVersion.slice(0, baseVersion.length).join('.')\n );\n }\n // pad with specifiers\n if (baseLen > newVerLen) {\n for (let i = baseLen - newVerLen - 1; i >= 0; i--) {\n futureVersion.push(0);\n }\n return range.operator + futureVersion.join('.');\n }\n return range.operator + newVersion;\n }\n if (['==', '<='].includes(range.operator)) {\n if (lte(newVersion, range.version)) {\n return range.operator + range.version;\n }\n return range.operator + newVersion;\n }\n\n let output = handleUpperBound(range, newVersion);\n if (output) {\n // manged to update upperbound\n // no need to try anything else\n return output;\n }\n output = handleLowerBound(range, newVersion);\n if (output) {\n return output;\n }\n\n // unless PEP440 changes, this won't happen\n // istanbul ignore next\n logger.error(\n { newVersion, currentValue, range },\n 'pep440: failed to process range',\n );\n // istanbul ignore next\n return null;\n}\n\n/**\n * Checks for zero specifiers.\n * returns true if one of the bounds' length is < 3.\n * @param ranges A {@link Range} array.\n * @returns A boolean value\n * Used mainly for cosmetics for the rez versioning syntax.\n */\nfunction hasZeroSpecifier(ranges: Range[]): boolean {\n return ranges.some((range) => {\n const release = parseVersion(range.version)?.release;\n return release && release.length < 3;\n });\n}\n\nfunction trimTrailingZeros(numbers: number[]): number[] {\n let i = numbers.length - 1;\n while (numbers[i] === 0) {\n i--;\n }\n return numbers.slice(0, i + 1);\n}\n\nfunction divideCompatibleReleaseRange(currentRange: Range): Range[] {\n const currentVersionUpperBound = currentRange.version\n .split('.')\n .map((num) => parseInt(num, 10));\n if (currentVersionUpperBound.length > 1) {\n currentVersionUpperBound.splice(-1);\n }\n currentVersionUpperBound[currentVersionUpperBound.length - 1] += 1;\n return [\n { operator: '>=', version: currentRange.version },\n {\n operator: '<',\n version: currentVersionUpperBound.join('.'),\n },\n ];\n}\n\nfunction handleWidenStrategy(\n { currentValue, rangeStrategy, currentVersion, newVersion }: NewValueConfig,\n ranges: Range[],\n): (string | null)[] {\n // newVersion is within range\n if (satisfies(newVersion, currentValue)) {\n return [currentValue];\n }\n let rangePrecision = getRangePrecision(ranges);\n const trimZeros = hasZeroSpecifier(ranges);\n let newRanges: Range[] = [];\n if (ranges.length === 1 && ranges[0].operator === '~=') {\n // If range operator is '~=', divide the range into its logical equivalent.\n // Example: ~=1.0 --> >=1.0,<2\n newRanges = divideCompatibleReleaseRange(ranges[0]);\n } else {\n newRanges = ranges;\n }\n return newRanges.map((range) => {\n // newVersion is over the upper bound\n if (range.operator === '<' && gte(newVersion, range.version)) {\n const upperBound = coerceArray(parseVersion(range.version)?.release);\n const len = upperBound.length;\n // Match the precision of the smallest specifier if other than 0\n if (upperBound[len - 1] !== 0) {\n const key =\n PrecisionUserPolicyMap[\n (len - 1) as keyof typeof PrecisionUserPolicyMap\n ];\n rangePrecision =\n UserPolicyPrecisionMap[key as keyof typeof UserPolicyPrecisionMap];\n }\n let futureVersion = getFutureVersion(\n rangePrecision,\n newVersion,\n range.version,\n );\n if (trimZeros) {\n futureVersion = trimTrailingZeros(futureVersion);\n }\n return range.operator + futureVersion.join('.');\n }\n // default\n return updateRangeValue(\n {\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n },\n range,\n );\n });\n}\n\nfunction handleReplaceStrategy(\n { currentValue, rangeStrategy, currentVersion, newVersion }: NewValueConfig,\n ranges: Range[],\n): (string | null)[] {\n // newVersion is within range\n if (satisfies(newVersion, currentValue)) {\n return [currentValue];\n }\n const trimZeros = hasZeroSpecifier(ranges);\n return ranges.map((range) => {\n // newVersion is over the upper bound\n if (range.operator === '<' && gte(newVersion, range.version)) {\n const rangePrecision = getRangePrecision(ranges);\n let futureVersion = getFutureVersion(\n rangePrecision,\n newVersion,\n range.version,\n );\n if (trimZeros) {\n futureVersion = trimTrailingZeros(futureVersion);\n }\n return range.operator + futureVersion.join('.');\n }\n // handle lower bound\n if (['>', '>='].includes(range.operator)) {\n if (lte(newVersion, range.version)) {\n // this looks like a rollback\n return `>=${newVersion}`;\n }\n // update the lower bound to reflect the accepted new version\n const lowerBound = coerceArray(parseVersion(range.version)?.release);\n const rangePrecision = lowerBound.length - 1;\n let newBase = getFutureVersion(rangePrecision, newVersion);\n if (trimZeros) {\n newBase = trimTrailingZeros(newBase);\n }\n // trim last element of the newBase when new accepted version is out of range.\n // example: let new bound be >8.2.5 & newVersion be 8.2.5\n // return value will be: >8.2\n if (\n range.operator === '>' &&\n newVersion === newBase.join('.') &&\n newBase.length > 1\n ) {\n newBase.pop();\n }\n return range.operator + newBase.join('.');\n }\n // default\n return updateRangeValue(\n {\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n },\n range,\n );\n });\n}\n\nfunction handleBumpStrategy(\n { currentValue, rangeStrategy, currentVersion, newVersion }: NewValueConfig,\n ranges: Range[],\n): (string | null)[] {\n return ranges.map((range) => {\n // bump lower bound to current new version\n if (range.operator === '>=') {\n return range.operator + newVersion;\n }\n return updateRangeValue(\n {\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n },\n range,\n );\n });\n}\n\nexport function checkRangeAndRemoveUnnecessaryRangeLimit(\n rangeInput: string,\n newVersion: string,\n): string {\n let newRange: string = rangeInput;\n if (rangeInput.includes(',')) {\n const newRes = rangeInput.split(',');\n if (\n newRes[0].includes('.*') &&\n newRes[0].includes('==') &&\n newRes[1].includes('>=') &&\n satisfies(newVersion, newRes[0])\n ) {\n newRange = newRes[0];\n }\n } else {\n return rangeInput;\n }\n\n return newRange;\n}\n"],"mappings":"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"}
|
|
@@ -91,7 +91,7 @@ function getNewValue({ currentValue, rangeStrategy, currentVersion, newVersion }
|
|
|
91
91
|
logger.info({ err }, "Poetry versioning: Error caught checking if newVersion satisfies currentValue");
|
|
92
92
|
}
|
|
93
93
|
const parsedRange = parseRange(npmCurrentValue);
|
|
94
|
-
const element = parsedRange
|
|
94
|
+
const element = parsedRange.at(-1);
|
|
95
95
|
if (parsedRange.length === 1 && element.operator) {
|
|
96
96
|
if (element.operator === "^") {
|
|
97
97
|
const version = handleShort("^", npmCurrentValue, newVersion);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["npm","pep440"],"sources":["../../../../lib/modules/versioning/poetry/index.ts"],"sourcesContent":["import { parseRange } from 'semver-utils';\nimport { logger } from '../../../logger/index.ts';\nimport type { RangeStrategy } from '../../../types/versioning.ts';\nimport { api as npm } from '../npm/index.ts';\nimport { api as pep440 } from '../pep440/index.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\n\nimport { VERSION_PATTERN } from './patterns.ts';\nimport {\n npm2poetry,\n poetry2npm,\n poetry2semver,\n semver2poetry,\n} from './transform.ts';\n\nexport const id = 'poetry';\nexport const displayName = 'Poetry';\nexport const urls = [\n '[Poetry dependency specification](https://python-poetry.org/docs/dependency-specification/)',\n '[Poetry FAQ - Why does Poetry not adhere to semantic versioning?](https://python-poetry.org/docs/faq#why-does-poetry-not-adhere-to-semantic-versioning)',\n '[Poetry FAQ - Why does Poetry enforce PEP 440 versions?](https://python-poetry.org/docs/faq#why-does-poetry-enforce-pep-440-versions)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = [\n 'bump',\n 'widen',\n 'replace',\n];\n\nfunction equals(a: string, b: string): boolean {\n const semverA = poetry2semver(a);\n const semverB = poetry2semver(b);\n return !!(semverA && semverB && npm.equals(semverA, semverB));\n}\n\nfunction getMajor(version: string): number | null {\n const semverVersion = poetry2semver(version);\n return semverVersion ? npm.getMajor(semverVersion) : null;\n}\n\nfunction getMinor(version: string): number | null {\n const semverVersion = poetry2semver(version);\n return semverVersion ? npm.getMinor(semverVersion) : null;\n}\n\nfunction getPatch(version: string): number | null {\n const semverVersion = poetry2semver(version);\n return semverVersion ? npm.getPatch(semverVersion) : null;\n}\n\nfunction isVersion(input: string): boolean {\n return VERSION_PATTERN.test(input);\n}\n\nfunction isGreaterThan(a: string, b: string): boolean {\n return !!(a && b && pep440.isGreaterThan(a, b));\n}\n\nfunction isLessThanRange(version: string, range: string): boolean {\n const semverVersion = poetry2semver(version);\n return !!(\n isVersion(version) &&\n semverVersion &&\n npm.isLessThanRange?.(semverVersion, poetry2npm(range))\n );\n}\n\nexport function isValid(input: string): boolean {\n if (!input) {\n return false;\n }\n\n try {\n return npm.isValid(poetry2npm(input, true));\n } catch {\n logger.once.debug(\n { version: input },\n 'Poetry version or range is not supported by current implementation',\n );\n return false;\n }\n}\n\nfunction isStable(version: string): boolean {\n const semverVersion = poetry2semver(version);\n return !!(semverVersion && npm.isStable(semverVersion));\n}\n\nfunction matches(version: string, range: string): boolean {\n const semverVersion = poetry2semver(version);\n return !!(\n isVersion(version) &&\n semverVersion &&\n npm.matches(semverVersion, poetry2npm(range))\n );\n}\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n const semverVersions: string[] = [];\n versions.forEach((version) => {\n const semverVersion = poetry2semver(version);\n if (semverVersion) {\n semverVersions.push(semverVersion);\n }\n });\n const npmRange = poetry2npm(range);\n const satisfyingVersion = npm.getSatisfyingVersion(semverVersions, npmRange);\n return satisfyingVersion ? semver2poetry(satisfyingVersion) : null;\n}\n\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n const semverVersions: string[] = [];\n versions.forEach((version) => {\n const semverVersion = poetry2semver(version);\n if (semverVersion) {\n semverVersions.push(semverVersion);\n }\n });\n const npmRange = poetry2npm(range);\n const satisfyingVersion = npm.minSatisfyingVersion(semverVersions, npmRange);\n return satisfyingVersion ? semver2poetry(satisfyingVersion) : null;\n}\n\nfunction isSingleVersion(constraint: string): boolean {\n return (\n (constraint.trim().startsWith('=') &&\n isVersion(constraint.trim().substring(1).trim())) ||\n isVersion(constraint.trim())\n );\n}\n\nfunction handleShort(\n operator: string,\n currentValue: string,\n newVersion: string,\n): string | null {\n const toVersionMajor = getMajor(newVersion);\n const toVersionMinor = getMinor(newVersion);\n const split = currentValue.split('.');\n if (toVersionMajor !== null && split.length === 1) {\n // [^,~]4\n return `${operator}${toVersionMajor}`;\n }\n if (\n toVersionMajor !== null &&\n toVersionMinor !== null &&\n split.length === 2\n ) {\n // [^,~]4.1\n return `${operator}${toVersionMajor}.${toVersionMinor}`;\n }\n return null;\n}\n\nfunction getNewValue({\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n}: NewValueConfig): string {\n if (rangeStrategy === 'replace') {\n const npmCurrentValue = poetry2npm(currentValue);\n try {\n const massagedNewVersion = poetry2semver(newVersion);\n if (\n massagedNewVersion &&\n isVersion(massagedNewVersion) &&\n npm.matches(massagedNewVersion, npmCurrentValue)\n ) {\n return currentValue;\n }\n } catch (err) /* istanbul ignore next */ {\n logger.info(\n { err },\n 'Poetry versioning: Error caught checking if newVersion satisfies currentValue',\n );\n }\n const parsedRange = parseRange(npmCurrentValue);\n const element = parsedRange[parsedRange.length - 1];\n if (parsedRange.length === 1 && element.operator) {\n if (element.operator === '^') {\n const version = handleShort('^', npmCurrentValue, newVersion);\n if (version) {\n return npm2poetry(version);\n }\n }\n if (element.operator === '~') {\n const version = handleShort('~', npmCurrentValue, newVersion);\n if (version) {\n return npm2poetry(version);\n }\n }\n }\n }\n\n // Explicitly check whether this is a fully-qualified version\n if (\n (VERSION_PATTERN.exec(newVersion)?.groups?.release ?? '').split('.')\n .length !== 3\n ) {\n logger.debug(\n 'Cannot massage python version to npm - returning currentValue',\n );\n return currentValue;\n }\n try {\n const currentSemverVersion =\n currentVersion && poetry2semver(currentVersion);\n\n const newSemverVersion = poetry2semver(newVersion);\n\n if (currentSemverVersion && newSemverVersion) {\n const newSemver = npm.getNewValue({\n currentValue: poetry2npm(currentValue),\n rangeStrategy,\n currentVersion: currentSemverVersion,\n newVersion: newSemverVersion,\n });\n const newPoetry = newSemver && npm2poetry(newSemver);\n if (newPoetry) {\n return newPoetry;\n }\n }\n } catch (err) /* istanbul ignore next */ {\n logger.debug(\n { currentValue, rangeStrategy, currentVersion, newVersion, err },\n 'Could not generate new value using npm.getNewValue()',\n );\n }\n\n // istanbul ignore next\n return currentValue;\n}\n\nfunction sortVersions(a: string, b: string): number {\n return pep440.sortVersions(a, b);\n}\n\nfunction subset(subRange: string, superRange: string): boolean | undefined {\n return npm.subset!(poetry2npm(subRange), poetry2npm(superRange));\n}\n\nexport const api: VersioningApi = {\n equals,\n getMajor,\n getMinor,\n getPatch,\n getNewValue,\n getSatisfyingVersion,\n isCompatible: isVersion,\n isGreaterThan,\n isLessThanRange,\n isSingleVersion,\n isStable,\n isValid,\n isVersion,\n matches,\n minSatisfyingVersion,\n sortVersions,\n subset,\n};\nexport default api;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["npm","pep440"],"sources":["../../../../lib/modules/versioning/poetry/index.ts"],"sourcesContent":["import { parseRange } from 'semver-utils';\nimport { logger } from '../../../logger/index.ts';\nimport type { RangeStrategy } from '../../../types/versioning.ts';\nimport { api as npm } from '../npm/index.ts';\nimport { api as pep440 } from '../pep440/index.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\n\nimport { VERSION_PATTERN } from './patterns.ts';\nimport {\n npm2poetry,\n poetry2npm,\n poetry2semver,\n semver2poetry,\n} from './transform.ts';\n\nexport const id = 'poetry';\nexport const displayName = 'Poetry';\nexport const urls = [\n '[Poetry dependency specification](https://python-poetry.org/docs/dependency-specification/)',\n '[Poetry FAQ - Why does Poetry not adhere to semantic versioning?](https://python-poetry.org/docs/faq#why-does-poetry-not-adhere-to-semantic-versioning)',\n '[Poetry FAQ - Why does Poetry enforce PEP 440 versions?](https://python-poetry.org/docs/faq#why-does-poetry-enforce-pep-440-versions)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = [\n 'bump',\n 'widen',\n 'replace',\n];\n\nfunction equals(a: string, b: string): boolean {\n const semverA = poetry2semver(a);\n const semverB = poetry2semver(b);\n return !!(semverA && semverB && npm.equals(semverA, semverB));\n}\n\nfunction getMajor(version: string): number | null {\n const semverVersion = poetry2semver(version);\n return semverVersion ? npm.getMajor(semverVersion) : null;\n}\n\nfunction getMinor(version: string): number | null {\n const semverVersion = poetry2semver(version);\n return semverVersion ? npm.getMinor(semverVersion) : null;\n}\n\nfunction getPatch(version: string): number | null {\n const semverVersion = poetry2semver(version);\n return semverVersion ? npm.getPatch(semverVersion) : null;\n}\n\nfunction isVersion(input: string): boolean {\n return VERSION_PATTERN.test(input);\n}\n\nfunction isGreaterThan(a: string, b: string): boolean {\n return !!(a && b && pep440.isGreaterThan(a, b));\n}\n\nfunction isLessThanRange(version: string, range: string): boolean {\n const semverVersion = poetry2semver(version);\n return !!(\n isVersion(version) &&\n semverVersion &&\n npm.isLessThanRange?.(semverVersion, poetry2npm(range))\n );\n}\n\nexport function isValid(input: string): boolean {\n if (!input) {\n return false;\n }\n\n try {\n return npm.isValid(poetry2npm(input, true));\n } catch {\n logger.once.debug(\n { version: input },\n 'Poetry version or range is not supported by current implementation',\n );\n return false;\n }\n}\n\nfunction isStable(version: string): boolean {\n const semverVersion = poetry2semver(version);\n return !!(semverVersion && npm.isStable(semverVersion));\n}\n\nfunction matches(version: string, range: string): boolean {\n const semverVersion = poetry2semver(version);\n return !!(\n isVersion(version) &&\n semverVersion &&\n npm.matches(semverVersion, poetry2npm(range))\n );\n}\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n const semverVersions: string[] = [];\n versions.forEach((version) => {\n const semverVersion = poetry2semver(version);\n if (semverVersion) {\n semverVersions.push(semverVersion);\n }\n });\n const npmRange = poetry2npm(range);\n const satisfyingVersion = npm.getSatisfyingVersion(semverVersions, npmRange);\n return satisfyingVersion ? semver2poetry(satisfyingVersion) : null;\n}\n\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n const semverVersions: string[] = [];\n versions.forEach((version) => {\n const semverVersion = poetry2semver(version);\n if (semverVersion) {\n semverVersions.push(semverVersion);\n }\n });\n const npmRange = poetry2npm(range);\n const satisfyingVersion = npm.minSatisfyingVersion(semverVersions, npmRange);\n return satisfyingVersion ? semver2poetry(satisfyingVersion) : null;\n}\n\nfunction isSingleVersion(constraint: string): boolean {\n return (\n (constraint.trim().startsWith('=') &&\n isVersion(constraint.trim().substring(1).trim())) ||\n isVersion(constraint.trim())\n );\n}\n\nfunction handleShort(\n operator: string,\n currentValue: string,\n newVersion: string,\n): string | null {\n const toVersionMajor = getMajor(newVersion);\n const toVersionMinor = getMinor(newVersion);\n const split = currentValue.split('.');\n if (toVersionMajor !== null && split.length === 1) {\n // [^,~]4\n return `${operator}${toVersionMajor}`;\n }\n if (\n toVersionMajor !== null &&\n toVersionMinor !== null &&\n split.length === 2\n ) {\n // [^,~]4.1\n return `${operator}${toVersionMajor}.${toVersionMinor}`;\n }\n return null;\n}\n\nfunction getNewValue({\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n}: NewValueConfig): string {\n if (rangeStrategy === 'replace') {\n const npmCurrentValue = poetry2npm(currentValue);\n try {\n const massagedNewVersion = poetry2semver(newVersion);\n if (\n massagedNewVersion &&\n isVersion(massagedNewVersion) &&\n npm.matches(massagedNewVersion, npmCurrentValue)\n ) {\n return currentValue;\n }\n } catch (err) /* istanbul ignore next */ {\n logger.info(\n { err },\n 'Poetry versioning: Error caught checking if newVersion satisfies currentValue',\n );\n }\n const parsedRange = parseRange(npmCurrentValue);\n const element = parsedRange.at(-1)!;\n if (parsedRange.length === 1 && element.operator) {\n if (element.operator === '^') {\n const version = handleShort('^', npmCurrentValue, newVersion);\n if (version) {\n return npm2poetry(version);\n }\n }\n if (element.operator === '~') {\n const version = handleShort('~', npmCurrentValue, newVersion);\n if (version) {\n return npm2poetry(version);\n }\n }\n }\n }\n\n // Explicitly check whether this is a fully-qualified version\n if (\n (VERSION_PATTERN.exec(newVersion)?.groups?.release ?? '').split('.')\n .length !== 3\n ) {\n logger.debug(\n 'Cannot massage python version to npm - returning currentValue',\n );\n return currentValue;\n }\n try {\n const currentSemverVersion =\n currentVersion && poetry2semver(currentVersion);\n\n const newSemverVersion = poetry2semver(newVersion);\n\n if (currentSemverVersion && newSemverVersion) {\n const newSemver = npm.getNewValue({\n currentValue: poetry2npm(currentValue),\n rangeStrategy,\n currentVersion: currentSemverVersion,\n newVersion: newSemverVersion,\n });\n const newPoetry = newSemver && npm2poetry(newSemver);\n if (newPoetry) {\n return newPoetry;\n }\n }\n } catch (err) /* istanbul ignore next */ {\n logger.debug(\n { currentValue, rangeStrategy, currentVersion, newVersion, err },\n 'Could not generate new value using npm.getNewValue()',\n );\n }\n\n // istanbul ignore next\n return currentValue;\n}\n\nfunction sortVersions(a: string, b: string): number {\n return pep440.sortVersions(a, b);\n}\n\nfunction subset(subRange: string, superRange: string): boolean | undefined {\n return npm.subset!(poetry2npm(subRange), poetry2npm(superRange));\n}\n\nexport const api: VersioningApi = {\n equals,\n getMajor,\n getMinor,\n getPatch,\n getNewValue,\n getSatisfyingVersion,\n isCompatible: isVersion,\n isGreaterThan,\n isLessThanRange,\n isSingleVersion,\n isStable,\n isValid,\n isVersion,\n matches,\n minSatisfyingVersion,\n sortVersions,\n subset,\n};\nexport default api;\n"],"mappings":"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"}
|
|
@@ -89,8 +89,8 @@ function isSame(type, a, b) {
|
|
|
89
89
|
const bParts = getParts(b);
|
|
90
90
|
if (aParts === null || bParts === null) return false;
|
|
91
91
|
if (type === "major") return "eq" === compareIntArray(aParts.major, bParts.major);
|
|
92
|
-
|
|
93
|
-
|
|
92
|
+
if (type === "minor") return "eq" === compareIntArray(aParts.minor, bParts.minor);
|
|
93
|
+
return "eq" === compareIntArray(aParts.patch, bParts.patch);
|
|
94
94
|
}
|
|
95
95
|
function subset(subRange, superRange) {
|
|
96
96
|
const sub = parseRange(subRange);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/pvp/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport type { RangeStrategy } from '../../../types/versioning.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\nimport { parseRange } from './range.ts';\nimport { compareIntArray, extractAllParts, getParts, plusOne } from './util.ts';\n\nexport const id = 'pvp';\nexport const displayName = 'Package Versioning Policy (Haskell)';\nexport const urls = [\n '[Haskell Package Versioning Policy](https://pvp.haskell.org)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = ['widen'];\n\nconst digitsAndDots = regEx(/^[\\d.]+$/);\n\nfunction isGreaterThan(version: string, other: string): boolean {\n const versionIntMajor = extractAllParts(version);\n const otherIntMajor = extractAllParts(other);\n if (versionIntMajor === null || otherIntMajor === null) {\n return false;\n }\n return compareIntArray(versionIntMajor, otherIntMajor) === 'gt';\n}\n\nfunction getMajor(version: string): number | null {\n // This basically can't be implemented correctly, since\n // 1.1 and 1.10 become equal when converted to float.\n // Consumers should use isSame instead.\n const parts = getParts(version);\n if (parts === null) {\n return null;\n }\n return Number(parts.major.join('.'));\n}\n\nfunction getMinor(version: string): number | null {\n const parts = getParts(version);\n if (parts === null || parts.minor.length === 0) {\n return null;\n }\n return Number(parts.minor.join('.'));\n}\n\nfunction getPatch(version: string): number | null {\n const parts = getParts(version);\n if (parts === null || parts.patch.length === 0) {\n return null;\n }\n return Number(`${parts.patch[0]}.${parts.patch.slice(1).join('')}`);\n}\n\nfunction matches(version: string, range: string): boolean {\n const parsed = parseRange(range);\n if (parsed === null) {\n return false;\n }\n const ver = extractAllParts(version);\n const lower = extractAllParts(parsed.lower);\n const upper = extractAllParts(parsed.upper);\n if (ver === null || lower === null || upper === null) {\n return false;\n }\n return (\n 'gt' === compareIntArray(upper, ver) &&\n ['eq', 'lt'].includes(compareIntArray(lower, ver))\n );\n}\n\nfunction satisfyingVersion(\n versions: string[],\n range: string,\n reverse: boolean,\n): string | null {\n const copy = versions.slice(0);\n copy.sort((a, b) => {\n const multiplier = reverse ? 1 : -1;\n return sortVersions(a, b) * multiplier;\n });\n const result = copy.find((v) => matches(v, range));\n return result ?? null;\n}\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return satisfyingVersion(versions, range, false);\n}\n\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return satisfyingVersion(versions, range, true);\n}\n\nfunction isLessThanRange(version: string, range: string): boolean {\n const parsed = parseRange(range);\n if (parsed === null) {\n return false;\n }\n const compos = extractAllParts(version);\n const lower = extractAllParts(parsed.lower);\n if (compos === null || lower === null) {\n return false;\n }\n return 'lt' === compareIntArray(compos, lower);\n}\n\nfunction getNewValue({\n currentValue,\n newVersion,\n rangeStrategy,\n}: NewValueConfig): string | null {\n if (rangeStrategy !== 'widen') {\n logger.info(\n { rangeStrategy, currentValue, newVersion },\n `PVP can't handle this range strategy.`,\n );\n return null;\n }\n const parsed = parseRange(currentValue);\n if (parsed === null) {\n logger.info(\n { currentValue, newVersion },\n 'could not parse PVP version range',\n );\n return null;\n }\n if (isLessThanRange(newVersion, currentValue)) {\n // ignore new releases in old release series\n return null;\n }\n if (matches(newVersion, currentValue)) {\n // the upper bound is already high enough\n return null;\n }\n const compos = getParts(newVersion);\n if (compos === null) {\n return null;\n }\n const majorPlusOne = plusOne(compos.major);\n // istanbul ignore next: since all versions that can be parsed, can also be bumped, this can never happen\n if (!matches(newVersion, `>=${parsed.lower} && <${majorPlusOne}`)) {\n logger.warn(\n { newVersion },\n \"Even though the major bound was bumped, the newVersion still isn't accepted.\",\n );\n return null;\n }\n return `>=${parsed.lower} && <${majorPlusOne}`;\n}\n\nfunction isSame(\n type: 'major' | 'minor' | 'patch',\n a: string,\n b: string,\n): boolean {\n const aParts = getParts(a);\n const bParts = getParts(b);\n if (aParts === null || bParts === null) {\n return false;\n }\n if (type === 'major') {\n return 'eq' === compareIntArray(aParts.major, bParts.major);\n } else if (type === 'minor') {\n return 'eq' === compareIntArray(aParts.minor, bParts.minor);\n } else {\n return 'eq' === compareIntArray(aParts.patch, bParts.patch);\n }\n}\n\nfunction subset(subRange: string, superRange: string): boolean | undefined {\n const sub = parseRange(subRange);\n const sup = parseRange(superRange);\n if (sub === null || sup === null) {\n return undefined;\n }\n const subLower = extractAllParts(sub.lower);\n const subUpper = extractAllParts(sub.upper);\n const supLower = extractAllParts(sup.lower);\n const supUpper = extractAllParts(sup.upper);\n if (\n subLower === null ||\n subUpper === null ||\n supLower === null ||\n supUpper === null\n ) {\n return undefined;\n }\n if ('lt' === compareIntArray(subLower, supLower)) {\n return false;\n }\n if ('gt' === compareIntArray(subUpper, supUpper)) {\n return false;\n }\n return true;\n}\n\nfunction isVersion(maybeRange: string | undefined | null): boolean {\n return typeof maybeRange === 'string' && parseRange(maybeRange) === null;\n}\n\nfunction isValid(ver: string): boolean {\n return extractAllParts(ver) !== null || parseRange(ver) !== null;\n}\n\nfunction isSingleVersion(range: string): boolean {\n const noSpaces = range.trim();\n return noSpaces.startsWith('==') && digitsAndDots.test(noSpaces.slice(2));\n}\n\nfunction equals(a: string, b: string): boolean {\n const aParts = extractAllParts(a);\n const bParts = extractAllParts(b);\n if (aParts === null || bParts === null) {\n return false;\n }\n return 'eq' === compareIntArray(aParts, bParts);\n}\n\nfunction sortVersions(a: string, b: string): number {\n if (equals(a, b)) {\n return 0;\n }\n return isGreaterThan(a, b) ? 1 : -1;\n}\n\nfunction isStable(_version: string): boolean {\n return true;\n}\n\nfunction isCompatible(_version: string): boolean {\n return true;\n}\n\nexport const api: VersioningApi = {\n isValid,\n isVersion,\n isStable,\n isCompatible,\n getMajor,\n getMinor,\n getPatch,\n isSingleVersion,\n sortVersions,\n equals,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n isLessThanRange,\n isGreaterThan,\n getNewValue,\n isSame,\n subset,\n};\nexport default api;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/pvp/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport type { RangeStrategy } from '../../../types/versioning.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\nimport { parseRange } from './range.ts';\nimport { compareIntArray, extractAllParts, getParts, plusOne } from './util.ts';\n\nexport const id = 'pvp';\nexport const displayName = 'Package Versioning Policy (Haskell)';\nexport const urls = [\n '[Haskell Package Versioning Policy](https://pvp.haskell.org)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = ['widen'];\n\nconst digitsAndDots = regEx(/^[\\d.]+$/);\n\nfunction isGreaterThan(version: string, other: string): boolean {\n const versionIntMajor = extractAllParts(version);\n const otherIntMajor = extractAllParts(other);\n if (versionIntMajor === null || otherIntMajor === null) {\n return false;\n }\n return compareIntArray(versionIntMajor, otherIntMajor) === 'gt';\n}\n\nfunction getMajor(version: string): number | null {\n // This basically can't be implemented correctly, since\n // 1.1 and 1.10 become equal when converted to float.\n // Consumers should use isSame instead.\n const parts = getParts(version);\n if (parts === null) {\n return null;\n }\n return Number(parts.major.join('.'));\n}\n\nfunction getMinor(version: string): number | null {\n const parts = getParts(version);\n if (parts === null || parts.minor.length === 0) {\n return null;\n }\n return Number(parts.minor.join('.'));\n}\n\nfunction getPatch(version: string): number | null {\n const parts = getParts(version);\n if (parts === null || parts.patch.length === 0) {\n return null;\n }\n return Number(`${parts.patch[0]}.${parts.patch.slice(1).join('')}`);\n}\n\nfunction matches(version: string, range: string): boolean {\n const parsed = parseRange(range);\n if (parsed === null) {\n return false;\n }\n const ver = extractAllParts(version);\n const lower = extractAllParts(parsed.lower);\n const upper = extractAllParts(parsed.upper);\n if (ver === null || lower === null || upper === null) {\n return false;\n }\n return (\n 'gt' === compareIntArray(upper, ver) &&\n ['eq', 'lt'].includes(compareIntArray(lower, ver))\n );\n}\n\nfunction satisfyingVersion(\n versions: string[],\n range: string,\n reverse: boolean,\n): string | null {\n const copy = versions.slice(0);\n copy.sort((a, b) => {\n const multiplier = reverse ? 1 : -1;\n return sortVersions(a, b) * multiplier;\n });\n const result = copy.find((v) => matches(v, range));\n return result ?? null;\n}\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return satisfyingVersion(versions, range, false);\n}\n\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return satisfyingVersion(versions, range, true);\n}\n\nfunction isLessThanRange(version: string, range: string): boolean {\n const parsed = parseRange(range);\n if (parsed === null) {\n return false;\n }\n const compos = extractAllParts(version);\n const lower = extractAllParts(parsed.lower);\n if (compos === null || lower === null) {\n return false;\n }\n return 'lt' === compareIntArray(compos, lower);\n}\n\nfunction getNewValue({\n currentValue,\n newVersion,\n rangeStrategy,\n}: NewValueConfig): string | null {\n if (rangeStrategy !== 'widen') {\n logger.info(\n { rangeStrategy, currentValue, newVersion },\n `PVP can't handle this range strategy.`,\n );\n return null;\n }\n const parsed = parseRange(currentValue);\n if (parsed === null) {\n logger.info(\n { currentValue, newVersion },\n 'could not parse PVP version range',\n );\n return null;\n }\n if (isLessThanRange(newVersion, currentValue)) {\n // ignore new releases in old release series\n return null;\n }\n if (matches(newVersion, currentValue)) {\n // the upper bound is already high enough\n return null;\n }\n const compos = getParts(newVersion);\n if (compos === null) {\n return null;\n }\n const majorPlusOne = plusOne(compos.major);\n // istanbul ignore next: since all versions that can be parsed, can also be bumped, this can never happen\n if (!matches(newVersion, `>=${parsed.lower} && <${majorPlusOne}`)) {\n logger.warn(\n { newVersion },\n \"Even though the major bound was bumped, the newVersion still isn't accepted.\",\n );\n return null;\n }\n return `>=${parsed.lower} && <${majorPlusOne}`;\n}\n\nfunction isSame(\n type: 'major' | 'minor' | 'patch',\n a: string,\n b: string,\n): boolean {\n const aParts = getParts(a);\n const bParts = getParts(b);\n if (aParts === null || bParts === null) {\n return false;\n }\n if (type === 'major') {\n return 'eq' === compareIntArray(aParts.major, bParts.major);\n }\n if (type === 'minor') {\n return 'eq' === compareIntArray(aParts.minor, bParts.minor);\n }\n return 'eq' === compareIntArray(aParts.patch, bParts.patch);\n}\n\nfunction subset(subRange: string, superRange: string): boolean | undefined {\n const sub = parseRange(subRange);\n const sup = parseRange(superRange);\n if (sub === null || sup === null) {\n return undefined;\n }\n const subLower = extractAllParts(sub.lower);\n const subUpper = extractAllParts(sub.upper);\n const supLower = extractAllParts(sup.lower);\n const supUpper = extractAllParts(sup.upper);\n if (\n subLower === null ||\n subUpper === null ||\n supLower === null ||\n supUpper === null\n ) {\n return undefined;\n }\n if ('lt' === compareIntArray(subLower, supLower)) {\n return false;\n }\n if ('gt' === compareIntArray(subUpper, supUpper)) {\n return false;\n }\n return true;\n}\n\nfunction isVersion(maybeRange: string | undefined | null): boolean {\n return typeof maybeRange === 'string' && parseRange(maybeRange) === null;\n}\n\nfunction isValid(ver: string): boolean {\n return extractAllParts(ver) !== null || parseRange(ver) !== null;\n}\n\nfunction isSingleVersion(range: string): boolean {\n const noSpaces = range.trim();\n return noSpaces.startsWith('==') && digitsAndDots.test(noSpaces.slice(2));\n}\n\nfunction equals(a: string, b: string): boolean {\n const aParts = extractAllParts(a);\n const bParts = extractAllParts(b);\n if (aParts === null || bParts === null) {\n return false;\n }\n return 'eq' === compareIntArray(aParts, bParts);\n}\n\nfunction sortVersions(a: string, b: string): number {\n if (equals(a, b)) {\n return 0;\n }\n return isGreaterThan(a, b) ? 1 : -1;\n}\n\nfunction isStable(_version: string): boolean {\n return true;\n}\n\nfunction isCompatible(_version: string): boolean {\n return true;\n}\n\nexport const api: VersioningApi = {\n isValid,\n isVersion,\n isStable,\n isCompatible,\n getMajor,\n getMinor,\n getPatch,\n isSingleVersion,\n sortVersions,\n equals,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n isLessThanRange,\n isGreaterThan,\n getNewValue,\n isSame,\n subset,\n};\nexport default api;\n"],"mappings":"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"}
|
|
@@ -52,7 +52,7 @@ var RpmVersioningApi = class extends GenericVersioningApi {
|
|
|
52
52
|
const c2 = s2[i];
|
|
53
53
|
if (c1 === c2) continue;
|
|
54
54
|
if (c1 > c2) return 1;
|
|
55
|
-
|
|
55
|
+
if (c1 < c2) return -1;
|
|
56
56
|
}
|
|
57
57
|
return s1.length > s2.length ? 1 : -1;
|
|
58
58
|
}
|
|
@@ -76,7 +76,8 @@ var RpmVersioningApi = class extends GenericVersioningApi {
|
|
|
76
76
|
const result = matchv1.localeCompare(matchv2, void 0, { numeric: true });
|
|
77
77
|
if (result === 0) continue;
|
|
78
78
|
return Math.sign(result);
|
|
79
|
-
}
|
|
79
|
+
}
|
|
80
|
+
if (isNumericString(matchv2?.[0])) return -1;
|
|
80
81
|
const compared_value = this._compare_string(matchv1, matchv2);
|
|
81
82
|
if (compared_value !== 0) return compared_value;
|
|
82
83
|
}
|
|
@@ -95,7 +96,7 @@ var RpmVersioningApi = class extends GenericVersioningApi {
|
|
|
95
96
|
const releaseVersionDifference = this._compare_glob(parsed1.rpmRelease, parsed2.rpmRelease);
|
|
96
97
|
if (releaseVersionDifference !== 0) return releaseVersionDifference;
|
|
97
98
|
if (parsed1.rpmPreRelease === "" && parsed2.rpmPreRelease !== "") return 1;
|
|
98
|
-
|
|
99
|
+
if (parsed1.rpmPreRelease !== "" && parsed2.rpmPreRelease === "") return -1;
|
|
99
100
|
if (this._compare_glob(parsed1.rpmPreRelease, parsed2.rpmPreRelease) !== 0) return releaseVersionDifference;
|
|
100
101
|
return this._compare_glob(parsed1.snapshot, parsed2.snapshot);
|
|
101
102
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/rpm/index.ts"],"sourcesContent":["import { isNumericString } 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 = 'rpm';\nexport const displayName = 'RPM version';\nexport const urls = [\n '[Fedora packaging guidelines - Versioning](https://docs.fedoraproject.org/en-US/packaging-guidelines/Versioning/)',\n '[Fedora package versioning examples](https://fedoraproject.org/wiki/Package_Versioning_Examples)',\n '[Fedora tilde and caret versioning](https://fedoraproject.org/wiki/User:Tibbs/TildeCaretVersioning)',\n];\nexport const supportsRanges = false;\n\nconst alphaNumPattern = regEx(/([a-zA-Z]+)|(\\d+)|(~)/g);\nconst epochPattern = regEx(/^\\d+$/);\n\nexport interface RpmVersion extends GenericVersion {\n /**\n * epoch, defaults to 0 if not present, are used to leave version mistakes and previous\n * versioning schemes behind.\n */\n epoch: number;\n /**\n * upstreamVersion is the main version part: it defines the version of origin software\n * that was packaged.\n */\n upstreamVersion: string;\n /**\n * rpmRelease is used to distinguish between different versions of packaging for the\n * same upstream version.\n */\n rpmRelease: string;\n\n /**\n * rpmPreRelease is used to distinguish versions of prerelease of the same upstream and release version\n * Example: Python 3.12.0-1 > Python 3.12.0-1~a1\n */\n rpmPreRelease: string;\n\n /**\n * snapshot is an archive taken from upstream's source code control system which is not equivalent to any release version.\n * This field must at minimum consist of the date in eight-digit \"YYYYMMDD\" format. The packager MAY\n * include up to 17 characters of additional information after the date. The following formats are suggested:\n * YYYYMMDD.<revision>\n * YYYYMMDD<scm><revision>\n */\n snapshot: string;\n}\n\nclass RpmVersioningApi extends GenericVersioningApi {\n /**\n * https://github.com/rpm-software-management/rpm/blob/e3c11a790367016aed7ea48cfcc78751a71ce862/rpmio/rpmvercmp.c#L16\n */\n protected _parse(version: string): RpmVersion | null {\n let remainingVersion = version;\n\n let epoch = 0;\n const epochIndex = remainingVersion.indexOf(':');\n if (epochIndex !== -1) {\n const epochStr = remainingVersion.slice(0, epochIndex);\n if (epochPattern.test(epochStr)) {\n epoch = parseInt(epochStr, 10);\n } else {\n return null;\n }\n\n remainingVersion = remainingVersion.slice(epochIndex + 1);\n }\n\n let upstreamVersion: string;\n let rpmRelease = '';\n let rpmPreRelease = '';\n let snapshot = '';\n const releaseIndex = remainingVersion.indexOf('-');\n const prereleaseIndex = remainingVersion.indexOf('~');\n\n // Note: There can be a snapshot if there is no prerelease. Snapshot always beat no snapshot,\n // so if there is 3.12.0-1 vs 3.12.0-1^20231110, the snapshot wins.\n // The logic below only creates snapshot IF there is a prerleease version. This logic is NOT\n // correct, but the result is still correct due to the caret being ignored in release, and\n // release continue comparing\n //\n // Note: If there IS a tilde preceding the caret, then snapshot DOES NOT win\n // Example: 3.12.0-1~^20231001 LOSES to 3.12.0-1 and\n // 3.12.0-1~^20231001 LOSES to 3.12.0-1^20231001\n const snapshotIndex = remainingVersion.indexOf('^');\n\n if (releaseIndex >= 0) {\n upstreamVersion = remainingVersion.slice(0, releaseIndex);\n\n // Do NOT splice out prerelease, we need to distinguish if the flag is set or not, regardless if there is a version.\n // The tilde will get filtered out during regex\n if (prereleaseIndex >= 0) {\n rpmRelease = remainingVersion.slice(releaseIndex, prereleaseIndex);\n if (snapshotIndex >= 0) {\n rpmPreRelease = remainingVersion.slice(\n prereleaseIndex,\n snapshotIndex,\n );\n snapshot = remainingVersion.slice(snapshotIndex + 1);\n } else {\n rpmPreRelease = remainingVersion.slice(prereleaseIndex);\n }\n } else {\n rpmRelease = remainingVersion.slice(releaseIndex + 1);\n }\n } else {\n upstreamVersion = remainingVersion;\n }\n\n const release = [...remainingVersion.matchAll(regEx(/\\d+/g))].map((m) =>\n parseInt(m[0], 10),\n );\n\n return {\n epoch,\n upstreamVersion,\n rpmRelease,\n release,\n rpmPreRelease,\n snapshot,\n };\n }\n\n protected _compare_string(s1: string, s2: string): number {\n if (s1 === s2) {\n return 0;\n }\n\n const minLength = Math.min(s1.length, s2.length);\n\n for (let i = 0; i < minLength; i++) {\n const c1 = s1[i];\n const c2 = s2[i];\n\n if (c1 === c2) {\n continue;\n }\n\n if (c1 > c2) {\n return 1;\n } else if (c1 < c2) {\n return -1;\n }\n }\n\n // Okay, they've been the exact same up until now, so return the longer one\n return s1.length > s2.length ? 1 : -1;\n }\n\n /**\n * Taken from https://github.com/rpm-software-management/rpm/blob/master/rpmio/rpmvercmp.c\n */\n protected _compare_glob(v1: string, v2: string): number {\n if (v1 === v2) {\n return 0;\n }\n\n const matchesv1 = v1.match(alphaNumPattern) ?? [];\n const matchesv2 = v2.match(alphaNumPattern) ?? [];\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 // compare tildes\n if (matchv1?.startsWith('~') || matchv2?.startsWith('~')) {\n if (!matchv1?.startsWith('~')) {\n return 1;\n }\n\n if (!matchv2?.startsWith('~')) {\n return -1;\n }\n }\n\n if (isNumericString(matchv1?.[0])) {\n // numbers are greater than letters\n if (!isNumericString(matchv2?.[0])) {\n return 1;\n }\n\n //We clearly have a number here, so return which is greater\n const result = matchv1.localeCompare(matchv2, undefined, {\n numeric: true,\n });\n\n if (result === 0) {\n continue;\n }\n\n return Math.sign(result);\n } else if (isNumericString(matchv2?.[0])) {\n return -1;\n }\n\n // We have two string globs, compare them\n const compared_value = this._compare_string(matchv1, matchv2);\n if (compared_value !== 0) {\n return compared_value;\n }\n }\n\n // segments were all the same, but separators were different\n if (matchesv1.length === matchesv2.length) {\n return 0;\n }\n\n // If there is a tilde in a segment past the minimum number of segments, find it\n if (matchesv1.length > matches && matchesv1[matches].startsWith('~')) {\n return -1;\n }\n\n if (matchesv2.length > matches && matchesv2[matches].startsWith('~')) {\n return 1;\n }\n\n // whichever has the most segments wins\n return matchesv1.length > matchesv2.length ? 1 : -1;\n }\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 // Greater epoch wins\n if (parsed1.epoch !== parsed2.epoch) {\n return Math.sign(parsed1.epoch - parsed2.epoch);\n }\n\n // Greater upstream version wins\n const upstreamVersionDifference = this._compare_glob(\n parsed1.upstreamVersion,\n parsed2.upstreamVersion,\n );\n\n if (upstreamVersionDifference !== 0) {\n return upstreamVersionDifference;\n }\n\n // Greater release version wins\n const releaseVersionDifference = this._compare_glob(\n parsed1.rpmRelease,\n parsed2.rpmRelease,\n );\n\n if (releaseVersionDifference !== 0) {\n return releaseVersionDifference;\n }\n\n // No Prerelease wins\n if (parsed1.rpmPreRelease === '' && parsed2.rpmPreRelease !== '') {\n return 1;\n } else if (parsed1.rpmPreRelease !== '' && parsed2.rpmPreRelease === '') {\n return -1;\n }\n\n const preReleaseDifference = this._compare_glob(\n parsed1.rpmPreRelease,\n parsed2.rpmPreRelease,\n );\n\n if (preReleaseDifference !== 0) {\n return releaseVersionDifference;\n }\n\n // Greater Snapshot wins\n return this._compare_glob(parsed1.snapshot, parsed2.snapshot);\n }\n}\n\nexport const api: VersioningApi = new RpmVersioningApi();\n\nexport default api;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/rpm/index.ts"],"sourcesContent":["import { isNumericString } 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 = 'rpm';\nexport const displayName = 'RPM version';\nexport const urls = [\n '[Fedora packaging guidelines - Versioning](https://docs.fedoraproject.org/en-US/packaging-guidelines/Versioning/)',\n '[Fedora package versioning examples](https://fedoraproject.org/wiki/Package_Versioning_Examples)',\n '[Fedora tilde and caret versioning](https://fedoraproject.org/wiki/User:Tibbs/TildeCaretVersioning)',\n];\nexport const supportsRanges = false;\n\nconst alphaNumPattern = regEx(/([a-zA-Z]+)|(\\d+)|(~)/g);\nconst epochPattern = regEx(/^\\d+$/);\n\nexport interface RpmVersion extends GenericVersion {\n /**\n * epoch, defaults to 0 if not present, are used to leave version mistakes and previous\n * versioning schemes behind.\n */\n epoch: number;\n /**\n * upstreamVersion is the main version part: it defines the version of origin software\n * that was packaged.\n */\n upstreamVersion: string;\n /**\n * rpmRelease is used to distinguish between different versions of packaging for the\n * same upstream version.\n */\n rpmRelease: string;\n\n /**\n * rpmPreRelease is used to distinguish versions of prerelease of the same upstream and release version\n * Example: Python 3.12.0-1 > Python 3.12.0-1~a1\n */\n rpmPreRelease: string;\n\n /**\n * snapshot is an archive taken from upstream's source code control system which is not equivalent to any release version.\n * This field must at minimum consist of the date in eight-digit \"YYYYMMDD\" format. The packager MAY\n * include up to 17 characters of additional information after the date. The following formats are suggested:\n * YYYYMMDD.<revision>\n * YYYYMMDD<scm><revision>\n */\n snapshot: string;\n}\n\nclass RpmVersioningApi extends GenericVersioningApi {\n /**\n * https://github.com/rpm-software-management/rpm/blob/e3c11a790367016aed7ea48cfcc78751a71ce862/rpmio/rpmvercmp.c#L16\n */\n protected _parse(version: string): RpmVersion | null {\n let remainingVersion = version;\n\n let epoch = 0;\n const epochIndex = remainingVersion.indexOf(':');\n if (epochIndex !== -1) {\n const epochStr = remainingVersion.slice(0, epochIndex);\n if (epochPattern.test(epochStr)) {\n epoch = parseInt(epochStr, 10);\n } else {\n return null;\n }\n\n remainingVersion = remainingVersion.slice(epochIndex + 1);\n }\n\n let upstreamVersion: string;\n let rpmRelease = '';\n let rpmPreRelease = '';\n let snapshot = '';\n const releaseIndex = remainingVersion.indexOf('-');\n const prereleaseIndex = remainingVersion.indexOf('~');\n\n // Note: There can be a snapshot if there is no prerelease. Snapshot always beat no snapshot,\n // so if there is 3.12.0-1 vs 3.12.0-1^20231110, the snapshot wins.\n // The logic below only creates snapshot IF there is a prerleease version. This logic is NOT\n // correct, but the result is still correct due to the caret being ignored in release, and\n // release continue comparing\n //\n // Note: If there IS a tilde preceding the caret, then snapshot DOES NOT win\n // Example: 3.12.0-1~^20231001 LOSES to 3.12.0-1 and\n // 3.12.0-1~^20231001 LOSES to 3.12.0-1^20231001\n const snapshotIndex = remainingVersion.indexOf('^');\n\n if (releaseIndex >= 0) {\n upstreamVersion = remainingVersion.slice(0, releaseIndex);\n\n // Do NOT splice out prerelease, we need to distinguish if the flag is set or not, regardless if there is a version.\n // The tilde will get filtered out during regex\n if (prereleaseIndex >= 0) {\n rpmRelease = remainingVersion.slice(releaseIndex, prereleaseIndex);\n if (snapshotIndex >= 0) {\n rpmPreRelease = remainingVersion.slice(\n prereleaseIndex,\n snapshotIndex,\n );\n snapshot = remainingVersion.slice(snapshotIndex + 1);\n } else {\n rpmPreRelease = remainingVersion.slice(prereleaseIndex);\n }\n } else {\n rpmRelease = remainingVersion.slice(releaseIndex + 1);\n }\n } else {\n upstreamVersion = remainingVersion;\n }\n\n const release = [...remainingVersion.matchAll(regEx(/\\d+/g))].map((m) =>\n parseInt(m[0], 10),\n );\n\n return {\n epoch,\n upstreamVersion,\n rpmRelease,\n release,\n rpmPreRelease,\n snapshot,\n };\n }\n\n protected _compare_string(s1: string, s2: string): number {\n if (s1 === s2) {\n return 0;\n }\n\n const minLength = Math.min(s1.length, s2.length);\n\n for (let i = 0; i < minLength; i++) {\n const c1 = s1[i];\n const c2 = s2[i];\n\n if (c1 === c2) {\n continue;\n }\n\n if (c1 > c2) {\n return 1;\n }\n if (c1 < c2) {\n return -1;\n }\n }\n\n // Okay, they've been the exact same up until now, so return the longer one\n return s1.length > s2.length ? 1 : -1;\n }\n\n /**\n * Taken from https://github.com/rpm-software-management/rpm/blob/master/rpmio/rpmvercmp.c\n */\n protected _compare_glob(v1: string, v2: string): number {\n if (v1 === v2) {\n return 0;\n }\n\n const matchesv1 = v1.match(alphaNumPattern) ?? [];\n const matchesv2 = v2.match(alphaNumPattern) ?? [];\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 // compare tildes\n if (matchv1?.startsWith('~') || matchv2?.startsWith('~')) {\n if (!matchv1?.startsWith('~')) {\n return 1;\n }\n\n if (!matchv2?.startsWith('~')) {\n return -1;\n }\n }\n\n if (isNumericString(matchv1?.[0])) {\n // numbers are greater than letters\n if (!isNumericString(matchv2?.[0])) {\n return 1;\n }\n\n //We clearly have a number here, so return which is greater\n const result = matchv1.localeCompare(matchv2, undefined, {\n numeric: true,\n });\n\n if (result === 0) {\n continue;\n }\n\n return Math.sign(result);\n }\n if (isNumericString(matchv2?.[0])) {\n return -1;\n }\n\n // We have two string globs, compare them\n const compared_value = this._compare_string(matchv1, matchv2);\n if (compared_value !== 0) {\n return compared_value;\n }\n }\n\n // segments were all the same, but separators were different\n if (matchesv1.length === matchesv2.length) {\n return 0;\n }\n\n // If there is a tilde in a segment past the minimum number of segments, find it\n if (matchesv1.length > matches && matchesv1[matches].startsWith('~')) {\n return -1;\n }\n\n if (matchesv2.length > matches && matchesv2[matches].startsWith('~')) {\n return 1;\n }\n\n // whichever has the most segments wins\n return matchesv1.length > matchesv2.length ? 1 : -1;\n }\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 // Greater epoch wins\n if (parsed1.epoch !== parsed2.epoch) {\n return Math.sign(parsed1.epoch - parsed2.epoch);\n }\n\n // Greater upstream version wins\n const upstreamVersionDifference = this._compare_glob(\n parsed1.upstreamVersion,\n parsed2.upstreamVersion,\n );\n\n if (upstreamVersionDifference !== 0) {\n return upstreamVersionDifference;\n }\n\n // Greater release version wins\n const releaseVersionDifference = this._compare_glob(\n parsed1.rpmRelease,\n parsed2.rpmRelease,\n );\n\n if (releaseVersionDifference !== 0) {\n return releaseVersionDifference;\n }\n\n // No Prerelease wins\n if (parsed1.rpmPreRelease === '' && parsed2.rpmPreRelease !== '') {\n return 1;\n }\n if (parsed1.rpmPreRelease !== '' && parsed2.rpmPreRelease === '') {\n return -1;\n }\n\n const preReleaseDifference = this._compare_glob(\n parsed1.rpmPreRelease,\n parsed2.rpmPreRelease,\n );\n\n if (preReleaseDifference !== 0) {\n return releaseVersionDifference;\n }\n\n // Greater Snapshot wins\n return this._compare_glob(parsed1.snapshot, parsed2.snapshot);\n }\n}\n\nexport const api: VersioningApi = new RpmVersioningApi();\n\nexport default api;\n"],"mappings":"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"}
|
|
@@ -25,7 +25,7 @@ const parse$1 = (range) => {
|
|
|
25
25
|
/** Wrapper for {@link satisfies} for {@link Range} record. */
|
|
26
26
|
function satisfiesRange(ver, range) {
|
|
27
27
|
if (range.companion) return satisfies(ver, `${range.operator}${range.version}`) && satisfiesRange(ver, range.companion);
|
|
28
|
-
|
|
28
|
+
return satisfies(ver, `${range.operator}${range.version}`);
|
|
29
29
|
}
|
|
30
30
|
/**
|
|
31
31
|
* Parses a comma-delimited list of range parts,
|
|
@@ -53,7 +53,7 @@ function parseRanges(range) {
|
|
|
53
53
|
function stringifyRanges(ranges) {
|
|
54
54
|
return ranges.map((r) => {
|
|
55
55
|
if (r.companion) return `${r.operator}${r.delimiter}${r.version}, ${r.companion.operator}${r.companion.delimiter}${r.companion.version}`;
|
|
56
|
-
|
|
56
|
+
return `${r.operator}${r.delimiter}${r.version}`;
|
|
57
57
|
}).join(", ");
|
|
58
58
|
}
|
|
59
59
|
const ltr = (version, range) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"range.js","names":["parse","_parse"],"sources":["../../../../lib/modules/versioning/ruby/range.ts"],"sourcesContent":["import { satisfies } from '@renovatebot/ruby-semver';\nimport { parse as _parse } from '@renovatebot/ruby-semver/dist/ruby/requirement.js';\nimport type { Version } from '@renovatebot/ruby-semver/dist/ruby/version.js';\nimport { create } from '@renovatebot/ruby-semver/dist/ruby/version.js';\nimport { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { EQUAL, GT, GTE, LT, LTE, NOT_EQUAL, PGTE } from './operator.ts';\n\nexport interface Range {\n version: string;\n operator: string;\n delimiter: string;\n /**\n * If the range is `~>` and immediately followed by `>=`,\n * the latter range is considered the former's companion\n * and assigned here instead of being an independent range.\n *\n * Example: `'~> 6.2', '>= 6.2.1'`\n */\n companion?: Range;\n}\n\nconst parse = (range: string): Range => {\n const regExp = regEx(\n /^(?<operator>[^\\d\\s]+)?(?<delimiter>\\s*)(?<version>[0-9a-zA-Z-.]+)$/,\n );\n\n const value = (range || '').trim();\n\n const match = regExp.exec(value);\n if (match?.groups) {\n const { version, operator = '', delimiter } = match.groups;\n return { version, operator, delimiter };\n }\n\n return {\n version: '',\n operator: '',\n delimiter: ' ',\n };\n};\n\n/** Wrapper for {@link satisfies} for {@link Range} record. */\nexport function satisfiesRange(ver: string, range: Range): boolean {\n if (range.companion) {\n return (\n satisfies(ver, `${range.operator}${range.version}`) &&\n satisfiesRange(ver, range.companion)\n );\n }
|
|
1
|
+
{"version":3,"file":"range.js","names":["parse","_parse"],"sources":["../../../../lib/modules/versioning/ruby/range.ts"],"sourcesContent":["import { satisfies } from '@renovatebot/ruby-semver';\nimport { parse as _parse } from '@renovatebot/ruby-semver/dist/ruby/requirement.js';\nimport type { Version } from '@renovatebot/ruby-semver/dist/ruby/version.js';\nimport { create } from '@renovatebot/ruby-semver/dist/ruby/version.js';\nimport { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { EQUAL, GT, GTE, LT, LTE, NOT_EQUAL, PGTE } from './operator.ts';\n\nexport interface Range {\n version: string;\n operator: string;\n delimiter: string;\n /**\n * If the range is `~>` and immediately followed by `>=`,\n * the latter range is considered the former's companion\n * and assigned here instead of being an independent range.\n *\n * Example: `'~> 6.2', '>= 6.2.1'`\n */\n companion?: Range;\n}\n\nconst parse = (range: string): Range => {\n const regExp = regEx(\n /^(?<operator>[^\\d\\s]+)?(?<delimiter>\\s*)(?<version>[0-9a-zA-Z-.]+)$/,\n );\n\n const value = (range || '').trim();\n\n const match = regExp.exec(value);\n if (match?.groups) {\n const { version, operator = '', delimiter } = match.groups;\n return { version, operator, delimiter };\n }\n\n return {\n version: '',\n operator: '',\n delimiter: ' ',\n };\n};\n\n/** Wrapper for {@link satisfies} for {@link Range} record. */\nexport function satisfiesRange(ver: string, range: Range): boolean {\n if (range.companion) {\n return (\n satisfies(ver, `${range.operator}${range.version}`) &&\n satisfiesRange(ver, range.companion)\n );\n }\n return satisfies(ver, `${range.operator}${range.version}`);\n}\n\n/**\n * Parses a comma-delimited list of range parts,\n * with special treatment for a pair of `~>` and `>=` parts.\n */\nexport function parseRanges(range: string): Range[] {\n const originalRanges = range.split(',').map(parse);\n const ranges: Range[] = [];\n for (let i = 0; i < originalRanges.length; ) {\n if (\n i + 1 < originalRanges.length &&\n originalRanges[i].operator === PGTE &&\n originalRanges[i + 1].operator === GTE\n ) {\n ranges.push({\n ...originalRanges[i],\n companion: originalRanges[i + 1],\n });\n i += 2;\n } else {\n ranges.push(originalRanges[i]);\n i++;\n }\n }\n return ranges;\n}\n\n/**\n * Stringifies a list of range parts into a comma-separated string,\n * with special treatment for a pair of `~>` and `>=` parts.\n */\nexport function stringifyRanges(ranges: Range[]): string {\n return ranges\n .map((r) => {\n if (r.companion) {\n return `${r.operator}${r.delimiter}${r.version}, ${r.companion.operator}${r.companion.delimiter}${r.companion.version}`;\n }\n return `${r.operator}${r.delimiter}${r.version}`;\n })\n .join(', ');\n}\n\ntype GemRequirement = [string, Version];\n\nconst ltr = (version: string, range: string): boolean => {\n const gemVersion = create(version);\n if (!gemVersion) {\n logger.warn({ version }, `Invalid ruby version`);\n return false;\n }\n const requirements: GemRequirement[] = range.split(',').map(_parse);\n\n const results = requirements.map(([operator, ver]) => {\n switch (operator) {\n case GT:\n case LT:\n return gemVersion.compare(ver) <= 0;\n case GTE:\n case LTE:\n case EQUAL:\n case NOT_EQUAL:\n return gemVersion.compare(ver) < 0;\n case PGTE:\n return (\n gemVersion.compare(ver) < 0 &&\n gemVersion.release().compare(ver.bump()) <= 0\n );\n // istanbul ignore next\n default:\n logger.warn({ operator }, `Unsupported operator`);\n return false;\n }\n });\n\n return results.reduce((accumulator, value) => accumulator && value, true);\n};\n\nexport { ltr, parse };\n"],"mappings":";;;;;;AAsBA,MAAMA,WAAS,UAAyB;CACtC,MAAM,SAAS,MACb,qEACF;CAEA,MAAM,SAAS,SAAS,GAAA,CAAI,KAAK;CAEjC,MAAM,QAAQ,OAAO,KAAK,KAAK;CAC/B,IAAI,OAAO,QAAQ;EACjB,MAAM,EAAE,SAAS,WAAW,IAAI,cAAc,MAAM;EACpD,OAAO;GAAE;GAAS;GAAU;EAAU;CACxC;CAEA,OAAO;EACL,SAAS;EACT,UAAU;EACV,WAAW;CACb;AACF;;AAGA,SAAgB,eAAe,KAAa,OAAuB;CACjE,IAAI,MAAM,WACR,OACE,UAAU,KAAK,GAAG,MAAM,WAAW,MAAM,SAAS,KAClD,eAAe,KAAK,MAAM,SAAS;CAGvC,OAAO,UAAU,KAAK,GAAG,MAAM,WAAW,MAAM,SAAS;AAC3D;;;;;AAMA,SAAgB,YAAY,OAAwB;CAClD,MAAM,iBAAiB,MAAM,MAAM,GAAG,CAAC,CAAC,IAAIA,OAAK;CACjD,MAAM,SAAkB,CAAC;CACzB,KAAK,IAAI,IAAI,GAAG,IAAI,eAAe,SACjC,IACE,IAAI,IAAI,eAAe,UACvB,eAAe,EAAE,CAAC,aAAA,QAClB,eAAe,IAAI,EAAE,CAAC,aAAA,MACtB;EACA,OAAO,KAAK;GACV,GAAG,eAAe;GAClB,WAAW,eAAe,IAAI;EAChC,CAAC;EACD,KAAK;CACP,OAAO;EACL,OAAO,KAAK,eAAe,EAAE;EAC7B;CACF;CAEF,OAAO;AACT;;;;;AAMA,SAAgB,gBAAgB,QAAyB;CACvD,OAAO,OACJ,KAAK,MAAM;EACV,IAAI,EAAE,WACJ,OAAO,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,IAAI,EAAE,UAAU,WAAW,EAAE,UAAU,YAAY,EAAE,UAAU;EAEhH,OAAO,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE;CACzC,CAAC,CAAC,CACD,KAAK,IAAI;AACd;AAIA,MAAM,OAAO,SAAiB,UAA2B;CACvD,MAAM,aAAa,OAAO,OAAO;CACjC,IAAI,CAAC,YAAY;EACf,OAAO,KAAK,EAAE,QAAQ,GAAG,sBAAsB;EAC/C,OAAO;CACT;CAyBA,OAxBuC,MAAM,MAAM,GAAG,CAAC,CAAC,IAAIC,KAEjC,CAAC,CAAC,KAAK,CAAC,UAAU,SAAS;EACpD,QAAQ,UAAR;GACE,KAAA;GACA,KAAA,KACE,OAAO,WAAW,QAAQ,GAAG,KAAK;GACpC,KAAA;GACA,KAAA;GACA,KAAA;GACA,KAAA,MACE,OAAO,WAAW,QAAQ,GAAG,IAAI;GACnC,KAAA,MACE,OACE,WAAW,QAAQ,GAAG,IAAI,KAC1B,WAAW,QAAQ,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK;;GAGhD;IACE,OAAO,KAAK,EAAE,SAAS,GAAG,sBAAsB;IAChD,OAAO;EACX;CACF,CAEa,CAAC,CAAC,QAAQ,aAAa,UAAU,eAAe,OAAO,IAAI;AAC1E"}
|