renovate 44.210.2 → 44.211.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/options/index.js +1 -1
- package/dist/config/options/index.js.map +1 -1
- package/dist/config/utils.js +2 -1
- package/dist/config/utils.js.map +1 -1
- package/dist/config/validation-helpers/regex-glob-matchers.js.map +1 -1
- package/dist/config/validation-helpers/utils.js +5 -1
- package/dist/config/validation-helpers/utils.js.map +1 -1
- package/dist/config/validation.js +8 -2
- package/dist/config/validation.js.map +1 -1
- package/dist/config-validator.js +1 -1
- 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/instrumentation/index.js +3 -2
- package/dist/instrumentation/index.js.map +1 -1
- package/dist/logger/bunyan.js +3 -2
- package/dist/logger/bunyan.js.map +1 -1
- package/dist/logger/pretty-stdout.js +2 -1
- package/dist/logger/pretty-stdout.js.map +1 -1
- package/dist/modules/datasource/apk/index.js +2 -2
- package/dist/modules/datasource/apk/index.js.map +1 -1
- package/dist/modules/datasource/artifactory/index.js +2 -3
- package/dist/modules/datasource/artifactory/index.js.map +1 -1
- package/dist/modules/datasource/bazel/index.js +2 -1
- package/dist/modules/datasource/bazel/index.js.map +1 -1
- package/dist/modules/datasource/cdnjs/index.js +2 -1
- package/dist/modules/datasource/cdnjs/index.js.map +1 -1
- package/dist/modules/datasource/conda/index.js +2 -1
- package/dist/modules/datasource/conda/index.js.map +1 -1
- package/dist/modules/datasource/crate/index.js +2 -1
- package/dist/modules/datasource/crate/index.js.map +1 -1
- package/dist/modules/datasource/dart-version/index.js +2 -1
- package/dist/modules/datasource/dart-version/index.js.map +1 -1
- package/dist/modules/datasource/datasource.js +2 -2
- package/dist/modules/datasource/datasource.js.map +1 -1
- package/dist/modules/datasource/deb/url.js +3 -1
- package/dist/modules/datasource/deb/url.js.map +1 -1
- package/dist/modules/datasource/devbox/index.js +2 -1
- package/dist/modules/datasource/devbox/index.js.map +1 -1
- package/dist/modules/datasource/docker/common.js +10 -8
- package/dist/modules/datasource/docker/common.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 +20 -17
- package/dist/modules/datasource/docker/index.js.map +1 -1
- package/dist/modules/datasource/gitea-tags/base.js +2 -3
- package/dist/modules/datasource/gitea-tags/base.js.map +1 -1
- package/dist/modules/datasource/github-tags/index.js +2 -1
- package/dist/modules/datasource/github-tags/index.js.map +1 -1
- package/dist/modules/datasource/gitlab-tags/index.js +2 -3
- package/dist/modules/datasource/gitlab-tags/index.js.map +1 -1
- package/dist/modules/datasource/go/base.js +1 -1
- package/dist/modules/datasource/go/base.js.map +1 -1
- package/dist/modules/datasource/go/common.js +8 -2
- package/dist/modules/datasource/go/common.js.map +1 -1
- package/dist/modules/datasource/go/env.js +2 -1
- package/dist/modules/datasource/go/env.js.map +1 -1
- package/dist/modules/datasource/go/releases-goproxy.js +7 -5
- package/dist/modules/datasource/go/releases-goproxy.js.map +1 -1
- package/dist/modules/datasource/helm/index.js +2 -1
- package/dist/modules/datasource/helm/index.js.map +1 -1
- package/dist/modules/datasource/hexpm-bob/index.js +2 -1
- package/dist/modules/datasource/hexpm-bob/index.js.map +1 -1
- package/dist/modules/datasource/index.js +4 -3
- package/dist/modules/datasource/index.js.map +1 -1
- package/dist/modules/datasource/java-version/adoptium.js +3 -2
- package/dist/modules/datasource/java-version/adoptium.js.map +1 -1
- package/dist/modules/datasource/java-version/graalvm.js +2 -1
- package/dist/modules/datasource/java-version/graalvm.js.map +1 -1
- package/dist/modules/datasource/maven/index.js.map +1 -1
- package/dist/modules/datasource/maven/util.js +7 -10
- package/dist/modules/datasource/maven/util.js.map +1 -1
- package/dist/modules/datasource/npm/npmrc.js +2 -2
- package/dist/modules/datasource/npm/npmrc.js.map +1 -1
- package/dist/modules/datasource/nuget/v3.js +3 -5
- package/dist/modules/datasource/nuget/v3.js.map +1 -1
- package/dist/modules/datasource/packagist/index.js +4 -5
- package/dist/modules/datasource/packagist/index.js.map +1 -1
- package/dist/modules/datasource/pod/index.js +4 -4
- package/dist/modules/datasource/pod/index.js.map +1 -1
- package/dist/modules/datasource/pypi/index.js +19 -11
- package/dist/modules/datasource/pypi/index.js.map +1 -1
- package/dist/modules/datasource/python-version/index.js +2 -3
- package/dist/modules/datasource/python-version/index.js.map +1 -1
- package/dist/modules/datasource/repology/index.js +4 -3
- package/dist/modules/datasource/repology/index.js.map +1 -1
- package/dist/modules/datasource/rpm/providers/common.js +3 -1
- package/dist/modules/datasource/rpm/providers/common.js.map +1 -1
- package/dist/modules/datasource/rubygems/index.js +2 -5
- package/dist/modules/datasource/rubygems/index.js.map +1 -1
- package/dist/modules/datasource/rubygems/versions-endpoint-cache.js +13 -18
- package/dist/modules/datasource/rubygems/versions-endpoint-cache.js.map +1 -1
- package/dist/modules/datasource/terraform-module/base.js +2 -1
- package/dist/modules/datasource/terraform-module/base.js.map +1 -1
- package/dist/modules/datasource/terraform-provider/index.js +2 -3
- package/dist/modules/datasource/terraform-provider/index.js.map +1 -1
- package/dist/modules/manager/bazel-module/parser/context.js +0 -1
- package/dist/modules/manager/bazel-module/parser/context.js.map +1 -1
- package/dist/modules/manager/bundler/host-rules.js +4 -1
- package/dist/modules/manager/bundler/host-rules.js.map +1 -1
- package/dist/modules/manager/composer/range.js +1 -1
- package/dist/modules/manager/composer/range.js.map +1 -1
- package/dist/modules/manager/custom/utils.js +3 -1
- package/dist/modules/manager/custom/utils.js.map +1 -1
- package/dist/modules/manager/devbox/schema.js +2 -1
- package/dist/modules/manager/devbox/schema.js.map +1 -1
- package/dist/modules/manager/dockerfile/extract.js +10 -2
- package/dist/modules/manager/dockerfile/extract.js.map +1 -1
- package/dist/modules/manager/fingerprint.generated.js +1 -1
- package/dist/modules/manager/fingerprint.generated.js.map +1 -1
- package/dist/modules/manager/github-actions/parse.js +2 -1
- package/dist/modules/manager/github-actions/parse.js.map +1 -1
- package/dist/modules/manager/gomod/artifacts.js +5 -2
- package/dist/modules/manager/gomod/artifacts.js.map +1 -1
- package/dist/modules/manager/gradle/artifacts.js +5 -2
- package/dist/modules/manager/gradle/artifacts.js.map +1 -1
- package/dist/modules/manager/gradle/utils.js +2 -1
- package/dist/modules/manager/gradle/utils.js.map +1 -1
- package/dist/modules/manager/gradle-wrapper/utils.js +9 -5
- package/dist/modules/manager/gradle-wrapper/utils.js.map +1 -1
- package/dist/modules/manager/helm-values/util.js +1 -1
- package/dist/modules/manager/helm-values/util.js.map +1 -1
- package/dist/modules/manager/helmfile/artifacts.js +1 -1
- package/dist/modules/manager/helmfile/artifacts.js.map +1 -1
- package/dist/modules/manager/helmv3/artifacts.js +1 -1
- package/dist/modules/manager/helmv3/artifacts.js.map +1 -1
- package/dist/modules/manager/maven/extract.js +5 -2
- package/dist/modules/manager/maven/extract.js.map +1 -1
- package/dist/modules/manager/maven-wrapper/artifacts.js +3 -2
- package/dist/modules/manager/maven-wrapper/artifacts.js.map +1 -1
- package/dist/modules/manager/mise/artifacts.js +2 -1
- package/dist/modules/manager/mise/artifacts.js.map +1 -1
- package/dist/modules/manager/mise/extract.js.map +1 -1
- package/dist/modules/manager/npm/artifacts.js +3 -1
- package/dist/modules/manager/npm/artifacts.js.map +1 -1
- package/dist/modules/manager/npm/extract/common/dependency.js +4 -1
- package/dist/modules/manager/npm/extract/common/dependency.js.map +1 -1
- package/dist/modules/manager/npm/extract/common/package-file.js +2 -1
- package/dist/modules/manager/npm/extract/common/package-file.js.map +1 -1
- package/dist/modules/manager/npm/extract/index.js.map +1 -1
- package/dist/modules/manager/npm/extract/post/locked-versions.js.map +1 -1
- package/dist/modules/manager/npm/npmrc.js +2 -1
- package/dist/modules/manager/npm/npmrc.js.map +1 -1
- package/dist/modules/manager/npm/post-update/index.js +2 -1
- package/dist/modules/manager/npm/post-update/index.js.map +1 -1
- package/dist/modules/manager/npm/post-update/npm.js +2 -3
- package/dist/modules/manager/npm/post-update/npm.js.map +1 -1
- package/dist/modules/manager/npm/post-update/yarn.js.map +1 -1
- package/dist/modules/manager/npm/schema.js +6 -2
- package/dist/modules/manager/npm/schema.js.map +1 -1
- package/dist/modules/manager/npm/update/dependency/index.js +3 -2
- package/dist/modules/manager/npm/update/dependency/index.js.map +1 -1
- package/dist/modules/manager/npm/update/locked-dependency/common/parent-version.js +6 -2
- package/dist/modules/manager/npm/update/locked-dependency/common/parent-version.js.map +1 -1
- package/dist/modules/manager/npm/update/locked-dependency/package-lock/get-locked.js +2 -1
- package/dist/modules/manager/npm/update/locked-dependency/package-lock/get-locked.js.map +1 -1
- package/dist/modules/manager/nuget/package-tree.js +2 -1
- package/dist/modules/manager/nuget/package-tree.js.map +1 -1
- package/dist/modules/manager/paket/update-locked.js +4 -1
- package/dist/modules/manager/paket/update-locked.js.map +1 -1
- package/dist/modules/manager/pipenv/extract.js +4 -1
- package/dist/modules/manager/pipenv/extract.js.map +1 -1
- package/dist/modules/platform/azure/azure-helper.js +2 -1
- package/dist/modules/platform/azure/azure-helper.js.map +1 -1
- package/dist/modules/platform/azure/index.js +7 -3
- package/dist/modules/platform/azure/index.js.map +1 -1
- package/dist/modules/platform/bitbucket/index.js +13 -6
- package/dist/modules/platform/bitbucket/index.js.map +1 -1
- package/dist/modules/platform/bitbucket-server/index.js +13 -9
- package/dist/modules/platform/bitbucket-server/index.js.map +1 -1
- package/dist/modules/platform/codecommit/index.js +2 -2
- package/dist/modules/platform/codecommit/index.js.map +1 -1
- package/dist/modules/platform/gerrit/client.js +4 -1
- package/dist/modules/platform/gerrit/client.js.map +1 -1
- package/dist/modules/platform/gerrit/index.js +3 -2
- package/dist/modules/platform/gerrit/index.js.map +1 -1
- package/dist/modules/platform/gitea/gitea-helper.js +5 -4
- package/dist/modules/platform/gitea/gitea-helper.js.map +1 -1
- package/dist/modules/platform/gitea/index.js +11 -4
- package/dist/modules/platform/gitea/index.js.map +1 -1
- package/dist/modules/platform/github/index.js +36 -23
- package/dist/modules/platform/github/index.js.map +1 -1
- package/dist/modules/platform/gitlab/index.js +16 -9
- package/dist/modules/platform/gitlab/index.js.map +1 -1
- package/dist/modules/platform/scm-manager/index.js +4 -1
- package/dist/modules/platform/scm-manager/index.js.map +1 -1
- package/dist/modules/platform/scm-manager/utils.js +2 -1
- package/dist/modules/platform/scm-manager/utils.js.map +1 -1
- package/dist/modules/versioning/cargo/index.js.map +1 -1
- package/dist/modules/versioning/composer/index.js +2 -1
- package/dist/modules/versioning/composer/index.js.map +1 -1
- package/dist/modules/versioning/conan/common.js +4 -1
- package/dist/modules/versioning/conan/common.js.map +1 -1
- package/dist/modules/versioning/debian/index.js +2 -1
- package/dist/modules/versioning/debian/index.js.map +1 -1
- package/dist/modules/versioning/gradle/compare.js +2 -1
- package/dist/modules/versioning/gradle/compare.js.map +1 -1
- package/dist/modules/versioning/hex/index.js +2 -1
- package/dist/modules/versioning/hex/index.js.map +1 -1
- package/dist/modules/versioning/julia/index.js.map +1 -1
- package/dist/modules/versioning/maven/compare.js +17 -7
- package/dist/modules/versioning/maven/compare.js.map +1 -1
- package/dist/modules/versioning/npm/index.js +2 -1
- package/dist/modules/versioning/npm/index.js.map +1 -1
- package/dist/modules/versioning/npm/range.js.map +1 -1
- package/dist/modules/versioning/paket/index.js +2 -1
- package/dist/modules/versioning/paket/index.js.map +1 -1
- package/dist/modules/versioning/paket/range.js +7 -3
- package/dist/modules/versioning/paket/range.js.map +1 -1
- package/dist/modules/versioning/pep440/index.js +2 -1
- package/dist/modules/versioning/pep440/index.js.map +1 -1
- package/dist/modules/versioning/poetry/index.js +2 -1
- package/dist/modules/versioning/poetry/index.js.map +1 -1
- package/dist/modules/versioning/regex/index.js +1 -1
- package/dist/modules/versioning/regex/index.js.map +1 -1
- package/dist/modules/versioning/rez/index.js +2 -1
- package/dist/modules/versioning/rez/index.js.map +1 -1
- package/dist/modules/versioning/vcpkg/index.js +2 -1
- package/dist/modules/versioning/vcpkg/index.js.map +1 -1
- package/dist/util/cache/package/impl/base.js +2 -1
- package/dist/util/cache/package/impl/base.js.map +1 -1
- package/dist/util/cache/package/with-cache.js +2 -1
- package/dist/util/cache/package/with-cache.js.map +1 -1
- package/dist/util/check-token.js +7 -4
- package/dist/util/check-token.js.map +1 -1
- package/dist/util/exec/utils.js +4 -1
- package/dist/util/exec/utils.js.map +1 -1
- package/dist/util/git/auth.js +5 -1
- package/dist/util/git/auth.js.map +1 -1
- package/dist/util/git/error.js.map +1 -1
- package/dist/util/host-rules.js +5 -3
- package/dist/util/host-rules.js.map +1 -1
- package/dist/util/http/cache/abstract-http-cache-provider.js +3 -2
- package/dist/util/http/cache/abstract-http-cache-provider.js.map +1 -1
- package/dist/util/http/cache/package-http-cache-provider.js +2 -1
- package/dist/util/http/cache/package-http-cache-provider.js.map +1 -1
- package/dist/util/http/github.js +15 -11
- package/dist/util/http/github.js.map +1 -1
- package/dist/util/http/gitlab.js +5 -4
- package/dist/util/http/gitlab.js.map +1 -1
- package/dist/util/http/http.js +2 -1
- package/dist/util/http/http.js.map +1 -1
- package/dist/util/http/jwt.js +2 -1
- package/dist/util/http/jwt.js.map +1 -1
- package/dist/util/http/retry-after.js +2 -1
- package/dist/util/http/retry-after.js.map +1 -1
- package/dist/util/http/status.js +95 -0
- package/dist/util/http/status.js.map +1 -0
- package/dist/util/merge-confidence/index.js +3 -2
- package/dist/util/merge-confidence/index.js.map +1 -1
- package/dist/util/package-rules/current-version.js +4 -1
- package/dist/util/package-rules/current-version.js.map +1 -1
- package/dist/util/package-rules/index.js +7 -3
- package/dist/util/package-rules/index.js.map +1 -1
- package/dist/util/schema-utils/index.js +5 -0
- package/dist/util/schema-utils/index.js.map +1 -1
- package/dist/workers/global/config/parse/host-rules-from-env.js +2 -1
- package/dist/workers/global/config/parse/host-rules-from-env.js.map +1 -1
- package/dist/workers/repository/common.js +4 -1
- package/dist/workers/repository/common.js.map +1 -1
- package/dist/workers/repository/config-migration/branch/index.js +2 -1
- package/dist/workers/repository/config-migration/branch/index.js.map +1 -1
- package/dist/workers/repository/dependency-dashboard.js +6 -2
- package/dist/workers/repository/dependency-dashboard.js.map +1 -1
- package/dist/workers/repository/finalize/repository-statistics.js +4 -1
- package/dist/workers/repository/finalize/repository-statistics.js.map +1 -1
- package/dist/workers/repository/init/merge.js +13 -3
- package/dist/workers/repository/init/merge.js.map +1 -1
- package/dist/workers/repository/onboarding/branch/check.js +2 -1
- package/dist/workers/repository/onboarding/branch/check.js.map +1 -1
- package/dist/workers/repository/onboarding/pr/pr-list.js +4 -2
- package/dist/workers/repository/onboarding/pr/pr-list.js.map +1 -1
- package/dist/workers/repository/process/extract-update.js +4 -1
- package/dist/workers/repository/process/extract-update.js.map +1 -1
- package/dist/workers/repository/process/lookup/digest.js +2 -1
- package/dist/workers/repository/process/lookup/digest.js.map +1 -1
- package/dist/workers/repository/process/lookup/generate.js +1 -1
- package/dist/workers/repository/process/lookup/generate.js.map +1 -1
- package/dist/workers/repository/process/lookup/index.js +4 -1
- package/dist/workers/repository/process/lookup/index.js.map +1 -1
- package/dist/workers/repository/process/lookup/utils.js +7 -1
- package/dist/workers/repository/process/lookup/utils.js.map +1 -1
- package/dist/workers/repository/process/vulnerabilities.js +10 -3
- package/dist/workers/repository/process/vulnerabilities.js.map +1 -1
- package/dist/workers/repository/reconfigure/index.js +2 -1
- package/dist/workers/repository/reconfigure/index.js.map +1 -1
- package/dist/workers/repository/update/branch/auto-replace.js +6 -2
- package/dist/workers/repository/update/branch/auto-replace.js.map +1 -1
- package/dist/workers/repository/update/branch/errors.js +2 -1
- package/dist/workers/repository/update/branch/errors.js.map +1 -1
- package/dist/workers/repository/update/branch/execute-post-upgrade-commands.js +2 -2
- package/dist/workers/repository/update/branch/execute-post-upgrade-commands.js.map +1 -1
- package/dist/workers/repository/update/branch/get-updated.js +1 -2
- package/dist/workers/repository/update/branch/get-updated.js.map +1 -1
- package/dist/workers/repository/update/branch/index.js +2 -1
- package/dist/workers/repository/update/branch/index.js.map +1 -1
- package/dist/workers/repository/update/branch/status-checks.js +2 -1
- package/dist/workers/repository/update/branch/status-checks.js.map +1 -1
- package/dist/workers/repository/update/pr/body/index.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/release-notes.js +3 -2
- package/dist/workers/repository/update/pr/changelog/release-notes.js.map +1 -1
- package/dist/workers/repository/update/pr/index.js +7 -3
- package/dist/workers/repository/update/pr/index.js.map +1 -1
- package/dist/workers/repository/updates/generate.js +6 -3
- package/dist/workers/repository/updates/generate.js.map +1 -1
- package/package.json +2 -2
- package/renovate-schema.json +2 -2
|
@@ -153,8 +153,9 @@ function getNewValue({ currentValue, rangeStrategy, currentVersion, newVersion }
|
|
|
153
153
|
} else if (regEx(/^[~^](?:[0-9]*)$/).test(currentValue)) newValue = `${currentValue.at(0)}${toMajor}`;
|
|
154
154
|
else if (toMajor && regEx(/^[~^](?:[0-9]*(?:\.[0-9]*)?)$/).test(currentValue)) {
|
|
155
155
|
const operator = currentValue.at(0);
|
|
156
|
+
const isMajorIncrease = isNumber(currentMajor) && toMajor > currentMajor;
|
|
156
157
|
if (rangeStrategy === "bump") newValue = `${operator}${newVersion}`;
|
|
157
|
-
else if (
|
|
158
|
+
else if (isMajorIncrease || !toMinor) newValue = `${operator}${toMajor}.0`;
|
|
158
159
|
else newValue = `${operator}${toMajor}.${toMinor}`;
|
|
159
160
|
} else if (currentVersion && api$1.isVersion(padZeroes(normalizeVersion(newVersion))) && api$1.isValid(normalizeVersion(currentValue)) && composer2npm(currentValue) === normalizeVersion(currentValue)) newValue = api$1.getNewValue({
|
|
160
161
|
currentValue: normalizeVersion(currentValue),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["npm"],"sources":["../../../../lib/modules/versioning/composer/index.ts"],"sourcesContent":["import { isNumber } from '@sindresorhus/is';\nimport semver from 'semver';\nimport { parseRange } from 'semver-utils';\nimport { logger } from '../../../logger/index.ts';\nimport type { RangeStrategy } from '../../../types/versioning.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { api as npm } from '../npm/index.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\n\nexport const id = 'composer';\nexport const displayName = 'Composer';\nexport const urls = [\n '[Composer versions](https://getcomposer.org/doc/articles/versions.md)',\n '[composer/semver package](https://packagist.org/packages/composer/semver)',\n '[Tilde and caret constraints](https://madewithlove.be/tilde-and-caret-constraints/)',\n '[Composer semver checker](https://semver.mwl.be)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = [\n 'bump',\n 'widen',\n 'replace',\n 'update-lockfile',\n];\n\nfunction getVersionParts(input: string): [string, string] {\n const versionParts = input.split('-');\n if (versionParts.length === 1) {\n return [input, ''];\n }\n\n return [versionParts[0], `-${versionParts[1]}`];\n}\n\nfunction padZeroes(input: string): string {\n const [output, stability] = getVersionParts(input);\n\n const sections = output.split('.');\n while (sections.length < 3) {\n sections.push('0');\n }\n return `${sections.join('.')}${stability}`;\n}\n\nfunction convertStabilityModifier(input: string): string {\n // Handle stability modifiers.\n const versionParts = input.split('@');\n if (versionParts.length === 1) {\n return input;\n }\n\n // 1.0@beta2 to 1.0-beta.2\n const stability = versionParts[1].replace(\n regEx(/(?:^|\\s)(?<label>beta|alpha|rc)(?<num>[1-9][0-9]*)(?: |$)/gi),\n '$<label>.$<num>',\n );\n\n // If there is a stability part, npm semver expects the version\n // to be full\n return `${padZeroes(versionParts[0])}-${stability}`;\n}\n\nfunction normalizeVersion(input: string): string {\n let output = input;\n // Strip leading + prefix (not a valid composer constraint operator)\n output = output.replace(regEx(/^\\+/), '');\n output = output.replace(regEx(/(?<prefix>^|>|>=|\\^|~)v/i), '$<prefix>');\n return convertStabilityModifier(output);\n}\n\n/**\n * @param versions Version list in any format, it recognizes the specific patch format x.x.x-pXX\n * @param range Range in composer format\n * @param minMode If true, it will calculate minSatisfyingVersion, if false, it calculates the maxSatisfyingVersion\n * @returns min or max satisfyingVersion from the input\n */\nfunction calculateSatisfyingVersionIntenal(\n versions: string[],\n range: string,\n minMode: boolean,\n): string | null {\n // Because composer -p versions are considered stable, we have to remove the suffix for the npm.XXX functions.\n const versionsMapped = versions.map((x) => {\n return {\n origianl: x,\n cleaned: removeComposerSpecificPatchPart(x),\n npmVariant: composer2npm(removeComposerSpecificPatchPart(x)[0]),\n };\n });\n\n const npmVersions = versionsMapped.map((x) => x.npmVariant);\n const npmVersion = minMode\n ? npm.minSatisfyingVersion(npmVersions, composer2npm(range))\n : npm.getSatisfyingVersion(npmVersions, composer2npm(range));\n\n if (!npmVersion) {\n return null;\n }\n\n // After we find the npm versions, we select from them back in the mapping the possible patches.\n const candidates = versionsMapped\n .filter((x) => x.npmVariant === npmVersion)\n .sort((a, b) => (minMode ? 1 : -1) * sortVersions(a.origianl, b.origianl));\n\n return candidates[0].origianl;\n}\n\n/**\n * @param intput Version in any format, it recognizes the specific patch format x.x.x-pXX\n * @returns If input contains the specific patch, it returns the input with removed the patch and true, otherwise it retunrs the same string and false.\n */\nfunction removeComposerSpecificPatchPart(input: string): [string, boolean] {\n // the regex is based on the original from composer implementation https://github.com/composer/semver/blob/fa1ec24f0ab1efe642671ec15c51a3ab879f59bf/src/VersionParser.php#L137\n const pattern = regEx(\n /^v?\\d+(?:\\.\\d+(?:\\.\\d+(?:\\.\\d+)?)?)?(?<suffix>-p[1-9]\\d*)$/gi,\n );\n const match = pattern.exec(input);\n\n return match\n ? [input.replace(match.groups!.suffix, ''), true]\n : [input, false];\n}\n\nfunction composer2npm(input: string): string {\n return input\n .split(regEx(/\\s*\\|\\|?\\s*/g))\n .map((part): string => {\n const cleanInput = normalizeVersion(part);\n if (npm.isVersion(cleanInput)) {\n return cleanInput;\n }\n if (npm.isVersion(padZeroes(cleanInput))) {\n return padZeroes(cleanInput);\n }\n const [versionId, stability] = getVersionParts(cleanInput);\n let output = versionId;\n\n // ~4 to ^4 and ~4.1 to ^4.1\n output = output.replace(\n regEx(/(?:^|\\s)~(?<minVersion>[1-9][0-9]*(?:\\.[0-9]*)?)(?: |$)/g),\n '^$<minVersion>',\n );\n // ~0.4 to >=0.4 <1\n output = output.replace(\n regEx(/(?:^|\\s)~(?<minVersion>0\\.[1-9][0-9]*)(?: |$)/g),\n '>=$<minVersion> <1',\n );\n\n // add extra digits to <8-DEV and <8.0-DEV\n output = output\n .replace(regEx(/^(?<version><\\d+(?:\\.\\d+)?)$/g), '$<version>.0')\n .replace(regEx(/^(?<version><\\d+(?:\\.\\d+)?)$/g), '$<version>.0');\n\n return output + stability;\n })\n .map((part) =>\n part.replace(\n regEx(/(?<letter>[a-z])(?<digit>[0-9])/gi),\n '$<letter>.$<digit>',\n ),\n )\n .join(' || ');\n}\n\nfunction equals(a: string, b: string): boolean {\n return npm.equals(composer2npm(a), composer2npm(b));\n}\n\nfunction getMajor(version: string): number | null {\n const semverVersion = semver.coerce(composer2npm(version));\n return semverVersion ? npm.getMajor(semverVersion) : null;\n}\n\nfunction getMinor(version: string): number | null {\n const semverVersion = semver.coerce(composer2npm(version));\n return semverVersion ? npm.getMinor(semverVersion) : null;\n}\n\nfunction getPatch(version: string): number | null {\n const semverVersion = semver.coerce(composer2npm(version));\n\n // This returns only the numbers without the optional `-pXX` patch version supported by composer. Fixing that would require a bigger\n // refactoring, because the API supports only numbers.\n return semverVersion ? npm.getPatch(semverVersion) : null;\n}\n\nfunction isGreaterThan(a: string, b: string): boolean {\n return sortVersions(a, b) === 1;\n}\n\nfunction isLessThanRange(version: string, range: string): boolean {\n return !!npm.isLessThanRange?.(composer2npm(version), composer2npm(range));\n}\n\nfunction isSingleVersion(input: string): boolean {\n return !!input && npm.isSingleVersion(composer2npm(input));\n}\n\nfunction isStable(version: string): boolean {\n if (version) {\n // Composer considers patches `-pXX` as stable: https://github.com/composer/semver/blob/fa1ec24f0ab1efe642671ec15c51a3ab879f59bf/src/VersionParser.php#L568 but npm not.\n // In order to be able to use the standard npm.isStable function, we remove the potential patch version for the check.\n const [withoutPatch] = removeComposerSpecificPatchPart(version);\n return npm.isStable(composer2npm(withoutPatch));\n }\n\n return false;\n}\n\nexport function isValid(input: string): boolean {\n return !!input && npm.isValid(composer2npm(input));\n}\n\nexport function isVersion(input: string): boolean {\n return !!input && npm.isVersion(composer2npm(input));\n}\n\nfunction matches(version: string, range: string): boolean {\n return npm.matches(composer2npm(version), composer2npm(range));\n}\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return calculateSatisfyingVersionIntenal(versions, range, false);\n}\n\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return calculateSatisfyingVersionIntenal(versions, range, true);\n}\n\nfunction subset(subRange: string, superRange: string): boolean | undefined {\n try {\n return npm.subset!(composer2npm(subRange), composer2npm(superRange));\n } catch (err) {\n logger.trace({ err }, 'composer.subset error');\n return false;\n }\n}\n\nfunction intersects(subRange: string, superRange: string): boolean {\n try {\n return npm.intersects!(composer2npm(subRange), composer2npm(superRange));\n } catch (err) {\n logger.trace({ err }, 'composer.intersects error');\n return false;\n }\n}\n\nfunction getNewValue({\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n}: NewValueConfig): string | null {\n if (rangeStrategy === 'update-lockfile') {\n if (matches(newVersion, currentValue)) {\n return currentValue;\n }\n return getNewValue({\n currentValue,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n }\n const currentMajor = currentVersion ? getMajor(currentVersion) : null;\n const toMajor = getMajor(newVersion);\n const toMinor = getMinor(newVersion);\n let newValue: string | null = null;\n if (isVersion(currentValue)) {\n newValue = newVersion;\n } else if (regEx(/^[~^](?:0\\.[1-9][0-9]*)$/).test(currentValue)) {\n const operator = currentValue.at(0)!;\n // handle ~0.4 case first\n if (toMajor === 0) {\n // TODO: types (#22198)\n newValue = `${operator}0.${toMinor!}`;\n } else {\n // TODO: types (#22198)\n newValue = `${operator}${toMajor!}.0`;\n }\n } else if (regEx(/^[~^](?:[0-9]*)$/).test(currentValue)) {\n // handle ~4 case\n const operator = currentValue.at(0)!;\n // TODO: types (#22198)\n newValue = `${operator}${toMajor!}`;\n } else if (\n toMajor &&\n regEx(/^[~^](?:[0-9]*(?:\\.[0-9]*)?)$/).test(currentValue)\n ) {\n const operator = currentValue.at(0)!;\n if (rangeStrategy === 'bump') {\n newValue = `${operator}${newVersion}`;\n } else if ((isNumber(currentMajor) && toMajor > currentMajor) || !toMinor) {\n // handle ~4.1 case\n newValue = `${operator}${toMajor}.0`;\n } else {\n newValue = `${operator}${toMajor}.${toMinor}`;\n }\n } else if (\n currentVersion &&\n npm.isVersion(padZeroes(normalizeVersion(newVersion))) &&\n npm.isValid(normalizeVersion(currentValue)) &&\n composer2npm(currentValue) === normalizeVersion(currentValue)\n ) {\n newValue = npm.getNewValue({\n currentValue: normalizeVersion(currentValue),\n rangeStrategy,\n currentVersion: padZeroes(normalizeVersion(currentVersion)),\n newVersion: padZeroes(normalizeVersion(newVersion)),\n });\n }\n\n if (rangeStrategy === 'widen' && matches(newVersion, currentValue)) {\n newValue = currentValue;\n } else {\n const hasOr = currentValue.includes(' || ');\n if (hasOr || rangeStrategy === 'widen') {\n const splitValues = currentValue.split('||');\n const lastValue = splitValues.at(-1)!;\n const replacementValue = getNewValue({\n currentValue: lastValue.trim(),\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n if (rangeStrategy === 'replace') {\n newValue = replacementValue;\n } else {\n // the recursive call above always produces a value: `getNewValue`\n // falls back to the new version when nothing else matched\n const parsedRange = parseRange(replacementValue!);\n const element = parsedRange.at(-1)!;\n if (element.operator?.startsWith('<')) {\n const splitCurrent = currentValue.split(element.operator);\n splitCurrent.pop();\n newValue = `${splitCurrent.join(element.operator)}${replacementValue}`;\n } else {\n newValue = `${currentValue} || ${replacementValue}`;\n }\n }\n }\n }\n\n if (!newValue) {\n logger.warn(\n { currentValue, rangeStrategy, currentVersion, newVersion },\n 'Unsupported composer value',\n );\n newValue = newVersion;\n }\n if (currentValue.split('.')[0].includes('v')) {\n newValue = newValue.replace(regEx(/(?<digit>[0-9])/), 'v$<digit>');\n }\n\n // Preserve original min-stability specifier\n if (currentValue.includes('@')) {\n newValue += `@${currentValue.split('@')[1]}`;\n }\n\n return newValue;\n}\n\nfunction sortVersions(a: string, b: string): number {\n const [aWithoutPatch, aContainsPatch] = removeComposerSpecificPatchPart(a);\n const [bWithoutPatch, bContainsPatch] = removeComposerSpecificPatchPart(b);\n\n if (aContainsPatch === bContainsPatch) {\n // If both [a and b] contain patch version or both [a and b] do not contain patch version, then npm comparison deliveres correct results\n return npm.sortVersions(composer2npm(a), composer2npm(b));\n }\n if (npm.equals(composer2npm(aWithoutPatch), composer2npm(bWithoutPatch))) {\n // If only one [a or b] contains patch version and the parts without patch versions are equal, then the version with patch is greater (this is the case where npm comparison fails)\n return aContainsPatch ? 1 : -1;\n }\n // All other cases can be compared correctly by npm\n return npm.sortVersions(composer2npm(a), composer2npm(b));\n}\n\nfunction isCompatible(version: string): boolean {\n return isVersion(version);\n}\n\nfunction isBreaking(current: string, version: string): boolean {\n return npm.isBreaking!(composer2npm(current), composer2npm(version));\n}\n\nexport const api: VersioningApi = {\n equals,\n getMajor,\n getMinor,\n getPatch,\n isBreaking,\n isCompatible,\n isGreaterThan,\n isLessThanRange,\n isSingleVersion,\n isStable,\n isValid,\n isVersion,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n getNewValue,\n sortVersions,\n subset,\n intersects,\n};\nexport default api;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["npm"],"sources":["../../../../lib/modules/versioning/composer/index.ts"],"sourcesContent":["import { isNumber } from '@sindresorhus/is';\nimport semver from 'semver';\nimport { parseRange } from 'semver-utils';\nimport { logger } from '../../../logger/index.ts';\nimport type { RangeStrategy } from '../../../types/versioning.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { api as npm } from '../npm/index.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\n\nexport const id = 'composer';\nexport const displayName = 'Composer';\nexport const urls = [\n '[Composer versions](https://getcomposer.org/doc/articles/versions.md)',\n '[composer/semver package](https://packagist.org/packages/composer/semver)',\n '[Tilde and caret constraints](https://madewithlove.be/tilde-and-caret-constraints/)',\n '[Composer semver checker](https://semver.mwl.be)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = [\n 'bump',\n 'widen',\n 'replace',\n 'update-lockfile',\n];\n\nfunction getVersionParts(input: string): [string, string] {\n const versionParts = input.split('-');\n if (versionParts.length === 1) {\n return [input, ''];\n }\n\n return [versionParts[0], `-${versionParts[1]}`];\n}\n\nfunction padZeroes(input: string): string {\n const [output, stability] = getVersionParts(input);\n\n const sections = output.split('.');\n while (sections.length < 3) {\n sections.push('0');\n }\n return `${sections.join('.')}${stability}`;\n}\n\nfunction convertStabilityModifier(input: string): string {\n // Handle stability modifiers.\n const versionParts = input.split('@');\n if (versionParts.length === 1) {\n return input;\n }\n\n // 1.0@beta2 to 1.0-beta.2\n const stability = versionParts[1].replace(\n regEx(/(?:^|\\s)(?<label>beta|alpha|rc)(?<num>[1-9][0-9]*)(?: |$)/gi),\n '$<label>.$<num>',\n );\n\n // If there is a stability part, npm semver expects the version\n // to be full\n return `${padZeroes(versionParts[0])}-${stability}`;\n}\n\nfunction normalizeVersion(input: string): string {\n let output = input;\n // Strip leading + prefix (not a valid composer constraint operator)\n output = output.replace(regEx(/^\\+/), '');\n output = output.replace(regEx(/(?<prefix>^|>|>=|\\^|~)v/i), '$<prefix>');\n return convertStabilityModifier(output);\n}\n\n/**\n * @param versions Version list in any format, it recognizes the specific patch format x.x.x-pXX\n * @param range Range in composer format\n * @param minMode If true, it will calculate minSatisfyingVersion, if false, it calculates the maxSatisfyingVersion\n * @returns min or max satisfyingVersion from the input\n */\nfunction calculateSatisfyingVersionIntenal(\n versions: string[],\n range: string,\n minMode: boolean,\n): string | null {\n // Because composer -p versions are considered stable, we have to remove the suffix for the npm.XXX functions.\n const versionsMapped = versions.map((x) => {\n return {\n origianl: x,\n cleaned: removeComposerSpecificPatchPart(x),\n npmVariant: composer2npm(removeComposerSpecificPatchPart(x)[0]),\n };\n });\n\n const npmVersions = versionsMapped.map((x) => x.npmVariant);\n const npmVersion = minMode\n ? npm.minSatisfyingVersion(npmVersions, composer2npm(range))\n : npm.getSatisfyingVersion(npmVersions, composer2npm(range));\n\n if (!npmVersion) {\n return null;\n }\n\n // After we find the npm versions, we select from them back in the mapping the possible patches.\n const candidates = versionsMapped\n .filter((x) => x.npmVariant === npmVersion)\n .sort((a, b) => (minMode ? 1 : -1) * sortVersions(a.origianl, b.origianl));\n\n return candidates[0].origianl;\n}\n\n/**\n * @param intput Version in any format, it recognizes the specific patch format x.x.x-pXX\n * @returns If input contains the specific patch, it returns the input with removed the patch and true, otherwise it retunrs the same string and false.\n */\nfunction removeComposerSpecificPatchPart(input: string): [string, boolean] {\n // the regex is based on the original from composer implementation https://github.com/composer/semver/blob/fa1ec24f0ab1efe642671ec15c51a3ab879f59bf/src/VersionParser.php#L137\n const pattern = regEx(\n /^v?\\d+(?:\\.\\d+(?:\\.\\d+(?:\\.\\d+)?)?)?(?<suffix>-p[1-9]\\d*)$/gi,\n );\n const match = pattern.exec(input);\n\n return match\n ? [input.replace(match.groups!.suffix, ''), true]\n : [input, false];\n}\n\nfunction composer2npm(input: string): string {\n return input\n .split(regEx(/\\s*\\|\\|?\\s*/g))\n .map((part): string => {\n const cleanInput = normalizeVersion(part);\n if (npm.isVersion(cleanInput)) {\n return cleanInput;\n }\n if (npm.isVersion(padZeroes(cleanInput))) {\n return padZeroes(cleanInput);\n }\n const [versionId, stability] = getVersionParts(cleanInput);\n let output = versionId;\n\n // ~4 to ^4 and ~4.1 to ^4.1\n output = output.replace(\n regEx(/(?:^|\\s)~(?<minVersion>[1-9][0-9]*(?:\\.[0-9]*)?)(?: |$)/g),\n '^$<minVersion>',\n );\n // ~0.4 to >=0.4 <1\n output = output.replace(\n regEx(/(?:^|\\s)~(?<minVersion>0\\.[1-9][0-9]*)(?: |$)/g),\n '>=$<minVersion> <1',\n );\n\n // add extra digits to <8-DEV and <8.0-DEV\n output = output\n .replace(regEx(/^(?<version><\\d+(?:\\.\\d+)?)$/g), '$<version>.0')\n .replace(regEx(/^(?<version><\\d+(?:\\.\\d+)?)$/g), '$<version>.0');\n\n return output + stability;\n })\n .map((part) =>\n part.replace(\n regEx(/(?<letter>[a-z])(?<digit>[0-9])/gi),\n '$<letter>.$<digit>',\n ),\n )\n .join(' || ');\n}\n\nfunction equals(a: string, b: string): boolean {\n return npm.equals(composer2npm(a), composer2npm(b));\n}\n\nfunction getMajor(version: string): number | null {\n const semverVersion = semver.coerce(composer2npm(version));\n return semverVersion ? npm.getMajor(semverVersion) : null;\n}\n\nfunction getMinor(version: string): number | null {\n const semverVersion = semver.coerce(composer2npm(version));\n return semverVersion ? npm.getMinor(semverVersion) : null;\n}\n\nfunction getPatch(version: string): number | null {\n const semverVersion = semver.coerce(composer2npm(version));\n\n // This returns only the numbers without the optional `-pXX` patch version supported by composer. Fixing that would require a bigger\n // refactoring, because the API supports only numbers.\n return semverVersion ? npm.getPatch(semverVersion) : null;\n}\n\nfunction isGreaterThan(a: string, b: string): boolean {\n return sortVersions(a, b) === 1;\n}\n\nfunction isLessThanRange(version: string, range: string): boolean {\n return !!npm.isLessThanRange?.(composer2npm(version), composer2npm(range));\n}\n\nfunction isSingleVersion(input: string): boolean {\n return !!input && npm.isSingleVersion(composer2npm(input));\n}\n\nfunction isStable(version: string): boolean {\n if (version) {\n // Composer considers patches `-pXX` as stable: https://github.com/composer/semver/blob/fa1ec24f0ab1efe642671ec15c51a3ab879f59bf/src/VersionParser.php#L568 but npm not.\n // In order to be able to use the standard npm.isStable function, we remove the potential patch version for the check.\n const [withoutPatch] = removeComposerSpecificPatchPart(version);\n return npm.isStable(composer2npm(withoutPatch));\n }\n\n return false;\n}\n\nexport function isValid(input: string): boolean {\n return !!input && npm.isValid(composer2npm(input));\n}\n\nexport function isVersion(input: string): boolean {\n return !!input && npm.isVersion(composer2npm(input));\n}\n\nfunction matches(version: string, range: string): boolean {\n return npm.matches(composer2npm(version), composer2npm(range));\n}\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return calculateSatisfyingVersionIntenal(versions, range, false);\n}\n\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return calculateSatisfyingVersionIntenal(versions, range, true);\n}\n\nfunction subset(subRange: string, superRange: string): boolean | undefined {\n try {\n return npm.subset!(composer2npm(subRange), composer2npm(superRange));\n } catch (err) {\n logger.trace({ err }, 'composer.subset error');\n return false;\n }\n}\n\nfunction intersects(subRange: string, superRange: string): boolean {\n try {\n return npm.intersects!(composer2npm(subRange), composer2npm(superRange));\n } catch (err) {\n logger.trace({ err }, 'composer.intersects error');\n return false;\n }\n}\n\nfunction getNewValue({\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n}: NewValueConfig): string | null {\n if (rangeStrategy === 'update-lockfile') {\n if (matches(newVersion, currentValue)) {\n return currentValue;\n }\n return getNewValue({\n currentValue,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n }\n const currentMajor = currentVersion ? getMajor(currentVersion) : null;\n const toMajor = getMajor(newVersion);\n const toMinor = getMinor(newVersion);\n let newValue: string | null = null;\n if (isVersion(currentValue)) {\n newValue = newVersion;\n } else if (regEx(/^[~^](?:0\\.[1-9][0-9]*)$/).test(currentValue)) {\n const operator = currentValue.at(0)!;\n // handle ~0.4 case first\n if (toMajor === 0) {\n // TODO: types (#22198)\n newValue = `${operator}0.${toMinor!}`;\n } else {\n // TODO: types (#22198)\n newValue = `${operator}${toMajor!}.0`;\n }\n } else if (regEx(/^[~^](?:[0-9]*)$/).test(currentValue)) {\n // handle ~4 case\n const operator = currentValue.at(0)!;\n // TODO: types (#22198)\n newValue = `${operator}${toMajor!}`;\n } else if (\n toMajor &&\n regEx(/^[~^](?:[0-9]*(?:\\.[0-9]*)?)$/).test(currentValue)\n ) {\n const operator = currentValue.at(0)!;\n const isMajorIncrease = isNumber(currentMajor) && toMajor > currentMajor;\n if (rangeStrategy === 'bump') {\n newValue = `${operator}${newVersion}`;\n } else if (isMajorIncrease || !toMinor) {\n // handle ~4.1 case\n newValue = `${operator}${toMajor}.0`;\n } else {\n newValue = `${operator}${toMajor}.${toMinor}`;\n }\n } else if (\n currentVersion &&\n npm.isVersion(padZeroes(normalizeVersion(newVersion))) &&\n npm.isValid(normalizeVersion(currentValue)) &&\n composer2npm(currentValue) === normalizeVersion(currentValue)\n ) {\n newValue = npm.getNewValue({\n currentValue: normalizeVersion(currentValue),\n rangeStrategy,\n currentVersion: padZeroes(normalizeVersion(currentVersion)),\n newVersion: padZeroes(normalizeVersion(newVersion)),\n });\n }\n\n if (rangeStrategy === 'widen' && matches(newVersion, currentValue)) {\n newValue = currentValue;\n } else {\n const hasOr = currentValue.includes(' || ');\n if (hasOr || rangeStrategy === 'widen') {\n const splitValues = currentValue.split('||');\n const lastValue = splitValues.at(-1)!;\n const replacementValue = getNewValue({\n currentValue: lastValue.trim(),\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n if (rangeStrategy === 'replace') {\n newValue = replacementValue;\n } else {\n // the recursive call above always produces a value: `getNewValue`\n // falls back to the new version when nothing else matched\n const parsedRange = parseRange(replacementValue!);\n const element = parsedRange.at(-1)!;\n if (element.operator?.startsWith('<')) {\n const splitCurrent = currentValue.split(element.operator);\n splitCurrent.pop();\n newValue = `${splitCurrent.join(element.operator)}${replacementValue}`;\n } else {\n newValue = `${currentValue} || ${replacementValue}`;\n }\n }\n }\n }\n\n if (!newValue) {\n logger.warn(\n { currentValue, rangeStrategy, currentVersion, newVersion },\n 'Unsupported composer value',\n );\n newValue = newVersion;\n }\n if (currentValue.split('.')[0].includes('v')) {\n newValue = newValue.replace(regEx(/(?<digit>[0-9])/), 'v$<digit>');\n }\n\n // Preserve original min-stability specifier\n if (currentValue.includes('@')) {\n newValue += `@${currentValue.split('@')[1]}`;\n }\n\n return newValue;\n}\n\nfunction sortVersions(a: string, b: string): number {\n const [aWithoutPatch, aContainsPatch] = removeComposerSpecificPatchPart(a);\n const [bWithoutPatch, bContainsPatch] = removeComposerSpecificPatchPart(b);\n\n if (aContainsPatch === bContainsPatch) {\n // If both [a and b] contain patch version or both [a and b] do not contain patch version, then npm comparison deliveres correct results\n return npm.sortVersions(composer2npm(a), composer2npm(b));\n }\n if (npm.equals(composer2npm(aWithoutPatch), composer2npm(bWithoutPatch))) {\n // If only one [a or b] contains patch version and the parts without patch versions are equal, then the version with patch is greater (this is the case where npm comparison fails)\n return aContainsPatch ? 1 : -1;\n }\n // All other cases can be compared correctly by npm\n return npm.sortVersions(composer2npm(a), composer2npm(b));\n}\n\nfunction isCompatible(version: string): boolean {\n return isVersion(version);\n}\n\nfunction isBreaking(current: string, version: string): boolean {\n return npm.isBreaking!(composer2npm(current), composer2npm(version));\n}\n\nexport const api: VersioningApi = {\n equals,\n getMajor,\n getMinor,\n getPatch,\n isBreaking,\n isCompatible,\n isGreaterThan,\n isLessThanRange,\n isSingleVersion,\n isStable,\n isValid,\n isVersion,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n getNewValue,\n sortVersions,\n subset,\n intersects,\n};\nexport default api;\n"],"mappings":"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"}
|
|
@@ -43,6 +43,9 @@ function matchesWithOptions(version, cleanRange, options) {
|
|
|
43
43
|
}
|
|
44
44
|
return semver$1.satisfies(cleanedVersion, cleanRange, options);
|
|
45
45
|
}
|
|
46
|
+
function isBetterCandidate(cur, curSV, candidate, options, compareRt) {
|
|
47
|
+
return !cur || semver$1.compare(curSV, candidate, options) === compareRt;
|
|
48
|
+
}
|
|
46
49
|
function findSatisfyingVersion(versions, range, compareRt) {
|
|
47
50
|
const options = getOptions(range);
|
|
48
51
|
let cur = null;
|
|
@@ -54,7 +57,7 @@ function findSatisfyingVersion(versions, range, compareRt) {
|
|
|
54
57
|
if (isString(versionFromList)) {
|
|
55
58
|
const cleanedVersion = cleanVersion(versionFromList);
|
|
56
59
|
const options = getOptions(range);
|
|
57
|
-
if (matchesWithOptions(cleanedVersion, cleanVersion(range), options) && (
|
|
60
|
+
if (matchesWithOptions(cleanedVersion, cleanVersion(range), options) && isBetterCandidate(cur, curSV, versionFromList, options, compareRt)) {
|
|
58
61
|
cur = versionFromList;
|
|
59
62
|
curIndex = index;
|
|
60
63
|
curSV = new semver$1.SemVer(cur, options);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","names":["semver"],"sources":["../../../../lib/modules/versioning/conan/common.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport * as semver from 'semver';\nimport { regEx } from '../../../util/regex.ts';\nimport { coerceString } from '../../../util/string.ts';\n\nexport function makeVersion(\n version: string,\n options: semver.RangeOptions,\n): string | boolean | null {\n const splitVersion = version.split('.');\n const prerelease = semver.prerelease(version, options);\n\n if (prerelease && !options.includePrerelease) {\n if (!Number.isNaN(parseInt(prerelease.toString()[0], 10))) {\n const stringVersion = `${splitVersion[0]}.${splitVersion[1]}.${splitVersion[2]}`;\n return semver.valid(stringVersion, options);\n }\n return false;\n }\n\n if (\n options.loose &&\n !semver.valid(version, options) &&\n splitVersion.length !== 3\n ) {\n return semver.valid(semver.coerce(version, options), options);\n }\n return semver.valid(version, options);\n}\n\nexport function cleanVersion(version: string): string {\n if (version) {\n return version\n .replace(\n regEx(\n /,|\\[|\\]|\"|include_prerelease=|include_prerelease|loose=|True|False/g,\n ),\n '',\n )\n .trim();\n }\n return version;\n}\n\nexport function getOptions(input: string): {\n loose: boolean;\n includePrerelease: boolean;\n} {\n let includePrerelease = false;\n let loose = true;\n if (input) {\n includePrerelease =\n input.includes('include_prerelease') &&\n !input.includes('include_prerelease=False');\n loose = input.includes('loose=True') || !input.includes('loose=False');\n }\n return { loose, includePrerelease };\n}\n\nexport function containsOperators(input: string): boolean {\n return regEx('[<=>^~]').test(input);\n}\n\nexport function matchesWithOptions(\n version: string,\n cleanRange: string,\n options: semver.RangeOptions,\n): boolean {\n let cleanedVersion = version;\n if (\n cleanedVersion &&\n semver.prerelease(cleanedVersion) &&\n options.includePrerelease\n ) {\n const coercedVersion = semver.coerce(cleanedVersion)?.raw;\n cleanedVersion = coerceString(coercedVersion);\n }\n return semver.satisfies(cleanedVersion, cleanRange, options);\n}\n\nexport function findSatisfyingVersion(\n versions: string[],\n range: string,\n compareRt: number,\n): string | null {\n const options = getOptions(range);\n let cur: any = null;\n let curSV: any = null;\n let index = 0;\n let curIndex = -1;\n\n for (const v of versions) {\n const versionFromList = makeVersion(v, options);\n if (isString(versionFromList)) {\n const cleanedVersion = cleanVersion(versionFromList);\n const options = getOptions(range);\n const cleanRange = cleanVersion(range);\n if (\n matchesWithOptions(cleanedVersion, cleanRange, options) &&\n (
|
|
1
|
+
{"version":3,"file":"common.js","names":["semver"],"sources":["../../../../lib/modules/versioning/conan/common.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport * as semver from 'semver';\nimport { regEx } from '../../../util/regex.ts';\nimport { coerceString } from '../../../util/string.ts';\n\nexport function makeVersion(\n version: string,\n options: semver.RangeOptions,\n): string | boolean | null {\n const splitVersion = version.split('.');\n const prerelease = semver.prerelease(version, options);\n\n if (prerelease && !options.includePrerelease) {\n if (!Number.isNaN(parseInt(prerelease.toString()[0], 10))) {\n const stringVersion = `${splitVersion[0]}.${splitVersion[1]}.${splitVersion[2]}`;\n return semver.valid(stringVersion, options);\n }\n return false;\n }\n\n if (\n options.loose &&\n !semver.valid(version, options) &&\n splitVersion.length !== 3\n ) {\n return semver.valid(semver.coerce(version, options), options);\n }\n return semver.valid(version, options);\n}\n\nexport function cleanVersion(version: string): string {\n if (version) {\n return version\n .replace(\n regEx(\n /,|\\[|\\]|\"|include_prerelease=|include_prerelease|loose=|True|False/g,\n ),\n '',\n )\n .trim();\n }\n return version;\n}\n\nexport function getOptions(input: string): {\n loose: boolean;\n includePrerelease: boolean;\n} {\n let includePrerelease = false;\n let loose = true;\n if (input) {\n includePrerelease =\n input.includes('include_prerelease') &&\n !input.includes('include_prerelease=False');\n loose = input.includes('loose=True') || !input.includes('loose=False');\n }\n return { loose, includePrerelease };\n}\n\nexport function containsOperators(input: string): boolean {\n return regEx('[<=>^~]').test(input);\n}\n\nexport function matchesWithOptions(\n version: string,\n cleanRange: string,\n options: semver.RangeOptions,\n): boolean {\n let cleanedVersion = version;\n if (\n cleanedVersion &&\n semver.prerelease(cleanedVersion) &&\n options.includePrerelease\n ) {\n const coercedVersion = semver.coerce(cleanedVersion)?.raw;\n cleanedVersion = coerceString(coercedVersion);\n }\n return semver.satisfies(cleanedVersion, cleanRange, options);\n}\n\nfunction isBetterCandidate(\n cur: any,\n curSV: any,\n candidate: string,\n options: semver.Options,\n compareRt: number,\n): boolean {\n return !cur || semver.compare(curSV, candidate, options) === compareRt;\n}\n\nexport function findSatisfyingVersion(\n versions: string[],\n range: string,\n compareRt: number,\n): string | null {\n const options = getOptions(range);\n let cur: any = null;\n let curSV: any = null;\n let index = 0;\n let curIndex = -1;\n\n for (const v of versions) {\n const versionFromList = makeVersion(v, options);\n if (isString(versionFromList)) {\n const cleanedVersion = cleanVersion(versionFromList);\n const options = getOptions(range);\n const cleanRange = cleanVersion(range);\n if (\n matchesWithOptions(cleanedVersion, cleanRange, options) &&\n isBetterCandidate(cur, curSV, versionFromList, options, compareRt)\n ) {\n cur = versionFromList;\n curIndex = index;\n curSV = new semver.SemVer(cur, options);\n }\n }\n index += 1;\n }\n if (curIndex >= 0) {\n return versions[curIndex];\n }\n return null;\n}\n"],"mappings":";;;;;AAKA,SAAgB,YACd,SACA,SACyB;CACzB,MAAM,eAAe,QAAQ,MAAM,GAAG;CACtC,MAAM,aAAaA,SAAO,WAAW,SAAS,OAAO;CAErD,IAAI,cAAc,CAAC,QAAQ,mBAAmB;EAC5C,IAAI,CAAC,OAAO,MAAM,SAAS,WAAW,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG;GACzD,MAAM,gBAAgB,GAAG,aAAa,GAAG,GAAG,aAAa,GAAG,GAAG,aAAa;GAC5E,OAAOA,SAAO,MAAM,eAAe,OAAO;EAC5C;EACA,OAAO;CACT;CAEA,IACE,QAAQ,SACR,CAACA,SAAO,MAAM,SAAS,OAAO,KAC9B,aAAa,WAAW,GAExB,OAAOA,SAAO,MAAMA,SAAO,OAAO,SAAS,OAAO,GAAG,OAAO;CAE9D,OAAOA,SAAO,MAAM,SAAS,OAAO;AACtC;AAEA,SAAgB,aAAa,SAAyB;CACpD,IAAI,SACF,OAAO,QACJ,QACC,MACE,qEACF,GACA,EACF,CAAC,CACA,KAAK;CAEV,OAAO;AACT;AAEA,SAAgB,WAAW,OAGzB;CACA,IAAI,oBAAoB;CACxB,IAAI,QAAQ;CACZ,IAAI,OAAO;EACT,oBACE,MAAM,SAAS,oBAAoB,KACnC,CAAC,MAAM,SAAS,0BAA0B;EAC5C,QAAQ,MAAM,SAAS,YAAY,KAAK,CAAC,MAAM,SAAS,aAAa;CACvE;CACA,OAAO;EAAE;EAAO;CAAkB;AACpC;AAEA,SAAgB,kBAAkB,OAAwB;CACxD,OAAO,MAAM,SAAS,CAAC,CAAC,KAAK,KAAK;AACpC;AAEA,SAAgB,mBACd,SACA,YACA,SACS;CACT,IAAI,iBAAiB;CACrB,IACE,kBACAA,SAAO,WAAW,cAAc,KAChC,QAAQ,mBACR;EACA,MAAM,iBAAiBA,SAAO,OAAO,cAAc,CAAC,EAAE;EACtD,iBAAiB,aAAa,cAAc;CAC9C;CACA,OAAOA,SAAO,UAAU,gBAAgB,YAAY,OAAO;AAC7D;AAEA,SAAS,kBACP,KACA,OACA,WACA,SACA,WACS;CACT,OAAO,CAAC,OAAOA,SAAO,QAAQ,OAAO,WAAW,OAAO,MAAM;AAC/D;AAEA,SAAgB,sBACd,UACA,OACA,WACe;CACf,MAAM,UAAU,WAAW,KAAK;CAChC,IAAI,MAAW;CACf,IAAI,QAAa;CACjB,IAAI,QAAQ;CACZ,IAAI,WAAW;CAEf,KAAK,MAAM,KAAK,UAAU;EACxB,MAAM,kBAAkB,YAAY,GAAG,OAAO;EAC9C,IAAI,SAAS,eAAe,GAAG;GAC7B,MAAM,iBAAiB,aAAa,eAAe;GACnD,MAAM,UAAU,WAAW,KAAK;GAEhC,IACE,mBAAmB,gBAFF,aAAa,KAEc,GAAG,OAAO,KACtD,kBAAkB,KAAK,OAAO,iBAAiB,SAAS,SAAS,GACjE;IACA,MAAM;IACN,WAAW;IACX,QAAQ,IAAIA,SAAO,OAAO,KAAK,OAAO;GACxC;EACF;EACA,SAAS;CACX;CACA,IAAI,YAAY,GACd,OAAO,SAAS;CAElB,OAAO;AACT"}
|
|
@@ -16,7 +16,8 @@ var DebianVersioningApi = class extends GenericVersioningApi {
|
|
|
16
16
|
let ver;
|
|
17
17
|
ver = this._rollingReleases.getVersionByLts(version);
|
|
18
18
|
ver = this._distroInfo.getVersionByCodename(ver);
|
|
19
|
-
|
|
19
|
+
if (isValid && this._distroInfo.isCreated(ver)) return true;
|
|
20
|
+
return isDatedCodeName(version, this._distroInfo);
|
|
20
21
|
}
|
|
21
22
|
isStable(version) {
|
|
22
23
|
if (isDatedCodeName(version, this._distroInfo)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/debian/index.ts"],"sourcesContent":["import type { RangeStrategy } from '../../../types/index.ts';\nimport { DistroInfo } from '../distro.ts';\nimport { GenericVersioningApi } from '../generic.ts';\nimport type {\n GenericVersion,\n NewValueConfig,\n VersioningApi,\n} from '../types.ts';\nimport {\n RollingReleasesData,\n getDatedContainerImageCodename,\n getDatedContainerImageSuffix,\n getDatedContainerImageVersion,\n isDatedCodeName,\n} from './common.ts';\n\nexport const id = 'debian';\nexport const displayName = 'Debian';\nexport const urls = [\n '[Debian distro info data](https://debian.pages.debian.net/distro-info-data/debian.csv)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = ['replace'];\n\nexport class DebianVersioningApi extends GenericVersioningApi {\n private readonly _distroInfo: DistroInfo;\n private readonly _rollingReleases: RollingReleasesData;\n\n constructor() {\n super();\n this._distroInfo = new DistroInfo('data/debian-distro-info.json');\n this._rollingReleases = new RollingReleasesData(this._distroInfo);\n }\n\n override isValid(version: string): boolean {\n const isValid = super.isValid(version);\n let ver: string;\n ver = this._rollingReleases.getVersionByLts(version);\n ver = this._distroInfo.getVersionByCodename(ver);\n
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/debian/index.ts"],"sourcesContent":["import type { RangeStrategy } from '../../../types/index.ts';\nimport { DistroInfo } from '../distro.ts';\nimport { GenericVersioningApi } from '../generic.ts';\nimport type {\n GenericVersion,\n NewValueConfig,\n VersioningApi,\n} from '../types.ts';\nimport {\n RollingReleasesData,\n getDatedContainerImageCodename,\n getDatedContainerImageSuffix,\n getDatedContainerImageVersion,\n isDatedCodeName,\n} from './common.ts';\n\nexport const id = 'debian';\nexport const displayName = 'Debian';\nexport const urls = [\n '[Debian distro info data](https://debian.pages.debian.net/distro-info-data/debian.csv)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = ['replace'];\n\nexport class DebianVersioningApi extends GenericVersioningApi {\n private readonly _distroInfo: DistroInfo;\n private readonly _rollingReleases: RollingReleasesData;\n\n constructor() {\n super();\n this._distroInfo = new DistroInfo('data/debian-distro-info.json');\n this._rollingReleases = new RollingReleasesData(this._distroInfo);\n }\n\n override isValid(version: string): boolean {\n const isValid = super.isValid(version);\n let ver: string;\n ver = this._rollingReleases.getVersionByLts(version);\n ver = this._distroInfo.getVersionByCodename(ver);\n if (isValid && this._distroInfo.isCreated(ver)) {\n return true;\n }\n return isDatedCodeName(version, this._distroInfo);\n }\n\n override isStable(version: string): boolean {\n if (isDatedCodeName(version, this._distroInfo)) {\n const codename = getDatedContainerImageCodename(version)!;\n const versionByCodename = this._distroInfo.getVersionByCodename(codename);\n return (\n this._distroInfo.isReleased(versionByCodename) &&\n !this._distroInfo.isEolLts(versionByCodename)\n );\n }\n let ver: string;\n ver = this._rollingReleases.getVersionByLts(version);\n ver = this._distroInfo.getVersionByCodename(ver);\n return this._distroInfo.isReleased(ver) && !this._distroInfo.isEolLts(ver);\n }\n\n override getNewValue({ currentValue, newVersion }: NewValueConfig): string {\n // current value is [oldold|old|]stable\n if (this._rollingReleases.has(currentValue)) {\n return this._rollingReleases.getLtsByVersion(newVersion);\n }\n\n if (this._distroInfo.isCodename(currentValue)) {\n const di = this._rollingReleases.schedule(newVersion);\n let ver = this._getBaseVersion(newVersion);\n if (di) {\n ver = di.version;\n }\n return this._distroInfo.getCodenameByVersion(ver);\n }\n\n // newVersion is [oldold|old|]stable\n // current value is numeric\n if (this._rollingReleases.has(newVersion)) {\n // should never `undefined` if it exists\n return this._rollingReleases.schedule(newVersion)!.version;\n }\n\n // current value is numeric, so keep a dated codename (e.g. trixie-20260406)\n // as its numeric version rather than switching format\n if (isDatedCodeName(newVersion, this._distroInfo)) {\n return this._getBaseVersion(newVersion);\n }\n\n return this._distroInfo.getVersionByCodename(newVersion);\n }\n\n private _getBaseVersion(version: string): string {\n if (isDatedCodeName(version, this._distroInfo)) {\n const codename = getDatedContainerImageCodename(version)!;\n return this._distroInfo.getVersionByCodename(codename);\n }\n return version;\n }\n\n override equals(version: string, other: string): boolean {\n const verImage = getDatedContainerImageVersion(version);\n const otherImageVer = getDatedContainerImageVersion(other);\n if (verImage !== otherImageVer) {\n return false;\n }\n\n const verSuffix = getDatedContainerImageSuffix(version);\n const otherSuffix = getDatedContainerImageSuffix(other);\n if (verSuffix !== otherSuffix) {\n return false;\n }\n\n const ver = this._getBaseVersion(version);\n const otherVer = this._getBaseVersion(other);\n return super.equals(ver, otherVer);\n }\n\n override isGreaterThan(version: string, other: string): boolean {\n if (\n !isDatedCodeName(version, this._distroInfo) &&\n !isDatedCodeName(other, this._distroInfo)\n ) {\n return super.isGreaterThan(version, other);\n }\n const xMajor = this.getMajor(version) ?? 0;\n const yMajor = this.getMajor(other) ?? 0;\n if (xMajor > yMajor) {\n return true;\n }\n if (xMajor < yMajor) {\n return false;\n }\n\n const xMinor = this.getMinor(version) ?? 0;\n const yMinor = this.getMinor(other) ?? 0;\n if (xMinor > yMinor) {\n return true;\n }\n if (xMinor < yMinor) {\n return false;\n }\n\n const xImageVersion = getDatedContainerImageVersion(version) ?? 0;\n const yImageVersion = getDatedContainerImageVersion(other) ?? 0;\n if (xImageVersion > yImageVersion) {\n return true;\n }\n if (xImageVersion < yImageVersion) {\n return false;\n }\n\n const xSuffixVersion = getDatedContainerImageSuffix(version) ?? 0;\n const ySuffixVersion = getDatedContainerImageSuffix(other) ?? 0;\n if (xSuffixVersion > ySuffixVersion) {\n return true;\n }\n if (xSuffixVersion < ySuffixVersion) {\n return false;\n }\n\n const xPatch = this.getPatch(version) ?? 0;\n const yPatch = this.getPatch(other) ?? 0;\n return xPatch > yPatch;\n }\n\n override getMajor(version: string): number | null {\n const ver = this._getBaseVersion(version);\n if (this.isValid(ver)) {\n const parsed = this._parse(ver);\n return parsed!.release[0];\n }\n return null;\n }\n\n override getMinor(version: string): number | null {\n const ver = this._getBaseVersion(version);\n if (this.isValid(ver)) {\n const parsed = this._parse(ver);\n return parsed?.release[1] ?? null;\n }\n return null;\n }\n\n override getPatch(version: string): number | null {\n const ver = this._getBaseVersion(version);\n if (this.isValid(ver)) {\n const parsed = this._parse(ver);\n return parsed?.release[2] ?? null;\n }\n return null;\n }\n\n protected override _parse(version: string): GenericVersion | null {\n let ver: string;\n if (isDatedCodeName(version, this._distroInfo)) {\n const codename = getDatedContainerImageCodename(version)!;\n ver = this._distroInfo.getVersionByCodename(codename);\n } else {\n ver = this._rollingReleases.getVersionByLts(version);\n ver = this._distroInfo.getVersionByCodename(ver);\n }\n if (!this._distroInfo.exists(ver)) {\n return null;\n }\n return { release: ver.split('.').map(Number) };\n }\n}\n\nexport const api: VersioningApi = new DebianVersioningApi();\n\nexport default api;\n"],"mappings":"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"}
|
|
@@ -26,7 +26,8 @@ function isLetter(char) {
|
|
|
26
26
|
return !isSeparator(char) && !isDigit(char);
|
|
27
27
|
}
|
|
28
28
|
function isTransition(prevChar, nextChar) {
|
|
29
|
-
|
|
29
|
+
if (isDigit(prevChar) && isLetter(nextChar)) return true;
|
|
30
|
+
return isLetter(prevChar) && isDigit(nextChar);
|
|
30
31
|
}
|
|
31
32
|
function tokenize(versionStr) {
|
|
32
33
|
let result = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare.js","names":[],"sources":["../../../../lib/modules/versioning/gradle/compare.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport { coerceArray } from '../../../util/array.ts';\nimport { regEx } from '../../../util/regex.ts';\n\nexport const TokenType = {\n Number: 1,\n String: 2,\n};\n\ninterface Token {\n type: number;\n val: string | bigint;\n}\n\nfunction iterateChars(\n str: string,\n cb: (p: string | null, n: string | null) => void,\n): void {\n let prev = null;\n let next = null;\n for (let i = 0; i < str.length; i += 1) {\n next = str.charAt(i);\n cb(prev, next);\n prev = next;\n }\n cb(prev, null);\n}\n\nfunction isSeparator(char: string): boolean {\n return regEx(/^[-._+]$/i).test(char);\n}\n\nfunction isDigit(char: string): boolean {\n return regEx(/^\\d$/).test(char);\n}\n\nfunction isLetter(char: string): boolean {\n return !isSeparator(char) && !isDigit(char);\n}\n\nfunction isTransition(prevChar: string, nextChar: string): boolean {\n return (\n (isDigit(prevChar) && isLetter(nextChar)) ||\n (isLetter(prevChar) && isDigit(nextChar))\n );\n}\n\nexport function tokenize(versionStr: string): Token[] | null {\n let result: Token[] | null = [];\n let currentVal = '';\n\n function yieldToken(): void {\n if (result) {\n const val = currentVal;\n if (regEx(/^\\d+$/).test(val)) {\n result.push({\n type: TokenType.Number,\n val: BigInt(val),\n });\n } else {\n result.push({\n type: TokenType.String,\n val,\n });\n }\n }\n }\n\n iterateChars(versionStr, (prevChar, nextChar) => {\n if (nextChar === null) {\n yieldToken();\n } else if (isSeparator(nextChar)) {\n if (prevChar && !isSeparator(prevChar)) {\n yieldToken();\n currentVal = '';\n } else {\n result = null;\n }\n } else if (prevChar !== null && isTransition(prevChar, nextChar)) {\n yieldToken();\n currentVal = nextChar;\n } else {\n currentVal = currentVal.concat(nextChar);\n }\n });\n\n return result;\n}\n\nexport const QualifierRank = {\n Dev: -1,\n Default: 0,\n RC: 1,\n Snapshot: 2,\n Final: 3,\n GA: 4,\n Release: 5,\n SP: 6,\n} as const;\n\nexport function qualifierRank(input: string): number {\n const val = input.toLowerCase();\n if (val === 'dev') {\n return QualifierRank.Dev;\n }\n if (val === 'rc' || val === 'cr') {\n return QualifierRank.RC;\n }\n if (val === 'snapshot') {\n return QualifierRank.Snapshot;\n }\n if (val === 'ga') {\n return QualifierRank.GA;\n }\n if (val === 'final') {\n return QualifierRank.Final;\n }\n if (val === 'release' || val === 'latest' || val === 'sr') {\n return QualifierRank.Release;\n }\n if (val === 'sp') {\n return QualifierRank.SP;\n }\n return QualifierRank.Default;\n}\n\nfunction stringTokenCmp(left: string, right: string): number {\n const leftRank = qualifierRank(left);\n const rightRank = qualifierRank(right);\n if (leftRank === 0 && rightRank === 0) {\n if (left < right) {\n return -1;\n }\n\n if (left > right) {\n return 1;\n }\n } else {\n if (leftRank < rightRank) {\n return -1;\n }\n if (leftRank > rightRank) {\n return 1;\n }\n }\n return 0;\n}\n\nfunction tokenCmp(left: Token | null, right: Token | null): number {\n if (left === null) {\n if (right?.type === TokenType.String) {\n return 1;\n }\n return -1;\n }\n\n if (right === null) {\n if (left.type === TokenType.String) {\n return -1;\n }\n return 1;\n }\n\n if (left.type === TokenType.Number && right.type === TokenType.Number) {\n if (left.val < right.val) {\n return -1;\n }\n if (left.val > right.val) {\n return 1;\n }\n return 0;\n }\n\n if (isString(left.val) && isString(right.val)) {\n return stringTokenCmp(left.val, right.val);\n }\n\n // `Number` and `String` are the only token types, so exactly one side is a\n // number here, and a number sorts above a string\n return right.type === TokenType.Number ? -1 : 1;\n}\n\nexport function compare(left: string, right: string): number {\n const leftTokens = coerceArray(tokenize(left));\n const rightTokens = coerceArray(tokenize(right));\n const length = Math.max(leftTokens.length, rightTokens.length);\n for (let idx = 0; idx < length; idx += 1) {\n const leftToken = leftTokens[idx] || null;\n const rightToken = rightTokens[idx] || null;\n const cmpResult = tokenCmp(leftToken, rightToken);\n if (cmpResult !== 0) {\n return cmpResult;\n }\n }\n return 0;\n}\n\nexport function parse(input: string): Token[] | null {\n if (!input) {\n return null;\n }\n\n if (!regEx(/^[-._+a-zA-Z0-9]+$/i).test(input)) {\n return null;\n }\n\n if (regEx(/^latest\\.?/i).test(input)) {\n return null;\n }\n\n const tokens = tokenize(input);\n // istanbul ignore if: should not happen\n if (!tokens?.length) {\n return null;\n }\n return tokens;\n}\n\nexport function isVersion(input: string): boolean {\n return !!parse(input);\n}\n\ninterface PrefixRange {\n tokens: Token[];\n}\n\ntype RangeBound = 'inclusive' | 'exclusive';\n\ninterface MavenBasedRange {\n leftBound: RangeBound;\n leftBoundStr: string;\n leftVal: string | null;\n separator: string;\n rightBound: RangeBound;\n rightBoundStr: string;\n rightVal: string | null;\n // The existence of preferredVal implies the \"strictly\" keyword \"!!\"\n // leading up to preferredVal: \"!![preferred version]\"\n preferredVal: string | null;\n}\n\nexport function parsePrefixRange(input: string): PrefixRange | null {\n if (!input) {\n return null;\n }\n\n if (input.trim() === '+') {\n return { tokens: [] };\n }\n\n const postfixRegex = regEx(/[^-._+][-._]\\+$/);\n if (postfixRegex.test(input)) {\n const prefixValue = input.replace(regEx(/[-._]\\+$/), '');\n const tokens = tokenize(prefixValue);\n if (tokens) {\n return { tokens };\n }\n }\n\n return null;\n}\n\nconst mavenBasedRangeRegex = regEx(\n /^(?<leftBoundStr>[[\\](]\\s*)(?<leftVal>[-._+a-zA-Z0-9]*?)(?<separator>\\s*,\\s*)(?<rightVal>[-._+a-zA-Z0-9]*?)(?<rightBoundStr>\\s*[[\\])])(?:!!(?<preferredVal>[-._+a-zA-Z0-9]+))?$/,\n);\n\nexport function parseMavenBasedRange(input: string): MavenBasedRange | null {\n if (!input) {\n return null;\n }\n\n const matchGroups = mavenBasedRangeRegex.exec(input)?.groups;\n if (!matchGroups) {\n return null;\n }\n\n const { leftBoundStr, separator, rightBoundStr } = matchGroups;\n const leftVal = matchGroups.leftVal || null;\n const rightVal = matchGroups.rightVal || null;\n const preferredVal = matchGroups.preferredVal || null;\n const isVersionLeft = isString(leftVal) && isVersion(leftVal);\n const isVersionRight = isString(rightVal) && isVersion(rightVal);\n if (\n (leftVal !== null && !isVersionLeft) ||\n (rightVal !== null && !isVersionRight)\n ) {\n return null;\n }\n\n if (\n isVersionLeft &&\n isVersionRight &&\n leftVal &&\n rightVal &&\n compare(leftVal, rightVal) === 1\n ) {\n return null;\n }\n\n const leftBound = leftBoundStr.trim() === '[' ? 'inclusive' : 'exclusive';\n const rightBound = rightBoundStr.trim() === ']' ? 'inclusive' : 'exclusive';\n\n return {\n leftBound,\n leftBoundStr,\n leftVal,\n separator,\n rightBound,\n rightBoundStr,\n rightVal,\n preferredVal,\n };\n}\n\ninterface SingleVersionRange {\n val: string;\n}\n\nconst singleVersionRangeRegex = regEx(/^\\[\\s*(?<val>[-._+a-zA-Z0-9]*?)\\s*\\]$/);\n\nexport function parseSingleVersionRange(\n input: string,\n): SingleVersionRange | null {\n const matchGroups = singleVersionRangeRegex.exec(input)?.groups;\n if (!matchGroups) {\n return null;\n }\n\n const { val } = matchGroups;\n if (!isVersion(val)) {\n return null;\n }\n\n return { val };\n}\n\nexport function isValid(str: string): boolean {\n if (!str) {\n return false;\n }\n\n return (\n isVersion(str) ||\n !!parsePrefixRange(str) ||\n !!parseMavenBasedRange(str) ||\n !!parseSingleVersionRange(str)\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"compare.js","names":[],"sources":["../../../../lib/modules/versioning/gradle/compare.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport { coerceArray } from '../../../util/array.ts';\nimport { regEx } from '../../../util/regex.ts';\n\nexport const TokenType = {\n Number: 1,\n String: 2,\n};\n\ninterface Token {\n type: number;\n val: string | bigint;\n}\n\nfunction iterateChars(\n str: string,\n cb: (p: string | null, n: string | null) => void,\n): void {\n let prev = null;\n let next = null;\n for (let i = 0; i < str.length; i += 1) {\n next = str.charAt(i);\n cb(prev, next);\n prev = next;\n }\n cb(prev, null);\n}\n\nfunction isSeparator(char: string): boolean {\n return regEx(/^[-._+]$/i).test(char);\n}\n\nfunction isDigit(char: string): boolean {\n return regEx(/^\\d$/).test(char);\n}\n\nfunction isLetter(char: string): boolean {\n return !isSeparator(char) && !isDigit(char);\n}\n\nfunction isTransition(prevChar: string, nextChar: string): boolean {\n if (isDigit(prevChar) && isLetter(nextChar)) {\n return true;\n }\n return isLetter(prevChar) && isDigit(nextChar);\n}\n\nexport function tokenize(versionStr: string): Token[] | null {\n let result: Token[] | null = [];\n let currentVal = '';\n\n function yieldToken(): void {\n if (result) {\n const val = currentVal;\n if (regEx(/^\\d+$/).test(val)) {\n result.push({\n type: TokenType.Number,\n val: BigInt(val),\n });\n } else {\n result.push({\n type: TokenType.String,\n val,\n });\n }\n }\n }\n\n iterateChars(versionStr, (prevChar, nextChar) => {\n if (nextChar === null) {\n yieldToken();\n } else if (isSeparator(nextChar)) {\n if (prevChar && !isSeparator(prevChar)) {\n yieldToken();\n currentVal = '';\n } else {\n result = null;\n }\n } else if (prevChar !== null && isTransition(prevChar, nextChar)) {\n yieldToken();\n currentVal = nextChar;\n } else {\n currentVal = currentVal.concat(nextChar);\n }\n });\n\n return result;\n}\n\nexport const QualifierRank = {\n Dev: -1,\n Default: 0,\n RC: 1,\n Snapshot: 2,\n Final: 3,\n GA: 4,\n Release: 5,\n SP: 6,\n} as const;\n\nexport function qualifierRank(input: string): number {\n const val = input.toLowerCase();\n if (val === 'dev') {\n return QualifierRank.Dev;\n }\n if (val === 'rc' || val === 'cr') {\n return QualifierRank.RC;\n }\n if (val === 'snapshot') {\n return QualifierRank.Snapshot;\n }\n if (val === 'ga') {\n return QualifierRank.GA;\n }\n if (val === 'final') {\n return QualifierRank.Final;\n }\n if (val === 'release' || val === 'latest' || val === 'sr') {\n return QualifierRank.Release;\n }\n if (val === 'sp') {\n return QualifierRank.SP;\n }\n return QualifierRank.Default;\n}\n\nfunction stringTokenCmp(left: string, right: string): number {\n const leftRank = qualifierRank(left);\n const rightRank = qualifierRank(right);\n if (leftRank === 0 && rightRank === 0) {\n if (left < right) {\n return -1;\n }\n\n if (left > right) {\n return 1;\n }\n } else {\n if (leftRank < rightRank) {\n return -1;\n }\n if (leftRank > rightRank) {\n return 1;\n }\n }\n return 0;\n}\n\nfunction tokenCmp(left: Token | null, right: Token | null): number {\n if (left === null) {\n if (right?.type === TokenType.String) {\n return 1;\n }\n return -1;\n }\n\n if (right === null) {\n if (left.type === TokenType.String) {\n return -1;\n }\n return 1;\n }\n\n if (left.type === TokenType.Number && right.type === TokenType.Number) {\n if (left.val < right.val) {\n return -1;\n }\n if (left.val > right.val) {\n return 1;\n }\n return 0;\n }\n\n if (isString(left.val) && isString(right.val)) {\n return stringTokenCmp(left.val, right.val);\n }\n\n // `Number` and `String` are the only token types, so exactly one side is a\n // number here, and a number sorts above a string\n return right.type === TokenType.Number ? -1 : 1;\n}\n\nexport function compare(left: string, right: string): number {\n const leftTokens = coerceArray(tokenize(left));\n const rightTokens = coerceArray(tokenize(right));\n const length = Math.max(leftTokens.length, rightTokens.length);\n for (let idx = 0; idx < length; idx += 1) {\n const leftToken = leftTokens[idx] || null;\n const rightToken = rightTokens[idx] || null;\n const cmpResult = tokenCmp(leftToken, rightToken);\n if (cmpResult !== 0) {\n return cmpResult;\n }\n }\n return 0;\n}\n\nexport function parse(input: string): Token[] | null {\n if (!input) {\n return null;\n }\n\n if (!regEx(/^[-._+a-zA-Z0-9]+$/i).test(input)) {\n return null;\n }\n\n if (regEx(/^latest\\.?/i).test(input)) {\n return null;\n }\n\n const tokens = tokenize(input);\n // istanbul ignore if: should not happen\n if (!tokens?.length) {\n return null;\n }\n return tokens;\n}\n\nexport function isVersion(input: string): boolean {\n return !!parse(input);\n}\n\ninterface PrefixRange {\n tokens: Token[];\n}\n\ntype RangeBound = 'inclusive' | 'exclusive';\n\ninterface MavenBasedRange {\n leftBound: RangeBound;\n leftBoundStr: string;\n leftVal: string | null;\n separator: string;\n rightBound: RangeBound;\n rightBoundStr: string;\n rightVal: string | null;\n // The existence of preferredVal implies the \"strictly\" keyword \"!!\"\n // leading up to preferredVal: \"!![preferred version]\"\n preferredVal: string | null;\n}\n\nexport function parsePrefixRange(input: string): PrefixRange | null {\n if (!input) {\n return null;\n }\n\n if (input.trim() === '+') {\n return { tokens: [] };\n }\n\n const postfixRegex = regEx(/[^-._+][-._]\\+$/);\n if (postfixRegex.test(input)) {\n const prefixValue = input.replace(regEx(/[-._]\\+$/), '');\n const tokens = tokenize(prefixValue);\n if (tokens) {\n return { tokens };\n }\n }\n\n return null;\n}\n\nconst mavenBasedRangeRegex = regEx(\n /^(?<leftBoundStr>[[\\](]\\s*)(?<leftVal>[-._+a-zA-Z0-9]*?)(?<separator>\\s*,\\s*)(?<rightVal>[-._+a-zA-Z0-9]*?)(?<rightBoundStr>\\s*[[\\])])(?:!!(?<preferredVal>[-._+a-zA-Z0-9]+))?$/,\n);\n\nexport function parseMavenBasedRange(input: string): MavenBasedRange | null {\n if (!input) {\n return null;\n }\n\n const matchGroups = mavenBasedRangeRegex.exec(input)?.groups;\n if (!matchGroups) {\n return null;\n }\n\n const { leftBoundStr, separator, rightBoundStr } = matchGroups;\n const leftVal = matchGroups.leftVal || null;\n const rightVal = matchGroups.rightVal || null;\n const preferredVal = matchGroups.preferredVal || null;\n const isVersionLeft = isString(leftVal) && isVersion(leftVal);\n const isVersionRight = isString(rightVal) && isVersion(rightVal);\n const isInvalidLeft = leftVal !== null && !isVersionLeft;\n const isInvalidRight = rightVal !== null && !isVersionRight;\n if (isInvalidLeft || isInvalidRight) {\n return null;\n }\n\n if (\n isVersionLeft &&\n isVersionRight &&\n leftVal &&\n rightVal &&\n compare(leftVal, rightVal) === 1\n ) {\n return null;\n }\n\n const leftBound = leftBoundStr.trim() === '[' ? 'inclusive' : 'exclusive';\n const rightBound = rightBoundStr.trim() === ']' ? 'inclusive' : 'exclusive';\n\n return {\n leftBound,\n leftBoundStr,\n leftVal,\n separator,\n rightBound,\n rightBoundStr,\n rightVal,\n preferredVal,\n };\n}\n\ninterface SingleVersionRange {\n val: string;\n}\n\nconst singleVersionRangeRegex = regEx(/^\\[\\s*(?<val>[-._+a-zA-Z0-9]*?)\\s*\\]$/);\n\nexport function parseSingleVersionRange(\n input: string,\n): SingleVersionRange | null {\n const matchGroups = singleVersionRangeRegex.exec(input)?.groups;\n if (!matchGroups) {\n return null;\n }\n\n const { val } = matchGroups;\n if (!isVersion(val)) {\n return null;\n }\n\n return { val };\n}\n\nexport function isValid(str: string): boolean {\n if (!str) {\n return false;\n }\n\n return (\n isVersion(str) ||\n !!parsePrefixRange(str) ||\n !!parseMavenBasedRange(str) ||\n !!parseSingleVersionRange(str)\n );\n}\n"],"mappings":"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"}
|
|
@@ -35,7 +35,8 @@ function isValid(input) {
|
|
|
35
35
|
return !!api$1.isValid(hex2npm(input));
|
|
36
36
|
}
|
|
37
37
|
function isSingleVersion(constraint) {
|
|
38
|
-
|
|
38
|
+
if (api$1.isVersion(constraint)) return true;
|
|
39
|
+
return constraint?.startsWith("==") && api$1.isVersion(constraint.substring(2).trim());
|
|
39
40
|
}
|
|
40
41
|
function getPinnedValue(newVersion) {
|
|
41
42
|
return `== ${newVersion}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["npm"],"sources":["../../../../lib/modules/versioning/hex/index.ts"],"sourcesContent":["import type { RangeStrategy } from '../../../types/versioning.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { api as npm } from '../npm/index.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\n\nexport const id = 'hex';\nexport const displayName = 'Hex';\nexport const urls = [\n '[Elixir Version module](https://hexdocs.pm/elixir/Version.html)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = [\n 'bump',\n 'widen',\n 'replace',\n 'update-lockfile',\n];\n\nfunction hex2npm(input: string): string {\n return input\n .replace(regEx(/~>\\s*(?<version>\\d+\\.\\d+)$/), '^$<version>')\n .replace(regEx(/~>\\s*(?<version>\\d+\\.\\d+\\.\\d+)/), '~$<version>')\n .replace(regEx(/==|and/), '')\n .replace('or', '||')\n .replace(\n regEx(/!=\\s*(?<version>\\d+\\.\\d+(?:\\.\\d+.*)?)/),\n '>$<version> <$<version>',\n )\n .trim();\n}\n\nfunction npm2hex(input: string): string {\n const res = input\n .split(' ')\n .map((str) => str.trim())\n .filter((str) => str !== '');\n let output = '';\n const operators = ['^', '=', '>', '<', '<=', '>=', '~>'];\n for (let i = 0; i < res.length; i += 1) {\n if (i === res.length - 1) {\n output += res[i];\n break;\n }\n if (i < res.length - 1 && res[i + 1].includes('||')) {\n output += `${res[i]} or `;\n i += 1;\n } else if (operators.includes(res[i])) {\n output += `${res[i]} `;\n } else {\n output += `${res[i]} and `;\n }\n }\n return output;\n}\n\nfunction isLessThanRange(version: string, range: string): boolean {\n return !!npm.isLessThanRange?.(hex2npm(version), hex2npm(range));\n}\n\nfunction isValid(input: string): boolean {\n return !!npm.isValid(hex2npm(input));\n}\n\nfunction isSingleVersion(constraint: string): boolean {\n
|
|
1
|
+
{"version":3,"file":"index.js","names":["npm"],"sources":["../../../../lib/modules/versioning/hex/index.ts"],"sourcesContent":["import type { RangeStrategy } from '../../../types/versioning.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { api as npm } from '../npm/index.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\n\nexport const id = 'hex';\nexport const displayName = 'Hex';\nexport const urls = [\n '[Elixir Version module](https://hexdocs.pm/elixir/Version.html)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = [\n 'bump',\n 'widen',\n 'replace',\n 'update-lockfile',\n];\n\nfunction hex2npm(input: string): string {\n return input\n .replace(regEx(/~>\\s*(?<version>\\d+\\.\\d+)$/), '^$<version>')\n .replace(regEx(/~>\\s*(?<version>\\d+\\.\\d+\\.\\d+)/), '~$<version>')\n .replace(regEx(/==|and/), '')\n .replace('or', '||')\n .replace(\n regEx(/!=\\s*(?<version>\\d+\\.\\d+(?:\\.\\d+.*)?)/),\n '>$<version> <$<version>',\n )\n .trim();\n}\n\nfunction npm2hex(input: string): string {\n const res = input\n .split(' ')\n .map((str) => str.trim())\n .filter((str) => str !== '');\n let output = '';\n const operators = ['^', '=', '>', '<', '<=', '>=', '~>'];\n for (let i = 0; i < res.length; i += 1) {\n if (i === res.length - 1) {\n output += res[i];\n break;\n }\n if (i < res.length - 1 && res[i + 1].includes('||')) {\n output += `${res[i]} or `;\n i += 1;\n } else if (operators.includes(res[i])) {\n output += `${res[i]} `;\n } else {\n output += `${res[i]} and `;\n }\n }\n return output;\n}\n\nfunction isLessThanRange(version: string, range: string): boolean {\n return !!npm.isLessThanRange?.(hex2npm(version), hex2npm(range));\n}\n\nfunction isValid(input: string): boolean {\n return !!npm.isValid(hex2npm(input));\n}\n\nfunction isSingleVersion(constraint: string): boolean {\n if (npm.isVersion(constraint)) {\n return true;\n }\n return (\n constraint?.startsWith('==') &&\n npm.isVersion(constraint.substring(2).trim())\n );\n}\n\nfunction getPinnedValue(newVersion: string): string {\n return `== ${newVersion}`;\n}\n\nfunction matches(version: string, range: string): boolean {\n return npm.matches(hex2npm(version), hex2npm(range));\n}\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return npm.getSatisfyingVersion(versions.map(hex2npm), hex2npm(range));\n}\n\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return npm.minSatisfyingVersion(versions.map(hex2npm), hex2npm(range));\n}\n\nfunction getNewValue({\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n}: NewValueConfig): string | null {\n let newSemver = npm.getNewValue({\n currentValue: hex2npm(currentValue),\n rangeStrategy,\n currentVersion,\n newVersion,\n });\n if (newSemver) {\n newSemver = npm2hex(newSemver);\n\n if (regEx(/~>\\s*(?:\\d+\\.\\d+\\.\\d+)$/).test(currentValue)) {\n newSemver = newSemver.replace(\n regEx(/[\\^~]\\s*(?<version>\\d+\\.\\d+\\.\\d+)/g),\n (_str, version: string) => `~> ${version}`,\n );\n } else if (regEx(/~>\\s*(?:\\d+\\.\\d+)$/).test(currentValue)) {\n newSemver = newSemver.replace(\n regEx(/\\^\\s*(?<version>\\d+\\.\\d+)(?:\\.\\d+)?/g),\n (_str, version: string) => `~> ${version}`,\n );\n } else {\n newSemver = newSemver.replace(\n regEx(/~\\s*(?<version>\\d+\\.\\d+\\.\\d)/g),\n '~> $<version>',\n );\n }\n if (npm.isVersion(newSemver)) {\n newSemver = `== ${newSemver}`;\n }\n }\n return newSemver;\n}\n\nexport { isValid };\n\nexport const api: VersioningApi = {\n ...npm,\n isLessThanRange,\n isSingleVersion,\n isValid,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n getNewValue,\n getPinnedValue,\n};\n\nexport default api;\n"],"mappings":";;AAkBA,SAAS,QAAQ,OAAuB;CACtC,OAAO,MACJ,QAAQ,MAAM,4BAA4B,GAAG,aAAa,CAAC,CAC3D,QAAQ,MAAM,gCAAgC,GAAG,aAAa,CAAC,CAC/D,QAAQ,MAAM,QAAQ,GAAG,EAAE,CAAC,CAC5B,QAAQ,MAAM,IAAI,CAAC,CACnB,QACC,MAAM,uCAAuC,GAC7C,yBACF,CAAC,CACA,KAAK;AACV;AAEA,SAAS,QAAQ,OAAuB;CACtC,MAAM,MAAM,MACT,MAAM,GAAG,CAAC,CACV,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CACxB,QAAQ,QAAQ,QAAQ,EAAE;CAC7B,IAAI,SAAS;CACb,MAAM,YAAY;EAAC;EAAK;EAAK;EAAK;EAAK;EAAM;EAAM;CAAI;CACvD,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,GAAG;EACtC,IAAI,MAAM,IAAI,SAAS,GAAG;GACxB,UAAU,IAAI;GACd;EACF;EACA,IAAI,IAAI,IAAI,SAAS,KAAK,IAAI,IAAI,EAAE,CAAC,SAAS,IAAI,GAAG;GACnD,UAAU,GAAG,IAAI,GAAG;GACpB,KAAK;EACP,OAAO,IAAI,UAAU,SAAS,IAAI,EAAE,GAClC,UAAU,GAAG,IAAI,GAAG;OAEpB,UAAU,GAAG,IAAI,GAAG;CAExB;CACA,OAAO;AACT;AAEA,SAAS,gBAAgB,SAAiB,OAAwB;CAChE,OAAO,CAAC,CAACA,MAAI,kBAAkB,QAAQ,OAAO,GAAG,QAAQ,KAAK,CAAC;AACjE;AAEA,SAAS,QAAQ,OAAwB;CACvC,OAAO,CAAC,CAACA,MAAI,QAAQ,QAAQ,KAAK,CAAC;AACrC;AAEA,SAAS,gBAAgB,YAA6B;CACpD,IAAIA,MAAI,UAAU,UAAU,GAC1B,OAAO;CAET,OACE,YAAY,WAAW,IAAI,KAC3BA,MAAI,UAAU,WAAW,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;AAEhD;AAEA,SAAS,eAAe,YAA4B;CAClD,OAAO,MAAM;AACf;AAEA,SAAS,QAAQ,SAAiB,OAAwB;CACxD,OAAOA,MAAI,QAAQ,QAAQ,OAAO,GAAG,QAAQ,KAAK,CAAC;AACrD;AAEA,SAAS,qBACP,UACA,OACe;CACf,OAAOA,MAAI,qBAAqB,SAAS,IAAI,OAAO,GAAG,QAAQ,KAAK,CAAC;AACvE;AAEA,SAAS,qBACP,UACA,OACe;CACf,OAAOA,MAAI,qBAAqB,SAAS,IAAI,OAAO,GAAG,QAAQ,KAAK,CAAC;AACvE;AAEA,SAAS,YAAY,EACnB,cACA,eACA,gBACA,cACgC;CAChC,IAAI,YAAYA,MAAI,YAAY;EAC9B,cAAc,QAAQ,YAAY;EAClC;EACA;EACA;CACF,CAAC;CACD,IAAI,WAAW;EACb,YAAY,QAAQ,SAAS;EAE7B,IAAI,MAAM,yBAAyB,CAAC,CAAC,KAAK,YAAY,GACpD,YAAY,UAAU,QACpB,MAAM,oCAAoC,IACzC,MAAM,YAAoB,MAAM,SACnC;OACK,IAAI,MAAM,oBAAoB,CAAC,CAAC,KAAK,YAAY,GACtD,YAAY,UAAU,QACpB,MAAM,sCAAsC,IAC3C,MAAM,YAAoB,MAAM,SACnC;OAEA,YAAY,UAAU,QACpB,MAAM,+BAA+B,GACrC,eACF;EAEF,IAAIA,MAAI,UAAU,SAAS,GACzB,YAAY,MAAM;CAEtB;CACA,OAAO;AACT;AAIA,MAAa,MAAqB;CAChC,GAAGA;CACH;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["npm","semver","getMajor","getMinor"],"sources":["../../../../lib/modules/versioning/julia/index.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { major as getMajor, minor as getMinor } from 'semver';\nimport semver from 'semver-stable';\nimport { logger } from '../../../logger/index.ts';\nimport type { RangeStrategy } from '../../../types/versioning.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { api as npm } from '../npm/index.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\n\nexport const id = 'julia';\nexport const displayName = 'Julia';\nexport const urls = [\n '[Pkg.jl - Compatibility](https://pkgdocs.julialang.org/v1/compatibility/)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = [\n 'bump',\n 'pin',\n 'replace',\n 'widen',\n];\n\nfunction convertToCaret(item: string): string {\n // In Julia, caret is the default specifier — `1.2.3` means `^1.2.3`.\n // See: https://pkgdocs.julialang.org/v1/compatibility/#Version-specifier-format\n const trimmed = item.trim();\n if (\n npm.isVersion(trimmed) ||\n npm.isVersion(`${trimmed}.0`) ||\n npm.isVersion(`${trimmed}.0.0`)\n ) {\n return `^${trimmed}`;\n }\n return trimmed;\n}\n\nfunction julia2npm(input: string): string {\n // Julia uses `,` for *union* (npm: `||`), `≥` as a synonym for `>=`,\n // and treats bare versions as carets.\n return input\n .replaceAll('≥', '>=')\n .split(',')\n .map(convertToCaret)\n .filter(isNonEmptyString)\n .join(' || ');\n}\n\nfunction npm2julia(input: string): string {\n /* v8 ignore if -- defensive */\n if (!input) {\n logger.warn(\n { input },\n 'julia: npm2julia received an empty value, returning as-is',\n );\n return input;\n }\n // Convert npm union (`||`) back to Julia union (`,`).\n return input\n .split(regEx(/\\s*\\|\\|\\s*/))\n .map((part) => part.trim())\n .filter(isNonEmptyString)\n .join(', ');\n}\n\nfunction isLessThanRange(version: string, range: string): boolean {\n return !!npm.isLessThanRange?.(version, julia2npm(range));\n}\n\nfunction isValid(input: string): boolean {\n // Pkg rejects an empty specifier, alone or in a union: `\"\"`, `\"1.2,\"`.\n return (\n input.split(',').every((spec) => isNonEmptyString(spec.trim())) &&\n npm.isValid(julia2npm(input))\n );\n}\n\nfunction matches(version: string, range: string): boolean {\n return npm.matches(version, julia2npm(range));\n}\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return npm.getSatisfyingVersion(versions, julia2npm(range));\n}\n\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return npm.minSatisfyingVersion(versions, julia2npm(range));\n}\n\nfunction isSingleVersion(constraint: string): boolean {\n const trimmed = constraint.trim();\n return trimmed.startsWith('=') && npm.isVersion(trimmed.substring(1).trim());\n}\n\nfunction getPinnedValue(newVersion: string): string {\n return `=${newVersion}`;\n}\n\n// A union like `0.10, 0.11` is several specifiers; the last one carries the\n// precision and the lower bound an upgrade moves.\nfunction lastSpecifier(value: string): string {\n return value.split(',').at(-1)!.trim();\n}\n\nfunction componentCount(value: string): number {\n return lastSpecifier(value).split('.').length;\n}\n\n// dependabot's `simplified_version_spec`: `major.minor` above 1.0, `0.minor`\n// for 0.x, `0.0.patch` for 0.0.x, always written plain.\nfunction simplifiedSpec(version: string): string {\n /* v8 ignore next -- newVersion is always a full release */\n const major = npm.getMajor(version) ?? 0;\n /* v8 ignore next -- newVersion is always a full release */\n const minor = npm.getMinor(version) ?? 0;\n /* v8 ignore next -- newVersion is always a full release */\n const patch = npm.getPatch(version) ?? 0;\n if (major > 0) {\n return `${major}.${minor}`;\n }\n if (minor > 0) {\n return `0.${minor}`;\n }\n return `0.0.${patch}`;\n}\n\n// The lowest version a single specifier admits, for ordering; a bare upper\n// bound such as `<0.0.1` starts at zero.\nfunction specLowerBound(spec: string): number[] {\n if (spec.startsWith('<') || spec.startsWith('\\u2264')) {\n return [0];\n }\n /* v8 ignore next -- a specifier without digits never reaches ordering */\n const digits = regEx(/\\d+(?:\\.\\d+)*/).exec(spec)?.[0] ?? '0';\n return digits.split('.').map(Number);\n}\n\nfunction isAbove(a: number[], b: number[]): boolean {\n for (let i = 0; i < Math.max(a.length, b.length); i += 1) {\n const left = a[i] ?? 0;\n const right = b[i] ?? 0;\n if (left !== right) {\n return left > right;\n }\n }\n return false;\n}\n\n// Julia's convention is to append a new specifier rather than replace the\n// entry, keeping it in ascending order.\nfunction widen(currentValue: string, newVersion: string): string {\n if (matches(newVersion, currentValue)) {\n return currentValue;\n }\n // Keep the last specifier's `~`, `^` or `=`: a plain `1.3` is `[1.3, 2.0)`,\n // so next to `~1.2` or `=1.2.5` it would let in all of 1.x.\n const last = lastSpecifier(currentValue);\n const operator = regEx(/^(?:[~^]|=\\s*)/).exec(last)?.[0] ?? '';\n // Next to a bare major such as `5`, write `6`, not `6.0`: the entry's own\n // style, and CompatHelper's.\n const major = npm.getMajor(newVersion)!;\n let newSpec: string;\n if (operator.startsWith('=')) {\n newSpec = operator + newVersion;\n } else if (\n major > 0 &&\n regEx(/^\\d+$/).test(last.slice(operator.length).trim())\n ) {\n newSpec = `${operator}${major}`;\n } else {\n newSpec = operator + simplifiedSpec(newVersion);\n }\n const separator =\n currentValue.includes(',') && !currentValue.includes(', ') ? ',' : ', ';\n const specs = currentValue.split(',').map((spec) => spec.trim());\n const index = specs.findIndex((spec) =>\n isAbove(specLowerBound(spec), specLowerBound(newSpec)),\n );\n if (index === -1) {\n return `${currentValue}${separator}${newSpec}`;\n }\n specs.splice(index, 0, newSpec);\n return specs.join(separator);\n}\n\nfunction getNewValue({\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n}: NewValueConfig): string {\n if (!currentValue || currentValue === '*') {\n return currentValue;\n }\n // A hyphen range is a deliberate manual constraint. Anchored: a hyphen\n // without surrounding whitespace is a prerelease tag, not a range.\n if (regEx(/^\\d+(?:\\.\\d+)*\\s+-\\s+\\d+(?:\\.\\d+)*$/).test(currentValue)) {\n return currentValue;\n }\n // A compat entry carries `major.minor.patch` and nothing else: the\n // specifier grammar in Pkg.jl `src/Versions.jl` (`ver_regs`, unchanged from\n // Julia 1.0 through 1.13) takes digits only, and its bounds compare the\n // three numbers, so `1.6.10` admits `1.6.10-rc1` and a JLL's `1.6.10+0`.\n const target = newVersion.replace(regEx(/[-+].*$/), '');\n // Bare version `1.2.3` (implicit caret) under bump → simply replace.\n if (rangeStrategy === 'bump' && regEx(/^\\d+(?:\\.\\d+)*$/).test(currentValue)) {\n return target;\n }\n if (isSingleVersion(currentValue)) {\n let res = '=';\n if (currentValue.startsWith('= ')) {\n res += ' ';\n }\n res += target;\n return res;\n }\n // After the single-version branch: an exact pin is a hard constraint, and\n // appending to it would silently relax it.\n if (rangeStrategy === 'widen') {\n return widen(currentValue, target);\n }\n if (rangeStrategy === 'replace' && matches(target, currentValue)) {\n return currentValue;\n }\n // npm bumps every comparator of a union and joins them with a space, which\n // is not Julia syntax; bump the last specifier instead.\n const npmCurrentValue =\n rangeStrategy === 'bump' && currentValue.includes(',')\n ? lastSpecifier(currentValue)\n : currentValue;\n const newSemver = npm.getNewValue({\n currentValue: julia2npm(npmCurrentValue),\n rangeStrategy,\n currentVersion,\n newVersion: target,\n });\n /* v8 ignore if: defensive — npm should always return a value for inputs julia2npm produces */\n if (!newSemver) {\n logger.warn(\n { currentValue, rangeStrategy, newVersion },\n 'Could not derive julia version range',\n );\n return currentValue;\n }\n let newJulia = npm2julia(newSemver);\n // Preserve precision (number of components) when current uses `^` or `~`.\n if (\n (currentValue.startsWith('~') || currentValue.startsWith('^')) &&\n rangeStrategy === 'replace' &&\n newJulia.split('.').length > componentCount(currentValue)\n ) {\n newJulia = newJulia\n .split('.')\n .slice(0, componentCount(currentValue))\n .join('.');\n }\n // Reverse any caret npm added that the original didn't have, restoring\n // Julia's bare-version-is-caret default.\n if (newJulia.startsWith('^') && !currentValue.startsWith('^')) {\n const withoutCaret = newJulia.substring(1);\n // Cutting to the current precision is a `replace` behaviour; under `bump`\n // it would throw the bump away.\n newJulia =\n rangeStrategy === 'replace'\n ? withoutCaret\n .split('.')\n .slice(0, componentCount(currentValue))\n .join('.')\n : withoutCaret;\n }\n\n return newJulia;\n}\n\nfunction isBreaking(current: string, version: string): boolean {\n // Treat any unstable version as potentially breaking.\n if (!semver.is(version) || !semver.is(current)) {\n return true;\n }\n const currentMajor = getMajor(current);\n // Julia treats the leftmost non-zero digit as the breaking-change axis\n // (same as Cargo / npm caret semantics).\n if (currentMajor === 0) {\n if (getMinor(current) === 0) {\n return current !== version;\n }\n return getMinor(current) !== getMinor(version);\n }\n return currentMajor !== getMajor(version);\n}\n\nexport const api: VersioningApi = {\n ...npm,\n getNewValue,\n getPinnedValue,\n isBreaking,\n isLessThanRange,\n isSingleVersion,\n isValid,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n};\nexport default api;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["npm","semver","getMajor","getMinor"],"sources":["../../../../lib/modules/versioning/julia/index.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { major as getMajor, minor as getMinor } from 'semver';\nimport semver from 'semver-stable';\nimport { logger } from '../../../logger/index.ts';\nimport type { RangeStrategy } from '../../../types/versioning.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { api as npm } from '../npm/index.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\n\nexport const id = 'julia';\nexport const displayName = 'Julia';\nexport const urls = [\n '[Pkg.jl - Compatibility](https://pkgdocs.julialang.org/v1/compatibility/)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = [\n 'bump',\n 'pin',\n 'replace',\n 'widen',\n];\n\nfunction convertToCaret(item: string): string {\n // In Julia, caret is the default specifier — `1.2.3` means `^1.2.3`.\n // See: https://pkgdocs.julialang.org/v1/compatibility/#Version-specifier-format\n const trimmed = item.trim();\n if (\n npm.isVersion(trimmed) ||\n npm.isVersion(`${trimmed}.0`) ||\n npm.isVersion(`${trimmed}.0.0`)\n ) {\n return `^${trimmed}`;\n }\n return trimmed;\n}\n\nfunction julia2npm(input: string): string {\n // Julia uses `,` for *union* (npm: `||`), `≥` as a synonym for `>=`,\n // and treats bare versions as carets.\n return input\n .replaceAll('≥', '>=')\n .split(',')\n .map(convertToCaret)\n .filter(isNonEmptyString)\n .join(' || ');\n}\n\nfunction npm2julia(input: string): string {\n /* v8 ignore if -- defensive */\n if (!input) {\n logger.warn(\n { input },\n 'julia: npm2julia received an empty value, returning as-is',\n );\n return input;\n }\n // Convert npm union (`||`) back to Julia union (`,`).\n return input\n .split(regEx(/\\s*\\|\\|\\s*/))\n .map((part) => part.trim())\n .filter(isNonEmptyString)\n .join(', ');\n}\n\nfunction isLessThanRange(version: string, range: string): boolean {\n return !!npm.isLessThanRange?.(version, julia2npm(range));\n}\n\nfunction isValid(input: string): boolean {\n // Pkg rejects an empty specifier, alone or in a union: `\"\"`, `\"1.2,\"`.\n return (\n input.split(',').every((spec) => isNonEmptyString(spec.trim())) &&\n npm.isValid(julia2npm(input))\n );\n}\n\nfunction matches(version: string, range: string): boolean {\n return npm.matches(version, julia2npm(range));\n}\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return npm.getSatisfyingVersion(versions, julia2npm(range));\n}\n\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return npm.minSatisfyingVersion(versions, julia2npm(range));\n}\n\nfunction isSingleVersion(constraint: string): boolean {\n const trimmed = constraint.trim();\n return trimmed.startsWith('=') && npm.isVersion(trimmed.substring(1).trim());\n}\n\nfunction getPinnedValue(newVersion: string): string {\n return `=${newVersion}`;\n}\n\n// A union like `0.10, 0.11` is several specifiers; the last one carries the\n// precision and the lower bound an upgrade moves.\nfunction lastSpecifier(value: string): string {\n return value.split(',').at(-1)!.trim();\n}\n\nfunction componentCount(value: string): number {\n return lastSpecifier(value).split('.').length;\n}\n\n// dependabot's `simplified_version_spec`: `major.minor` above 1.0, `0.minor`\n// for 0.x, `0.0.patch` for 0.0.x, always written plain.\nfunction simplifiedSpec(version: string): string {\n /* v8 ignore next -- newVersion is always a full release */\n const major = npm.getMajor(version) ?? 0;\n /* v8 ignore next -- newVersion is always a full release */\n const minor = npm.getMinor(version) ?? 0;\n /* v8 ignore next -- newVersion is always a full release */\n const patch = npm.getPatch(version) ?? 0;\n if (major > 0) {\n return `${major}.${minor}`;\n }\n if (minor > 0) {\n return `0.${minor}`;\n }\n return `0.0.${patch}`;\n}\n\n// The lowest version a single specifier admits, for ordering; a bare upper\n// bound such as `<0.0.1` starts at zero.\nfunction specLowerBound(spec: string): number[] {\n if (spec.startsWith('<') || spec.startsWith('\\u2264')) {\n return [0];\n }\n /* v8 ignore next -- a specifier without digits never reaches ordering */\n const digits = regEx(/\\d+(?:\\.\\d+)*/).exec(spec)?.[0] ?? '0';\n return digits.split('.').map(Number);\n}\n\nfunction isAbove(a: number[], b: number[]): boolean {\n for (let i = 0; i < Math.max(a.length, b.length); i += 1) {\n const left = a[i] ?? 0;\n const right = b[i] ?? 0;\n if (left !== right) {\n return left > right;\n }\n }\n return false;\n}\n\n// Julia's convention is to append a new specifier rather than replace the\n// entry, keeping it in ascending order.\nfunction widen(currentValue: string, newVersion: string): string {\n if (matches(newVersion, currentValue)) {\n return currentValue;\n }\n // Keep the last specifier's `~`, `^` or `=`: a plain `1.3` is `[1.3, 2.0)`,\n // so next to `~1.2` or `=1.2.5` it would let in all of 1.x.\n const last = lastSpecifier(currentValue);\n const operator = regEx(/^(?:[~^]|=\\s*)/).exec(last)?.[0] ?? '';\n // Next to a bare major such as `5`, write `6`, not `6.0`: the entry's own\n // style, and CompatHelper's.\n const major = npm.getMajor(newVersion)!;\n let newSpec: string;\n if (operator.startsWith('=')) {\n newSpec = operator + newVersion;\n } else if (\n major > 0 &&\n regEx(/^\\d+$/).test(last.slice(operator.length).trim())\n ) {\n newSpec = `${operator}${major}`;\n } else {\n newSpec = operator + simplifiedSpec(newVersion);\n }\n const separator =\n currentValue.includes(',') && !currentValue.includes(', ') ? ',' : ', ';\n const specs = currentValue.split(',').map((spec) => spec.trim());\n const index = specs.findIndex((spec) =>\n isAbove(specLowerBound(spec), specLowerBound(newSpec)),\n );\n if (index === -1) {\n return `${currentValue}${separator}${newSpec}`;\n }\n specs.splice(index, 0, newSpec);\n return specs.join(separator);\n}\n\nfunction getNewValue({\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n}: NewValueConfig): string {\n if (!currentValue || currentValue === '*') {\n return currentValue;\n }\n // A hyphen range is a deliberate manual constraint. Anchored: a hyphen\n // without surrounding whitespace is a prerelease tag, not a range.\n if (regEx(/^\\d+(?:\\.\\d+)*\\s+-\\s+\\d+(?:\\.\\d+)*$/).test(currentValue)) {\n return currentValue;\n }\n // A compat entry carries `major.minor.patch` and nothing else: the\n // specifier grammar in Pkg.jl `src/Versions.jl` (`ver_regs`, unchanged from\n // Julia 1.0 through 1.13) takes digits only, and its bounds compare the\n // three numbers, so `1.6.10` admits `1.6.10-rc1` and a JLL's `1.6.10+0`.\n const target = newVersion.replace(regEx(/[-+].*$/), '');\n // Bare version `1.2.3` (implicit caret) under bump → simply replace.\n if (rangeStrategy === 'bump' && regEx(/^\\d+(?:\\.\\d+)*$/).test(currentValue)) {\n return target;\n }\n if (isSingleVersion(currentValue)) {\n let res = '=';\n if (currentValue.startsWith('= ')) {\n res += ' ';\n }\n res += target;\n return res;\n }\n // After the single-version branch: an exact pin is a hard constraint, and\n // appending to it would silently relax it.\n if (rangeStrategy === 'widen') {\n return widen(currentValue, target);\n }\n if (rangeStrategy === 'replace' && matches(target, currentValue)) {\n return currentValue;\n }\n // npm bumps every comparator of a union and joins them with a space, which\n // is not Julia syntax; bump the last specifier instead.\n const npmCurrentValue =\n rangeStrategy === 'bump' && currentValue.includes(',')\n ? lastSpecifier(currentValue)\n : currentValue;\n const newSemver = npm.getNewValue({\n currentValue: julia2npm(npmCurrentValue),\n rangeStrategy,\n currentVersion,\n newVersion: target,\n });\n /* v8 ignore if: defensive — npm should always return a value for inputs julia2npm produces */\n if (!newSemver) {\n logger.warn(\n { currentValue, rangeStrategy, newVersion },\n 'Could not derive julia version range',\n );\n return currentValue;\n }\n let newJulia = npm2julia(newSemver);\n // Preserve precision (number of components) when current uses `^` or `~`.\n const isTildeOrCaret =\n currentValue.startsWith('~') || currentValue.startsWith('^');\n if (\n isTildeOrCaret &&\n rangeStrategy === 'replace' &&\n newJulia.split('.').length > componentCount(currentValue)\n ) {\n newJulia = newJulia\n .split('.')\n .slice(0, componentCount(currentValue))\n .join('.');\n }\n // Reverse any caret npm added that the original didn't have, restoring\n // Julia's bare-version-is-caret default.\n if (newJulia.startsWith('^') && !currentValue.startsWith('^')) {\n const withoutCaret = newJulia.substring(1);\n // Cutting to the current precision is a `replace` behaviour; under `bump`\n // it would throw the bump away.\n newJulia =\n rangeStrategy === 'replace'\n ? withoutCaret\n .split('.')\n .slice(0, componentCount(currentValue))\n .join('.')\n : withoutCaret;\n }\n\n return newJulia;\n}\n\nfunction isBreaking(current: string, version: string): boolean {\n // Treat any unstable version as potentially breaking.\n if (!semver.is(version) || !semver.is(current)) {\n return true;\n }\n const currentMajor = getMajor(current);\n // Julia treats the leftmost non-zero digit as the breaking-change axis\n // (same as Cargo / npm caret semantics).\n if (currentMajor === 0) {\n if (getMinor(current) === 0) {\n return current !== version;\n }\n return getMinor(current) !== getMinor(version);\n }\n return currentMajor !== getMajor(version);\n}\n\nexport const api: VersioningApi = {\n ...npm,\n getNewValue,\n getPinnedValue,\n isBreaking,\n isLessThanRange,\n isSingleVersion,\n isValid,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n};\nexport default api;\n"],"mappings":"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"}
|
|
@@ -22,8 +22,12 @@ function isDigit(char) {
|
|
|
22
22
|
function isLetter(char) {
|
|
23
23
|
return regEx(/^[a-z_+]$/i).test(char);
|
|
24
24
|
}
|
|
25
|
+
function isVPrefix(char) {
|
|
26
|
+
return char === "v" || char === "V";
|
|
27
|
+
}
|
|
25
28
|
function isTransition(prevChar, nextChar) {
|
|
26
|
-
|
|
29
|
+
if (isDigit(prevChar) && isLetter(nextChar)) return true;
|
|
30
|
+
return isLetter(prevChar) && isDigit(nextChar);
|
|
27
31
|
}
|
|
28
32
|
function iterateTokens(versionStr, cb) {
|
|
29
33
|
let currentPrefix = "";
|
|
@@ -53,12 +57,12 @@ function iterateTokens(versionStr, cb) {
|
|
|
53
57
|
yieldToken();
|
|
54
58
|
currentPrefix = PREFIX_DOT;
|
|
55
59
|
currentVal = "";
|
|
56
|
-
} else if (prevChar === null && (nextChar
|
|
60
|
+
} else if (prevChar === null && isVPrefix(nextChar)) currentPrefix = nextChar;
|
|
57
61
|
else if (currentVal !== "" && isTransition(prevChar, nextChar)) {
|
|
58
62
|
yieldToken(true);
|
|
59
63
|
currentPrefix = PREFIX_HYPHEN;
|
|
60
64
|
currentVal = nextChar;
|
|
61
|
-
} else if (currentVal === "" && (currentPrefix
|
|
65
|
+
} else if (currentVal === "" && isVPrefix(currentPrefix) && !isDigit(nextChar)) {
|
|
62
66
|
currentVal = currentVal.concat(currentPrefix, nextChar);
|
|
63
67
|
currentPrefix = "";
|
|
64
68
|
} else currentVal = currentVal.concat(nextChar);
|
|
@@ -111,11 +115,15 @@ const QualifierTypes = {
|
|
|
111
115
|
Release: 6,
|
|
112
116
|
SP: 7
|
|
113
117
|
};
|
|
118
|
+
function isQualifier(token, name, shortName) {
|
|
119
|
+
if (token.val === name) return true;
|
|
120
|
+
return !!token.isTransition && token.val === shortName;
|
|
121
|
+
}
|
|
114
122
|
function qualifierType(token) {
|
|
115
123
|
const val = token.val;
|
|
116
|
-
if (
|
|
117
|
-
if (
|
|
118
|
-
if (
|
|
124
|
+
if (isQualifier(token, "alpha", "a")) return QualifierTypes.Alpha;
|
|
125
|
+
if (isQualifier(token, "beta", "b")) return QualifierTypes.Beta;
|
|
126
|
+
if (isQualifier(token, "milestone", "m")) return QualifierTypes.Milestone;
|
|
119
127
|
if (val === "rc" || val === "cr" || val === "preview") return QualifierTypes.RC;
|
|
120
128
|
if (val === "snapshot" || val === "snap") return QualifierTypes.Snapshot;
|
|
121
129
|
if (val === "" || val === "final" || val === "ga" || val === "release" || val === "latest" || val === "sr") return QualifierTypes.Release;
|
|
@@ -324,7 +332,9 @@ function autoExtendMavenRange(currentRepresentation, newValue) {
|
|
|
324
332
|
if (isPoint(range)) return `[${newValue}]`;
|
|
325
333
|
const interval = [...range].reverse().find((elem) => {
|
|
326
334
|
const { rightType, rightValue } = elem;
|
|
327
|
-
|
|
335
|
+
if (rightValue === null) return true;
|
|
336
|
+
if (rightType === "INCLUDING_POINT" && compare(rightValue, newValue) === -1) return true;
|
|
337
|
+
return rightType === "EXCLUDING_POINT" && compare(rightValue, newValue) !== 1;
|
|
328
338
|
});
|
|
329
339
|
if (!interval) return currentRepresentation;
|
|
330
340
|
const { leftValue, rightValue } = interval;
|