renovate 44.28.0 → 44.29.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/options/index.js +1 -2
- package/dist/config/options/index.js.map +1 -1
- package/dist/config/presets/index.js +39 -12
- package/dist/config/presets/index.js.map +1 -1
- package/dist/config/presets/parse.js +64 -7
- package/dist/config/presets/parse.js.map +1 -1
- package/dist/config/presets/relative.js +66 -0
- package/dist/config/presets/relative.js.map +1 -0
- package/dist/config/presets/util.js +3 -1
- package/dist/config/presets/util.js.map +1 -1
- package/dist/config/validation.js +48 -4
- package/dist/config/validation.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/logger/bunyan.js +2 -2
- package/dist/logger/bunyan.js.map +1 -1
- package/dist/logger/cmd-serializer.js +2 -1
- package/dist/logger/cmd-serializer.js.map +1 -1
- package/dist/modules/datasource/go/goproxy-parser.js +2 -2
- package/dist/modules/datasource/go/goproxy-parser.js.map +1 -1
- package/dist/modules/datasource/index.js +3 -3
- package/dist/modules/datasource/index.js.map +1 -1
- package/dist/modules/datasource/nuget/common.js +2 -1
- package/dist/modules/datasource/nuget/common.js.map +1 -1
- package/dist/modules/datasource/packagist/schema.js +2 -2
- package/dist/modules/datasource/packagist/schema.js.map +1 -1
- package/dist/modules/datasource/rpm/providers/common.js +3 -2
- package/dist/modules/datasource/rpm/providers/common.js.map +1 -1
- package/dist/modules/manager/ant/update.js +2 -1
- package/dist/modules/manager/ant/update.js.map +1 -1
- package/dist/modules/manager/bazel-module/parser/fragments.js +4 -3
- package/dist/modules/manager/bazel-module/parser/fragments.js.map +1 -1
- package/dist/modules/manager/bun/extract.js +2 -2
- package/dist/modules/manager/bun/extract.js.map +1 -1
- package/dist/modules/manager/circleci/extract.js +2 -1
- package/dist/modules/manager/circleci/extract.js.map +1 -1
- package/dist/modules/manager/deno/post.js +2 -2
- package/dist/modules/manager/deno/post.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/helm-values/extract.js +2 -1
- package/dist/modules/manager/helm-values/extract.js.map +1 -1
- package/dist/modules/manager/helm-values/util.js +3 -2
- package/dist/modules/manager/helm-values/util.js.map +1 -1
- package/dist/modules/manager/npm/extract/common/dependency.js +1 -1
- package/dist/modules/manager/npm/extract/common/dependency.js.map +1 -1
- package/dist/modules/manager/npm/extract/post/monorepo.js +3 -3
- package/dist/modules/manager/npm/extract/post/monorepo.js.map +1 -1
- package/dist/modules/manager/npm/post-update/rules.js +2 -2
- package/dist/modules/manager/npm/post-update/rules.js.map +1 -1
- package/dist/modules/manager/osgi/extract.js +2 -2
- package/dist/modules/manager/osgi/extract.js.map +1 -1
- package/dist/modules/manager/pipenv/extract.js +2 -2
- package/dist/modules/manager/pipenv/extract.js.map +1 -1
- package/dist/modules/manager/pre-commit/parsing.js +3 -2
- package/dist/modules/manager/pre-commit/parsing.js.map +1 -1
- package/dist/modules/manager/proto/schema.js +2 -1
- package/dist/modules/manager/proto/schema.js.map +1 -1
- package/dist/modules/manager/renovate-config/extract.js +16 -2
- package/dist/modules/manager/renovate-config/extract.js.map +1 -1
- package/dist/modules/manager/woodpecker/extract.js +2 -2
- package/dist/modules/manager/woodpecker/extract.js.map +1 -1
- package/dist/modules/versioning/apk/index.js +2 -1
- package/dist/modules/versioning/apk/index.js.map +1 -1
- package/dist/modules/versioning/bazel-module/bzlmod-version.js +2 -1
- package/dist/modules/versioning/bazel-module/bzlmod-version.js.map +1 -1
- package/dist/modules/versioning/bazel-module/index.js +2 -1
- package/dist/modules/versioning/bazel-module/index.js.map +1 -1
- package/dist/modules/versioning/conan/common.js +2 -1
- package/dist/modules/versioning/conan/common.js.map +1 -1
- package/dist/modules/versioning/conan/range.js +5 -3
- package/dist/modules/versioning/conan/range.js.map +1 -1
- package/dist/modules/versioning/gradle/compare.js +1 -1
- package/dist/modules/versioning/gradle/compare.js.map +1 -1
- package/dist/modules/versioning/lambda-node/index.js +2 -1
- package/dist/modules/versioning/lambda-node/index.js.map +1 -1
- package/dist/modules/versioning/maven/compare.js +4 -3
- package/dist/modules/versioning/maven/compare.js.map +1 -1
- package/dist/modules/versioning/pep440/range.js +2 -1
- package/dist/modules/versioning/pep440/range.js.map +1 -1
- package/dist/modules/versioning/pvp/index.js +2 -1
- package/dist/modules/versioning/pvp/index.js.map +1 -1
- package/dist/modules/versioning/ruby/index.js +2 -1
- package/dist/modules/versioning/ruby/index.js.map +1 -1
- package/dist/util/cache/package/impl/file.js +2 -1
- package/dist/util/cache/package/impl/file.js.map +1 -1
- package/dist/util/cache/package/legacy.js +2 -1
- package/dist/util/cache/package/legacy.js.map +1 -1
- package/dist/util/date.js +2 -1
- package/dist/util/date.js.map +1 -1
- package/dist/util/exec/docker/index.js +2 -2
- package/dist/util/exec/docker/index.js.map +1 -1
- package/dist/util/exec/index.js +2 -2
- package/dist/util/exec/index.js.map +1 -1
- package/dist/util/exec/utils.js +2 -2
- package/dist/util/exec/utils.js.map +1 -1
- package/dist/util/fingerprint.js.map +1 -1
- package/dist/util/git/index.js +3 -3
- package/dist/util/git/index.js.map +1 -1
- package/dist/util/git/instrument.js +3 -2
- package/dist/util/git/instrument.js.map +1 -1
- package/dist/util/host-rules.js +1 -1
- package/dist/util/host-rules.js.map +1 -1
- package/dist/util/http/github.js +2 -2
- package/dist/util/http/github.js.map +1 -1
- package/dist/util/object.js.map +1 -1
- package/dist/util/result.js.map +1 -1
- package/dist/util/s3.js +2 -2
- package/dist/util/s3.js.map +1 -1
- package/dist/util/schema-utils/index.js.map +1 -1
- package/dist/util/timestamp.js +2 -1
- package/dist/util/timestamp.js.map +1 -1
- package/dist/workers/global/config/parse/index.js +2 -2
- package/dist/workers/global/config/parse/index.js.map +1 -1
- package/dist/workers/global/index.js +2 -2
- package/dist/workers/global/index.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/pr/changelog/release-notes.js +2 -2
- package/dist/workers/repository/update/pr/changelog/release-notes.js.map +1 -1
- package/package.json +2 -2
- package/renovate-schema.json +2 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { logger } from "../../../logger/index.js";
|
|
2
2
|
import { parseSingleYaml } from "../../../util/yaml.js";
|
|
3
3
|
import { getDep } from "../dockerfile/extract.js";
|
|
4
|
-
import { isString } from "@sindresorhus/is";
|
|
4
|
+
import { isObject, isString } from "@sindresorhus/is";
|
|
5
5
|
//#region lib/modules/manager/woodpecker/extract.ts
|
|
6
6
|
function woodpeckerVersionDecider(woodpeckerConfig) {
|
|
7
7
|
const keys = [
|
|
@@ -21,7 +21,7 @@ function extractPackageFile(content, packageFile, extractConfig) {
|
|
|
21
21
|
logger.debug({ packageFile }, "Null config when parsing Woodpecker Configuration content");
|
|
22
22
|
return null;
|
|
23
23
|
}
|
|
24
|
-
if (
|
|
24
|
+
if (!isObject(config)) {
|
|
25
25
|
logger.debug({
|
|
26
26
|
packageFile,
|
|
27
27
|
type: typeof config
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/woodpecker/extract.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { parseSingleYaml } from '../../../util/yaml.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport type { ExtractConfig, PackageFileContent } from '../types.ts';\nimport type { WoodpeckerConfig } from './types.ts';\n\nfunction woodpeckerVersionDecider(\n woodpeckerConfig: WoodpeckerConfig,\n): (keyof WoodpeckerConfig)[] {\n const keys = ['clone', 'steps', 'pipeline', 'services'];\n return Object.keys(woodpeckerConfig).filter((key) =>\n keys.includes(key),\n ) as (keyof WoodpeckerConfig)[];\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n extractConfig: ExtractConfig,\n): PackageFileContent | null {\n logger.debug('woodpecker.extractPackageFile()');\n let config: WoodpeckerConfig;\n try {\n // TODO: use schema (#9610)\n config = parseSingleYaml(content);\n if (!config) {\n logger.debug(\n { packageFile },\n 'Null config when parsing Woodpecker Configuration content',\n );\n return null;\n }\n if (
|
|
1
|
+
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/woodpecker/extract.ts"],"sourcesContent":["import { isObject, isString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { parseSingleYaml } from '../../../util/yaml.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport type { ExtractConfig, PackageFileContent } from '../types.ts';\nimport type { WoodpeckerConfig } from './types.ts';\n\nfunction woodpeckerVersionDecider(\n woodpeckerConfig: WoodpeckerConfig,\n): (keyof WoodpeckerConfig)[] {\n const keys = ['clone', 'steps', 'pipeline', 'services'];\n return Object.keys(woodpeckerConfig).filter((key) =>\n keys.includes(key),\n ) as (keyof WoodpeckerConfig)[];\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n extractConfig: ExtractConfig,\n): PackageFileContent | null {\n logger.debug('woodpecker.extractPackageFile()');\n let config: WoodpeckerConfig;\n try {\n // TODO: use schema (#9610)\n config = parseSingleYaml(content);\n if (!config) {\n logger.debug(\n { packageFile },\n 'Null config when parsing Woodpecker Configuration content',\n );\n return null;\n }\n if (!isObject(config)) {\n logger.debug(\n { packageFile, type: typeof config },\n 'Unexpected type for Woodpecker Configuration content',\n );\n return null;\n }\n } catch (err) {\n logger.debug(\n { packageFile, err },\n 'Error parsing Woodpecker Configuration config YAML',\n );\n return null;\n }\n\n const pipelineKeys = woodpeckerVersionDecider(config);\n\n if (pipelineKeys.length === 0) {\n logger.debug({ packageFile }, \"Couldn't identify dependencies\");\n return null;\n }\n\n // Image name/tags for services are only eligible for update if they don't\n // use variables and if the image is not built locally\n const deps = pipelineKeys.flatMap((pipelineKey) =>\n Object.values(config[pipelineKey] ?? {})\n .filter((step) => isString(step?.image))\n .map((step) => getDep(step.image, true, extractConfig.registryAliases)),\n );\n\n logger.trace({ deps }, 'Woodpecker Configuration image');\n return deps.length ? { deps } : null;\n}\n"],"mappings":";;;;;AAOA,SAAS,yBACP,kBAC4B;CAC5B,MAAM,OAAO;EAAC;EAAS;EAAS;EAAY;CAAU;CACtD,OAAO,OAAO,KAAK,gBAAgB,CAAC,CAAC,QAAQ,QAC3C,KAAK,SAAS,GAAG,CACnB;AACF;AAEA,SAAgB,mBACd,SACA,aACA,eAC2B;CAC3B,OAAO,MAAM,iCAAiC;CAC9C,IAAI;CACJ,IAAI;EAEF,SAAS,gBAAgB,OAAO;EAChC,IAAI,CAAC,QAAQ;GACX,OAAO,MACL,EAAE,YAAY,GACd,2DACF;GACA,OAAO;EACT;EACA,IAAI,CAAC,SAAS,MAAM,GAAG;GACrB,OAAO,MACL;IAAE;IAAa,MAAM,OAAO;GAAO,GACnC,sDACF;GACA,OAAO;EACT;CACF,SAAS,KAAK;EACZ,OAAO,MACL;GAAE;GAAa;EAAI,GACnB,oDACF;EACA,OAAO;CACT;CAEA,MAAM,eAAe,yBAAyB,MAAM;CAEpD,IAAI,aAAa,WAAW,GAAG;EAC7B,OAAO,MAAM,EAAE,YAAY,GAAG,gCAAgC;EAC9D,OAAO;CACT;CAIA,MAAM,OAAO,aAAa,SAAS,gBACjC,OAAO,OAAO,OAAO,gBAAgB,CAAC,CAAC,CAAC,CACrC,QAAQ,SAAS,SAAS,MAAM,KAAK,CAAC,CAAC,CACvC,KAAK,SAAS,OAAO,KAAK,OAAO,MAAM,cAAc,eAAe,CAAC,CAC1E;CAEA,OAAO,MAAM,EAAE,KAAK,GAAG,gCAAgC;CACvD,OAAO,KAAK,SAAS,EAAE,KAAK,IAAI;AAClC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { regEx } from "../../../util/regex.js";
|
|
2
2
|
import { GenericVersioningApi } from "../generic.js";
|
|
3
|
+
import { isTruthy } from "@sindresorhus/is";
|
|
3
4
|
const versionRegex = regEx(/^v?(?<major>[0-9]+)(?:\.(?<minor>[0-9]+))?(?:\.(?<patch>[0-9]+))?(?<extra>(?:\.[0-9]+)*)(?<letter>[a-z])?(?:(?<prereleaseType>_alpha|_beta|_pre|_rc)(?<prereleaseNum>[0-9]*))?(?:(?<packageFixType>_cvs|_svn|_git|_hg|_p)(?<packageFixNum>[0-9]*))?(?:-r(?<releaseNum>[0-9]+))?$/);
|
|
4
5
|
const alphaNumRegex = regEx(/([a-zA-Z]+)|(\d+)/g);
|
|
5
6
|
var ApkVersioningApi = class extends GenericVersioningApi {
|
|
@@ -19,7 +20,7 @@ var ApkVersioningApi = class extends GenericVersioningApi {
|
|
|
19
20
|
if (minor) release.push(parseInt(minor, 10));
|
|
20
21
|
if (patch) release.push(parseInt(patch, 10));
|
|
21
22
|
if (extra) {
|
|
22
|
-
const extraParts = extra.substring(1).split(".").filter(
|
|
23
|
+
const extraParts = extra.substring(1).split(".").filter(isTruthy).map(Number);
|
|
23
24
|
release.push(...extraParts);
|
|
24
25
|
}
|
|
25
26
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/apk/index.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport type { GenericVersion } from '../generic.ts';\nimport { GenericVersioningApi } from '../generic.ts';\nimport type { VersioningApi } from '../types.ts';\n\nexport const id = 'apk';\nexport const displayName = 'Alpine Package Keeper (APK)';\nexport const urls = [\n '[Alpine Linux package policies](https://wiki.alpinelinux.org/wiki/Package_policies)',\n '[Alpine Package Keeper - Package pinning](https://wiki.alpinelinux.org/wiki/Alpine_Package_Keeper#Package_pinning)',\n];\nexport const supportsRanges = false;\n\n// Regex with named capture groups for APK version parsing\nconst versionRegex = regEx(\n /^v?(?<major>[0-9]+)(?:\\.(?<minor>[0-9]+))?(?:\\.(?<patch>[0-9]+))?(?<extra>(?:\\.[0-9]+)*)(?<letter>[a-z])?(?:(?<prereleaseType>_alpha|_beta|_pre|_rc)(?<prereleaseNum>[0-9]*))?(?:(?<packageFixType>_cvs|_svn|_git|_hg|_p)(?<packageFixNum>[0-9]*))?(?:-r(?<releaseNum>[0-9]+))?$/,\n);\n\n// Regex for splitting version strings into alphanumeric parts\nconst alphaNumRegex = regEx(/([a-zA-Z]+)|(\\d+)/g);\n\nexport interface ApkVersion extends GenericVersion {\n /**\n * version is the main version part: it defines the version of origin software\n * that was packaged.\n */\n version: string;\n /**\n * releaseString is used to distinguish between different versions of packaging for the\n * same upstream version.\n */\n releaseString: string;\n}\n\nclass ApkVersioningApi extends GenericVersioningApi {\n /**\n * Parse APK version format using apko's version parsing patterns\n * Based on `Apache-2.0` code in https://github.com/chainguard-dev/apko/blob/v0.30.35/pkg/apk/apk/version.go\n */\n protected _parse(version: string): ApkVersion | null {\n const match = versionRegex.exec(version);\n if (!match?.groups) {\n return null;\n }\n\n const {\n major,\n minor,\n patch,\n extra,\n letter,\n prereleaseType,\n prereleaseNum,\n packageFixType,\n packageFixNum,\n releaseNum,\n } = match.groups;\n\n const packageFixFull = packageFixType ? packageFixType + packageFixNum : '';\n\n const minorPatchStr =\n (minor ? `.${minor}` : '') + (patch ? `.${patch}` : '') + extra;\n\n // For version comparison, we only include the base version + package fix, not prerelease\n const versionStr = major + minorPatchStr + (letter ?? '') + packageFixFull;\n\n let prerelease: string | undefined;\n if (prereleaseType) {\n prerelease = prereleaseType.substring(1) + prereleaseNum;\n }\n\n // Extract numeric parts for major/minor/patch/extra\n const release = [parseInt(major, 10)];\n if (minor) {\n release.push(parseInt(minor, 10));\n }\n if (patch) {\n release.push(parseInt(patch, 10));\n }\n // Handle any additional version parts (e.g., 1.2.3.4.5)\n if (extra) {\n const extraParts = extra\n .substring(1)\n .split('.')\n .filter(Boolean)\n .map(Number);\n release.push(...extraParts);\n }\n\n // Extract release string (just the number part)\n const releaseString = releaseNum ?? '';\n\n return {\n version: versionStr,\n releaseString,\n release,\n prerelease,\n };\n }\n\n /**\n * Compare two APK versions according to Alpine Linux rules\n */\n protected override _compare(version: string, other: string): number {\n const parsed1 = this._parse(version);\n const parsed2 = this._parse(other);\n\n if (!(parsed1 && parsed2)) {\n return 1;\n }\n\n // Compare version parts (without release number)\n const versionCompare = this._compareVersionParts(\n parsed1.version,\n parsed2.version,\n );\n if (versionCompare !== 0) {\n return versionCompare;\n }\n\n // Compare prerelease identifiers\n const prerelease1 = parsed1.prerelease;\n const prerelease2 = parsed2.prerelease;\n\n if (prerelease1 || prerelease2) {\n if (!prerelease1) {\n return -1; // Version without prerelease < version with prerelease (APK-specific)\n }\n if (!prerelease2) {\n return 1; // Version with prerelease > version without (APK-specific)\n }\n // Both have prerelease identifiers, compare them\n const prereleaseCompare = prerelease1.localeCompare(prerelease2);\n if (prereleaseCompare !== 0) {\n return prereleaseCompare;\n }\n }\n\n // Compare release numbers\n const release1 = parsed1.releaseString || '';\n const release2 = parsed2.releaseString || '';\n\n // If one has a release number and the other doesn't, the one with release number is greater\n if (release1 && !release2) {\n return 1;\n }\n if (!release1 && release2) {\n return -1;\n }\n\n // If both have release numbers or neither has release numbers, compare them\n const releaseCompare = this._compareVersionParts(\n release1 || '0',\n release2 || '0',\n );\n return releaseCompare;\n }\n\n /**\n * Compare version parts using APK's version comparison rules\n */\n private _compareVersionParts(v1: string, v2: string): number {\n if (v1 === v2) {\n return 0;\n }\n const matchesv1 = v1.match(alphaNumRegex)!;\n const matchesv2 = v2.match(alphaNumRegex)!;\n const matches = Math.min(matchesv1.length, matchesv2.length);\n\n for (let i = 0; i < matches; i++) {\n const matchv1 = matchesv1[i];\n const matchv2 = matchesv2[i];\n\n if (matchv1 && /^\\d+$/.test(matchv1)) {\n if (!matchv2 || !/^\\d+$/.test(matchv2)) {\n return 1;\n }\n const num1 = parseInt(matchv1, 10);\n const num2 = parseInt(matchv2, 10);\n if (num1 !== num2) {\n return num1 - num2;\n }\n } else if (matchv2 && /^\\d+$/.test(matchv2)) {\n return -1;\n } else if (matchv1 !== matchv2) {\n return matchv1.localeCompare(matchv2);\n }\n }\n\n if (matchesv1.length !== matchesv2.length) {\n const maxLength = Math.max(matchesv1.length, matchesv2.length);\n for (let i = matches; i < maxLength; i++) {\n const matchv1 = matchesv1[i];\n const matchv2 = matchesv2[i];\n\n if (matchv1 && /^\\d+$/.test(matchv1)) {\n return 1;\n }\n if (matchv2 && /^\\d+$/.test(matchv2)) {\n return -1;\n }\n if (matchv1) {\n return -1;\n }\n return 1;\n }\n }\n\n return 0;\n }\n\n override isValid(version: string): boolean {\n if (!version) {\n return false;\n }\n // Strip any operators (=, >, <, ~) before validation\n const cleanVersion = version.replace(/^[=><~][=]?/, '');\n const parsed = this._parse(cleanVersion);\n return parsed !== null;\n }\n\n override isSingleVersion(version: string): boolean {\n if (!version) {\n return false;\n }\n // Range constraints (>, >=, <, <=, ~) are not single versions\n if (/^[><~]/.test(version)) {\n return false;\n }\n // Exact versions (starting with = or no operator) are single versions\n return this.isValid(version);\n }\n\n override isStable(version: string): boolean {\n if (!version) {\n return false;\n }\n // Strip any operators (=, >, <, ~) before checking stability\n const cleanVersion = version.replace(/^[=><~][=]?/, '');\n const parsed = this._parse(cleanVersion);\n if (!parsed) {\n return false;\n }\n // Consider versions without prerelease identifiers as stable\n return !parsed.prerelease;\n }\n\n override getSatisfyingVersion(\n versions: string[],\n range: string,\n ): string | null {\n // Handle range expressions like >5.2.37-r0, <5.2.37-r0, ~5.2.37-r0, etc.\n const rangeMatch = /^([><=~]+)(.+)$/.exec(range);\n if (!rangeMatch) {\n // If no range operator, look for exact match\n return versions.find((v) => this.equals(v, range)) ?? null;\n }\n\n const [, operator, targetVersion] = rangeMatch;\n\n // Filter versions that satisfy the range\n const satisfyingVersions = versions.filter((version) => {\n if (!this.isValid(version) || !this.isValid(targetVersion)) {\n return false;\n }\n\n switch (operator) {\n case '>':\n return this.isGreaterThan(version, targetVersion);\n case '>=':\n return (\n this.isGreaterThan(version, targetVersion) ||\n this.equals(version, targetVersion)\n );\n case '<':\n return this.isLessThanRange(version, targetVersion);\n case '<=':\n return (\n this.isLessThanRange(version, targetVersion) ||\n this.equals(version, targetVersion)\n );\n case '=':\n case '==':\n return this.equals(version, targetVersion);\n case '~': {\n const targetParsed = this._parse(targetVersion)!;\n const versionParsed = this._parse(version)!;\n\n // Must have same major and minor versions\n if (\n targetParsed.release[0] !== versionParsed.release[0] ||\n targetParsed.release[1] !== versionParsed.release[1]\n ) {\n return false;\n }\n\n // Version must be >= target\n return (\n this.isGreaterThan(version, targetVersion) ||\n this.equals(version, targetVersion)\n );\n }\n }\n // Fallback for unhandled operator combinations like >>, <>, ><, ~~~\n // These match the regex but aren't semantically valid APK range operators\n return false;\n });\n\n if (satisfyingVersions.length === 0) {\n return null;\n }\n\n // Return the highest satisfying version\n return satisfyingVersions.sort((a, b) => this.sortVersions(b, a))[0];\n }\n\n override getMajor(version: string): number | null {\n if (!version) {\n return null;\n }\n // Strip any operators (=, >, <, ~) before parsing\n const cleanVersion = version.replace(/^[=><~][=]?/, '');\n const parsed = this._parse(cleanVersion);\n return parsed?.release[0] ?? null;\n }\n\n override getMinor(version: string): number | null {\n if (!version) {\n return null;\n }\n // Strip any operators (=, >, <, ~) before parsing\n const cleanVersion = version.replace(/^[=><~][=]?/, '');\n const parsed = this._parse(cleanVersion);\n return parsed?.release[1] ?? null;\n }\n\n override getPatch(version: string): number | null {\n if (!version) {\n return null;\n }\n // Strip any operators (=, >, <, ~) before parsing\n const cleanVersion = version.replace(/^[=><~][=]?/, '');\n const parsed = this._parse(cleanVersion);\n if (!parsed) {\n return null;\n }\n return parsed.release[2] ?? null;\n }\n\n override getNewValue({\n currentValue,\n newVersion,\n }: {\n currentValue: string;\n rangeStrategy?: string;\n currentVersion?: string;\n newVersion: string;\n }): string | null {\n // APK packages in apko.yaml only use exact versions\n // currentValue is stored without the = operator for cleaner PR display\n const hasRevision = /-r\\d+$/.test(currentValue);\n\n // If current version has no revision, strip revision from newVersion\n // This ensures both newValue and the displayed version are clean\n if (!hasRevision) {\n return newVersion.replace(/-r\\d+$/, '');\n }\n\n // If current version has revision, keep revision in newVersion\n return newVersion;\n }\n\n // Override to provide clean version for PR titles and display\n override sortVersions(a: string, b: string): number {\n // Strip = prefix if present for comparison\n const cleanA = a.replace(/^=/, '');\n const cleanB = b.replace(/^=/, '');\n return super.sortVersions(cleanA, cleanB);\n }\n}\n\nexport const api: VersioningApi = new ApkVersioningApi();\n\nexport default api;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/apk/index.ts"],"sourcesContent":["import { isTruthy } from '@sindresorhus/is';\nimport { regEx } from '../../../util/regex.ts';\nimport type { GenericVersion } from '../generic.ts';\nimport { GenericVersioningApi } from '../generic.ts';\nimport type { VersioningApi } from '../types.ts';\n\nexport const id = 'apk';\nexport const displayName = 'Alpine Package Keeper (APK)';\nexport const urls = [\n '[Alpine Linux package policies](https://wiki.alpinelinux.org/wiki/Package_policies)',\n '[Alpine Package Keeper - Package pinning](https://wiki.alpinelinux.org/wiki/Alpine_Package_Keeper#Package_pinning)',\n];\nexport const supportsRanges = false;\n\n// Regex with named capture groups for APK version parsing\nconst versionRegex = regEx(\n /^v?(?<major>[0-9]+)(?:\\.(?<minor>[0-9]+))?(?:\\.(?<patch>[0-9]+))?(?<extra>(?:\\.[0-9]+)*)(?<letter>[a-z])?(?:(?<prereleaseType>_alpha|_beta|_pre|_rc)(?<prereleaseNum>[0-9]*))?(?:(?<packageFixType>_cvs|_svn|_git|_hg|_p)(?<packageFixNum>[0-9]*))?(?:-r(?<releaseNum>[0-9]+))?$/,\n);\n\n// Regex for splitting version strings into alphanumeric parts\nconst alphaNumRegex = regEx(/([a-zA-Z]+)|(\\d+)/g);\n\nexport interface ApkVersion extends GenericVersion {\n /**\n * version is the main version part: it defines the version of origin software\n * that was packaged.\n */\n version: string;\n /**\n * releaseString is used to distinguish between different versions of packaging for the\n * same upstream version.\n */\n releaseString: string;\n}\n\nclass ApkVersioningApi extends GenericVersioningApi {\n /**\n * Parse APK version format using apko's version parsing patterns\n * Based on `Apache-2.0` code in https://github.com/chainguard-dev/apko/blob/v0.30.35/pkg/apk/apk/version.go\n */\n protected _parse(version: string): ApkVersion | null {\n const match = versionRegex.exec(version);\n if (!match?.groups) {\n return null;\n }\n\n const {\n major,\n minor,\n patch,\n extra,\n letter,\n prereleaseType,\n prereleaseNum,\n packageFixType,\n packageFixNum,\n releaseNum,\n } = match.groups;\n\n const packageFixFull = packageFixType ? packageFixType + packageFixNum : '';\n\n const minorPatchStr =\n (minor ? `.${minor}` : '') + (patch ? `.${patch}` : '') + extra;\n\n // For version comparison, we only include the base version + package fix, not prerelease\n const versionStr = major + minorPatchStr + (letter ?? '') + packageFixFull;\n\n let prerelease: string | undefined;\n if (prereleaseType) {\n prerelease = prereleaseType.substring(1) + prereleaseNum;\n }\n\n // Extract numeric parts for major/minor/patch/extra\n const release = [parseInt(major, 10)];\n if (minor) {\n release.push(parseInt(minor, 10));\n }\n if (patch) {\n release.push(parseInt(patch, 10));\n }\n // Handle any additional version parts (e.g., 1.2.3.4.5)\n if (extra) {\n const extraParts = extra\n .substring(1)\n .split('.')\n .filter(isTruthy)\n .map(Number);\n release.push(...extraParts);\n }\n\n // Extract release string (just the number part)\n const releaseString = releaseNum ?? '';\n\n return {\n version: versionStr,\n releaseString,\n release,\n prerelease,\n };\n }\n\n /**\n * Compare two APK versions according to Alpine Linux rules\n */\n protected override _compare(version: string, other: string): number {\n const parsed1 = this._parse(version);\n const parsed2 = this._parse(other);\n\n if (!(parsed1 && parsed2)) {\n return 1;\n }\n\n // Compare version parts (without release number)\n const versionCompare = this._compareVersionParts(\n parsed1.version,\n parsed2.version,\n );\n if (versionCompare !== 0) {\n return versionCompare;\n }\n\n // Compare prerelease identifiers\n const prerelease1 = parsed1.prerelease;\n const prerelease2 = parsed2.prerelease;\n\n if (prerelease1 || prerelease2) {\n if (!prerelease1) {\n return -1; // Version without prerelease < version with prerelease (APK-specific)\n }\n if (!prerelease2) {\n return 1; // Version with prerelease > version without (APK-specific)\n }\n // Both have prerelease identifiers, compare them\n const prereleaseCompare = prerelease1.localeCompare(prerelease2);\n if (prereleaseCompare !== 0) {\n return prereleaseCompare;\n }\n }\n\n // Compare release numbers\n const release1 = parsed1.releaseString || '';\n const release2 = parsed2.releaseString || '';\n\n // If one has a release number and the other doesn't, the one with release number is greater\n if (release1 && !release2) {\n return 1;\n }\n if (!release1 && release2) {\n return -1;\n }\n\n // If both have release numbers or neither has release numbers, compare them\n const releaseCompare = this._compareVersionParts(\n release1 || '0',\n release2 || '0',\n );\n return releaseCompare;\n }\n\n /**\n * Compare version parts using APK's version comparison rules\n */\n private _compareVersionParts(v1: string, v2: string): number {\n if (v1 === v2) {\n return 0;\n }\n const matchesv1 = v1.match(alphaNumRegex)!;\n const matchesv2 = v2.match(alphaNumRegex)!;\n const matches = Math.min(matchesv1.length, matchesv2.length);\n\n for (let i = 0; i < matches; i++) {\n const matchv1 = matchesv1[i];\n const matchv2 = matchesv2[i];\n\n if (matchv1 && /^\\d+$/.test(matchv1)) {\n if (!matchv2 || !/^\\d+$/.test(matchv2)) {\n return 1;\n }\n const num1 = parseInt(matchv1, 10);\n const num2 = parseInt(matchv2, 10);\n if (num1 !== num2) {\n return num1 - num2;\n }\n } else if (matchv2 && /^\\d+$/.test(matchv2)) {\n return -1;\n } else if (matchv1 !== matchv2) {\n return matchv1.localeCompare(matchv2);\n }\n }\n\n if (matchesv1.length !== matchesv2.length) {\n const maxLength = Math.max(matchesv1.length, matchesv2.length);\n for (let i = matches; i < maxLength; i++) {\n const matchv1 = matchesv1[i];\n const matchv2 = matchesv2[i];\n\n if (matchv1 && /^\\d+$/.test(matchv1)) {\n return 1;\n }\n if (matchv2 && /^\\d+$/.test(matchv2)) {\n return -1;\n }\n if (matchv1) {\n return -1;\n }\n return 1;\n }\n }\n\n return 0;\n }\n\n override isValid(version: string): boolean {\n if (!version) {\n return false;\n }\n // Strip any operators (=, >, <, ~) before validation\n const cleanVersion = version.replace(/^[=><~][=]?/, '');\n const parsed = this._parse(cleanVersion);\n return parsed !== null;\n }\n\n override isSingleVersion(version: string): boolean {\n if (!version) {\n return false;\n }\n // Range constraints (>, >=, <, <=, ~) are not single versions\n if (/^[><~]/.test(version)) {\n return false;\n }\n // Exact versions (starting with = or no operator) are single versions\n return this.isValid(version);\n }\n\n override isStable(version: string): boolean {\n if (!version) {\n return false;\n }\n // Strip any operators (=, >, <, ~) before checking stability\n const cleanVersion = version.replace(/^[=><~][=]?/, '');\n const parsed = this._parse(cleanVersion);\n if (!parsed) {\n return false;\n }\n // Consider versions without prerelease identifiers as stable\n return !parsed.prerelease;\n }\n\n override getSatisfyingVersion(\n versions: string[],\n range: string,\n ): string | null {\n // Handle range expressions like >5.2.37-r0, <5.2.37-r0, ~5.2.37-r0, etc.\n const rangeMatch = /^([><=~]+)(.+)$/.exec(range);\n if (!rangeMatch) {\n // If no range operator, look for exact match\n return versions.find((v) => this.equals(v, range)) ?? null;\n }\n\n const [, operator, targetVersion] = rangeMatch;\n\n // Filter versions that satisfy the range\n const satisfyingVersions = versions.filter((version) => {\n if (!this.isValid(version) || !this.isValid(targetVersion)) {\n return false;\n }\n\n switch (operator) {\n case '>':\n return this.isGreaterThan(version, targetVersion);\n case '>=':\n return (\n this.isGreaterThan(version, targetVersion) ||\n this.equals(version, targetVersion)\n );\n case '<':\n return this.isLessThanRange(version, targetVersion);\n case '<=':\n return (\n this.isLessThanRange(version, targetVersion) ||\n this.equals(version, targetVersion)\n );\n case '=':\n case '==':\n return this.equals(version, targetVersion);\n case '~': {\n const targetParsed = this._parse(targetVersion)!;\n const versionParsed = this._parse(version)!;\n\n // Must have same major and minor versions\n if (\n targetParsed.release[0] !== versionParsed.release[0] ||\n targetParsed.release[1] !== versionParsed.release[1]\n ) {\n return false;\n }\n\n // Version must be >= target\n return (\n this.isGreaterThan(version, targetVersion) ||\n this.equals(version, targetVersion)\n );\n }\n }\n // Fallback for unhandled operator combinations like >>, <>, ><, ~~~\n // These match the regex but aren't semantically valid APK range operators\n return false;\n });\n\n if (satisfyingVersions.length === 0) {\n return null;\n }\n\n // Return the highest satisfying version\n return satisfyingVersions.sort((a, b) => this.sortVersions(b, a))[0];\n }\n\n override getMajor(version: string): number | null {\n if (!version) {\n return null;\n }\n // Strip any operators (=, >, <, ~) before parsing\n const cleanVersion = version.replace(/^[=><~][=]?/, '');\n const parsed = this._parse(cleanVersion);\n return parsed?.release[0] ?? null;\n }\n\n override getMinor(version: string): number | null {\n if (!version) {\n return null;\n }\n // Strip any operators (=, >, <, ~) before parsing\n const cleanVersion = version.replace(/^[=><~][=]?/, '');\n const parsed = this._parse(cleanVersion);\n return parsed?.release[1] ?? null;\n }\n\n override getPatch(version: string): number | null {\n if (!version) {\n return null;\n }\n // Strip any operators (=, >, <, ~) before parsing\n const cleanVersion = version.replace(/^[=><~][=]?/, '');\n const parsed = this._parse(cleanVersion);\n if (!parsed) {\n return null;\n }\n return parsed.release[2] ?? null;\n }\n\n override getNewValue({\n currentValue,\n newVersion,\n }: {\n currentValue: string;\n rangeStrategy?: string;\n currentVersion?: string;\n newVersion: string;\n }): string | null {\n // APK packages in apko.yaml only use exact versions\n // currentValue is stored without the = operator for cleaner PR display\n const hasRevision = /-r\\d+$/.test(currentValue);\n\n // If current version has no revision, strip revision from newVersion\n // This ensures both newValue and the displayed version are clean\n if (!hasRevision) {\n return newVersion.replace(/-r\\d+$/, '');\n }\n\n // If current version has revision, keep revision in newVersion\n return newVersion;\n }\n\n // Override to provide clean version for PR titles and display\n override sortVersions(a: string, b: string): number {\n // Strip = prefix if present for comparison\n const cleanA = a.replace(/^=/, '');\n const cleanB = b.replace(/^=/, '');\n return super.sortVersions(cleanA, cleanB);\n }\n}\n\nexport const api: VersioningApi = new ApkVersioningApi();\n\nexport default api;\n"],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isString } from "@sindresorhus/is";
|
|
1
2
|
//#region lib/modules/versioning/bazel-module/bzlmod-version.ts
|
|
2
3
|
/**
|
|
3
4
|
* @fileoverview Contains classes that represent a Bazel module version.
|
|
@@ -64,7 +65,7 @@ var VersionPart = class VersionPart extends Array {
|
|
|
64
65
|
*/
|
|
65
66
|
static create(...items) {
|
|
66
67
|
const idents = items.map((item) => {
|
|
67
|
-
if (
|
|
68
|
+
if (isString(item)) return new Identifier(item);
|
|
68
69
|
return item;
|
|
69
70
|
});
|
|
70
71
|
const vp = new VersionPart();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bzlmod-version.js","names":[],"sources":["../../../../lib/modules/versioning/bazel-module/bzlmod-version.ts"],"sourcesContent":["/**\n * @fileoverview Contains classes that represent a Bazel module version.\n */\n\n/**\n * Represents a single value in a VersionPart. For example, the version string\n * `1.2.3` has three identifiers: `1`, `2`, `3`.\n */\nexport class Identifier {\n /**\n * Returns the identifier as a string.\n */\n readonly asString: string;\n\n /**\n * If the identifier only contains digits, this is the numeric value.\n * Otherwise, it is `0`.\n */\n readonly asNumber: number;\n\n /**\n * Specifies whether the identifier only contains digits.\n */\n readonly isDigitsOnly: boolean;\n\n /**\n * Regular expression used to identify whether an identifier value only\n * contains digits.\n */\n static readonly digitsOnlyMatcher = /^[0-9]+$/;\n\n /**\n * @param value The value that is parsed for the Bazel module version parts.\n */\n constructor(value: string) {\n if (value === '') {\n throw new Error('Identifier value cannot be empty.');\n }\n this.asString = value;\n if (Identifier.digitsOnlyMatcher.test(value)) {\n this.isDigitsOnly = true;\n this.asNumber = parseInt(value, 10);\n } else {\n this.isDigitsOnly = false;\n this.asNumber = 0;\n }\n }\n\n /**\n * Determines whether this identifier and another identifier are equal.\n */\n equals(other: Identifier): boolean {\n return this.asString === other.asString;\n }\n\n /**\n * Determines whether this identifier comes before the other identifier.\n */\n isLessThan(other: Identifier): boolean {\n // This logic mirrors the comparison logic in\n // https://cs.opensource.google/bazel/bazel/+/refs/heads/master:src/main/java/com/google/devtools/build/lib/bazel/bzlmod/Version.java\n // isDigitsOnly: true first\n if (this.isDigitsOnly !== other.isDigitsOnly) {\n return this.isDigitsOnly;\n }\n if (this.asNumber !== other.asNumber) {\n return this.asNumber < other.asNumber;\n }\n return this.asString < other.asString;\n }\n}\n\n/**\n * A collection of {@link Identifier} values that represent a portion of a\n * Bazel module version.\n */\nexport class VersionPart extends Array<Identifier> {\n /**\n * Creates a {@link VersionPart} populated with the provided identifiers.\n */\n static create(...items: (Identifier | string)[]): VersionPart {\n const idents = items.map((item) => {\n if (typeof item === 'string') {\n return new Identifier(item);\n }\n return item;\n });\n const vp = new VersionPart();\n vp.push(...idents);\n return vp;\n }\n\n /**\n * The string representation of the version part.\n */\n get asString(): string {\n return this.map((ident) => ident.asString).join('.');\n }\n\n /**\n * Specifies whether this contains any identifiers.\n */\n get isEmpty(): boolean {\n return this.length === 0;\n }\n\n /**\n * Returns the equivalent of the a Semver major value.\n */\n get major(): number {\n return this.length > 0 ? this[0].asNumber : 0;\n }\n\n /**\n * Returns the equivalent of the a Semver minor value.\n */\n get minor(): number {\n return this.length > 1 ? this[1].asNumber : 0;\n }\n\n /**\n * Returns the equivalent of the a Semver patch value.\n */\n get patch(): number {\n return this.length > 2 ? this[2].asNumber : 0;\n }\n\n /**\n * Determines whether this version part is equal to the other.\n */\n equals(other: VersionPart): boolean {\n if (this.length !== other.length) {\n return false;\n }\n for (let i = 0; i < this.length; i++) {\n const a = this[i];\n const b = other[i];\n if (!a.equals(b)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Determines whether this version part comes before the other.\n */\n isLessThan(other: VersionPart): boolean {\n // This logic mirrors the comparison logic in\n // https://cs.opensource.google/bazel/bazel/+/refs/heads/master:src/main/java/com/google/devtools/build/lib/bazel/bzlmod/Version.java\n if (this.equals(other)) {\n return false;\n }\n // Non-empty are first\n if (this.length === 0 && other.length !== 0) {\n return false;\n }\n if (other.length === 0 && this.length !== 0) {\n return true;\n }\n const shortestLen = this.length < other.length ? this.length : other.length;\n for (let i = 0; i < shortestLen; i++) {\n const a = this[i];\n const b = other[i];\n if (!a.equals(b)) {\n return a.isLessThan(b);\n }\n }\n return this.length < other.length;\n }\n}\n\n// Represents the capture groups produced by BzlmodVersion.versionMatcher.\ninterface VersionRegexResult {\n release: string;\n prerelease: string | undefined;\n build: string | undefined;\n}\n\n/**\n * Represents a version in the Bazel module system. The version format we support is\n * `RELEASE[-PRERELEASE][+BUILD]`, where `RELEASE`, `PRERELEASE`, and `BUILD` are\n * each a sequence of \"identifiers\" (defined as a non-empty sequence of ASCII alphanumerical\n * characters and hyphens) separated by dots. The `RELEASE` part may not contain hyphens.\n *\n * Otherwise, this format is identical to SemVer, especially in terms of the comparison algorithm\n * (https://semver.org/#spec-item-11). In other words, this format is intentionally looser than\n * SemVer; in particular:\n *\n * - the \"release\" part isn't limited to exactly 3 segments (major, minor, patch), but can be\n * fewer or more;\n * - each segment in the \"release\" part can be identifiers instead of just numbers (so letters\n * are also allowed -- although hyphens are not).\n *\n * Any valid SemVer version is a valid Bazel module version. Additionally, two SemVer versions\n * `a` and `b` compare `a < b` iff the same holds when they're compared as Bazel * module versions.\n *\n * The special \"empty string\" version can also be used, and compares higher than everything else.\n * It signifies that there is a NonRegistryOverride for a module.\n */\nexport class BzlmodVersion {\n readonly original: string;\n readonly release: VersionPart;\n readonly prerelease: VersionPart;\n readonly build: VersionPart;\n\n /**\n * The regular expression that identifies a valid Bazel module version.\n */\n static readonly versionMatcher =\n /^(?<release>[a-zA-Z0-9.]+)(?:-(?<prerelease>[a-zA-Z0-9.-]+))?(?:\\+(?<build>[a-zA-Z0-9.-]+))?$/;\n\n /**\n * @param version The string that is parsed for the Bazel module version\n * values.\n */\n constructor(version: string) {\n this.original = version;\n if (version === '') {\n this.release = VersionPart.create();\n this.prerelease = VersionPart.create();\n this.build = VersionPart.create();\n return;\n }\n const vparts: Partial<VersionRegexResult> | undefined =\n BzlmodVersion.versionMatcher.exec(version)?.groups;\n if (!vparts) {\n throw new Error(`Invalid Bazel module version: ${version}`);\n }\n // The regex check above ensures that we will have a release group.\n const rparts = vparts.release!.split('.');\n this.release = VersionPart.create(...rparts);\n const pparts = vparts.prerelease ? vparts.prerelease.split('.') : [];\n this.prerelease = VersionPart.create(...pparts);\n // Do not parse the build value. Treat it as a single value.\n const bparts = vparts.build ? [vparts.build] : [];\n this.build = VersionPart.create(...bparts);\n }\n\n /**\n * Specifies whether this is a pre-release version.\n */\n get isPrerelease(): boolean {\n return !this.prerelease.isEmpty;\n }\n\n // Comparison\n\n /**\n * Determines whether this Bazel module version is equal to the other.\n *\n * @param other The other version for the comparison.\n * @param ignoreBuild? If specified, determines whether the build value is\n * evaluated as part of the equality check. This is useful when\n * determining precedence.\n */\n equals(other: BzlmodVersion, ignoreBuild?: boolean): boolean {\n if (ignoreBuild) {\n return (\n this.release.equals(other.release) &&\n this.prerelease.equals(other.prerelease)\n );\n }\n return (\n this.release.equals(other.release) &&\n this.prerelease.equals(other.prerelease) &&\n this.build.equals(other.build)\n );\n }\n\n /**\n * Determines whether this Bazel module version comes before the other.\n */\n isLessThan(other: BzlmodVersion): boolean {\n // This logic mirrors the comparison logic in\n // https://cs.opensource.google/bazel/bazel/+/refs/heads/master:src/main/java/com/google/devtools/build/lib/bazel/bzlmod/Version.java\n if (this.release.isLessThan(other.release)) {\n return true;\n }\n // Ensure that prerelease is listed before regular releases\n if (this.isPrerelease && !other.isPrerelease) {\n return true;\n }\n if (this.prerelease.isLessThan(other.prerelease)) {\n return true;\n }\n // NOTE: We ignore the build value for precedence comparison per the Semver spec.\n // https://semver.org/#spec-item-10\n return false;\n }\n\n /**\n * Determines whether this Bazel module version comes after the other.\n */\n isGreaterThan(other: BzlmodVersion): boolean {\n return BzlmodVersion.defaultCompare(this, other) === 1;\n }\n\n /**\n * Evaluates two Bazel module versions and returns a value specifying whether\n * a < b (-1), a == b (0), or a > b (1).\n */\n static defaultCompare(a: BzlmodVersion, b: BzlmodVersion): number {\n if (a.equals(b, true)) {\n return 0;\n }\n if (a.isLessThan(b)) {\n return -1;\n }\n return 1;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bzlmod-version.js","names":[],"sources":["../../../../lib/modules/versioning/bazel-module/bzlmod-version.ts"],"sourcesContent":["/**\n * @fileoverview Contains classes that represent a Bazel module version.\n */\nimport { isString } from '@sindresorhus/is';\n\n/**\n * Represents a single value in a VersionPart. For example, the version string\n * `1.2.3` has three identifiers: `1`, `2`, `3`.\n */\nexport class Identifier {\n /**\n * Returns the identifier as a string.\n */\n readonly asString: string;\n\n /**\n * If the identifier only contains digits, this is the numeric value.\n * Otherwise, it is `0`.\n */\n readonly asNumber: number;\n\n /**\n * Specifies whether the identifier only contains digits.\n */\n readonly isDigitsOnly: boolean;\n\n /**\n * Regular expression used to identify whether an identifier value only\n * contains digits.\n */\n static readonly digitsOnlyMatcher = /^[0-9]+$/;\n\n /**\n * @param value The value that is parsed for the Bazel module version parts.\n */\n constructor(value: string) {\n if (value === '') {\n throw new Error('Identifier value cannot be empty.');\n }\n this.asString = value;\n if (Identifier.digitsOnlyMatcher.test(value)) {\n this.isDigitsOnly = true;\n this.asNumber = parseInt(value, 10);\n } else {\n this.isDigitsOnly = false;\n this.asNumber = 0;\n }\n }\n\n /**\n * Determines whether this identifier and another identifier are equal.\n */\n equals(other: Identifier): boolean {\n return this.asString === other.asString;\n }\n\n /**\n * Determines whether this identifier comes before the other identifier.\n */\n isLessThan(other: Identifier): boolean {\n // This logic mirrors the comparison logic in\n // https://cs.opensource.google/bazel/bazel/+/refs/heads/master:src/main/java/com/google/devtools/build/lib/bazel/bzlmod/Version.java\n // isDigitsOnly: true first\n if (this.isDigitsOnly !== other.isDigitsOnly) {\n return this.isDigitsOnly;\n }\n if (this.asNumber !== other.asNumber) {\n return this.asNumber < other.asNumber;\n }\n return this.asString < other.asString;\n }\n}\n\n/**\n * A collection of {@link Identifier} values that represent a portion of a\n * Bazel module version.\n */\nexport class VersionPart extends Array<Identifier> {\n /**\n * Creates a {@link VersionPart} populated with the provided identifiers.\n */\n static create(...items: (Identifier | string)[]): VersionPart {\n const idents = items.map((item) => {\n if (isString(item)) {\n return new Identifier(item);\n }\n return item;\n });\n const vp = new VersionPart();\n vp.push(...idents);\n return vp;\n }\n\n /**\n * The string representation of the version part.\n */\n get asString(): string {\n return this.map((ident) => ident.asString).join('.');\n }\n\n /**\n * Specifies whether this contains any identifiers.\n */\n get isEmpty(): boolean {\n return this.length === 0;\n }\n\n /**\n * Returns the equivalent of the a Semver major value.\n */\n get major(): number {\n return this.length > 0 ? this[0].asNumber : 0;\n }\n\n /**\n * Returns the equivalent of the a Semver minor value.\n */\n get minor(): number {\n return this.length > 1 ? this[1].asNumber : 0;\n }\n\n /**\n * Returns the equivalent of the a Semver patch value.\n */\n get patch(): number {\n return this.length > 2 ? this[2].asNumber : 0;\n }\n\n /**\n * Determines whether this version part is equal to the other.\n */\n equals(other: VersionPart): boolean {\n if (this.length !== other.length) {\n return false;\n }\n for (let i = 0; i < this.length; i++) {\n const a = this[i];\n const b = other[i];\n if (!a.equals(b)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Determines whether this version part comes before the other.\n */\n isLessThan(other: VersionPart): boolean {\n // This logic mirrors the comparison logic in\n // https://cs.opensource.google/bazel/bazel/+/refs/heads/master:src/main/java/com/google/devtools/build/lib/bazel/bzlmod/Version.java\n if (this.equals(other)) {\n return false;\n }\n // Non-empty are first\n if (this.length === 0 && other.length !== 0) {\n return false;\n }\n if (other.length === 0 && this.length !== 0) {\n return true;\n }\n const shortestLen = this.length < other.length ? this.length : other.length;\n for (let i = 0; i < shortestLen; i++) {\n const a = this[i];\n const b = other[i];\n if (!a.equals(b)) {\n return a.isLessThan(b);\n }\n }\n return this.length < other.length;\n }\n}\n\n// Represents the capture groups produced by BzlmodVersion.versionMatcher.\ninterface VersionRegexResult {\n release: string;\n prerelease: string | undefined;\n build: string | undefined;\n}\n\n/**\n * Represents a version in the Bazel module system. The version format we support is\n * `RELEASE[-PRERELEASE][+BUILD]`, where `RELEASE`, `PRERELEASE`, and `BUILD` are\n * each a sequence of \"identifiers\" (defined as a non-empty sequence of ASCII alphanumerical\n * characters and hyphens) separated by dots. The `RELEASE` part may not contain hyphens.\n *\n * Otherwise, this format is identical to SemVer, especially in terms of the comparison algorithm\n * (https://semver.org/#spec-item-11). In other words, this format is intentionally looser than\n * SemVer; in particular:\n *\n * - the \"release\" part isn't limited to exactly 3 segments (major, minor, patch), but can be\n * fewer or more;\n * - each segment in the \"release\" part can be identifiers instead of just numbers (so letters\n * are also allowed -- although hyphens are not).\n *\n * Any valid SemVer version is a valid Bazel module version. Additionally, two SemVer versions\n * `a` and `b` compare `a < b` iff the same holds when they're compared as Bazel * module versions.\n *\n * The special \"empty string\" version can also be used, and compares higher than everything else.\n * It signifies that there is a NonRegistryOverride for a module.\n */\nexport class BzlmodVersion {\n readonly original: string;\n readonly release: VersionPart;\n readonly prerelease: VersionPart;\n readonly build: VersionPart;\n\n /**\n * The regular expression that identifies a valid Bazel module version.\n */\n static readonly versionMatcher =\n /^(?<release>[a-zA-Z0-9.]+)(?:-(?<prerelease>[a-zA-Z0-9.-]+))?(?:\\+(?<build>[a-zA-Z0-9.-]+))?$/;\n\n /**\n * @param version The string that is parsed for the Bazel module version\n * values.\n */\n constructor(version: string) {\n this.original = version;\n if (version === '') {\n this.release = VersionPart.create();\n this.prerelease = VersionPart.create();\n this.build = VersionPart.create();\n return;\n }\n const vparts: Partial<VersionRegexResult> | undefined =\n BzlmodVersion.versionMatcher.exec(version)?.groups;\n if (!vparts) {\n throw new Error(`Invalid Bazel module version: ${version}`);\n }\n // The regex check above ensures that we will have a release group.\n const rparts = vparts.release!.split('.');\n this.release = VersionPart.create(...rparts);\n const pparts = vparts.prerelease ? vparts.prerelease.split('.') : [];\n this.prerelease = VersionPart.create(...pparts);\n // Do not parse the build value. Treat it as a single value.\n const bparts = vparts.build ? [vparts.build] : [];\n this.build = VersionPart.create(...bparts);\n }\n\n /**\n * Specifies whether this is a pre-release version.\n */\n get isPrerelease(): boolean {\n return !this.prerelease.isEmpty;\n }\n\n // Comparison\n\n /**\n * Determines whether this Bazel module version is equal to the other.\n *\n * @param other The other version for the comparison.\n * @param ignoreBuild? If specified, determines whether the build value is\n * evaluated as part of the equality check. This is useful when\n * determining precedence.\n */\n equals(other: BzlmodVersion, ignoreBuild?: boolean): boolean {\n if (ignoreBuild) {\n return (\n this.release.equals(other.release) &&\n this.prerelease.equals(other.prerelease)\n );\n }\n return (\n this.release.equals(other.release) &&\n this.prerelease.equals(other.prerelease) &&\n this.build.equals(other.build)\n );\n }\n\n /**\n * Determines whether this Bazel module version comes before the other.\n */\n isLessThan(other: BzlmodVersion): boolean {\n // This logic mirrors the comparison logic in\n // https://cs.opensource.google/bazel/bazel/+/refs/heads/master:src/main/java/com/google/devtools/build/lib/bazel/bzlmod/Version.java\n if (this.release.isLessThan(other.release)) {\n return true;\n }\n // Ensure that prerelease is listed before regular releases\n if (this.isPrerelease && !other.isPrerelease) {\n return true;\n }\n if (this.prerelease.isLessThan(other.prerelease)) {\n return true;\n }\n // NOTE: We ignore the build value for precedence comparison per the Semver spec.\n // https://semver.org/#spec-item-10\n return false;\n }\n\n /**\n * Determines whether this Bazel module version comes after the other.\n */\n isGreaterThan(other: BzlmodVersion): boolean {\n return BzlmodVersion.defaultCompare(this, other) === 1;\n }\n\n /**\n * Evaluates two Bazel module versions and returns a value specifying whether\n * a < b (-1), a == b (0), or a > b (1).\n */\n static defaultCompare(a: BzlmodVersion, b: BzlmodVersion): number {\n if (a.equals(b, true)) {\n return 0;\n }\n if (a.isLessThan(b)) {\n return -1;\n }\n return 1;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { BzlmodVersion } from "./bzlmod-version.js";
|
|
2
|
+
import { isNullOrUndefined } from "@sindresorhus/is";
|
|
2
3
|
//#region lib/modules/versioning/bazel-module/index.ts
|
|
3
4
|
const id = "bazel-module";
|
|
4
5
|
function getBzlmodVersion(version) {
|
|
@@ -119,7 +120,7 @@ function isValid(input) {
|
|
|
119
120
|
* Check whether the `input` is a valid version string.
|
|
120
121
|
*/
|
|
121
122
|
function isVersion(input) {
|
|
122
|
-
if (input
|
|
123
|
+
if (isNullOrUndefined(input)) return false;
|
|
123
124
|
return isValid(input);
|
|
124
125
|
}
|
|
125
126
|
const api = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/bazel-module/index.ts"],"sourcesContent":["import type { NewValueConfig, VersioningApi } from '../types.ts';\nimport { BzlmodVersion } from './bzlmod-version.ts';\n\nexport const id = 'bazel-module';\nexport const displayName = 'Bazel Module';\nexport const urls = ['[Bazel modules](https://bazel.build/external/module)'];\nexport const supportsRanges = false;\n\nfunction getBzlmodVersion(version: string): BzlmodVersion {\n return new BzlmodVersion(version);\n}\n\nfunction getMajor(version: string): null | number {\n return getBzlmodVersion(version).release.major;\n}\n\nfunction getMinor(version: string): null | number {\n return getBzlmodVersion(version).release.minor;\n}\n\nfunction getPatch(version: string): null | number {\n return getBzlmodVersion(version).release.patch;\n}\n\n/**\n * Check whether `version` and `other` are logically equivalent, even if\n * they're not the exact same string.\n *\n * For example, with Semver the build metadata should be ignored when comparing.\n */\nfunction equals(version: string, other: string): boolean {\n const abv = new BzlmodVersion(version);\n const bbv = new BzlmodVersion(other);\n return abv.equals(bbv);\n}\n\n/**\n * Check whether `version` is \"greater\" than the `other` version.\n */\nfunction isGreaterThan(version: string, other: string): boolean {\n const abv = new BzlmodVersion(version);\n const bbv = new BzlmodVersion(other);\n return abv.isGreaterThan(bbv);\n}\n\n/**\n * Check whether the `version` is \"less\" than all the versions possible in\n * the `range`.\n */\nfunction isLessThanRange(version: string, range: string): boolean {\n const abv = new BzlmodVersion(version);\n const bbv = new BzlmodVersion(range);\n return abv.isLessThan(bbv);\n}\n\n/**\n * Select the highest version from `versions` that is within the given\n * `range` constraint, or return `null` if there is no matching version.\n */\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n const target = new BzlmodVersion(range);\n const result = versions.find((ver) => {\n const bv = new BzlmodVersion(ver);\n return target.equals(bv);\n });\n return result ? range : null;\n}\n\n/**\n * Select the lowest version from `versions` that is within the given\n * `range` constraint, or return `null` if there is no matching version.\n */\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return getSatisfyingVersion(versions, range);\n}\n\n/**\n * Calculate a new version constraint based on the current constraint, the\n * `rangeStrategy` option, and the current and new version.\n */\nfunction getNewValue({\n currentValue,\n currentVersion,\n newVersion,\n}: NewValueConfig): string {\n if (currentVersion === `v${currentValue}`) {\n return newVersion.replace(/^v/, '');\n }\n return newVersion;\n}\n\n/**\n * Compare two versions. Return `0` if `v1 == v2`, or `1` if `v1` is\n * greater, or `-1` if `v2` is greater.\n */\nfunction sortVersions(version: string, other: string): number {\n const abv = new BzlmodVersion(version);\n const bbv = new BzlmodVersion(other);\n return BzlmodVersion.defaultCompare(abv, bbv);\n}\n\n/**\n * Check whether the `version` satisfies the `range` constraint.\n */\nfunction matches(version: string, range: string): boolean {\n return equals(version, range);\n}\n\n/**\n * Check whether the `version` is compatible with the `current` value\n * constraint.\n */\nfunction isCompatible(version: string, _current?: string): boolean {\n return isValid(version);\n}\n\n/**\n * Check whether the `version` constraint is not a range, i.e. it only allows a\n * single specific version.\n */\nfunction isSingleVersion(version: string): boolean {\n return isValid(version);\n}\n\n/**\n * Check whether the `version` is considered to be \"stable\".\n *\n * Example: in SemVer the version must not have a pre-release marker.\n */\nfunction isStable(version: string): boolean {\n const abv = new BzlmodVersion(version);\n return !abv.isPrerelease;\n}\n\n/**\n * Check whether the `input` is a valid version or a valid version range constraint.\n */\nfunction isValid(input: string): boolean {\n try {\n new BzlmodVersion(input);\n } catch {\n return false;\n }\n return true;\n}\n\n/**\n * Check whether the `input` is a valid version string.\n */\nfunction isVersion(input: string | undefined | null): boolean {\n if (input
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/bazel-module/index.ts"],"sourcesContent":["import { isNullOrUndefined } from '@sindresorhus/is';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\nimport { BzlmodVersion } from './bzlmod-version.ts';\n\nexport const id = 'bazel-module';\nexport const displayName = 'Bazel Module';\nexport const urls = ['[Bazel modules](https://bazel.build/external/module)'];\nexport const supportsRanges = false;\n\nfunction getBzlmodVersion(version: string): BzlmodVersion {\n return new BzlmodVersion(version);\n}\n\nfunction getMajor(version: string): null | number {\n return getBzlmodVersion(version).release.major;\n}\n\nfunction getMinor(version: string): null | number {\n return getBzlmodVersion(version).release.minor;\n}\n\nfunction getPatch(version: string): null | number {\n return getBzlmodVersion(version).release.patch;\n}\n\n/**\n * Check whether `version` and `other` are logically equivalent, even if\n * they're not the exact same string.\n *\n * For example, with Semver the build metadata should be ignored when comparing.\n */\nfunction equals(version: string, other: string): boolean {\n const abv = new BzlmodVersion(version);\n const bbv = new BzlmodVersion(other);\n return abv.equals(bbv);\n}\n\n/**\n * Check whether `version` is \"greater\" than the `other` version.\n */\nfunction isGreaterThan(version: string, other: string): boolean {\n const abv = new BzlmodVersion(version);\n const bbv = new BzlmodVersion(other);\n return abv.isGreaterThan(bbv);\n}\n\n/**\n * Check whether the `version` is \"less\" than all the versions possible in\n * the `range`.\n */\nfunction isLessThanRange(version: string, range: string): boolean {\n const abv = new BzlmodVersion(version);\n const bbv = new BzlmodVersion(range);\n return abv.isLessThan(bbv);\n}\n\n/**\n * Select the highest version from `versions` that is within the given\n * `range` constraint, or return `null` if there is no matching version.\n */\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n const target = new BzlmodVersion(range);\n const result = versions.find((ver) => {\n const bv = new BzlmodVersion(ver);\n return target.equals(bv);\n });\n return result ? range : null;\n}\n\n/**\n * Select the lowest version from `versions` that is within the given\n * `range` constraint, or return `null` if there is no matching version.\n */\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return getSatisfyingVersion(versions, range);\n}\n\n/**\n * Calculate a new version constraint based on the current constraint, the\n * `rangeStrategy` option, and the current and new version.\n */\nfunction getNewValue({\n currentValue,\n currentVersion,\n newVersion,\n}: NewValueConfig): string {\n if (currentVersion === `v${currentValue}`) {\n return newVersion.replace(/^v/, '');\n }\n return newVersion;\n}\n\n/**\n * Compare two versions. Return `0` if `v1 == v2`, or `1` if `v1` is\n * greater, or `-1` if `v2` is greater.\n */\nfunction sortVersions(version: string, other: string): number {\n const abv = new BzlmodVersion(version);\n const bbv = new BzlmodVersion(other);\n return BzlmodVersion.defaultCompare(abv, bbv);\n}\n\n/**\n * Check whether the `version` satisfies the `range` constraint.\n */\nfunction matches(version: string, range: string): boolean {\n return equals(version, range);\n}\n\n/**\n * Check whether the `version` is compatible with the `current` value\n * constraint.\n */\nfunction isCompatible(version: string, _current?: string): boolean {\n return isValid(version);\n}\n\n/**\n * Check whether the `version` constraint is not a range, i.e. it only allows a\n * single specific version.\n */\nfunction isSingleVersion(version: string): boolean {\n return isValid(version);\n}\n\n/**\n * Check whether the `version` is considered to be \"stable\".\n *\n * Example: in SemVer the version must not have a pre-release marker.\n */\nfunction isStable(version: string): boolean {\n const abv = new BzlmodVersion(version);\n return !abv.isPrerelease;\n}\n\n/**\n * Check whether the `input` is a valid version or a valid version range constraint.\n */\nfunction isValid(input: string): boolean {\n try {\n new BzlmodVersion(input);\n } catch {\n return false;\n }\n return true;\n}\n\n/**\n * Check whether the `input` is a valid version string.\n */\nfunction isVersion(input: string | undefined | null): boolean {\n if (isNullOrUndefined(input)) {\n return false;\n }\n return isValid(input);\n}\n\nexport const api: VersioningApi = {\n equals,\n getMajor,\n getMinor,\n getPatch,\n isCompatible,\n isGreaterThan,\n isLessThanRange,\n isSingleVersion,\n isStable,\n isValid,\n isVersion,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n getNewValue,\n sortVersions,\n};\nexport default api;\n"],"mappings":";;;AAIA,MAAa,KAAK;AAKlB,SAAS,iBAAiB,SAAgC;CACxD,OAAO,IAAI,cAAc,OAAO;AAClC;AAEA,SAAS,SAAS,SAAgC;CAChD,OAAO,iBAAiB,OAAO,CAAC,CAAC,QAAQ;AAC3C;AAEA,SAAS,SAAS,SAAgC;CAChD,OAAO,iBAAiB,OAAO,CAAC,CAAC,QAAQ;AAC3C;AAEA,SAAS,SAAS,SAAgC;CAChD,OAAO,iBAAiB,OAAO,CAAC,CAAC,QAAQ;AAC3C;;;;;;;AAQA,SAAS,OAAO,SAAiB,OAAwB;CACvD,MAAM,MAAM,IAAI,cAAc,OAAO;CACrC,MAAM,MAAM,IAAI,cAAc,KAAK;CACnC,OAAO,IAAI,OAAO,GAAG;AACvB;;;;AAKA,SAAS,cAAc,SAAiB,OAAwB;CAC9D,MAAM,MAAM,IAAI,cAAc,OAAO;CACrC,MAAM,MAAM,IAAI,cAAc,KAAK;CACnC,OAAO,IAAI,cAAc,GAAG;AAC9B;;;;;AAMA,SAAS,gBAAgB,SAAiB,OAAwB;CAChE,MAAM,MAAM,IAAI,cAAc,OAAO;CACrC,MAAM,MAAM,IAAI,cAAc,KAAK;CACnC,OAAO,IAAI,WAAW,GAAG;AAC3B;;;;;AAMA,SAAS,qBACP,UACA,OACe;CACf,MAAM,SAAS,IAAI,cAAc,KAAK;CAKtC,OAJe,SAAS,MAAM,QAAQ;EACpC,MAAM,KAAK,IAAI,cAAc,GAAG;EAChC,OAAO,OAAO,OAAO,EAAE;CACzB,CACY,IAAI,QAAQ;AAC1B;;;;;AAMA,SAAS,qBACP,UACA,OACe;CACf,OAAO,qBAAqB,UAAU,KAAK;AAC7C;;;;;AAMA,SAAS,YAAY,EACnB,cACA,gBACA,cACyB;CACzB,IAAI,mBAAmB,IAAI,gBACzB,OAAO,WAAW,QAAQ,MAAM,EAAE;CAEpC,OAAO;AACT;;;;;AAMA,SAAS,aAAa,SAAiB,OAAuB;CAC5D,MAAM,MAAM,IAAI,cAAc,OAAO;CACrC,MAAM,MAAM,IAAI,cAAc,KAAK;CACnC,OAAO,cAAc,eAAe,KAAK,GAAG;AAC9C;;;;AAKA,SAAS,QAAQ,SAAiB,OAAwB;CACxD,OAAO,OAAO,SAAS,KAAK;AAC9B;;;;;AAMA,SAAS,aAAa,SAAiB,UAA4B;CACjE,OAAO,QAAQ,OAAO;AACxB;;;;;AAMA,SAAS,gBAAgB,SAA0B;CACjD,OAAO,QAAQ,OAAO;AACxB;;;;;;AAOA,SAAS,SAAS,SAA0B;CAE1C,OAAO,CAAC,IADQ,cAAc,OACpB,CAAC,CAAC;AACd;;;;AAKA,SAAS,QAAQ,OAAwB;CACvC,IAAI;EACF,IAAI,cAAc,KAAK;CACzB,QAAQ;EACN,OAAO;CACT;CACA,OAAO;AACT;;;;AAKA,SAAS,UAAU,OAA2C;CAC5D,IAAI,kBAAkB,KAAK,GACzB,OAAO;CAET,OAAO,QAAQ,KAAK;AACtB;AAEA,MAAa,MAAqB;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { regEx } from "../../../util/regex.js";
|
|
2
2
|
import { coerceString } from "../../../util/string.js";
|
|
3
|
+
import { isString } from "@sindresorhus/is";
|
|
3
4
|
import * as semver$1 from "semver";
|
|
4
5
|
//#region lib/modules/versioning/conan/common.ts
|
|
5
6
|
function makeVersion(version, options) {
|
|
@@ -50,7 +51,7 @@ function findSatisfyingVersion(versions, range, compareRt) {
|
|
|
50
51
|
let curIndex = -1;
|
|
51
52
|
for (const v of versions) {
|
|
52
53
|
const versionFromList = makeVersion(v, options);
|
|
53
|
-
if (
|
|
54
|
+
if (isString(versionFromList)) {
|
|
54
55
|
const cleanedVersion = cleanVersion(versionFromList);
|
|
55
56
|
const options = getOptions(range);
|
|
56
57
|
if (matchesWithOptions(cleanedVersion, cleanVersion(range), options) && (!cur || semver$1.compare(curSV, versionFromList, options) === compareRt)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","names":["semver"],"sources":["../../../../lib/modules/versioning/conan/common.ts"],"sourcesContent":["import * 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 (
|
|
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 (!cur || semver.compare(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,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,MACrD,CAAC,OAAOA,SAAO,QAAQ,OAAO,iBAAiB,OAAO,MAAM,YAC7D;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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { coerceString } from "../../../util/string.js";
|
|
2
2
|
import { logger } from "../../../logger/index.js";
|
|
3
3
|
import { cleanVersion, containsOperators, getOptions, makeVersion, matchesWithOptions } from "./common.js";
|
|
4
|
+
import { isString } from "@sindresorhus/is";
|
|
4
5
|
import * as semver$1 from "semver";
|
|
5
6
|
import { parseRange } from "semver-utils";
|
|
6
7
|
//#region lib/modules/versioning/conan/range.ts
|
|
@@ -9,7 +10,7 @@ function getMajor(version) {
|
|
|
9
10
|
const options = getOptions(version);
|
|
10
11
|
options.includePrerelease = true;
|
|
11
12
|
const cleanerVersion = makeVersion(cleanedVersion, options);
|
|
12
|
-
if (
|
|
13
|
+
if (isString(cleanerVersion)) return Number(cleanerVersion.split(".")[0]);
|
|
13
14
|
return null;
|
|
14
15
|
}
|
|
15
16
|
function getMinor(version) {
|
|
@@ -17,14 +18,15 @@ function getMinor(version) {
|
|
|
17
18
|
const options = getOptions(version);
|
|
18
19
|
options.includePrerelease = true;
|
|
19
20
|
const cleanerVersion = makeVersion(cleanedVersion, options);
|
|
20
|
-
if (
|
|
21
|
+
if (isString(cleanerVersion)) return Number(cleanerVersion.split(".")[1]);
|
|
21
22
|
return null;
|
|
22
23
|
}
|
|
23
24
|
function getPatch(version) {
|
|
24
25
|
const cleanedVersion = cleanVersion(version);
|
|
25
26
|
const options = getOptions(version);
|
|
26
27
|
options.includePrerelease = true;
|
|
27
|
-
|
|
28
|
+
const cleanerVersion = makeVersion(cleanedVersion, options);
|
|
29
|
+
if (isString(cleanerVersion)) {
|
|
28
30
|
const newVersion = semver$1.valid(semver$1.coerce(cleanedVersion, { loose: false }), options);
|
|
29
31
|
return Number(newVersion?.split(".")[2]);
|
|
30
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"range.js","names":["semver"],"sources":["../../../../lib/modules/versioning/conan/range.ts"],"sourcesContent":["import * as semver from 'semver';\nimport type { SemVer } from 'semver-utils';\nimport { parseRange } from 'semver-utils';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceString } from '../../../util/string.ts';\nimport type { NewValueConfig } from '../types.ts';\nimport {\n cleanVersion,\n containsOperators,\n getOptions,\n makeVersion,\n matchesWithOptions,\n} from './common.ts';\n\n// always include prereleases\nexport function getMajor(version: string): null | number {\n const cleanedVersion = cleanVersion(version);\n const options = getOptions(version);\n options.includePrerelease = true;\n const cleanerVersion = makeVersion(cleanedVersion, options);\n if (typeof cleanerVersion === 'string') {\n return Number(cleanerVersion.split('.')[0]);\n }\n return null;\n}\n\n// always include prereleases\nexport function getMinor(version: string): null | number {\n const cleanedVersion = cleanVersion(version);\n const options = getOptions(version);\n options.includePrerelease = true;\n const cleanerVersion = makeVersion(cleanedVersion, options);\n if (typeof cleanerVersion === 'string') {\n return Number(cleanerVersion.split('.')[1]);\n }\n return null;\n}\n\n// always include prereleases\nexport function getPatch(version: string): null | number {\n const cleanedVersion = cleanVersion(version);\n const options = getOptions(version);\n options.includePrerelease = true;\n const cleanerVersion = makeVersion(cleanedVersion, options);\n\n if (typeof cleanerVersion === 'string') {\n const newVersion = semver.valid(\n semver.coerce(cleanedVersion, {\n loose: false,\n }),\n options,\n );\n return Number(newVersion?.split('.')[2]);\n }\n return null;\n}\n\nexport function fixParsedRange(range: string): any {\n const ordValues = [];\n\n // don't bump or'd single version values\n const originalSplit = range.split(' ');\n for (let i = 0; i < originalSplit.length; i += 1) {\n if (\n !containsOperators(originalSplit[i]) &&\n !originalSplit[i].includes('||')\n ) {\n if (i !== 0 && originalSplit[i - 1].includes('||')) {\n ordValues.push(`|| ${originalSplit[i]}`);\n } else if (i !== originalSplit.length && originalSplit[i + 1] === '||') {\n ordValues.push(`${originalSplit[i]} ||`);\n }\n } else {\n ordValues.push(originalSplit[i]);\n }\n }\n\n const parsedRange = parseRange(range);\n const cleanRange = range.replace(/([<=>^~])( )?/g, '');\n const splitRange = cleanRange.split(' ');\n const semverRange: SemVer[] = [];\n\n for (let i = 0; i < splitRange.length; i += 1) {\n if (!splitRange[i].includes('||')) {\n const splitVersion = splitRange[i].split('.');\n const major = splitVersion[0];\n const minor = splitVersion[1];\n const patch = splitVersion[2];\n const operator = ordValues[i].includes('||')\n ? '||'\n : parsedRange[i].operator;\n const NewSemVer: SemVer = {\n major,\n };\n\n let full = `${coerceString(operator)}${major}`;\n if (minor) {\n NewSemVer.minor = minor;\n full = `${full}.${minor}`;\n if (patch) {\n NewSemVer.patch = patch;\n full = `${full}.${patch}`;\n }\n }\n if (operator) {\n NewSemVer.operator = operator;\n full = range.includes(`${operator} `)\n ? `${operator} ${full.replace(operator, '')}`\n : `${operator}${full.replace(operator, '')}`;\n }\n\n full = ordValues[i].includes('||') ? ordValues[i] : full;\n\n NewSemVer.semver = full;\n\n semverRange.push(NewSemVer);\n }\n }\n return semverRange;\n}\n\nexport function replaceRange({\n currentValue,\n newVersion,\n}: NewValueConfig): string {\n const parsedRange = parseRange(currentValue);\n const element = parsedRange.at(-1)!;\n const toVersionMajor = getMajor(newVersion);\n const toVersionMinor = getMinor(newVersion);\n const toVersionPatch = getPatch(newVersion);\n const suffix = semver.prerelease(newVersion)\n ? `-${String(semver.prerelease(newVersion)?.[0])}`\n : '';\n\n if (element.operator === '~>') {\n return `~> ${toVersionMajor}.${toVersionMinor}.0`;\n }\n if (element.operator === '=') {\n return `=${newVersion}`;\n }\n if (element.operator === '~') {\n if (suffix.length) {\n return `~${toVersionMajor}.${toVersionMinor}.${toVersionPatch}${suffix}`;\n }\n return `~${toVersionMajor}.${toVersionMinor}.0`;\n }\n if (element.operator === '<=') {\n let res;\n if (!!element.patch || suffix.length) {\n res = `<=${newVersion}`;\n } else if (element.minor) {\n res = `<=${toVersionMajor}.${toVersionMinor}`;\n } else {\n res = `<=${toVersionMajor}`;\n }\n if (currentValue.includes('<= ')) {\n res = res.replace('<=', '<= ');\n }\n return res;\n }\n if (element.operator === '<' && toVersionMajor) {\n let res;\n if (currentValue.endsWith('.0.0')) {\n const newMajor = toVersionMajor + 1;\n res = `<${newMajor}.0.0`;\n } else if (element.patch) {\n res = `<${semver.inc(newVersion, 'patch')}`;\n } else if (element.minor && toVersionMinor) {\n res = `<${toVersionMajor}.${toVersionMinor + 1}`;\n } else {\n res = `<${toVersionMajor + 1}`;\n }\n if (currentValue.includes('< ')) {\n res = res.replace(/</g, '< ');\n }\n return res;\n }\n if (element.operator === '>') {\n let res;\n if (currentValue.endsWith('.0.0') && toVersionMajor) {\n const newMajor = toVersionMajor + 1;\n res = `>${newMajor}.0.0`;\n } else if (element.patch) {\n res = `>${toVersionMajor}.${toVersionMinor}.${toVersionPatch}`;\n } else if (element.minor) {\n res = `>${toVersionMajor}.${toVersionMinor}`;\n } else {\n res = `>${toVersionMajor}`;\n }\n if (currentValue.includes('> ')) {\n res = res.replace(/</g, '> ');\n }\n return res;\n }\n if (!element.operator) {\n if (element.minor) {\n if (element.minor === 'x') {\n return `${toVersionMajor}.x`;\n }\n if (element.minor === '*') {\n return `${toVersionMajor}.*`;\n }\n if (element.patch === 'x') {\n return `${toVersionMajor}.${toVersionMinor}.x`;\n }\n if (element.patch === '*') {\n return `${toVersionMajor}.${toVersionMinor}.*`;\n }\n return `${newVersion}`;\n }\n return `${toVersionMajor}`;\n }\n return newVersion;\n}\n\nexport function widenRange(\n { currentValue, currentVersion, newVersion }: NewValueConfig,\n options: semver.Options,\n): string | null {\n const parsedRange = parseRange(currentValue);\n const element = parsedRange.at(-1)!;\n\n if (matchesWithOptions(newVersion, currentValue, options)) {\n return currentValue;\n }\n const newValue = replaceRange({\n currentValue,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n if (element.operator?.startsWith('<')) {\n const splitCurrent = currentValue.split(element.operator);\n splitCurrent.pop();\n return splitCurrent.join(element.operator) + newValue;\n }\n if (parsedRange.length > 1) {\n const previousElement = parsedRange.at(-2)!;\n if (previousElement.operator === '-') {\n const splitCurrent = currentValue.split('-');\n splitCurrent.pop();\n return `${splitCurrent.join('-')}- ${newValue}`;\n }\n if (element.operator?.startsWith('>')) {\n logger.warn(`Complex ranges ending in greater than are not supported`);\n return null;\n }\n }\n return `${currentValue} || ${newValue}`;\n}\n\nexport function bumpRange(\n { currentValue, currentVersion, newVersion }: NewValueConfig,\n options: semver.Options,\n): string | null {\n if (!containsOperators(currentValue) && currentValue.includes('||')) {\n return widenRange(\n {\n currentValue,\n rangeStrategy: 'widen',\n currentVersion,\n newVersion,\n },\n options,\n );\n }\n const parsedRange = parseRange(currentValue);\n const element = parsedRange.at(-1)!;\n\n const toVersionMajor = getMajor(newVersion);\n const toVersionMinor = getMinor(newVersion);\n const suffix = semver.prerelease(newVersion)\n ? `-${String(semver.prerelease(newVersion)?.[0])}`\n : '';\n\n if (parsedRange.length === 1) {\n if (!element.operator) {\n return replaceRange({\n currentValue,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n }\n if (element.operator.startsWith('~')) {\n const split = currentValue.split('.');\n if (suffix.length) {\n return `${element.operator}${newVersion}`;\n }\n if (split.length === 1) {\n // ~4\n return `${element.operator}${toVersionMajor}`;\n }\n if (split.length === 2) {\n // ~4.1\n return `${element.operator}${toVersionMajor}.${toVersionMinor}`;\n }\n return `${element.operator}${newVersion}`;\n }\n if (element.operator === '=') {\n return `=${newVersion}`;\n }\n if (element.operator === '>=') {\n return currentValue.includes('>= ')\n ? `>= ${newVersion}`\n : `>=${newVersion}`;\n }\n if (element.operator.startsWith('<')) {\n return currentValue;\n }\n } else {\n const newRange = fixParsedRange(currentValue);\n const versions = newRange.map((x: any) => {\n // don't bump or'd single version values\n if (x.operator === '||') {\n return x.semver;\n }\n if (x.operator) {\n const bumpedSubRange = bumpRange(\n {\n currentValue: x.semver,\n rangeStrategy: 'bump',\n currentVersion,\n newVersion,\n },\n options,\n );\n if (\n bumpedSubRange &&\n matchesWithOptions(newVersion, bumpedSubRange, options)\n ) {\n return bumpedSubRange;\n }\n }\n\n return replaceRange({\n currentValue: x.semver,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n });\n return versions.filter((x: any) => x !== null && x !== '').join(' ');\n }\n logger.debug(\n `Unsupported range type for rangeStrategy=bump: ${currentValue}`,\n );\n return null;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"range.js","names":["semver"],"sources":["../../../../lib/modules/versioning/conan/range.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport * as semver from 'semver';\nimport type { SemVer } from 'semver-utils';\nimport { parseRange } from 'semver-utils';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceString } from '../../../util/string.ts';\nimport type { NewValueConfig } from '../types.ts';\nimport {\n cleanVersion,\n containsOperators,\n getOptions,\n makeVersion,\n matchesWithOptions,\n} from './common.ts';\n\n// always include prereleases\nexport function getMajor(version: string): null | number {\n const cleanedVersion = cleanVersion(version);\n const options = getOptions(version);\n options.includePrerelease = true;\n const cleanerVersion = makeVersion(cleanedVersion, options);\n if (isString(cleanerVersion)) {\n return Number(cleanerVersion.split('.')[0]);\n }\n return null;\n}\n\n// always include prereleases\nexport function getMinor(version: string): null | number {\n const cleanedVersion = cleanVersion(version);\n const options = getOptions(version);\n options.includePrerelease = true;\n const cleanerVersion = makeVersion(cleanedVersion, options);\n if (isString(cleanerVersion)) {\n return Number(cleanerVersion.split('.')[1]);\n }\n return null;\n}\n\n// always include prereleases\nexport function getPatch(version: string): null | number {\n const cleanedVersion = cleanVersion(version);\n const options = getOptions(version);\n options.includePrerelease = true;\n const cleanerVersion = makeVersion(cleanedVersion, options);\n\n if (isString(cleanerVersion)) {\n const newVersion = semver.valid(\n semver.coerce(cleanedVersion, {\n loose: false,\n }),\n options,\n );\n return Number(newVersion?.split('.')[2]);\n }\n return null;\n}\n\nexport function fixParsedRange(range: string): any {\n const ordValues = [];\n\n // don't bump or'd single version values\n const originalSplit = range.split(' ');\n for (let i = 0; i < originalSplit.length; i += 1) {\n if (\n !containsOperators(originalSplit[i]) &&\n !originalSplit[i].includes('||')\n ) {\n if (i !== 0 && originalSplit[i - 1].includes('||')) {\n ordValues.push(`|| ${originalSplit[i]}`);\n } else if (i !== originalSplit.length && originalSplit[i + 1] === '||') {\n ordValues.push(`${originalSplit[i]} ||`);\n }\n } else {\n ordValues.push(originalSplit[i]);\n }\n }\n\n const parsedRange = parseRange(range);\n const cleanRange = range.replace(/([<=>^~])( )?/g, '');\n const splitRange = cleanRange.split(' ');\n const semverRange: SemVer[] = [];\n\n for (let i = 0; i < splitRange.length; i += 1) {\n if (!splitRange[i].includes('||')) {\n const splitVersion = splitRange[i].split('.');\n const major = splitVersion[0];\n const minor = splitVersion[1];\n const patch = splitVersion[2];\n const operator = ordValues[i].includes('||')\n ? '||'\n : parsedRange[i].operator;\n const NewSemVer: SemVer = {\n major,\n };\n\n let full = `${coerceString(operator)}${major}`;\n if (minor) {\n NewSemVer.minor = minor;\n full = `${full}.${minor}`;\n if (patch) {\n NewSemVer.patch = patch;\n full = `${full}.${patch}`;\n }\n }\n if (operator) {\n NewSemVer.operator = operator;\n full = range.includes(`${operator} `)\n ? `${operator} ${full.replace(operator, '')}`\n : `${operator}${full.replace(operator, '')}`;\n }\n\n full = ordValues[i].includes('||') ? ordValues[i] : full;\n\n NewSemVer.semver = full;\n\n semverRange.push(NewSemVer);\n }\n }\n return semverRange;\n}\n\nexport function replaceRange({\n currentValue,\n newVersion,\n}: NewValueConfig): string {\n const parsedRange = parseRange(currentValue);\n const element = parsedRange.at(-1)!;\n const toVersionMajor = getMajor(newVersion);\n const toVersionMinor = getMinor(newVersion);\n const toVersionPatch = getPatch(newVersion);\n const suffix = semver.prerelease(newVersion)\n ? `-${String(semver.prerelease(newVersion)?.[0])}`\n : '';\n\n if (element.operator === '~>') {\n return `~> ${toVersionMajor}.${toVersionMinor}.0`;\n }\n if (element.operator === '=') {\n return `=${newVersion}`;\n }\n if (element.operator === '~') {\n if (suffix.length) {\n return `~${toVersionMajor}.${toVersionMinor}.${toVersionPatch}${suffix}`;\n }\n return `~${toVersionMajor}.${toVersionMinor}.0`;\n }\n if (element.operator === '<=') {\n let res;\n if (!!element.patch || suffix.length) {\n res = `<=${newVersion}`;\n } else if (element.minor) {\n res = `<=${toVersionMajor}.${toVersionMinor}`;\n } else {\n res = `<=${toVersionMajor}`;\n }\n if (currentValue.includes('<= ')) {\n res = res.replace('<=', '<= ');\n }\n return res;\n }\n if (element.operator === '<' && toVersionMajor) {\n let res;\n if (currentValue.endsWith('.0.0')) {\n const newMajor = toVersionMajor + 1;\n res = `<${newMajor}.0.0`;\n } else if (element.patch) {\n res = `<${semver.inc(newVersion, 'patch')}`;\n } else if (element.minor && toVersionMinor) {\n res = `<${toVersionMajor}.${toVersionMinor + 1}`;\n } else {\n res = `<${toVersionMajor + 1}`;\n }\n if (currentValue.includes('< ')) {\n res = res.replace(/</g, '< ');\n }\n return res;\n }\n if (element.operator === '>') {\n let res;\n if (currentValue.endsWith('.0.0') && toVersionMajor) {\n const newMajor = toVersionMajor + 1;\n res = `>${newMajor}.0.0`;\n } else if (element.patch) {\n res = `>${toVersionMajor}.${toVersionMinor}.${toVersionPatch}`;\n } else if (element.minor) {\n res = `>${toVersionMajor}.${toVersionMinor}`;\n } else {\n res = `>${toVersionMajor}`;\n }\n if (currentValue.includes('> ')) {\n res = res.replace(/</g, '> ');\n }\n return res;\n }\n if (!element.operator) {\n if (element.minor) {\n if (element.minor === 'x') {\n return `${toVersionMajor}.x`;\n }\n if (element.minor === '*') {\n return `${toVersionMajor}.*`;\n }\n if (element.patch === 'x') {\n return `${toVersionMajor}.${toVersionMinor}.x`;\n }\n if (element.patch === '*') {\n return `${toVersionMajor}.${toVersionMinor}.*`;\n }\n return `${newVersion}`;\n }\n return `${toVersionMajor}`;\n }\n return newVersion;\n}\n\nexport function widenRange(\n { currentValue, currentVersion, newVersion }: NewValueConfig,\n options: semver.Options,\n): string | null {\n const parsedRange = parseRange(currentValue);\n const element = parsedRange.at(-1)!;\n\n if (matchesWithOptions(newVersion, currentValue, options)) {\n return currentValue;\n }\n const newValue = replaceRange({\n currentValue,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n if (element.operator?.startsWith('<')) {\n const splitCurrent = currentValue.split(element.operator);\n splitCurrent.pop();\n return splitCurrent.join(element.operator) + newValue;\n }\n if (parsedRange.length > 1) {\n const previousElement = parsedRange.at(-2)!;\n if (previousElement.operator === '-') {\n const splitCurrent = currentValue.split('-');\n splitCurrent.pop();\n return `${splitCurrent.join('-')}- ${newValue}`;\n }\n if (element.operator?.startsWith('>')) {\n logger.warn(`Complex ranges ending in greater than are not supported`);\n return null;\n }\n }\n return `${currentValue} || ${newValue}`;\n}\n\nexport function bumpRange(\n { currentValue, currentVersion, newVersion }: NewValueConfig,\n options: semver.Options,\n): string | null {\n if (!containsOperators(currentValue) && currentValue.includes('||')) {\n return widenRange(\n {\n currentValue,\n rangeStrategy: 'widen',\n currentVersion,\n newVersion,\n },\n options,\n );\n }\n const parsedRange = parseRange(currentValue);\n const element = parsedRange.at(-1)!;\n\n const toVersionMajor = getMajor(newVersion);\n const toVersionMinor = getMinor(newVersion);\n const suffix = semver.prerelease(newVersion)\n ? `-${String(semver.prerelease(newVersion)?.[0])}`\n : '';\n\n if (parsedRange.length === 1) {\n if (!element.operator) {\n return replaceRange({\n currentValue,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n }\n if (element.operator.startsWith('~')) {\n const split = currentValue.split('.');\n if (suffix.length) {\n return `${element.operator}${newVersion}`;\n }\n if (split.length === 1) {\n // ~4\n return `${element.operator}${toVersionMajor}`;\n }\n if (split.length === 2) {\n // ~4.1\n return `${element.operator}${toVersionMajor}.${toVersionMinor}`;\n }\n return `${element.operator}${newVersion}`;\n }\n if (element.operator === '=') {\n return `=${newVersion}`;\n }\n if (element.operator === '>=') {\n return currentValue.includes('>= ')\n ? `>= ${newVersion}`\n : `>=${newVersion}`;\n }\n if (element.operator.startsWith('<')) {\n return currentValue;\n }\n } else {\n const newRange = fixParsedRange(currentValue);\n const versions = newRange.map((x: any) => {\n // don't bump or'd single version values\n if (x.operator === '||') {\n return x.semver;\n }\n if (x.operator) {\n const bumpedSubRange = bumpRange(\n {\n currentValue: x.semver,\n rangeStrategy: 'bump',\n currentVersion,\n newVersion,\n },\n options,\n );\n if (\n bumpedSubRange &&\n matchesWithOptions(newVersion, bumpedSubRange, options)\n ) {\n return bumpedSubRange;\n }\n }\n\n return replaceRange({\n currentValue: x.semver,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n });\n return versions.filter((x: any) => x !== null && x !== '').join(' ');\n }\n logger.debug(\n `Unsupported range type for rangeStrategy=bump: ${currentValue}`,\n );\n return null;\n}\n"],"mappings":"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"}
|
|
@@ -101,7 +101,7 @@ function tokenCmp(left, right) {
|
|
|
101
101
|
if (left.type === TokenType.Number && right.type === TokenType.Number) {
|
|
102
102
|
if (left.val < right.val) return -1;
|
|
103
103
|
if (left.val > right.val) return 1;
|
|
104
|
-
} else if (
|
|
104
|
+
} else if (isString(left.val) && isString(right.val)) return stringTokenCmp(left.val, right.val);
|
|
105
105
|
else if (right.type === TokenType.Number) return -1;
|
|
106
106
|
else if (left.type === TokenType.Number) return 1;
|
|
107
107
|
return 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare.js","names":[],"sources":["../../../../lib/modules/versioning/gradle/compare.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\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 | number;\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: parseInt(val, 10),\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 } else if (typeof left.val === 'string' && typeof right.val === 'string') {\n return stringTokenCmp(left.val, right.val);\n } else if (right.type === TokenType.Number) {\n return -1;\n } else if (left.type === TokenType.Number) {\n return 1;\n }\n\n return 0;\n}\n\nexport function compare(left: string, right: string): number {\n const leftTokens = tokenize(left) ?? [];\n const rightTokens = 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\nexport type 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 { 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 | number;\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: parseInt(val, 10),\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 } else if (isString(left.val) && isString(right.val)) {\n return stringTokenCmp(left.val, right.val);\n } else if (right.type === TokenType.Number) {\n return -1;\n } else if (left.type === TokenType.Number) {\n return 1;\n }\n\n return 0;\n}\n\nexport function compare(left: string, right: string): number {\n const leftTokens = tokenize(left) ?? [];\n const rightTokens = 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\nexport type 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,12 +1,13 @@
|
|
|
1
1
|
import { api as api$1 } from "../node/index.js";
|
|
2
2
|
import { findLambdaScheduleForVersion } from "./schedule.js";
|
|
3
|
+
import { isString } from "@sindresorhus/is";
|
|
3
4
|
import { DateTime } from "luxon";
|
|
4
5
|
//#region lib/modules/versioning/lambda-node/index.ts
|
|
5
6
|
const id = "lambda-node";
|
|
6
7
|
function isStable(version) {
|
|
7
8
|
const schedule = findLambdaScheduleForVersion(version);
|
|
8
9
|
if (schedule === null) return false;
|
|
9
|
-
if (
|
|
10
|
+
if (isString(schedule.support)) return DateTime.local() < DateTime.fromISO(schedule.support);
|
|
10
11
|
return true;
|
|
11
12
|
}
|
|
12
13
|
const api = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["nodeApi"],"sources":["../../../../lib/modules/versioning/lambda-node/index.ts"],"sourcesContent":["import { DateTime } from 'luxon';\nimport { api as nodeApi } from '../node/index.ts';\nimport type { VersioningApi } from '../types.ts';\nimport { findLambdaScheduleForVersion } from './schedule.ts';\n\nexport const id = 'lambda-node';\nexport const displayName = 'Lambda Node.js Runtime';\nexport const urls = [];\nexport const supportsRanges = false;\n\nexport function isStable(version: string): boolean {\n const schedule = findLambdaScheduleForVersion(version);\n\n if (schedule === null) {\n return false;\n }\n\n if (
|
|
1
|
+
{"version":3,"file":"index.js","names":["nodeApi"],"sources":["../../../../lib/modules/versioning/lambda-node/index.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport { api as nodeApi } from '../node/index.ts';\nimport type { VersioningApi } from '../types.ts';\nimport { findLambdaScheduleForVersion } from './schedule.ts';\n\nexport const id = 'lambda-node';\nexport const displayName = 'Lambda Node.js Runtime';\nexport const urls = [];\nexport const supportsRanges = false;\n\nexport function isStable(version: string): boolean {\n const schedule = findLambdaScheduleForVersion(version);\n\n if (schedule === null) {\n return false;\n }\n\n if (isString(schedule.support)) {\n return DateTime.local() < DateTime.fromISO(schedule.support);\n }\n\n return true;\n}\n\nexport const api: VersioningApi = {\n ...nodeApi,\n isStable,\n};\n\nexport default api;\n"],"mappings":";;;;;AAMA,MAAa,KAAK;AAKlB,SAAgB,SAAS,SAA0B;CACjD,MAAM,WAAW,6BAA6B,OAAO;CAErD,IAAI,aAAa,MACf,OAAO;CAGT,IAAI,SAAS,SAAS,OAAO,GAC3B,OAAO,SAAS,MAAM,IAAI,SAAS,QAAQ,SAAS,OAAO;CAG7D,OAAO;AACT;AAEA,MAAa,MAAqB;CAChC,GAAGA;CACH;AACF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { regEx } from "../../../util/regex.js";
|
|
2
|
+
import { isString } from "@sindresorhus/is";
|
|
2
3
|
//#region lib/modules/versioning/maven/compare.ts
|
|
3
4
|
const PREFIX_DOT = "PREFIX_DOT";
|
|
4
5
|
const PREFIX_HYPHEN = "PREFIX_HYPHEN";
|
|
@@ -63,7 +64,7 @@ function iterateTokens(versionStr, cb) {
|
|
|
63
64
|
} else currentVal = currentVal.concat(nextChar);
|
|
64
65
|
});
|
|
65
66
|
}
|
|
66
|
-
function isNull(token) {
|
|
67
|
+
function isNull$1(token) {
|
|
67
68
|
const val = token.val;
|
|
68
69
|
return val === 0 || val === "" || val === "final" || val === "ga" || val === "release" || val === "latest" || val === "sr";
|
|
69
70
|
}
|
|
@@ -74,7 +75,7 @@ function tokenize(versionStr, preserveMinorZeroes = false) {
|
|
|
74
75
|
iterateTokens(versionStr.toLowerCase(), (token) => {
|
|
75
76
|
if (token.prefix === "PREFIX_HYPHEN" || token.type === "TYPE_QUALIFIER") buf = [];
|
|
76
77
|
buf.push(token);
|
|
77
|
-
if (!isNull(token)) {
|
|
78
|
+
if (!isNull$1(token)) {
|
|
78
79
|
leadingZero = false;
|
|
79
80
|
result = result.concat(buf);
|
|
80
81
|
buf = [];
|
|
@@ -158,7 +159,7 @@ function compare(left, right) {
|
|
|
158
159
|
return 0;
|
|
159
160
|
}
|
|
160
161
|
function isVersion(version) {
|
|
161
|
-
if (!version ||
|
|
162
|
+
if (!version || !isString(version)) return false;
|
|
162
163
|
if (!regEx(/^[-.a-z_+0-9]+$/i).test(version)) return false;
|
|
163
164
|
if (regEx(/^[.-]/).test(version)) return false;
|
|
164
165
|
if (regEx(/[.-]$/).test(version)) return false;
|