renovate 44.48.0 → 44.48.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/dist/config/options/index.js +1 -1
  2. package/dist/config/options/index.js.map +1 -1
  3. package/dist/global-config-option-defaults.generated.js +1 -1
  4. package/dist/global-config-option-defaults.generated.js.map +1 -1
  5. package/dist/modules/datasource/docker/dockerhub-cache.js.map +1 -1
  6. package/dist/modules/datasource/go/common.js.map +1 -1
  7. package/dist/modules/datasource/rubygems/versions-endpoint-cache.js.map +1 -1
  8. package/dist/modules/datasource/rust-version/index.js.map +1 -1
  9. package/dist/modules/datasource/rust-version/parse.js.map +1 -1
  10. package/dist/modules/manager/asdf/extract.js.map +1 -1
  11. package/dist/modules/manager/asdf/upgradeable-tooling.js.map +1 -1
  12. package/dist/modules/manager/bazel-module/extract.js.map +1 -1
  13. package/dist/modules/manager/bazel-module/parser/context.js.map +1 -1
  14. package/dist/modules/manager/bazel-module/parser/fragments.js +1 -1
  15. package/dist/modules/manager/bazel-module/parser/fragments.js.map +1 -1
  16. package/dist/modules/manager/bazel-module/parser/index.js.map +1 -1
  17. package/dist/modules/manager/bazel-module/rules.js.map +1 -1
  18. package/dist/modules/manager/custom/jsonata/utils.js.map +1 -1
  19. package/dist/modules/manager/custom/regex/utils.js.map +1 -1
  20. package/dist/modules/manager/custom/types.d.ts +1 -0
  21. package/dist/modules/manager/custom/utils.d.ts +1 -0
  22. package/dist/modules/manager/custom/utils.js.map +1 -1
  23. package/dist/modules/manager/devbox/tool-versioning.js.map +1 -1
  24. package/dist/modules/manager/fingerprint.generated.js +2 -2
  25. package/dist/modules/manager/fingerprint.generated.js.map +1 -1
  26. package/dist/modules/manager/github-actions/community.js.map +1 -1
  27. package/dist/modules/manager/github-actions/extract.js.map +1 -1
  28. package/dist/modules/manager/github-actions/parse.js.map +1 -1
  29. package/dist/modules/manager/github-actions/schema.js.map +1 -1
  30. package/dist/modules/manager/haskell-cabal/extract.js.map +1 -1
  31. package/dist/modules/manager/haskell-cabal/index.js.map +1 -1
  32. package/dist/modules/manager/homebrew/handlers/github.js.map +1 -1
  33. package/dist/modules/manager/homebrew/handlers/npm.js.map +1 -1
  34. package/dist/modules/manager/mise/backends.js.map +1 -1
  35. package/dist/modules/manager/mise/extract.js.map +1 -1
  36. package/dist/modules/manager/mise/lockfile.js.map +1 -1
  37. package/dist/modules/manager/mise/upgradeable-tooling.js.map +1 -1
  38. package/dist/modules/manager/npm/npmrc.js.map +1 -1
  39. package/dist/modules/manager/npm/post-update/node-version.js.map +1 -1
  40. package/dist/modules/manager/npm/post-update/npm.js.map +1 -1
  41. package/dist/modules/manager/npm/post-update/rules.js.map +1 -1
  42. package/dist/modules/manager/npm/post-update/utils.js.map +1 -1
  43. package/dist/modules/manager/pixi/lockfile.js.map +1 -1
  44. package/dist/modules/manager/proto/extract.js.map +1 -1
  45. package/dist/modules/manager/proto/upgradeable-tooling.js.map +1 -1
  46. package/dist/modules/manager/terragrunt/util.js.map +1 -1
  47. package/dist/modules/platform/azure/azure-helper.js.map +1 -1
  48. package/dist/modules/platform/azure/types.js.map +1 -1
  49. package/dist/modules/platform/bitbucket/comments.js.map +1 -1
  50. package/dist/modules/platform/bitbucket-server/index.js.map +1 -1
  51. package/dist/modules/platform/bitbucket-server/utils.js.map +1 -1
  52. package/dist/modules/platform/codecommit/index.js.map +1 -1
  53. package/dist/modules/versioning/apk/index.js.map +1 -1
  54. package/dist/modules/versioning/aws-machine-image/index.js.map +1 -1
  55. package/dist/modules/versioning/azure-rest-api/index.js.map +1 -1
  56. package/dist/modules/versioning/deb/index.js.map +1 -1
  57. package/dist/modules/versioning/debian/common.js.map +1 -1
  58. package/dist/modules/versioning/debian/index.js.map +1 -1
  59. package/dist/modules/versioning/devbox/index.js.map +1 -1
  60. package/dist/modules/versioning/distro.js.map +1 -1
  61. package/dist/modules/versioning/docker/index.js.map +1 -1
  62. package/dist/modules/versioning/generic.d.ts +2 -10
  63. package/dist/modules/versioning/generic.js.map +1 -1
  64. package/dist/modules/versioning/git/index.js.map +1 -1
  65. package/dist/modules/versioning/glasskube/index.js.map +1 -1
  66. package/dist/modules/versioning/gradle/compare.js.map +1 -1
  67. package/dist/modules/versioning/hermit/index.js.map +1 -1
  68. package/dist/modules/versioning/index.d.ts +2 -2
  69. package/dist/modules/versioning/ivy/parse.js.map +1 -1
  70. package/dist/modules/versioning/lambda-node/schedule.js.map +1 -1
  71. package/dist/modules/versioning/loose/index.js.map +1 -1
  72. package/dist/modules/versioning/maven/compare.js.map +1 -1
  73. package/dist/modules/versioning/nixpkgs/index.js.map +1 -1
  74. package/dist/modules/versioning/node/schedule.js.map +1 -1
  75. package/dist/modules/versioning/paket/index.js.map +1 -1
  76. package/dist/modules/versioning/paket/range.js.map +1 -1
  77. package/dist/modules/versioning/perl/index.js.map +1 -1
  78. package/dist/modules/versioning/redhat/index.js.map +1 -1
  79. package/dist/modules/versioning/regex/index.js.map +1 -1
  80. package/dist/modules/versioning/rpm/index.js.map +1 -1
  81. package/dist/modules/versioning/ruby/range.js.map +1 -1
  82. package/dist/modules/versioning/ruby/strategies/bump.js.map +1 -1
  83. package/dist/modules/versioning/ruby/strategies/replace.js.map +1 -1
  84. package/dist/modules/versioning/ruby/strategies/widen.js.map +1 -1
  85. package/dist/modules/versioning/semver/common.js.map +1 -1
  86. package/dist/modules/versioning/types.d.ts +25 -1
  87. package/dist/modules/versioning/unity3d/index.js.map +1 -1
  88. package/dist/modules/versioning/unity3d-packages/index.js.map +1 -1
  89. package/package.json +1 -1
  90. package/renovate-schema.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["client.listRepositories","client.getRepositoryInfo","client.getCodeCommitUrl","git.initRepo","client.listPullRequests","client.getPr","client.getFile","client.createPr","client.updatePrDescription","client.updatePrTitle","client.updatePrStatus","client.createPrApprovalRule","client.getPrComments","client.createPrComment","client.updateComment","client.deleteComment"],"sources":["../../../../lib/modules/platform/codecommit/index.ts"],"sourcesContent":["import { Buffer } from 'node:buffer';\nimport type {\n GetCommentsForPullRequestOutput,\n ListRepositoriesOutput,\n} from '@aws-sdk/client-codecommit';\nimport { PullRequestStatusEnum } from '@aws-sdk/client-codecommit';\nimport {\n PLATFORM_BAD_CREDENTIALS,\n REPOSITORY_EMPTY,\n REPOSITORY_NOT_FOUND,\n} from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { BranchStatus, PrState } from '../../../types/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { parseJson } from '../../../util/common.ts';\nimport * as git from '../../../util/git/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { sanitize } from '../../../util/sanitize.ts';\nimport type {\n BranchStatusConfig,\n CreatePRConfig,\n EnsureCommentConfig,\n EnsureCommentRemovalConfig,\n EnsureIssueConfig,\n EnsureIssueResult,\n FindPRConfig,\n Issue,\n MergePRConfig,\n PlatformParams,\n PlatformResult,\n Pr,\n RepoParams,\n RepoResult,\n UpdatePrConfig,\n} from '../types.ts';\nimport { getNewBranchName, repoFingerprint } from '../util.ts';\nimport { smartTruncate } from '../utils/pr-body.ts';\nimport * as client from './codecommit-client.ts';\n\nexport interface CodeCommitPr extends Pr {\n body: string;\n destinationCommit: string;\n sourceCommit: string;\n}\n\ninterface Config {\n repository?: string;\n defaultBranch?: string;\n region?: string;\n prList?: CodeCommitPr[];\n}\n\nexport const id = 'codecommit';\nexport const experimental = true;\n\nconst platformConfig = {\n endpoint: 'https://git-codecommit.us-east-1.amazonaws.com',\n};\n\nlet config: Config = {};\n\nexport async function initPlatform({\n endpoint,\n username,\n password,\n token: awsToken,\n}: PlatformParams): Promise<PlatformResult> {\n const accessKeyId = username;\n const secretAccessKey = password;\n const env = process.env;\n let region: string | undefined;\n\n if (accessKeyId) {\n env.AWS_ACCESS_KEY_ID = accessKeyId;\n }\n if (secretAccessKey) {\n env.AWS_SECRET_ACCESS_KEY = secretAccessKey;\n }\n if (awsToken) {\n env.AWS_SESSION_TOKEN = awsToken;\n }\n\n if (endpoint) {\n const regionReg = regEx(/.*codecommit\\.(?<region>.+)\\.amazonaws\\.com/);\n const codeCommitMatch = regionReg.exec(endpoint);\n region = codeCommitMatch?.groups?.region;\n if (region) {\n env.AWS_REGION = region;\n } else {\n logger.warn(\"Can't parse region, make sure your endpoint is correct\");\n }\n }\n\n // If any of the below fails, it will throw an exception stopping the program.\n client.buildCodeCommitClient();\n // To check if we have permission to codecommit, throws exception if failed.\n await client.listRepositories();\n\n platformConfig.endpoint =\n endpoint ??\n `https://git-codecommit.${env.AWS_REGION ?? 'us-east-1'}.amazonaws.com/`;\n\n const platformResult: PlatformResult = {\n endpoint: platformConfig.endpoint,\n };\n return platformResult;\n}\n\nexport async function initRepo({\n repository,\n}: RepoParams): Promise<RepoResult> {\n logger.debug(`initRepo(\"${repository}\")`);\n\n config = { repository };\n\n let repo;\n try {\n repo = await client.getRepositoryInfo(repository);\n } catch (err) {\n logger.error({ err }, 'Could not find repository');\n throw new Error(REPOSITORY_NOT_FOUND);\n }\n\n if (!repo?.repositoryMetadata) {\n logger.error({ repository }, 'Could not find repository');\n throw new Error(REPOSITORY_NOT_FOUND);\n }\n logger.debug({ repositoryDetails: repo }, 'Repository details');\n const metadata = repo.repositoryMetadata;\n\n const url = client.getCodeCommitUrl(metadata, repository);\n try {\n await git.initRepo({\n url,\n });\n } catch (err) {\n logger.debug({ err }, 'Failed to git init');\n throw new Error(PLATFORM_BAD_CREDENTIALS);\n }\n\n if (!metadata.defaultBranch || !metadata.repositoryId) {\n logger.debug('Repo is empty');\n throw new Error(REPOSITORY_EMPTY);\n }\n\n const defaultBranch = metadata.defaultBranch;\n config.defaultBranch = defaultBranch;\n logger.debug(`${repository} default branch = ${defaultBranch}`);\n\n return {\n repoFingerprint: repoFingerprint(\n metadata.repositoryId,\n platformConfig.endpoint,\n ),\n defaultBranch,\n isFork: false,\n };\n}\n\nexport async function getPrList(): Promise<CodeCommitPr[]> {\n logger.debug('getPrList()');\n\n if (config.prList) {\n return config.prList;\n }\n\n const listPrsResponse = await client.listPullRequests(config.repository!);\n const fetchedPrs: CodeCommitPr[] = [];\n\n if (listPrsResponse && !listPrsResponse.pullRequestIds) {\n return fetchedPrs;\n }\n\n const prIds = coerceArray(listPrsResponse.pullRequestIds);\n\n for (const prId of prIds) {\n const prRes = await client.getPr(prId);\n\n if (!prRes?.pullRequest) {\n continue;\n }\n const prInfo = prRes.pullRequest;\n const pr: CodeCommitPr = {\n targetBranch: prInfo.pullRequestTargets![0].destinationReference!,\n sourceBranch: prInfo.pullRequestTargets![0].sourceReference!,\n destinationCommit: prInfo.pullRequestTargets![0].destinationCommit!,\n sourceCommit: prInfo.pullRequestTargets![0].sourceCommit!,\n state:\n prInfo.pullRequestStatus === PullRequestStatusEnum.OPEN\n ? 'open'\n : 'closed',\n number: Number.parseInt(prId, 10),\n title: prInfo.title!,\n body: prInfo.description!,\n createdAt: prInfo.creationDate?.toISOString(),\n };\n fetchedPrs.push(pr);\n }\n\n config.prList = fetchedPrs;\n\n logger.debug(`Retrieved Pull Requests, count: ${fetchedPrs.length}`);\n return fetchedPrs;\n}\n\nexport async function findPr({\n branchName,\n prTitle,\n state = 'all',\n}: FindPRConfig): Promise<CodeCommitPr | null> {\n let prsFiltered: CodeCommitPr[] = [];\n try {\n const prs = await getPrList();\n const refsHeadBranchName = getNewBranchName(branchName);\n prsFiltered = prs.filter(\n (item) => item.sourceBranch === refsHeadBranchName,\n );\n\n if (prTitle) {\n prsFiltered = prsFiltered.filter(\n (item) => item.title.toUpperCase() === prTitle.toUpperCase(),\n );\n }\n\n switch (state) {\n case 'all':\n break;\n case '!open':\n prsFiltered = prsFiltered.filter((item) => item.state !== 'open');\n break;\n default:\n prsFiltered = prsFiltered.filter((item) => item.state === 'open');\n break;\n }\n } catch (err) {\n logger.error({ err }, 'findPr error');\n }\n if (prsFiltered.length === 0) {\n return null;\n }\n return prsFiltered[0];\n}\n\nexport async function getBranchPr(\n branchName: string,\n): Promise<CodeCommitPr | null> {\n logger.debug(`getBranchPr(${branchName})`);\n const existingPr = await findPr({\n branchName,\n state: 'open',\n });\n return existingPr ? getPr(existingPr.number) : null;\n}\n\nexport async function getPr(\n pullRequestId: number,\n): Promise<CodeCommitPr | null> {\n logger.debug(`getPr(${pullRequestId})`);\n const prRes = await client.getPr(`${pullRequestId}`);\n\n if (!prRes?.pullRequest) {\n return null;\n }\n\n const prInfo = prRes.pullRequest;\n let prState: PrState;\n if (prInfo.pullRequestTargets![0].mergeMetadata?.isMerged) {\n prState = 'merged';\n } else {\n prState =\n prInfo.pullRequestStatus === PullRequestStatusEnum.OPEN\n ? 'open'\n : 'closed';\n }\n\n return {\n sourceBranch: prInfo.pullRequestTargets![0].sourceReference!,\n sourceCommit: prInfo.pullRequestTargets![0].sourceCommit!,\n state: prState,\n number: pullRequestId,\n title: prInfo.title!,\n targetBranch: prInfo.pullRequestTargets![0].destinationReference!,\n destinationCommit: prInfo.pullRequestTargets![0].destinationCommit!,\n body: prInfo.description!,\n };\n}\n\nexport async function getRepos(): Promise<string[]> {\n logger.debug('Autodiscovering AWS CodeCommit repositories');\n\n let reposRes: ListRepositoriesOutput;\n try {\n reposRes = await client.listRepositories();\n //todo do we need pagination? maximum number of repos is 1000 without pagination, also the same for free account\n } catch (err) {\n logger.error({ err }, 'Could not retrieve repositories');\n return [];\n }\n\n const res: string[] = [];\n\n const repoNames = coerceArray(reposRes?.repositories);\n\n for (const repo of repoNames) {\n // v8 ignore else -- TODO: add test #40625\n if (repo.repositoryName) {\n res.push(repo.repositoryName);\n }\n }\n\n return res;\n}\n\nexport function massageMarkdown(input: string): string {\n // Remove any HTML we use\n return input\n .replace(\n 'you tick the rebase/retry checkbox',\n 'PR is renamed to start with \"rebase!\"',\n )\n .replace(\n 'checking the rebase/retry box above',\n 'renaming the PR to start with \"rebase!\"',\n )\n .replace(regEx(/<\\/?summary>/g), '**')\n .replace(regEx(/<\\/?details>/g), '')\n .replace(regEx(`\\n---\\n\\n.*?<!-- rebase-check -->.*?\\n`), '')\n .replace(regEx(/\\]\\(\\.\\.\\/issues\\//g), '](#')\n .replace(regEx(/\\]\\(\\.\\.\\/pull\\//g), '](../../pull-requests/')\n .replace(\n regEx(/(?<hiddenComment><!--renovate-(?:debug|config-hash):.*?-->)/g),\n '[//]: # ($<hiddenComment>)',\n );\n}\n\n/**\n * Unsed, no Dashboard\n */\nexport function maxBodyLength(): number {\n return Infinity;\n}\n\nexport async function getJsonFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<any> {\n const raw = await getRawFile(fileName, repoName, branchOrTag);\n return parseJson(raw, fileName);\n}\n\nexport async function getRawFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<string | null> {\n const fileRes = await client.getFile(\n repoName ?? config.repository,\n fileName,\n branchOrTag,\n );\n if (!fileRes?.fileContent) {\n return null;\n }\n const buf = Buffer.from(fileRes.fileContent);\n return buf.toString();\n}\n\nconst AMAZON_MAX_BODY_LENGTH = 10239;\n\nexport async function createPr({\n sourceBranch,\n targetBranch,\n prTitle: title,\n prBody: body,\n}: CreatePRConfig): Promise<CodeCommitPr> {\n const description = smartTruncate(sanitize(body), AMAZON_MAX_BODY_LENGTH);\n\n const prCreateRes = await client.createPr(\n title,\n sanitize(description),\n sourceBranch,\n targetBranch,\n config.repository,\n );\n\n if (\n !prCreateRes.pullRequest?.title ||\n !prCreateRes.pullRequest?.pullRequestId ||\n !prCreateRes.pullRequest?.description ||\n !prCreateRes.pullRequest?.pullRequestTargets?.length\n ) {\n throw new Error('Could not create pr, missing PR info');\n }\n\n return {\n number: Number.parseInt(prCreateRes.pullRequest.pullRequestId, 10),\n state: 'open',\n title: prCreateRes.pullRequest.title,\n sourceBranch,\n targetBranch,\n sourceCommit: prCreateRes.pullRequest.pullRequestTargets[0].sourceCommit!,\n destinationCommit:\n prCreateRes.pullRequest.pullRequestTargets[0].destinationCommit!,\n sourceRepo: config.repository,\n body: prCreateRes.pullRequest.description,\n };\n}\n\nexport async function updatePr({\n number: prNo,\n prTitle: title,\n prBody: body,\n state,\n}: UpdatePrConfig): Promise<void> {\n logger.debug(`updatePr(${prNo}, ${title}, body)`);\n\n let cachedPr: CodeCommitPr | undefined = undefined;\n const cachedPrs = config.prList ?? [];\n for (const p of cachedPrs) {\n // v8 ignore else -- TODO: add test #40625\n if (p.number === prNo) {\n cachedPr = p;\n }\n }\n\n // v8 ignore else -- TODO: add test #40625\n if (body && cachedPr?.body !== body) {\n await client.updatePrDescription(\n `${prNo}`,\n smartTruncate(sanitize(body), AMAZON_MAX_BODY_LENGTH),\n );\n }\n\n // v8 ignore else -- TODO: add test #40625\n if (title && cachedPr?.title !== title) {\n await client.updatePrTitle(`${prNo}`, title);\n }\n\n const prStatusInput =\n state === 'closed'\n ? PullRequestStatusEnum.CLOSED\n : PullRequestStatusEnum.OPEN;\n // v8 ignore else -- TODO: add test #40625\n if (cachedPr?.state !== prStatusInput) {\n try {\n await client.updatePrStatus(`${prNo}`, prStatusInput);\n } catch {\n // safety check\n // do nothing, it's ok to fail sometimes when trying to update from open to open or from closed to closed.\n }\n }\n}\n\n// Auto-Merge not supported currently.\n/* v8 ignore next -- auto-merge is not supported on CodeCommit, so this stub is unexercised */\nexport async function mergePr({\n branchName,\n id: prNo,\n}: MergePRConfig): Promise<boolean> {\n logger.debug(`mergePr(${prNo}, ${branchName!})`);\n await client.getPr(`${prNo}`);\n return Promise.resolve(false);\n //\n // if (!prOut) {\n // return false;\n // }\n // const pReq = prOut.pullRequest;\n // const targets = pReq?.pullRequestTargets;\n //\n // if (!targets) {\n // return false;\n // }\n //\n // if (strategy === 'rebase') {\n // logger.warn('CodeCommit does not support a \"rebase\" strategy.');\n // return false;\n // }\n //\n // try {\n // if (strategy === 'auto' || strategy === 'squash') {\n // await client.squashMerge(\n // targets[0].repositoryName!,\n // targets[0].sourceReference!,\n // targets[0].destinationReference!,\n // pReq?.title\n // );\n // } else if (strategy === 'fast-forward') {\n // await client.fastForwardMerge(\n // targets[0].repositoryName!,\n // targets[0].sourceReference!,\n // targets[0].destinationReference!\n // );\n // } else {\n // logger.debug(`unsupported strategy`);\n // return false;\n // }\n // } catch (err) {\n // logger.debug({ err }, `PR merge error`);\n // logger.info({ pr: prNo }, 'PR automerge failed');\n // return false;\n // }\n //\n // logger.trace(`Updating PR ${prNo} to status ${PullRequestStatusEnum.CLOSED}`);\n //\n // try {\n // const response = await client.updatePrStatus(\n // `${prNo}`,\n // PullRequestStatusEnum.CLOSED\n // );\n // const isClosed =\n // response.pullRequest?.pullRequestStatus === PullRequestStatusEnum.CLOSED;\n //\n // if (!isClosed) {\n // logger.warn(\n // {\n // pullRequestId: prNo,\n // status: response.pullRequest?.pullRequestStatus,\n // },\n // `Expected PR to have status`\n // );\n // }\n // return true;\n // } catch (err) {\n // logger.debug({ err }, 'Failed to set the PR as Closed.');\n // return false;\n // }\n}\n\nexport async function addReviewers(\n prNo: number,\n reviewers: string[],\n): Promise<void> {\n const numberOfApprovers = reviewers.length;\n const approvalRuleContents = `{\"Version\":\"2018-11-08\",\"Statements\": [{\"Type\": \"Approvers\",\"NumberOfApprovalsNeeded\":${numberOfApprovers},\"ApprovalPoolMembers\": ${JSON.stringify(\n reviewers,\n )}}]}`;\n const res = await client.createPrApprovalRule(\n `${prNo}`,\n approvalRuleContents,\n );\n // v8 ignore else -- TODO: add test #40625\n if (res) {\n const approvalRule = res.approvalRule;\n logger.debug({ approvalRule }, `Approval Rule Added to PR #${prNo}:`);\n }\n}\n\n/* v8 ignore next -- no-op stub: CodeCommit does not support adding assignees */\nexport function addAssignees(\n _iid: number,\n _assignees: string[],\n): Promise<void> {\n // CodeCommit does not support adding reviewers\n return Promise.resolve();\n}\n\n/* v8 ignore next -- no-op stub: CodeCommit has no issues */\nexport function findIssue(_title: string): Promise<Issue | null> {\n // CodeCommit does not have issues\n return Promise.resolve(null);\n}\n\n/* v8 ignore next -- no-op stub: CodeCommit has no issues */\nexport function ensureIssue(\n _cfg: EnsureIssueConfig,\n): Promise<EnsureIssueResult | null> {\n // CodeCommit does not have issues\n return Promise.resolve(null);\n}\n\n/* v8 ignore next -- no-op stub: CodeCommit has no issues */\nexport function getIssueList(): Promise<Issue[]> {\n // CodeCommit does not have issues\n return Promise.resolve([]);\n}\n\n/* v8 ignore next -- no-op stub: CodeCommit has no issues */\nexport function ensureIssueClosing(_title: string): Promise<void> {\n // CodeCommit does not have issues\n return Promise.resolve();\n}\n\n/* v8 ignore next -- no-op stub: label deletion is not implemented for CodeCommit */\nexport function deleteLabel(_prNumber: number, _label: string): Promise<void> {\n return Promise.resolve();\n}\n\n// Returns the combined status for a branch.\n/* v8 ignore next -- stub: branch statuses are not supported on CodeCommit yet, always yellow */\nexport function getBranchStatus(branchName: string): Promise<BranchStatus> {\n logger.debug(`getBranchStatus(${branchName})`);\n logger.debug(\n 'returning branch status yellow, because getBranchStatus isnt supported on aws yet',\n );\n return Promise.resolve('yellow');\n}\n\n/* v8 ignore next -- stub: branch status checks are not supported on CodeCommit yet, always null */\nexport function getBranchStatusCheck(\n branchName: string,\n context: string,\n): Promise<BranchStatus | null> {\n logger.debug(`getBranchStatusCheck(${branchName}, context=${context})`);\n logger.debug(\n 'returning null, because getBranchStatusCheck is not supported on aws yet',\n );\n return Promise.resolve(null);\n}\n\n/* v8 ignore next -- no-op stub: setting branch status is not supported on CodeCommit */\nexport function setBranchStatus(_cfg: BranchStatusConfig): Promise<void> {\n return Promise.resolve();\n}\n\nexport async function ensureComment({\n number,\n topic,\n content,\n}: EnsureCommentConfig): Promise<boolean> {\n logger.debug(`ensureComment(${number}, ${topic!}, content)`);\n const header = topic ? `### ${topic}\\n\\n` : '';\n const body = `${header}${sanitize(content)}`;\n let prCommentsResponse: GetCommentsForPullRequestOutput;\n try {\n prCommentsResponse = await client.getPrComments(`${number}`);\n } catch (err) {\n logger.debug({ err }, 'Unable to retrieve pr comments');\n return false;\n }\n\n let commentId: string | undefined = undefined;\n let commentNeedsUpdating = false;\n\n if (!prCommentsResponse?.commentsForPullRequestData) {\n return false;\n }\n\n for (const commentObj of prCommentsResponse.commentsForPullRequestData) {\n if (!commentObj?.comments) {\n continue;\n }\n const firstCommentContent = commentObj.comments[0].content;\n if (\n (topic && firstCommentContent?.startsWith(header)) === true ||\n (!topic && firstCommentContent === body)\n ) {\n commentId = commentObj.comments[0].commentId;\n commentNeedsUpdating = firstCommentContent !== body;\n break;\n }\n }\n\n if (!commentId) {\n const prs = await getPrList();\n const thisPr = prs.filter((item) => item.number === number);\n\n if (!thisPr[0].sourceCommit || !thisPr[0].destinationCommit) {\n return false;\n }\n\n await client.createPrComment(\n `${number}`,\n config.repository,\n body,\n thisPr[0].destinationCommit,\n thisPr[0].sourceCommit,\n );\n logger.info(\n { repository: config.repository, prNo: number, topic },\n 'Comment added',\n );\n } else if (commentNeedsUpdating && commentId) {\n await client.updateComment(commentId, body);\n\n logger.debug(\n { repository: config.repository, prNo: number, topic },\n 'Comment updated',\n );\n } else {\n logger.debug(\n { repository: config.repository, prNo: number, topic },\n 'Comment is already up-to-date',\n );\n }\n\n return true;\n}\n\nexport async function ensureCommentRemoval(\n removeConfig: EnsureCommentRemovalConfig,\n): Promise<void> {\n const { number: prNo } = removeConfig;\n const key =\n removeConfig.type === 'by-topic'\n ? removeConfig.topic\n : removeConfig.content;\n logger.debug(`Ensuring comment \"${key}\" in #${prNo} is removed`);\n\n let prCommentsResponse: GetCommentsForPullRequestOutput;\n try {\n prCommentsResponse = await client.getPrComments(`${prNo}`);\n } catch (err) {\n logger.debug({ err }, 'Unable to retrieve pr comments');\n return;\n }\n\n if (!prCommentsResponse?.commentsForPullRequestData) {\n logger.debug('commentsForPullRequestData not found');\n return;\n }\n\n let commentIdToRemove: string | undefined;\n for (const commentObj of prCommentsResponse.commentsForPullRequestData) {\n if (!commentObj?.comments) {\n logger.debug(\n 'comments object not found under commentsForPullRequestData',\n );\n continue;\n }\n\n for (const comment of commentObj.comments) {\n // v8 ignore else -- TODO: add test #40625\n if (\n (removeConfig.type === 'by-topic' &&\n comment.content?.startsWith(`### ${removeConfig.topic}\\n\\n`)) ===\n true ||\n (removeConfig.type === 'by-content' &&\n removeConfig.content === comment.content?.trim())\n ) {\n commentIdToRemove = comment.commentId;\n break;\n }\n }\n // v8 ignore else -- TODO: add test #40625\n if (commentIdToRemove) {\n await client.deleteComment(commentIdToRemove);\n logger.debug(`comment \"${key}\" in PR #${prNo} was removed`);\n break;\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["client.listRepositories","client.getRepositoryInfo","client.getCodeCommitUrl","git.initRepo","client.listPullRequests","client.getPr","client.getFile","client.createPr","client.updatePrDescription","client.updatePrTitle","client.updatePrStatus","client.createPrApprovalRule","client.getPrComments","client.createPrComment","client.updateComment","client.deleteComment"],"sources":["../../../../lib/modules/platform/codecommit/index.ts"],"sourcesContent":["import { Buffer } from 'node:buffer';\nimport type {\n GetCommentsForPullRequestOutput,\n ListRepositoriesOutput,\n} from '@aws-sdk/client-codecommit';\nimport { PullRequestStatusEnum } from '@aws-sdk/client-codecommit';\nimport {\n PLATFORM_BAD_CREDENTIALS,\n REPOSITORY_EMPTY,\n REPOSITORY_NOT_FOUND,\n} from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { BranchStatus, PrState } from '../../../types/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { parseJson } from '../../../util/common.ts';\nimport * as git from '../../../util/git/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { sanitize } from '../../../util/sanitize.ts';\nimport type {\n BranchStatusConfig,\n CreatePRConfig,\n EnsureCommentConfig,\n EnsureCommentRemovalConfig,\n EnsureIssueConfig,\n EnsureIssueResult,\n FindPRConfig,\n Issue,\n MergePRConfig,\n PlatformParams,\n PlatformResult,\n RepoParams,\n RepoResult,\n UpdatePrConfig,\n} from '../types.ts';\nimport { getNewBranchName, repoFingerprint } from '../util.ts';\nimport { smartTruncate } from '../utils/pr-body.ts';\nimport * as client from './codecommit-client.ts';\nimport type { CodeCommitPr } from './types.ts';\n\ninterface Config {\n repository?: string;\n defaultBranch?: string;\n region?: string;\n prList?: CodeCommitPr[];\n}\n\nexport const id = 'codecommit';\nexport const experimental = true;\n\nconst platformConfig = {\n endpoint: 'https://git-codecommit.us-east-1.amazonaws.com',\n};\n\nlet config: Config = {};\n\nexport async function initPlatform({\n endpoint,\n username,\n password,\n token: awsToken,\n}: PlatformParams): Promise<PlatformResult> {\n const accessKeyId = username;\n const secretAccessKey = password;\n const env = process.env;\n let region: string | undefined;\n\n if (accessKeyId) {\n env.AWS_ACCESS_KEY_ID = accessKeyId;\n }\n if (secretAccessKey) {\n env.AWS_SECRET_ACCESS_KEY = secretAccessKey;\n }\n if (awsToken) {\n env.AWS_SESSION_TOKEN = awsToken;\n }\n\n if (endpoint) {\n const regionReg = regEx(/.*codecommit\\.(?<region>.+)\\.amazonaws\\.com/);\n const codeCommitMatch = regionReg.exec(endpoint);\n region = codeCommitMatch?.groups?.region;\n if (region) {\n env.AWS_REGION = region;\n } else {\n logger.warn(\"Can't parse region, make sure your endpoint is correct\");\n }\n }\n\n // If any of the below fails, it will throw an exception stopping the program.\n client.buildCodeCommitClient();\n // To check if we have permission to codecommit, throws exception if failed.\n await client.listRepositories();\n\n platformConfig.endpoint =\n endpoint ??\n `https://git-codecommit.${env.AWS_REGION ?? 'us-east-1'}.amazonaws.com/`;\n\n const platformResult: PlatformResult = {\n endpoint: platformConfig.endpoint,\n };\n return platformResult;\n}\n\nexport async function initRepo({\n repository,\n}: RepoParams): Promise<RepoResult> {\n logger.debug(`initRepo(\"${repository}\")`);\n\n config = { repository };\n\n let repo;\n try {\n repo = await client.getRepositoryInfo(repository);\n } catch (err) {\n logger.error({ err }, 'Could not find repository');\n throw new Error(REPOSITORY_NOT_FOUND);\n }\n\n if (!repo?.repositoryMetadata) {\n logger.error({ repository }, 'Could not find repository');\n throw new Error(REPOSITORY_NOT_FOUND);\n }\n logger.debug({ repositoryDetails: repo }, 'Repository details');\n const metadata = repo.repositoryMetadata;\n\n const url = client.getCodeCommitUrl(metadata, repository);\n try {\n await git.initRepo({\n url,\n });\n } catch (err) {\n logger.debug({ err }, 'Failed to git init');\n throw new Error(PLATFORM_BAD_CREDENTIALS);\n }\n\n if (!metadata.defaultBranch || !metadata.repositoryId) {\n logger.debug('Repo is empty');\n throw new Error(REPOSITORY_EMPTY);\n }\n\n const defaultBranch = metadata.defaultBranch;\n config.defaultBranch = defaultBranch;\n logger.debug(`${repository} default branch = ${defaultBranch}`);\n\n return {\n repoFingerprint: repoFingerprint(\n metadata.repositoryId,\n platformConfig.endpoint,\n ),\n defaultBranch,\n isFork: false,\n };\n}\n\nexport async function getPrList(): Promise<CodeCommitPr[]> {\n logger.debug('getPrList()');\n\n if (config.prList) {\n return config.prList;\n }\n\n const listPrsResponse = await client.listPullRequests(config.repository!);\n const fetchedPrs: CodeCommitPr[] = [];\n\n if (listPrsResponse && !listPrsResponse.pullRequestIds) {\n return fetchedPrs;\n }\n\n const prIds = coerceArray(listPrsResponse.pullRequestIds);\n\n for (const prId of prIds) {\n const prRes = await client.getPr(prId);\n\n if (!prRes?.pullRequest) {\n continue;\n }\n const prInfo = prRes.pullRequest;\n const pr: CodeCommitPr = {\n targetBranch: prInfo.pullRequestTargets![0].destinationReference!,\n sourceBranch: prInfo.pullRequestTargets![0].sourceReference!,\n destinationCommit: prInfo.pullRequestTargets![0].destinationCommit!,\n sourceCommit: prInfo.pullRequestTargets![0].sourceCommit!,\n state:\n prInfo.pullRequestStatus === PullRequestStatusEnum.OPEN\n ? 'open'\n : 'closed',\n number: Number.parseInt(prId, 10),\n title: prInfo.title!,\n body: prInfo.description!,\n createdAt: prInfo.creationDate?.toISOString(),\n };\n fetchedPrs.push(pr);\n }\n\n config.prList = fetchedPrs;\n\n logger.debug(`Retrieved Pull Requests, count: ${fetchedPrs.length}`);\n return fetchedPrs;\n}\n\nexport async function findPr({\n branchName,\n prTitle,\n state = 'all',\n}: FindPRConfig): Promise<CodeCommitPr | null> {\n let prsFiltered: CodeCommitPr[] = [];\n try {\n const prs = await getPrList();\n const refsHeadBranchName = getNewBranchName(branchName);\n prsFiltered = prs.filter(\n (item) => item.sourceBranch === refsHeadBranchName,\n );\n\n if (prTitle) {\n prsFiltered = prsFiltered.filter(\n (item) => item.title.toUpperCase() === prTitle.toUpperCase(),\n );\n }\n\n switch (state) {\n case 'all':\n break;\n case '!open':\n prsFiltered = prsFiltered.filter((item) => item.state !== 'open');\n break;\n default:\n prsFiltered = prsFiltered.filter((item) => item.state === 'open');\n break;\n }\n } catch (err) {\n logger.error({ err }, 'findPr error');\n }\n if (prsFiltered.length === 0) {\n return null;\n }\n return prsFiltered[0];\n}\n\nexport async function getBranchPr(\n branchName: string,\n): Promise<CodeCommitPr | null> {\n logger.debug(`getBranchPr(${branchName})`);\n const existingPr = await findPr({\n branchName,\n state: 'open',\n });\n return existingPr ? getPr(existingPr.number) : null;\n}\n\nexport async function getPr(\n pullRequestId: number,\n): Promise<CodeCommitPr | null> {\n logger.debug(`getPr(${pullRequestId})`);\n const prRes = await client.getPr(`${pullRequestId}`);\n\n if (!prRes?.pullRequest) {\n return null;\n }\n\n const prInfo = prRes.pullRequest;\n let prState: PrState;\n if (prInfo.pullRequestTargets![0].mergeMetadata?.isMerged) {\n prState = 'merged';\n } else {\n prState =\n prInfo.pullRequestStatus === PullRequestStatusEnum.OPEN\n ? 'open'\n : 'closed';\n }\n\n return {\n sourceBranch: prInfo.pullRequestTargets![0].sourceReference!,\n sourceCommit: prInfo.pullRequestTargets![0].sourceCommit!,\n state: prState,\n number: pullRequestId,\n title: prInfo.title!,\n targetBranch: prInfo.pullRequestTargets![0].destinationReference!,\n destinationCommit: prInfo.pullRequestTargets![0].destinationCommit!,\n body: prInfo.description!,\n };\n}\n\nexport async function getRepos(): Promise<string[]> {\n logger.debug('Autodiscovering AWS CodeCommit repositories');\n\n let reposRes: ListRepositoriesOutput;\n try {\n reposRes = await client.listRepositories();\n //todo do we need pagination? maximum number of repos is 1000 without pagination, also the same for free account\n } catch (err) {\n logger.error({ err }, 'Could not retrieve repositories');\n return [];\n }\n\n const res: string[] = [];\n\n const repoNames = coerceArray(reposRes?.repositories);\n\n for (const repo of repoNames) {\n // v8 ignore else -- TODO: add test #40625\n if (repo.repositoryName) {\n res.push(repo.repositoryName);\n }\n }\n\n return res;\n}\n\nexport function massageMarkdown(input: string): string {\n // Remove any HTML we use\n return input\n .replace(\n 'you tick the rebase/retry checkbox',\n 'PR is renamed to start with \"rebase!\"',\n )\n .replace(\n 'checking the rebase/retry box above',\n 'renaming the PR to start with \"rebase!\"',\n )\n .replace(regEx(/<\\/?summary>/g), '**')\n .replace(regEx(/<\\/?details>/g), '')\n .replace(regEx(`\\n---\\n\\n.*?<!-- rebase-check -->.*?\\n`), '')\n .replace(regEx(/\\]\\(\\.\\.\\/issues\\//g), '](#')\n .replace(regEx(/\\]\\(\\.\\.\\/pull\\//g), '](../../pull-requests/')\n .replace(\n regEx(/(?<hiddenComment><!--renovate-(?:debug|config-hash):.*?-->)/g),\n '[//]: # ($<hiddenComment>)',\n );\n}\n\n/**\n * Unsed, no Dashboard\n */\nexport function maxBodyLength(): number {\n return Infinity;\n}\n\nexport async function getJsonFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<any> {\n const raw = await getRawFile(fileName, repoName, branchOrTag);\n return parseJson(raw, fileName);\n}\n\nexport async function getRawFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<string | null> {\n const fileRes = await client.getFile(\n repoName ?? config.repository,\n fileName,\n branchOrTag,\n );\n if (!fileRes?.fileContent) {\n return null;\n }\n const buf = Buffer.from(fileRes.fileContent);\n return buf.toString();\n}\n\nconst AMAZON_MAX_BODY_LENGTH = 10239;\n\nexport async function createPr({\n sourceBranch,\n targetBranch,\n prTitle: title,\n prBody: body,\n}: CreatePRConfig): Promise<CodeCommitPr> {\n const description = smartTruncate(sanitize(body), AMAZON_MAX_BODY_LENGTH);\n\n const prCreateRes = await client.createPr(\n title,\n sanitize(description),\n sourceBranch,\n targetBranch,\n config.repository,\n );\n\n if (\n !prCreateRes.pullRequest?.title ||\n !prCreateRes.pullRequest?.pullRequestId ||\n !prCreateRes.pullRequest?.description ||\n !prCreateRes.pullRequest?.pullRequestTargets?.length\n ) {\n throw new Error('Could not create pr, missing PR info');\n }\n\n return {\n number: Number.parseInt(prCreateRes.pullRequest.pullRequestId, 10),\n state: 'open',\n title: prCreateRes.pullRequest.title,\n sourceBranch,\n targetBranch,\n sourceCommit: prCreateRes.pullRequest.pullRequestTargets[0].sourceCommit!,\n destinationCommit:\n prCreateRes.pullRequest.pullRequestTargets[0].destinationCommit!,\n sourceRepo: config.repository,\n body: prCreateRes.pullRequest.description,\n };\n}\n\nexport async function updatePr({\n number: prNo,\n prTitle: title,\n prBody: body,\n state,\n}: UpdatePrConfig): Promise<void> {\n logger.debug(`updatePr(${prNo}, ${title}, body)`);\n\n let cachedPr: CodeCommitPr | undefined = undefined;\n const cachedPrs = config.prList ?? [];\n for (const p of cachedPrs) {\n // v8 ignore else -- TODO: add test #40625\n if (p.number === prNo) {\n cachedPr = p;\n }\n }\n\n // v8 ignore else -- TODO: add test #40625\n if (body && cachedPr?.body !== body) {\n await client.updatePrDescription(\n `${prNo}`,\n smartTruncate(sanitize(body), AMAZON_MAX_BODY_LENGTH),\n );\n }\n\n // v8 ignore else -- TODO: add test #40625\n if (title && cachedPr?.title !== title) {\n await client.updatePrTitle(`${prNo}`, title);\n }\n\n const prStatusInput =\n state === 'closed'\n ? PullRequestStatusEnum.CLOSED\n : PullRequestStatusEnum.OPEN;\n // v8 ignore else -- TODO: add test #40625\n if (cachedPr?.state !== prStatusInput) {\n try {\n await client.updatePrStatus(`${prNo}`, prStatusInput);\n } catch {\n // safety check\n // do nothing, it's ok to fail sometimes when trying to update from open to open or from closed to closed.\n }\n }\n}\n\n// Auto-Merge not supported currently.\n/* v8 ignore next -- auto-merge is not supported on CodeCommit, so this stub is unexercised */\nexport async function mergePr({\n branchName,\n id: prNo,\n}: MergePRConfig): Promise<boolean> {\n logger.debug(`mergePr(${prNo}, ${branchName!})`);\n await client.getPr(`${prNo}`);\n return Promise.resolve(false);\n //\n // if (!prOut) {\n // return false;\n // }\n // const pReq = prOut.pullRequest;\n // const targets = pReq?.pullRequestTargets;\n //\n // if (!targets) {\n // return false;\n // }\n //\n // if (strategy === 'rebase') {\n // logger.warn('CodeCommit does not support a \"rebase\" strategy.');\n // return false;\n // }\n //\n // try {\n // if (strategy === 'auto' || strategy === 'squash') {\n // await client.squashMerge(\n // targets[0].repositoryName!,\n // targets[0].sourceReference!,\n // targets[0].destinationReference!,\n // pReq?.title\n // );\n // } else if (strategy === 'fast-forward') {\n // await client.fastForwardMerge(\n // targets[0].repositoryName!,\n // targets[0].sourceReference!,\n // targets[0].destinationReference!\n // );\n // } else {\n // logger.debug(`unsupported strategy`);\n // return false;\n // }\n // } catch (err) {\n // logger.debug({ err }, `PR merge error`);\n // logger.info({ pr: prNo }, 'PR automerge failed');\n // return false;\n // }\n //\n // logger.trace(`Updating PR ${prNo} to status ${PullRequestStatusEnum.CLOSED}`);\n //\n // try {\n // const response = await client.updatePrStatus(\n // `${prNo}`,\n // PullRequestStatusEnum.CLOSED\n // );\n // const isClosed =\n // response.pullRequest?.pullRequestStatus === PullRequestStatusEnum.CLOSED;\n //\n // if (!isClosed) {\n // logger.warn(\n // {\n // pullRequestId: prNo,\n // status: response.pullRequest?.pullRequestStatus,\n // },\n // `Expected PR to have status`\n // );\n // }\n // return true;\n // } catch (err) {\n // logger.debug({ err }, 'Failed to set the PR as Closed.');\n // return false;\n // }\n}\n\nexport async function addReviewers(\n prNo: number,\n reviewers: string[],\n): Promise<void> {\n const numberOfApprovers = reviewers.length;\n const approvalRuleContents = `{\"Version\":\"2018-11-08\",\"Statements\": [{\"Type\": \"Approvers\",\"NumberOfApprovalsNeeded\":${numberOfApprovers},\"ApprovalPoolMembers\": ${JSON.stringify(\n reviewers,\n )}}]}`;\n const res = await client.createPrApprovalRule(\n `${prNo}`,\n approvalRuleContents,\n );\n // v8 ignore else -- TODO: add test #40625\n if (res) {\n const approvalRule = res.approvalRule;\n logger.debug({ approvalRule }, `Approval Rule Added to PR #${prNo}:`);\n }\n}\n\n/* v8 ignore next -- no-op stub: CodeCommit does not support adding assignees */\nexport function addAssignees(\n _iid: number,\n _assignees: string[],\n): Promise<void> {\n // CodeCommit does not support adding reviewers\n return Promise.resolve();\n}\n\n/* v8 ignore next -- no-op stub: CodeCommit has no issues */\nexport function findIssue(_title: string): Promise<Issue | null> {\n // CodeCommit does not have issues\n return Promise.resolve(null);\n}\n\n/* v8 ignore next -- no-op stub: CodeCommit has no issues */\nexport function ensureIssue(\n _cfg: EnsureIssueConfig,\n): Promise<EnsureIssueResult | null> {\n // CodeCommit does not have issues\n return Promise.resolve(null);\n}\n\n/* v8 ignore next -- no-op stub: CodeCommit has no issues */\nexport function getIssueList(): Promise<Issue[]> {\n // CodeCommit does not have issues\n return Promise.resolve([]);\n}\n\n/* v8 ignore next -- no-op stub: CodeCommit has no issues */\nexport function ensureIssueClosing(_title: string): Promise<void> {\n // CodeCommit does not have issues\n return Promise.resolve();\n}\n\n/* v8 ignore next -- no-op stub: label deletion is not implemented for CodeCommit */\nexport function deleteLabel(_prNumber: number, _label: string): Promise<void> {\n return Promise.resolve();\n}\n\n// Returns the combined status for a branch.\n/* v8 ignore next -- stub: branch statuses are not supported on CodeCommit yet, always yellow */\nexport function getBranchStatus(branchName: string): Promise<BranchStatus> {\n logger.debug(`getBranchStatus(${branchName})`);\n logger.debug(\n 'returning branch status yellow, because getBranchStatus isnt supported on aws yet',\n );\n return Promise.resolve('yellow');\n}\n\n/* v8 ignore next -- stub: branch status checks are not supported on CodeCommit yet, always null */\nexport function getBranchStatusCheck(\n branchName: string,\n context: string,\n): Promise<BranchStatus | null> {\n logger.debug(`getBranchStatusCheck(${branchName}, context=${context})`);\n logger.debug(\n 'returning null, because getBranchStatusCheck is not supported on aws yet',\n );\n return Promise.resolve(null);\n}\n\n/* v8 ignore next -- no-op stub: setting branch status is not supported on CodeCommit */\nexport function setBranchStatus(_cfg: BranchStatusConfig): Promise<void> {\n return Promise.resolve();\n}\n\nexport async function ensureComment({\n number,\n topic,\n content,\n}: EnsureCommentConfig): Promise<boolean> {\n logger.debug(`ensureComment(${number}, ${topic!}, content)`);\n const header = topic ? `### ${topic}\\n\\n` : '';\n const body = `${header}${sanitize(content)}`;\n let prCommentsResponse: GetCommentsForPullRequestOutput;\n try {\n prCommentsResponse = await client.getPrComments(`${number}`);\n } catch (err) {\n logger.debug({ err }, 'Unable to retrieve pr comments');\n return false;\n }\n\n let commentId: string | undefined = undefined;\n let commentNeedsUpdating = false;\n\n if (!prCommentsResponse?.commentsForPullRequestData) {\n return false;\n }\n\n for (const commentObj of prCommentsResponse.commentsForPullRequestData) {\n if (!commentObj?.comments) {\n continue;\n }\n const firstCommentContent = commentObj.comments[0].content;\n if (\n (topic && firstCommentContent?.startsWith(header)) === true ||\n (!topic && firstCommentContent === body)\n ) {\n commentId = commentObj.comments[0].commentId;\n commentNeedsUpdating = firstCommentContent !== body;\n break;\n }\n }\n\n if (!commentId) {\n const prs = await getPrList();\n const thisPr = prs.filter((item) => item.number === number);\n\n if (!thisPr[0].sourceCommit || !thisPr[0].destinationCommit) {\n return false;\n }\n\n await client.createPrComment(\n `${number}`,\n config.repository,\n body,\n thisPr[0].destinationCommit,\n thisPr[0].sourceCommit,\n );\n logger.info(\n { repository: config.repository, prNo: number, topic },\n 'Comment added',\n );\n } else if (commentNeedsUpdating && commentId) {\n await client.updateComment(commentId, body);\n\n logger.debug(\n { repository: config.repository, prNo: number, topic },\n 'Comment updated',\n );\n } else {\n logger.debug(\n { repository: config.repository, prNo: number, topic },\n 'Comment is already up-to-date',\n );\n }\n\n return true;\n}\n\nexport async function ensureCommentRemoval(\n removeConfig: EnsureCommentRemovalConfig,\n): Promise<void> {\n const { number: prNo } = removeConfig;\n const key =\n removeConfig.type === 'by-topic'\n ? removeConfig.topic\n : removeConfig.content;\n logger.debug(`Ensuring comment \"${key}\" in #${prNo} is removed`);\n\n let prCommentsResponse: GetCommentsForPullRequestOutput;\n try {\n prCommentsResponse = await client.getPrComments(`${prNo}`);\n } catch (err) {\n logger.debug({ err }, 'Unable to retrieve pr comments');\n return;\n }\n\n if (!prCommentsResponse?.commentsForPullRequestData) {\n logger.debug('commentsForPullRequestData not found');\n return;\n }\n\n let commentIdToRemove: string | undefined;\n for (const commentObj of prCommentsResponse.commentsForPullRequestData) {\n if (!commentObj?.comments) {\n logger.debug(\n 'comments object not found under commentsForPullRequestData',\n );\n continue;\n }\n\n for (const comment of commentObj.comments) {\n // v8 ignore else -- TODO: add test #40625\n if (\n (removeConfig.type === 'by-topic' &&\n comment.content?.startsWith(`### ${removeConfig.topic}\\n\\n`)) ===\n true ||\n (removeConfig.type === 'by-content' &&\n removeConfig.content === comment.content?.trim())\n ) {\n commentIdToRemove = comment.commentId;\n break;\n }\n }\n // v8 ignore else -- TODO: add test #40625\n if (commentIdToRemove) {\n await client.deleteComment(commentIdToRemove);\n logger.debug(`comment \"${key}\" in PR #${prNo} was removed`);\n break;\n }\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/apk/index.ts"],"sourcesContent":["import { isTruthy } from '@sindresorhus/is';\nimport { regEx } from '../../../util/regex.ts';\nimport type { GenericVersion } from '../generic.ts';\nimport { GenericVersioningApi } from '../generic.ts';\nimport type { VersioningApi } from '../types.ts';\n\nexport const id = 'apk';\nexport const displayName = 'Alpine Package Keeper (APK)';\nexport const urls = [\n '[Alpine Linux package policies](https://wiki.alpinelinux.org/wiki/Package_policies)',\n '[Alpine Package Keeper - Package pinning](https://wiki.alpinelinux.org/wiki/Alpine_Package_Keeper#Package_pinning)',\n];\nexport const supportsRanges = false;\n\n// Regex with named capture groups for APK version parsing\nconst versionRegex = regEx(\n /^v?(?<major>[0-9]+)(?:\\.(?<minor>[0-9]+))?(?:\\.(?<patch>[0-9]+))?(?<extra>(?:\\.[0-9]+)*)(?<letter>[a-z])?(?:(?<prereleaseType>_alpha|_beta|_pre|_rc)(?<prereleaseNum>[0-9]*))?(?:(?<packageFixType>_cvs|_svn|_git|_hg|_p)(?<packageFixNum>[0-9]*))?(?:-r(?<releaseNum>[0-9]+))?$/,\n);\n\n// Regex for splitting version strings into alphanumeric parts\nconst alphaNumRegex = regEx(/([a-zA-Z]+)|(\\d+)/g);\n\nexport interface ApkVersion extends GenericVersion {\n /**\n * version is the main version part: it defines the version of origin software\n * that was packaged.\n */\n version: string;\n /**\n * releaseString is used to distinguish between different versions of packaging for the\n * same upstream version.\n */\n releaseString: string;\n}\n\nclass ApkVersioningApi extends GenericVersioningApi {\n /**\n * Parse APK version format using apko's version parsing patterns\n * Based on `Apache-2.0` code in https://github.com/chainguard-dev/apko/blob/v0.30.35/pkg/apk/apk/version.go\n */\n protected _parse(version: string): ApkVersion | null {\n const match = versionRegex.exec(version);\n if (!match?.groups) {\n return null;\n }\n\n const {\n major,\n minor,\n patch,\n extra,\n letter,\n prereleaseType,\n prereleaseNum,\n packageFixType,\n packageFixNum,\n releaseNum,\n } = match.groups;\n\n const packageFixFull = packageFixType ? packageFixType + packageFixNum : '';\n\n const minorPatchStr =\n (minor ? `.${minor}` : '') + (patch ? `.${patch}` : '') + extra;\n\n // For version comparison, we only include the base version + package fix, not prerelease\n const versionStr = major + minorPatchStr + (letter ?? '') + packageFixFull;\n\n let prerelease: string | undefined;\n if (prereleaseType) {\n prerelease = prereleaseType.substring(1) + prereleaseNum;\n }\n\n // Extract numeric parts for major/minor/patch/extra\n const release = [parseInt(major, 10)];\n if (minor) {\n release.push(parseInt(minor, 10));\n }\n if (patch) {\n release.push(parseInt(patch, 10));\n }\n // Handle any additional version parts (e.g., 1.2.3.4.5)\n if (extra) {\n const extraParts = extra\n .substring(1)\n .split('.')\n .filter(isTruthy)\n .map(Number);\n release.push(...extraParts);\n }\n\n // Extract release string (just the number part)\n const releaseString = releaseNum ?? '';\n\n return {\n version: versionStr,\n releaseString,\n release,\n prerelease,\n };\n }\n\n /**\n * Compare two APK versions according to Alpine Linux rules\n */\n protected override _compare(version: string, other: string): number {\n const parsed1 = this._parse(version);\n const parsed2 = this._parse(other);\n\n if (!(parsed1 && parsed2)) {\n return 1;\n }\n\n // Compare version parts (without release number)\n const versionCompare = this._compareVersionParts(\n parsed1.version,\n parsed2.version,\n );\n if (versionCompare !== 0) {\n return versionCompare;\n }\n\n // Compare prerelease identifiers\n const prerelease1 = parsed1.prerelease;\n const prerelease2 = parsed2.prerelease;\n\n if (prerelease1 || prerelease2) {\n if (!prerelease1) {\n return -1; // Version without prerelease < version with prerelease (APK-specific)\n }\n if (!prerelease2) {\n return 1; // Version with prerelease > version without (APK-specific)\n }\n // Both have prerelease identifiers, compare them\n const prereleaseCompare = prerelease1.localeCompare(prerelease2);\n if (prereleaseCompare !== 0) {\n return prereleaseCompare;\n }\n }\n\n // Compare release numbers\n const release1 = parsed1.releaseString || '';\n const release2 = parsed2.releaseString || '';\n\n // If one has a release number and the other doesn't, the one with release number is greater\n if (release1 && !release2) {\n return 1;\n }\n if (!release1 && release2) {\n return -1;\n }\n\n // If both have release numbers or neither has release numbers, compare them\n const releaseCompare = this._compareVersionParts(\n release1 || '0',\n release2 || '0',\n );\n return releaseCompare;\n }\n\n /**\n * Compare version parts using APK's version comparison rules\n */\n private _compareVersionParts(v1: string, v2: string): number {\n if (v1 === v2) {\n return 0;\n }\n const matchesv1 = v1.match(alphaNumRegex)!;\n const matchesv2 = v2.match(alphaNumRegex)!;\n const matches = Math.min(matchesv1.length, matchesv2.length);\n\n for (let i = 0; i < matches; i++) {\n const matchv1 = matchesv1[i];\n const matchv2 = matchesv2[i];\n\n if (matchv1 && regEx(/^\\d+$/).test(matchv1)) {\n if (!matchv2 || !regEx(/^\\d+$/).test(matchv2)) {\n return 1;\n }\n const num1 = parseInt(matchv1, 10);\n const num2 = parseInt(matchv2, 10);\n if (num1 !== num2) {\n return num1 - num2;\n }\n } else if (matchv2 && regEx(/^\\d+$/).test(matchv2)) {\n return -1;\n } else if (matchv1 !== matchv2) {\n return matchv1.localeCompare(matchv2);\n }\n }\n\n if (matchesv1.length !== matchesv2.length) {\n const maxLength = Math.max(matchesv1.length, matchesv2.length);\n for (let i = matches; i < maxLength; i++) {\n const matchv1 = matchesv1[i];\n const matchv2 = matchesv2[i];\n\n if (matchv1 && regEx(/^\\d+$/).test(matchv1)) {\n return 1;\n }\n if (matchv2 && regEx(/^\\d+$/).test(matchv2)) {\n return -1;\n }\n if (matchv1) {\n return -1;\n }\n return 1;\n }\n }\n\n return 0;\n }\n\n override isValid(version: string): boolean {\n if (!version) {\n return false;\n }\n // Strip any operators (=, >, <, ~) before validation\n const cleanVersion = version.replace(regEx(/^[=><~][=]?/), '');\n const parsed = this._parse(cleanVersion);\n return parsed !== null;\n }\n\n override isSingleVersion(version: string): boolean {\n if (!version) {\n return false;\n }\n // Range constraints (>, >=, <, <=, ~) are not single versions\n if (regEx(/^[><~]/).test(version)) {\n return false;\n }\n // Exact versions (starting with = or no operator) are single versions\n return this.isValid(version);\n }\n\n override isStable(version: string): boolean {\n if (!version) {\n return false;\n }\n // Strip any operators (=, >, <, ~) before checking stability\n const cleanVersion = version.replace(regEx(/^[=><~][=]?/), '');\n const parsed = this._parse(cleanVersion);\n if (!parsed) {\n return false;\n }\n // Consider versions without prerelease identifiers as stable\n return !parsed.prerelease;\n }\n\n override getSatisfyingVersion(\n versions: string[],\n range: string,\n ): string | null {\n // Handle range expressions like >5.2.37-r0, <5.2.37-r0, ~5.2.37-r0, etc.\n const rangeMatch = regEx(/^([><=~]+)(.+)$/).exec(range);\n if (!rangeMatch) {\n // If no range operator, look for exact match\n return versions.find((v) => this.equals(v, range)) ?? null;\n }\n\n const [, operator, targetVersion] = rangeMatch;\n\n // Filter versions that satisfy the range\n const satisfyingVersions = versions.filter((version) => {\n if (!this.isValid(version) || !this.isValid(targetVersion)) {\n return false;\n }\n\n switch (operator) {\n case '>':\n return this.isGreaterThan(version, targetVersion);\n case '>=':\n return (\n this.isGreaterThan(version, targetVersion) ||\n this.equals(version, targetVersion)\n );\n case '<':\n return this.isLessThanRange(version, targetVersion);\n case '<=':\n return (\n this.isLessThanRange(version, targetVersion) ||\n this.equals(version, targetVersion)\n );\n case '=':\n case '==':\n return this.equals(version, targetVersion);\n case '~': {\n const targetParsed = this._parse(targetVersion)!;\n const versionParsed = this._parse(version)!;\n\n // Must have same major and minor versions\n if (\n targetParsed.release[0] !== versionParsed.release[0] ||\n targetParsed.release[1] !== versionParsed.release[1]\n ) {\n return false;\n }\n\n // Version must be >= target\n return (\n this.isGreaterThan(version, targetVersion) ||\n this.equals(version, targetVersion)\n );\n }\n }\n // Fallback for unhandled operator combinations like >>, <>, ><, ~~~\n // These match the regex but aren't semantically valid APK range operators\n return false;\n });\n\n if (satisfyingVersions.length === 0) {\n return null;\n }\n\n // Return the highest satisfying version\n return satisfyingVersions.sort((a, b) => this.sortVersions(b, a))[0];\n }\n\n override getMajor(version: string): number | null {\n if (!version) {\n return null;\n }\n // Strip any operators (=, >, <, ~) before parsing\n const cleanVersion = version.replace(regEx(/^[=><~][=]?/), '');\n const parsed = this._parse(cleanVersion);\n return parsed?.release[0] ?? null;\n }\n\n override getMinor(version: string): number | null {\n if (!version) {\n return null;\n }\n // Strip any operators (=, >, <, ~) before parsing\n const cleanVersion = version.replace(regEx(/^[=><~][=]?/), '');\n const parsed = this._parse(cleanVersion);\n return parsed?.release[1] ?? null;\n }\n\n override getPatch(version: string): number | null {\n if (!version) {\n return null;\n }\n // Strip any operators (=, >, <, ~) before parsing\n const cleanVersion = version.replace(regEx(/^[=><~][=]?/), '');\n const parsed = this._parse(cleanVersion);\n if (!parsed) {\n return null;\n }\n return parsed.release[2] ?? null;\n }\n\n override getNewValue({\n currentValue,\n newVersion,\n }: {\n currentValue: string;\n rangeStrategy?: string;\n currentVersion?: string;\n newVersion: string;\n }): string | null {\n // APK packages in apko.yaml only use exact versions\n // currentValue is stored without the = operator for cleaner PR display\n const hasRevision = regEx(/-r\\d+$/).test(currentValue);\n\n // If current version has no revision, strip revision from newVersion\n // This ensures both newValue and the displayed version are clean\n if (!hasRevision) {\n return newVersion.replace(regEx(/-r\\d+$/), '');\n }\n\n // If current version has revision, keep revision in newVersion\n return newVersion;\n }\n\n // Override to provide clean version for PR titles and display\n override sortVersions(a: string, b: string): number {\n // Strip = prefix if present for comparison\n const cleanA = a.replace(regEx(/^=/), '');\n const cleanB = b.replace(regEx(/^=/), '');\n return super.sortVersions(cleanA, cleanB);\n }\n}\n\nexport const api: VersioningApi = new ApkVersioningApi();\n\nexport default api;\n"],"mappings":"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"}
1
+ {"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 { GenericVersioningApi } from '../generic.ts';\nimport type { VersioningApi } from '../types.ts';\nimport type { ApkVersion } 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\nclass ApkVersioningApi extends GenericVersioningApi {\n /**\n * Parse APK version format using apko's version parsing patterns\n * Based on `Apache-2.0` code in https://github.com/chainguard-dev/apko/blob/v0.30.35/pkg/apk/apk/version.go\n */\n protected _parse(version: string): ApkVersion | null {\n const match = versionRegex.exec(version);\n if (!match?.groups) {\n return null;\n }\n\n const {\n major,\n minor,\n patch,\n extra,\n letter,\n prereleaseType,\n prereleaseNum,\n packageFixType,\n packageFixNum,\n releaseNum,\n } = match.groups;\n\n const packageFixFull = packageFixType ? packageFixType + packageFixNum : '';\n\n const minorPatchStr =\n (minor ? `.${minor}` : '') + (patch ? `.${patch}` : '') + extra;\n\n // For version comparison, we only include the base version + package fix, not prerelease\n const versionStr = major + minorPatchStr + (letter ?? '') + packageFixFull;\n\n let prerelease: string | undefined;\n if (prereleaseType) {\n prerelease = prereleaseType.substring(1) + prereleaseNum;\n }\n\n // Extract numeric parts for major/minor/patch/extra\n const release = [parseInt(major, 10)];\n if (minor) {\n release.push(parseInt(minor, 10));\n }\n if (patch) {\n release.push(parseInt(patch, 10));\n }\n // Handle any additional version parts (e.g., 1.2.3.4.5)\n if (extra) {\n const extraParts = extra\n .substring(1)\n .split('.')\n .filter(isTruthy)\n .map(Number);\n release.push(...extraParts);\n }\n\n // Extract release string (just the number part)\n const releaseString = releaseNum ?? '';\n\n return {\n version: versionStr,\n releaseString,\n release,\n prerelease,\n };\n }\n\n /**\n * Compare two APK versions according to Alpine Linux rules\n */\n protected override _compare(version: string, other: string): number {\n const parsed1 = this._parse(version);\n const parsed2 = this._parse(other);\n\n if (!(parsed1 && parsed2)) {\n return 1;\n }\n\n // Compare version parts (without release number)\n const versionCompare = this._compareVersionParts(\n parsed1.version,\n parsed2.version,\n );\n if (versionCompare !== 0) {\n return versionCompare;\n }\n\n // Compare prerelease identifiers\n const prerelease1 = parsed1.prerelease;\n const prerelease2 = parsed2.prerelease;\n\n if (prerelease1 || prerelease2) {\n if (!prerelease1) {\n return -1; // Version without prerelease < version with prerelease (APK-specific)\n }\n if (!prerelease2) {\n return 1; // Version with prerelease > version without (APK-specific)\n }\n // Both have prerelease identifiers, compare them\n const prereleaseCompare = prerelease1.localeCompare(prerelease2);\n if (prereleaseCompare !== 0) {\n return prereleaseCompare;\n }\n }\n\n // Compare release numbers\n const release1 = parsed1.releaseString || '';\n const release2 = parsed2.releaseString || '';\n\n // If one has a release number and the other doesn't, the one with release number is greater\n if (release1 && !release2) {\n return 1;\n }\n if (!release1 && release2) {\n return -1;\n }\n\n // If both have release numbers or neither has release numbers, compare them\n const releaseCompare = this._compareVersionParts(\n release1 || '0',\n release2 || '0',\n );\n return releaseCompare;\n }\n\n /**\n * Compare version parts using APK's version comparison rules\n */\n private _compareVersionParts(v1: string, v2: string): number {\n if (v1 === v2) {\n return 0;\n }\n const matchesv1 = v1.match(alphaNumRegex)!;\n const matchesv2 = v2.match(alphaNumRegex)!;\n const matches = Math.min(matchesv1.length, matchesv2.length);\n\n for (let i = 0; i < matches; i++) {\n const matchv1 = matchesv1[i];\n const matchv2 = matchesv2[i];\n\n if (matchv1 && regEx(/^\\d+$/).test(matchv1)) {\n if (!matchv2 || !regEx(/^\\d+$/).test(matchv2)) {\n return 1;\n }\n const num1 = parseInt(matchv1, 10);\n const num2 = parseInt(matchv2, 10);\n if (num1 !== num2) {\n return num1 - num2;\n }\n } else if (matchv2 && regEx(/^\\d+$/).test(matchv2)) {\n return -1;\n } else if (matchv1 !== matchv2) {\n return matchv1.localeCompare(matchv2);\n }\n }\n\n if (matchesv1.length !== matchesv2.length) {\n const maxLength = Math.max(matchesv1.length, matchesv2.length);\n for (let i = matches; i < maxLength; i++) {\n const matchv1 = matchesv1[i];\n const matchv2 = matchesv2[i];\n\n if (matchv1 && regEx(/^\\d+$/).test(matchv1)) {\n return 1;\n }\n if (matchv2 && regEx(/^\\d+$/).test(matchv2)) {\n return -1;\n }\n if (matchv1) {\n return -1;\n }\n return 1;\n }\n }\n\n return 0;\n }\n\n override isValid(version: string): boolean {\n if (!version) {\n return false;\n }\n // Strip any operators (=, >, <, ~) before validation\n const cleanVersion = version.replace(regEx(/^[=><~][=]?/), '');\n const parsed = this._parse(cleanVersion);\n return parsed !== null;\n }\n\n override isSingleVersion(version: string): boolean {\n if (!version) {\n return false;\n }\n // Range constraints (>, >=, <, <=, ~) are not single versions\n if (regEx(/^[><~]/).test(version)) {\n return false;\n }\n // Exact versions (starting with = or no operator) are single versions\n return this.isValid(version);\n }\n\n override isStable(version: string): boolean {\n if (!version) {\n return false;\n }\n // Strip any operators (=, >, <, ~) before checking stability\n const cleanVersion = version.replace(regEx(/^[=><~][=]?/), '');\n const parsed = this._parse(cleanVersion);\n if (!parsed) {\n return false;\n }\n // Consider versions without prerelease identifiers as stable\n return !parsed.prerelease;\n }\n\n override getSatisfyingVersion(\n versions: string[],\n range: string,\n ): string | null {\n // Handle range expressions like >5.2.37-r0, <5.2.37-r0, ~5.2.37-r0, etc.\n const rangeMatch = regEx(/^([><=~]+)(.+)$/).exec(range);\n if (!rangeMatch) {\n // If no range operator, look for exact match\n return versions.find((v) => this.equals(v, range)) ?? null;\n }\n\n const [, operator, targetVersion] = rangeMatch;\n\n // Filter versions that satisfy the range\n const satisfyingVersions = versions.filter((version) => {\n if (!this.isValid(version) || !this.isValid(targetVersion)) {\n return false;\n }\n\n switch (operator) {\n case '>':\n return this.isGreaterThan(version, targetVersion);\n case '>=':\n return (\n this.isGreaterThan(version, targetVersion) ||\n this.equals(version, targetVersion)\n );\n case '<':\n return this.isLessThanRange(version, targetVersion);\n case '<=':\n return (\n this.isLessThanRange(version, targetVersion) ||\n this.equals(version, targetVersion)\n );\n case '=':\n case '==':\n return this.equals(version, targetVersion);\n case '~': {\n const targetParsed = this._parse(targetVersion)!;\n const versionParsed = this._parse(version)!;\n\n // Must have same major and minor versions\n if (\n targetParsed.release[0] !== versionParsed.release[0] ||\n targetParsed.release[1] !== versionParsed.release[1]\n ) {\n return false;\n }\n\n // Version must be >= target\n return (\n this.isGreaterThan(version, targetVersion) ||\n this.equals(version, targetVersion)\n );\n }\n }\n // Fallback for unhandled operator combinations like >>, <>, ><, ~~~\n // These match the regex but aren't semantically valid APK range operators\n return false;\n });\n\n if (satisfyingVersions.length === 0) {\n return null;\n }\n\n // Return the highest satisfying version\n return satisfyingVersions.sort((a, b) => this.sortVersions(b, a))[0];\n }\n\n override getMajor(version: string): number | null {\n if (!version) {\n return null;\n }\n // Strip any operators (=, >, <, ~) before parsing\n const cleanVersion = version.replace(regEx(/^[=><~][=]?/), '');\n const parsed = this._parse(cleanVersion);\n return parsed?.release[0] ?? null;\n }\n\n override getMinor(version: string): number | null {\n if (!version) {\n return null;\n }\n // Strip any operators (=, >, <, ~) before parsing\n const cleanVersion = version.replace(regEx(/^[=><~][=]?/), '');\n const parsed = this._parse(cleanVersion);\n return parsed?.release[1] ?? null;\n }\n\n override getPatch(version: string): number | null {\n if (!version) {\n return null;\n }\n // Strip any operators (=, >, <, ~) before parsing\n const cleanVersion = version.replace(regEx(/^[=><~][=]?/), '');\n const parsed = this._parse(cleanVersion);\n if (!parsed) {\n return null;\n }\n return parsed.release[2] ?? null;\n }\n\n override getNewValue({\n currentValue,\n newVersion,\n }: {\n currentValue: string;\n rangeStrategy?: string;\n currentVersion?: string;\n newVersion: string;\n }): string | null {\n // APK packages in apko.yaml only use exact versions\n // currentValue is stored without the = operator for cleaner PR display\n const hasRevision = regEx(/-r\\d+$/).test(currentValue);\n\n // If current version has no revision, strip revision from newVersion\n // This ensures both newValue and the displayed version are clean\n if (!hasRevision) {\n return newVersion.replace(regEx(/-r\\d+$/), '');\n }\n\n // If current version has revision, keep revision in newVersion\n return newVersion;\n }\n\n // Override to provide clean version for PR titles and display\n override sortVersions(a: string, b: string): number {\n // Strip = prefix if present for comparison\n const cleanA = a.replace(regEx(/^=/), '');\n const cleanB = b.replace(regEx(/^=/), '');\n return super.sortVersions(cleanA, cleanB);\n }\n}\n\nexport const api: VersioningApi = new ApkVersioningApi();\n\nexport default api;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/aws-machine-image/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 = 'aws-machine-image';\nexport const displayName = 'aws-machine-image';\n\nexport const urls = [];\n\nexport const supportsRanges = false;\n\nconst awsMachineImageRegex = regEx('^ami-(?<suffix>[a-z0-9]{17})$');\n\nclass AwsMachineImageVersioningApi extends GenericVersioningApi {\n protected _parse(version: string): GenericVersion | null {\n if (version) {\n const matchGroups = awsMachineImageRegex.exec(version)?.groups;\n if (matchGroups) {\n const { suffix } = matchGroups;\n return { release: [1, 0, 0], suffix };\n }\n }\n return null;\n }\n\n protected override _compare(_version: string, _other: string): number {\n return 1;\n }\n}\n\nexport const api: VersioningApi = new AwsMachineImageVersioningApi();\n\nexport default api;\n"],"mappings":";;;AAKA,MAAa,KAAK;AAOlB,MAAM,uBAAuB,MAAM,+BAA+B;AAElE,IAAM,+BAAN,cAA2C,qBAAqB;CAC9D,OAAiB,SAAwC;EACvD,IAAI,SAAS;GACX,MAAM,cAAc,qBAAqB,KAAK,OAAO,CAAC,EAAE;GACxD,IAAI,aAAa;IACf,MAAM,EAAE,WAAW;IACnB,OAAO;KAAE,SAAS;MAAC;MAAG;MAAG;KAAC;KAAG;IAAO;GACtC;EACF;EACA,OAAO;CACT;CAEA,SAA4B,UAAkB,QAAwB;EACpE,OAAO;CACT;AACF;AAEA,MAAa,MAAqB,IAAI,6BAA6B"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/aws-machine-image/index.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport { GenericVersioningApi } from '../generic.ts';\nimport type { GenericVersion, VersioningApi } from '../types.ts';\n\nexport const id = 'aws-machine-image';\nexport const displayName = 'aws-machine-image';\n\nexport const urls = [];\n\nexport const supportsRanges = false;\n\nconst awsMachineImageRegex = regEx('^ami-(?<suffix>[a-z0-9]{17})$');\n\nclass AwsMachineImageVersioningApi extends GenericVersioningApi {\n protected _parse(version: string): GenericVersion | null {\n if (version) {\n const matchGroups = awsMachineImageRegex.exec(version)?.groups;\n if (matchGroups) {\n const { suffix } = matchGroups;\n return { release: [1, 0, 0], suffix };\n }\n }\n return null;\n }\n\n protected override _compare(_version: string, _other: string): number {\n return 1;\n }\n}\n\nexport const api: VersioningApi = new AwsMachineImageVersioningApi();\n\nexport default api;\n"],"mappings":";;;AAIA,MAAa,KAAK;AAOlB,MAAM,uBAAuB,MAAM,+BAA+B;AAElE,IAAM,+BAAN,cAA2C,qBAAqB;CAC9D,OAAiB,SAAwC;EACvD,IAAI,SAAS;GACX,MAAM,cAAc,qBAAqB,KAAK,OAAO,CAAC,EAAE;GACxD,IAAI,aAAa;IACf,MAAM,EAAE,WAAW;IACnB,OAAO;KAAE,SAAS;MAAC;MAAG;MAAG;KAAC;KAAG;IAAO;GACtC;EACF;EACA,OAAO;CACT;CAEA,SAA4B,UAAkB,QAAwB;EACpE,OAAO;CACT;AACF;AAEA,MAAa,MAAqB,IAAI,6BAA6B"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/azure-rest-api/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 = 'azure-rest-api';\nexport const displayName = 'azure-rest-api';\n\nexport const urls = [\n '[Microsoft Azure API versioning guidelines](https://github.com/microsoft/api-guidelines/blob/vNext/azure/Guidelines.md#api-versioning)',\n];\n\nexport const supportsRanges = false;\n\nconst AZURE_REST_API_VERSION_REGEX = regEx(\n /^(?<year>\\d{4})-(?<month>\\d{2})-(?<day>\\d{2})(?<prerelease>-[a-z]+)?$/,\n);\n\nclass AzureRestApiVersioningApi extends GenericVersioningApi {\n protected _parse(version: string): GenericVersion | null {\n if (!version) {\n return null;\n }\n\n const matchGroups = AZURE_REST_API_VERSION_REGEX.exec(version)?.groups;\n\n if (!matchGroups) {\n return null;\n }\n\n const { year, month, day, prerelease } = matchGroups;\n\n return {\n release: [parseInt(`${year}${month}${day}`, 10), 0, 0],\n prerelease,\n };\n }\n\n protected override _compare(_version: string, _other: string): number {\n if (_version === _other) {\n return 0;\n }\n\n return _version > _other ? 1 : -1;\n }\n}\n\nexport const api: VersioningApi = new AzureRestApiVersioningApi();\n\nexport default api;\n"],"mappings":";;;AAKA,MAAa,KAAK;AASlB,MAAM,+BAA+B,MACnC,uEACF;AAEA,IAAM,4BAAN,cAAwC,qBAAqB;CAC3D,OAAiB,SAAwC;EACvD,IAAI,CAAC,SACH,OAAO;EAGT,MAAM,cAAc,6BAA6B,KAAK,OAAO,CAAC,EAAE;EAEhE,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,EAAE,MAAM,OAAO,KAAK,eAAe;EAEzC,OAAO;GACL,SAAS;IAAC,SAAS,GAAG,OAAO,QAAQ,OAAO,EAAE;IAAG;IAAG;GAAC;GACrD;EACF;CACF;CAEA,SAA4B,UAAkB,QAAwB;EACpE,IAAI,aAAa,QACf,OAAO;EAGT,OAAO,WAAW,SAAS,IAAI;CACjC;AACF;AAEA,MAAa,MAAqB,IAAI,0BAA0B"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/azure-rest-api/index.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport { GenericVersioningApi } from '../generic.ts';\nimport type { GenericVersion, VersioningApi } from '../types.ts';\n\nexport const id = 'azure-rest-api';\nexport const displayName = 'azure-rest-api';\n\nexport const urls = [\n '[Microsoft Azure API versioning guidelines](https://github.com/microsoft/api-guidelines/blob/vNext/azure/Guidelines.md#api-versioning)',\n];\n\nexport const supportsRanges = false;\n\nconst AZURE_REST_API_VERSION_REGEX = regEx(\n /^(?<year>\\d{4})-(?<month>\\d{2})-(?<day>\\d{2})(?<prerelease>-[a-z]+)?$/,\n);\n\nclass AzureRestApiVersioningApi extends GenericVersioningApi {\n protected _parse(version: string): GenericVersion | null {\n if (!version) {\n return null;\n }\n\n const matchGroups = AZURE_REST_API_VERSION_REGEX.exec(version)?.groups;\n\n if (!matchGroups) {\n return null;\n }\n\n const { year, month, day, prerelease } = matchGroups;\n\n return {\n release: [parseInt(`${year}${month}${day}`, 10), 0, 0],\n prerelease,\n };\n }\n\n protected override _compare(_version: string, _other: string): number {\n if (_version === _other) {\n return 0;\n }\n\n return _version > _other ? 1 : -1;\n }\n}\n\nexport const api: VersioningApi = new AzureRestApiVersioningApi();\n\nexport default api;\n"],"mappings":";;;AAIA,MAAa,KAAK;AASlB,MAAM,+BAA+B,MACnC,uEACF;AAEA,IAAM,4BAAN,cAAwC,qBAAqB;CAC3D,OAAiB,SAAwC;EACvD,IAAI,CAAC,SACH,OAAO;EAGT,MAAM,cAAc,6BAA6B,KAAK,OAAO,CAAC,EAAE;EAEhE,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,EAAE,MAAM,OAAO,KAAK,eAAe;EAEzC,OAAO;GACL,SAAS;IAAC,SAAS,GAAG,OAAO,QAAQ,OAAO,EAAE;IAAG;IAAG;GAAC;GACrD;EACF;CACF;CAEA,SAA4B,UAAkB,QAAwB;EACpE,IAAI,aAAa,QACf,OAAO;EAGT,OAAO,WAAW,SAAS,IAAI;CACjC;AACF;AAEA,MAAa,MAAqB,IAAI,0BAA0B"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/deb/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 = 'deb';\nexport const displayName = 'Deb version';\nexport const urls = [\n '[Debian policy - Version](https://www.debian.org/doc/debian-policy/ch-controlfields.html#version)',\n '[deb-version man page](https://manpages.debian.org/unstable/dpkg-dev/deb-version.7.en.html)',\n];\nexport const supportsRanges = false;\n\nconst epochPattern = regEx(/^\\d+$/);\nconst upstreamVersionPattern = regEx(/^[-+.:~A-Za-z\\d]+$/);\nconst debianRevisionPattern = regEx(/^[+.~A-Za-z\\d]*$/);\nconst numericPattern = regEx(/\\d+/g);\nconst characterOrder =\n '~ ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+-.:';\nconst numericChars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];\n\nexport interface DebVersion extends GenericVersion {\n /**\n * epoch, defaults to 0 if not present, are used to leave version mistakes and previous\n * versioning schemes behind.\n */\n epoch: number;\n /**\n * upstreamVersion is the main version part: it defines the version of origin software\n * that was packaged.\n */\n upstreamVersion: string;\n /**\n * debianRevision is used to distinguish between different versions of packaging for the\n * same upstream version.\n */\n debianRevision: string;\n}\n\nclass DebVersioningApi extends GenericVersioningApi {\n protected _parse(version: string): DebVersion | null {\n /* Splitting version into \"[epoch:]upstream-version[-debian-revision]\"\n All found numbers are exported as release info */\n\n // split of first element by `:` as epoch:\n const epochSplit = version.split(':');\n const epochStr = epochSplit.length > 1 ? epochSplit.shift()! : '0';\n const remainingVersion = epochSplit.join(':');\n\n // split of last element by `-`\n if (remainingVersion.endsWith('-')) {\n // Forbid debian revision (it would result in `2.4.0-` == `2.4.0`)\n return null;\n }\n const debianSplit = remainingVersion.split('-');\n const debianRevision = debianSplit.length > 1 ? debianSplit.pop()! : '';\n const upstreamVersion = debianSplit.join('-');\n\n if (\n !epochPattern.test(epochStr) ||\n !upstreamVersionPattern.test(upstreamVersion) ||\n !debianRevisionPattern.test(debianRevision)\n ) {\n return null;\n }\n const release = [...remainingVersion.matchAll(numericPattern)].map((m) =>\n parseInt(m[0], 10),\n );\n return {\n epoch: parseInt(epochStr, 10),\n upstreamVersion,\n debianRevision,\n release,\n suffix: debianRevision,\n };\n }\n\n protected _compare_string(a: string, b: string): number {\n /* Special string sorting based on official specification:\n * https://manpages.debian.org/unstable/dpkg-dev/deb-version.7.en.html#Sorting_algorithm\n * The string is compared by continuous blocks of a) non-digit and b) digit characters.\n * Non-digit blocks are compared lexicographically with a custom character order.\n * Digit blocks are compared numerically.\n * We are alternating between both modes until a difference is found.\n */\n let charPos = 0;\n while (charPos < a.length || charPos < b.length) {\n const aChar = a.charAt(charPos);\n const bChar = b.charAt(charPos);\n if (numericChars.includes(aChar) && numericChars.includes(bChar)) {\n // numeric comparison of the whole block\n let aNumericEnd = charPos + 1;\n while (numericChars.includes(a.charAt(aNumericEnd))) {\n aNumericEnd += 1;\n }\n let bNumericEnd = charPos + 1;\n while (numericChars.includes(b.charAt(bNumericEnd))) {\n bNumericEnd += 1;\n }\n const numericCmp = a\n .substring(charPos, aNumericEnd)\n .localeCompare(b.substring(charPos, bNumericEnd), undefined, {\n numeric: true,\n });\n if (numericCmp !== 0) {\n return numericCmp;\n }\n charPos = aNumericEnd; // the same as bNumericEnd as both are the same\n continue;\n }\n if (aChar !== bChar) {\n // Lexicographical comparison\n // numeric character is treated like end of string (they are part of a new block)\n const aPriority = characterOrder.indexOf(\n numericChars.includes(aChar) || aChar === '' ? ' ' : aChar,\n );\n const bPriority = characterOrder.indexOf(\n numericChars.includes(bChar) || bChar === '' ? ' ' : bChar,\n );\n return Math.sign(aPriority - bPriority);\n }\n charPos += 1;\n }\n return 0;\n }\n\n protected override _compare(version: string, other: string): number {\n const parsed1 = this._parse(version);\n const parsed2 = this._parse(other);\n if (!(parsed1 && parsed2)) {\n return 1;\n }\n if (parsed1.epoch !== parsed2.epoch) {\n return Math.sign(parsed1.epoch - parsed2.epoch);\n }\n const upstreamVersionDifference = this._compare_string(\n parsed1.upstreamVersion,\n parsed2.upstreamVersion,\n );\n if (upstreamVersionDifference !== 0) {\n return upstreamVersionDifference;\n }\n return this._compare_string(parsed1.debianRevision, parsed2.debianRevision);\n }\n}\n\nexport const api: VersioningApi = new DebVersioningApi();\n\nexport default api;\n"],"mappings":";;AAaA,MAAM,eAAe,MAAM,OAAO;AAClC,MAAM,yBAAyB,MAAM,oBAAoB;AACzD,MAAM,wBAAwB,MAAM,kBAAkB;AACtD,MAAM,iBAAiB,MAAM,MAAM;AACnC,MAAM,iBACJ;AACF,MAAM,eAAe;CAAC;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;AAAG;AAoBtE,IAAM,mBAAN,cAA+B,qBAAqB;CAClD,OAAiB,SAAoC;EAKnD,MAAM,aAAa,QAAQ,MAAM,GAAG;EACpC,MAAM,WAAW,WAAW,SAAS,IAAI,WAAW,MAAM,IAAK;EAC/D,MAAM,mBAAmB,WAAW,KAAK,GAAG;EAG5C,IAAI,iBAAiB,SAAS,GAAG,GAE/B,OAAO;EAET,MAAM,cAAc,iBAAiB,MAAM,GAAG;EAC9C,MAAM,iBAAiB,YAAY,SAAS,IAAI,YAAY,IAAI,IAAK;EACrE,MAAM,kBAAkB,YAAY,KAAK,GAAG;EAE5C,IACE,CAAC,aAAa,KAAK,QAAQ,KAC3B,CAAC,uBAAuB,KAAK,eAAe,KAC5C,CAAC,sBAAsB,KAAK,cAAc,GAE1C,OAAO;EAET,MAAM,UAAU,CAAC,GAAG,iBAAiB,SAAS,cAAc,CAAC,CAAC,CAAC,KAAK,MAClE,SAAS,EAAE,IAAI,EAAE,CACnB;EACA,OAAO;GACL,OAAO,SAAS,UAAU,EAAE;GAC5B;GACA;GACA;GACA,QAAQ;EACV;CACF;CAEA,gBAA0B,GAAW,GAAmB;EAQtD,IAAI,UAAU;EACd,OAAO,UAAU,EAAE,UAAU,UAAU,EAAE,QAAQ;GAC/C,MAAM,QAAQ,EAAE,OAAO,OAAO;GAC9B,MAAM,QAAQ,EAAE,OAAO,OAAO;GAC9B,IAAI,aAAa,SAAS,KAAK,KAAK,aAAa,SAAS,KAAK,GAAG;IAEhE,IAAI,cAAc,UAAU;IAC5B,OAAO,aAAa,SAAS,EAAE,OAAO,WAAW,CAAC,GAChD,eAAe;IAEjB,IAAI,cAAc,UAAU;IAC5B,OAAO,aAAa,SAAS,EAAE,OAAO,WAAW,CAAC,GAChD,eAAe;IAEjB,MAAM,aAAa,EAChB,UAAU,SAAS,WAAW,CAAC,CAC/B,cAAc,EAAE,UAAU,SAAS,WAAW,GAAG,KAAA,GAAW,EAC3D,SAAS,KACX,CAAC;IACH,IAAI,eAAe,GACjB,OAAO;IAET,UAAU;IACV;GACF;GACA,IAAI,UAAU,OAAO;IAGnB,MAAM,YAAY,eAAe,QAC/B,aAAa,SAAS,KAAK,KAAK,UAAU,KAAK,MAAM,KACvD;IACA,MAAM,YAAY,eAAe,QAC/B,aAAa,SAAS,KAAK,KAAK,UAAU,KAAK,MAAM,KACvD;IACA,OAAO,KAAK,KAAK,YAAY,SAAS;GACxC;GACA,WAAW;EACb;EACA,OAAO;CACT;CAEA,SAA4B,SAAiB,OAAuB;EAClE,MAAM,UAAU,KAAK,OAAO,OAAO;EACnC,MAAM,UAAU,KAAK,OAAO,KAAK;EACjC,IAAI,EAAE,WAAW,UACf,OAAO;EAET,IAAI,QAAQ,UAAU,QAAQ,OAC5B,OAAO,KAAK,KAAK,QAAQ,QAAQ,QAAQ,KAAK;EAEhD,MAAM,4BAA4B,KAAK,gBACrC,QAAQ,iBACR,QAAQ,eACV;EACA,IAAI,8BAA8B,GAChC,OAAO;EAET,OAAO,KAAK,gBAAgB,QAAQ,gBAAgB,QAAQ,cAAc;CAC5E;AACF;AAEA,MAAa,MAAqB,IAAI,iBAAiB"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/deb/index.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport { GenericVersioningApi } from '../generic.ts';\nimport type { VersioningApi } from '../types.ts';\nimport type { DebVersion } from './types.ts';\n\nexport const id = 'deb';\nexport const displayName = 'Deb version';\nexport const urls = [\n '[Debian policy - Version](https://www.debian.org/doc/debian-policy/ch-controlfields.html#version)',\n '[deb-version man page](https://manpages.debian.org/unstable/dpkg-dev/deb-version.7.en.html)',\n];\nexport const supportsRanges = false;\n\nconst epochPattern = regEx(/^\\d+$/);\nconst upstreamVersionPattern = regEx(/^[-+.:~A-Za-z\\d]+$/);\nconst debianRevisionPattern = regEx(/^[+.~A-Za-z\\d]*$/);\nconst numericPattern = regEx(/\\d+/g);\nconst characterOrder =\n '~ ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+-.:';\nconst numericChars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];\n\nclass DebVersioningApi extends GenericVersioningApi {\n protected _parse(version: string): DebVersion | null {\n /* Splitting version into \"[epoch:]upstream-version[-debian-revision]\"\n All found numbers are exported as release info */\n\n // split of first element by `:` as epoch:\n const epochSplit = version.split(':');\n const epochStr = epochSplit.length > 1 ? epochSplit.shift()! : '0';\n const remainingVersion = epochSplit.join(':');\n\n // split of last element by `-`\n if (remainingVersion.endsWith('-')) {\n // Forbid debian revision (it would result in `2.4.0-` == `2.4.0`)\n return null;\n }\n const debianSplit = remainingVersion.split('-');\n const debianRevision = debianSplit.length > 1 ? debianSplit.pop()! : '';\n const upstreamVersion = debianSplit.join('-');\n\n if (\n !epochPattern.test(epochStr) ||\n !upstreamVersionPattern.test(upstreamVersion) ||\n !debianRevisionPattern.test(debianRevision)\n ) {\n return null;\n }\n const release = [...remainingVersion.matchAll(numericPattern)].map((m) =>\n parseInt(m[0], 10),\n );\n return {\n epoch: parseInt(epochStr, 10),\n upstreamVersion,\n debianRevision,\n release,\n suffix: debianRevision,\n };\n }\n\n protected _compare_string(a: string, b: string): number {\n /* Special string sorting based on official specification:\n * https://manpages.debian.org/unstable/dpkg-dev/deb-version.7.en.html#Sorting_algorithm\n * The string is compared by continuous blocks of a) non-digit and b) digit characters.\n * Non-digit blocks are compared lexicographically with a custom character order.\n * Digit blocks are compared numerically.\n * We are alternating between both modes until a difference is found.\n */\n let charPos = 0;\n while (charPos < a.length || charPos < b.length) {\n const aChar = a.charAt(charPos);\n const bChar = b.charAt(charPos);\n if (numericChars.includes(aChar) && numericChars.includes(bChar)) {\n // numeric comparison of the whole block\n let aNumericEnd = charPos + 1;\n while (numericChars.includes(a.charAt(aNumericEnd))) {\n aNumericEnd += 1;\n }\n let bNumericEnd = charPos + 1;\n while (numericChars.includes(b.charAt(bNumericEnd))) {\n bNumericEnd += 1;\n }\n const numericCmp = a\n .substring(charPos, aNumericEnd)\n .localeCompare(b.substring(charPos, bNumericEnd), undefined, {\n numeric: true,\n });\n if (numericCmp !== 0) {\n return numericCmp;\n }\n charPos = aNumericEnd; // the same as bNumericEnd as both are the same\n continue;\n }\n if (aChar !== bChar) {\n // Lexicographical comparison\n // numeric character is treated like end of string (they are part of a new block)\n const aPriority = characterOrder.indexOf(\n numericChars.includes(aChar) || aChar === '' ? ' ' : aChar,\n );\n const bPriority = characterOrder.indexOf(\n numericChars.includes(bChar) || bChar === '' ? ' ' : bChar,\n );\n return Math.sign(aPriority - bPriority);\n }\n charPos += 1;\n }\n return 0;\n }\n\n protected override _compare(version: string, other: string): number {\n const parsed1 = this._parse(version);\n const parsed2 = this._parse(other);\n if (!(parsed1 && parsed2)) {\n return 1;\n }\n if (parsed1.epoch !== parsed2.epoch) {\n return Math.sign(parsed1.epoch - parsed2.epoch);\n }\n const upstreamVersionDifference = this._compare_string(\n parsed1.upstreamVersion,\n parsed2.upstreamVersion,\n );\n if (upstreamVersionDifference !== 0) {\n return upstreamVersionDifference;\n }\n return this._compare_string(parsed1.debianRevision, parsed2.debianRevision);\n }\n}\n\nexport const api: VersioningApi = new DebVersioningApi();\n\nexport default api;\n"],"mappings":";;AAaA,MAAM,eAAe,MAAM,OAAO;AAClC,MAAM,yBAAyB,MAAM,oBAAoB;AACzD,MAAM,wBAAwB,MAAM,kBAAkB;AACtD,MAAM,iBAAiB,MAAM,MAAM;AACnC,MAAM,iBACJ;AACF,MAAM,eAAe;CAAC;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;AAAG;AAEtE,IAAM,mBAAN,cAA+B,qBAAqB;CAClD,OAAiB,SAAoC;EAKnD,MAAM,aAAa,QAAQ,MAAM,GAAG;EACpC,MAAM,WAAW,WAAW,SAAS,IAAI,WAAW,MAAM,IAAK;EAC/D,MAAM,mBAAmB,WAAW,KAAK,GAAG;EAG5C,IAAI,iBAAiB,SAAS,GAAG,GAE/B,OAAO;EAET,MAAM,cAAc,iBAAiB,MAAM,GAAG;EAC9C,MAAM,iBAAiB,YAAY,SAAS,IAAI,YAAY,IAAI,IAAK;EACrE,MAAM,kBAAkB,YAAY,KAAK,GAAG;EAE5C,IACE,CAAC,aAAa,KAAK,QAAQ,KAC3B,CAAC,uBAAuB,KAAK,eAAe,KAC5C,CAAC,sBAAsB,KAAK,cAAc,GAE1C,OAAO;EAET,MAAM,UAAU,CAAC,GAAG,iBAAiB,SAAS,cAAc,CAAC,CAAC,CAAC,KAAK,MAClE,SAAS,EAAE,IAAI,EAAE,CACnB;EACA,OAAO;GACL,OAAO,SAAS,UAAU,EAAE;GAC5B;GACA;GACA;GACA,QAAQ;EACV;CACF;CAEA,gBAA0B,GAAW,GAAmB;EAQtD,IAAI,UAAU;EACd,OAAO,UAAU,EAAE,UAAU,UAAU,EAAE,QAAQ;GAC/C,MAAM,QAAQ,EAAE,OAAO,OAAO;GAC9B,MAAM,QAAQ,EAAE,OAAO,OAAO;GAC9B,IAAI,aAAa,SAAS,KAAK,KAAK,aAAa,SAAS,KAAK,GAAG;IAEhE,IAAI,cAAc,UAAU;IAC5B,OAAO,aAAa,SAAS,EAAE,OAAO,WAAW,CAAC,GAChD,eAAe;IAEjB,IAAI,cAAc,UAAU;IAC5B,OAAO,aAAa,SAAS,EAAE,OAAO,WAAW,CAAC,GAChD,eAAe;IAEjB,MAAM,aAAa,EAChB,UAAU,SAAS,WAAW,CAAC,CAC/B,cAAc,EAAE,UAAU,SAAS,WAAW,GAAG,KAAA,GAAW,EAC3D,SAAS,KACX,CAAC;IACH,IAAI,eAAe,GACjB,OAAO;IAET,UAAU;IACV;GACF;GACA,IAAI,UAAU,OAAO;IAGnB,MAAM,YAAY,eAAe,QAC/B,aAAa,SAAS,KAAK,KAAK,UAAU,KAAK,MAAM,KACvD;IACA,MAAM,YAAY,eAAe,QAC/B,aAAa,SAAS,KAAK,KAAK,UAAU,KAAK,MAAM,KACvD;IACA,OAAO,KAAK,KAAK,YAAY,SAAS;GACxC;GACA,WAAW;EACb;EACA,OAAO;CACT;CAEA,SAA4B,SAAiB,OAAuB;EAClE,MAAM,UAAU,KAAK,OAAO,OAAO;EACnC,MAAM,UAAU,KAAK,OAAO,KAAK;EACjC,IAAI,EAAE,WAAW,UACf,OAAO;EAET,IAAI,QAAQ,UAAU,QAAQ,OAC5B,OAAO,KAAK,KAAK,QAAQ,QAAQ,QAAQ,KAAK;EAEhD,MAAM,4BAA4B,KAAK,gBACrC,QAAQ,iBACR,QAAQ,eACV;EACA,IAAI,8BAA8B,GAChC,OAAO;EAET,OAAO,KAAK,gBAAgB,QAAQ,gBAAgB,QAAQ,cAAc;CAC5E;AACF;AAEA,MAAa,MAAqB,IAAI,iBAAiB"}
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","names":[],"sources":["../../../../lib/modules/versioning/debian/common.ts"],"sourcesContent":["import { DateTime } from 'luxon';\nimport { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type { DistroInfo, DistroInfoRecordWithVersion } from '../distro.ts';\n\nconst refreshInterval = { days: 1 };\n\nconst datedRegex = regEx(\n /^(?<codename>\\w+)-(?<date>\\d{8})(?<suffix>\\.\\d{1,2})?$/,\n);\n\nexport function isDatedCodeName(\n input: string,\n distroInfo: DistroInfo,\n): boolean {\n const match = datedRegex.exec(input);\n if (!match?.groups) {\n return false;\n }\n const codename = match.groups.codename;\n return distroInfo.isCodename(codename);\n}\n\nexport function getDatedContainerImageCodename(version: string): null | string {\n const match = datedRegex.exec(version);\n if (!match?.groups) {\n return null;\n }\n return match.groups.codename;\n}\n\nexport function getDatedContainerImageVersion(version: string): null | number {\n const match = datedRegex.exec(version);\n if (!match?.groups) {\n return null;\n }\n\n return parseInt(match.groups.date, 10);\n}\n\nexport function getDatedContainerImageSuffix(version: string): null | string {\n const match = datedRegex.exec(version);\n if (!match?.groups?.suffix) {\n return null;\n }\n\n return match.groups.suffix;\n}\n\nexport class RollingReleasesData {\n private ltsToVer = new Map<string, DistroInfoRecordWithVersion>();\n private verToLts = new Map<string, DistroInfoRecordWithVersion>();\n private timestamp = DateTime.fromMillis(0).toUTC(); // start of epoch\n private distroInfo: DistroInfo;\n\n constructor(distroInfo: DistroInfo) {\n this.distroInfo = distroInfo;\n }\n\n getVersionByLts(input: string): string {\n this.build();\n const schedule = this.ltsToVer.get(input);\n if (schedule) {\n return schedule.version;\n }\n return input;\n }\n\n getLtsByVersion(input: string): string {\n this.build();\n const di = this.verToLts.get(input);\n if (di) {\n return di.series;\n }\n return input;\n }\n\n has(version: string): boolean {\n this.build();\n return this.ltsToVer.has(version);\n }\n\n schedule(version: string): DistroInfoRecordWithVersion | undefined {\n this.build();\n let schedule: DistroInfoRecordWithVersion | undefined = undefined;\n if (this.verToLts.has(version)) {\n schedule = this.verToLts.get(version);\n }\n if (this.ltsToVer.has(version)) {\n schedule = this.ltsToVer.get(version);\n }\n return schedule;\n }\n\n private build(): void {\n const now = DateTime.now().toUTC();\n if (now < this.timestamp.plus(refreshInterval)) {\n return;\n }\n logger.debug('RollingReleasesData - data written');\n this.timestamp = now;\n for (let i = 0; i < 3; i++) {\n const di = this.distroInfo.getNLatest(i);\n\n // should never happen, just for type checking\n if (!di) {\n return;\n }\n\n let prefix = '';\n for (let j = 0; j < i; j++) {\n prefix += 'old';\n }\n di.series = `${prefix}stable`;\n\n this.ltsToVer.set(di.series, di);\n this.verToLts.set(di.version, di);\n }\n }\n}\n"],"mappings":";;;;AAKA,MAAM,kBAAkB,EAAE,MAAM,EAAE;AAElC,MAAM,aAAa,MACjB,wDACF;AAEA,SAAgB,gBACd,OACA,YACS;CACT,MAAM,QAAQ,WAAW,KAAK,KAAK;CACnC,IAAI,CAAC,OAAO,QACV,OAAO;CAET,MAAM,WAAW,MAAM,OAAO;CAC9B,OAAO,WAAW,WAAW,QAAQ;AACvC;AAEA,SAAgB,+BAA+B,SAAgC;CAC7E,MAAM,QAAQ,WAAW,KAAK,OAAO;CACrC,IAAI,CAAC,OAAO,QACV,OAAO;CAET,OAAO,MAAM,OAAO;AACtB;AAEA,SAAgB,8BAA8B,SAAgC;CAC5E,MAAM,QAAQ,WAAW,KAAK,OAAO;CACrC,IAAI,CAAC,OAAO,QACV,OAAO;CAGT,OAAO,SAAS,MAAM,OAAO,MAAM,EAAE;AACvC;AAEA,SAAgB,6BAA6B,SAAgC;CAC3E,MAAM,QAAQ,WAAW,KAAK,OAAO;CACrC,IAAI,CAAC,OAAO,QAAQ,QAClB,OAAO;CAGT,OAAO,MAAM,OAAO;AACtB;AAEA,IAAa,sBAAb,MAAiC;CAC/B,2BAAmB,IAAI,IAAyC;CAChE,2BAAmB,IAAI,IAAyC;CAChE,YAAoB,SAAS,WAAW,CAAC,CAAC,CAAC,MAAM;CACjD;CAEA,YAAY,YAAwB;EAClC,KAAK,aAAa;CACpB;CAEA,gBAAgB,OAAuB;EACrC,KAAK,MAAM;EACX,MAAM,WAAW,KAAK,SAAS,IAAI,KAAK;EACxC,IAAI,UACF,OAAO,SAAS;EAElB,OAAO;CACT;CAEA,gBAAgB,OAAuB;EACrC,KAAK,MAAM;EACX,MAAM,KAAK,KAAK,SAAS,IAAI,KAAK;EAClC,IAAI,IACF,OAAO,GAAG;EAEZ,OAAO;CACT;CAEA,IAAI,SAA0B;EAC5B,KAAK,MAAM;EACX,OAAO,KAAK,SAAS,IAAI,OAAO;CAClC;CAEA,SAAS,SAA0D;EACjE,KAAK,MAAM;EACX,IAAI,WAAoD,KAAA;EACxD,IAAI,KAAK,SAAS,IAAI,OAAO,GAC3B,WAAW,KAAK,SAAS,IAAI,OAAO;EAEtC,IAAI,KAAK,SAAS,IAAI,OAAO,GAC3B,WAAW,KAAK,SAAS,IAAI,OAAO;EAEtC,OAAO;CACT;CAEA,QAAsB;EACpB,MAAM,MAAM,SAAS,IAAI,CAAC,CAAC,MAAM;EACjC,IAAI,MAAM,KAAK,UAAU,KAAK,eAAe,GAC3C;EAEF,OAAO,MAAM,oCAAoC;EACjD,KAAK,YAAY;EACjB,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;GAC1B,MAAM,KAAK,KAAK,WAAW,WAAW,CAAC;GAGvC,IAAI,CAAC,IACH;GAGF,IAAI,SAAS;GACb,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KACrB,UAAU;GAEZ,GAAG,SAAS,GAAG,OAAO;GAEtB,KAAK,SAAS,IAAI,GAAG,QAAQ,EAAE;GAC/B,KAAK,SAAS,IAAI,GAAG,SAAS,EAAE;EAClC;CACF;AACF"}
1
+ {"version":3,"file":"common.js","names":[],"sources":["../../../../lib/modules/versioning/debian/common.ts"],"sourcesContent":["import { DateTime } from 'luxon';\nimport { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type { DistroInfo } from '../distro.ts';\nimport type { DistroInfoRecordWithVersion } from '../types.ts';\n\nconst refreshInterval = { days: 1 };\n\nconst datedRegex = regEx(\n /^(?<codename>\\w+)-(?<date>\\d{8})(?<suffix>\\.\\d{1,2})?$/,\n);\n\nexport function isDatedCodeName(\n input: string,\n distroInfo: DistroInfo,\n): boolean {\n const match = datedRegex.exec(input);\n if (!match?.groups) {\n return false;\n }\n const codename = match.groups.codename;\n return distroInfo.isCodename(codename);\n}\n\nexport function getDatedContainerImageCodename(version: string): null | string {\n const match = datedRegex.exec(version);\n if (!match?.groups) {\n return null;\n }\n return match.groups.codename;\n}\n\nexport function getDatedContainerImageVersion(version: string): null | number {\n const match = datedRegex.exec(version);\n if (!match?.groups) {\n return null;\n }\n\n return parseInt(match.groups.date, 10);\n}\n\nexport function getDatedContainerImageSuffix(version: string): null | string {\n const match = datedRegex.exec(version);\n if (!match?.groups?.suffix) {\n return null;\n }\n\n return match.groups.suffix;\n}\n\nexport class RollingReleasesData {\n private ltsToVer = new Map<string, DistroInfoRecordWithVersion>();\n private verToLts = new Map<string, DistroInfoRecordWithVersion>();\n private timestamp = DateTime.fromMillis(0).toUTC(); // start of epoch\n private distroInfo: DistroInfo;\n\n constructor(distroInfo: DistroInfo) {\n this.distroInfo = distroInfo;\n }\n\n getVersionByLts(input: string): string {\n this.build();\n const schedule = this.ltsToVer.get(input);\n if (schedule) {\n return schedule.version;\n }\n return input;\n }\n\n getLtsByVersion(input: string): string {\n this.build();\n const di = this.verToLts.get(input);\n if (di) {\n return di.series;\n }\n return input;\n }\n\n has(version: string): boolean {\n this.build();\n return this.ltsToVer.has(version);\n }\n\n schedule(version: string): DistroInfoRecordWithVersion | undefined {\n this.build();\n let schedule: DistroInfoRecordWithVersion | undefined = undefined;\n if (this.verToLts.has(version)) {\n schedule = this.verToLts.get(version);\n }\n if (this.ltsToVer.has(version)) {\n schedule = this.ltsToVer.get(version);\n }\n return schedule;\n }\n\n private build(): void {\n const now = DateTime.now().toUTC();\n if (now < this.timestamp.plus(refreshInterval)) {\n return;\n }\n logger.debug('RollingReleasesData - data written');\n this.timestamp = now;\n for (let i = 0; i < 3; i++) {\n const di = this.distroInfo.getNLatest(i);\n\n // should never happen, just for type checking\n if (!di) {\n return;\n }\n\n let prefix = '';\n for (let j = 0; j < i; j++) {\n prefix += 'old';\n }\n di.series = `${prefix}stable`;\n\n this.ltsToVer.set(di.series, di);\n this.verToLts.set(di.version, di);\n }\n }\n}\n"],"mappings":";;;;AAMA,MAAM,kBAAkB,EAAE,MAAM,EAAE;AAElC,MAAM,aAAa,MACjB,wDACF;AAEA,SAAgB,gBACd,OACA,YACS;CACT,MAAM,QAAQ,WAAW,KAAK,KAAK;CACnC,IAAI,CAAC,OAAO,QACV,OAAO;CAET,MAAM,WAAW,MAAM,OAAO;CAC9B,OAAO,WAAW,WAAW,QAAQ;AACvC;AAEA,SAAgB,+BAA+B,SAAgC;CAC7E,MAAM,QAAQ,WAAW,KAAK,OAAO;CACrC,IAAI,CAAC,OAAO,QACV,OAAO;CAET,OAAO,MAAM,OAAO;AACtB;AAEA,SAAgB,8BAA8B,SAAgC;CAC5E,MAAM,QAAQ,WAAW,KAAK,OAAO;CACrC,IAAI,CAAC,OAAO,QACV,OAAO;CAGT,OAAO,SAAS,MAAM,OAAO,MAAM,EAAE;AACvC;AAEA,SAAgB,6BAA6B,SAAgC;CAC3E,MAAM,QAAQ,WAAW,KAAK,OAAO;CACrC,IAAI,CAAC,OAAO,QAAQ,QAClB,OAAO;CAGT,OAAO,MAAM,OAAO;AACtB;AAEA,IAAa,sBAAb,MAAiC;CAC/B,2BAAmB,IAAI,IAAyC;CAChE,2BAAmB,IAAI,IAAyC;CAChE,YAAoB,SAAS,WAAW,CAAC,CAAC,CAAC,MAAM;CACjD;CAEA,YAAY,YAAwB;EAClC,KAAK,aAAa;CACpB;CAEA,gBAAgB,OAAuB;EACrC,KAAK,MAAM;EACX,MAAM,WAAW,KAAK,SAAS,IAAI,KAAK;EACxC,IAAI,UACF,OAAO,SAAS;EAElB,OAAO;CACT;CAEA,gBAAgB,OAAuB;EACrC,KAAK,MAAM;EACX,MAAM,KAAK,KAAK,SAAS,IAAI,KAAK;EAClC,IAAI,IACF,OAAO,GAAG;EAEZ,OAAO;CACT;CAEA,IAAI,SAA0B;EAC5B,KAAK,MAAM;EACX,OAAO,KAAK,SAAS,IAAI,OAAO;CAClC;CAEA,SAAS,SAA0D;EACjE,KAAK,MAAM;EACX,IAAI,WAAoD,KAAA;EACxD,IAAI,KAAK,SAAS,IAAI,OAAO,GAC3B,WAAW,KAAK,SAAS,IAAI,OAAO;EAEtC,IAAI,KAAK,SAAS,IAAI,OAAO,GAC3B,WAAW,KAAK,SAAS,IAAI,OAAO;EAEtC,OAAO;CACT;CAEA,QAAsB;EACpB,MAAM,MAAM,SAAS,IAAI,CAAC,CAAC,MAAM;EACjC,IAAI,MAAM,KAAK,UAAU,KAAK,eAAe,GAC3C;EAEF,OAAO,MAAM,oCAAoC;EACjD,KAAK,YAAY;EACjB,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;GAC1B,MAAM,KAAK,KAAK,WAAW,WAAW,CAAC;GAGvC,IAAI,CAAC,IACH;GAGF,IAAI,SAAS;GACb,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KACrB,UAAU;GAEZ,GAAG,SAAS,GAAG,OAAO;GAEtB,KAAK,SAAS,IAAI,GAAG,QAAQ,EAAE;GAC/B,KAAK,SAAS,IAAI,GAAG,SAAS,EAAE;EAClC;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/debian/index.ts"],"sourcesContent":["import type { RangeStrategy } from '../../../types/index.ts';\nimport { DistroInfo } from '../distro.ts';\nimport type { GenericVersion } from '../generic.ts';\nimport { GenericVersioningApi } from '../generic.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\nimport {\n RollingReleasesData,\n getDatedContainerImageCodename,\n getDatedContainerImageSuffix,\n getDatedContainerImageVersion,\n isDatedCodeName,\n} from './common.ts';\n\nexport const id = 'debian';\nexport const displayName = 'Debian';\nexport const urls = [\n '[Debian distro info data](https://debian.pages.debian.net/distro-info-data/debian.csv)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = ['replace'];\n\nexport class DebianVersioningApi extends GenericVersioningApi {\n private readonly _distroInfo: DistroInfo;\n private readonly _rollingReleases: RollingReleasesData;\n\n constructor() {\n super();\n this._distroInfo = new DistroInfo('data/debian-distro-info.json');\n this._rollingReleases = new RollingReleasesData(this._distroInfo);\n }\n\n override isValid(version: string): boolean {\n const isValid = super.isValid(version);\n let ver: string;\n ver = this._rollingReleases.getVersionByLts(version);\n ver = this._distroInfo.getVersionByCodename(ver);\n return (\n (isValid && this._distroInfo.isCreated(ver)) ||\n isDatedCodeName(version, this._distroInfo)\n );\n }\n\n override isStable(version: string): boolean {\n if (isDatedCodeName(version, this._distroInfo)) {\n const codename = getDatedContainerImageCodename(version)!;\n const versionByCodename = this._distroInfo.getVersionByCodename(codename);\n return (\n this._distroInfo.isReleased(versionByCodename) &&\n !this._distroInfo.isEolLts(versionByCodename)\n );\n }\n let ver: string;\n ver = this._rollingReleases.getVersionByLts(version);\n ver = this._distroInfo.getVersionByCodename(ver);\n return this._distroInfo.isReleased(ver) && !this._distroInfo.isEolLts(ver);\n }\n\n override getNewValue({ currentValue, newVersion }: NewValueConfig): string {\n // current value is [oldold|old|]stable\n if (this._rollingReleases.has(currentValue)) {\n return this._rollingReleases.getLtsByVersion(newVersion);\n }\n\n if (this._distroInfo.isCodename(currentValue)) {\n const di = this._rollingReleases.schedule(newVersion);\n let ver = this._getBaseVersion(newVersion);\n if (di) {\n ver = di.version;\n }\n return this._distroInfo.getCodenameByVersion(ver);\n }\n\n // newVersion is [oldold|old|]stable\n // current value is numeric\n if (this._rollingReleases.has(newVersion)) {\n // should never `undefined` if it exists\n return this._rollingReleases.schedule(newVersion)!.version;\n }\n\n // current value is numeric, so keep a dated codename (e.g. trixie-20260406)\n // as its numeric version rather than switching format\n if (isDatedCodeName(newVersion, this._distroInfo)) {\n return this._getBaseVersion(newVersion);\n }\n\n return this._distroInfo.getVersionByCodename(newVersion);\n }\n\n private _getBaseVersion(version: string): string {\n if (isDatedCodeName(version, this._distroInfo)) {\n const codename = getDatedContainerImageCodename(version)!;\n return this._distroInfo.getVersionByCodename(codename);\n }\n return version;\n }\n\n override equals(version: string, other: string): boolean {\n const verImage = getDatedContainerImageVersion(version);\n const otherImageVer = getDatedContainerImageVersion(other);\n if (verImage !== otherImageVer) {\n return false;\n }\n\n const verSuffix = getDatedContainerImageSuffix(version);\n const otherSuffix = getDatedContainerImageSuffix(other);\n if (verSuffix !== otherSuffix) {\n return false;\n }\n\n const ver = this._getBaseVersion(version);\n const otherVer = this._getBaseVersion(other);\n return super.equals(ver, otherVer);\n }\n\n override isGreaterThan(version: string, other: string): boolean {\n if (\n !isDatedCodeName(version, this._distroInfo) &&\n !isDatedCodeName(other, this._distroInfo)\n ) {\n return super.isGreaterThan(version, other);\n }\n const xMajor = this.getMajor(version) ?? 0;\n const yMajor = this.getMajor(other) ?? 0;\n if (xMajor > yMajor) {\n return true;\n }\n if (xMajor < yMajor) {\n return false;\n }\n\n const xMinor = this.getMinor(version) ?? 0;\n const yMinor = this.getMinor(other) ?? 0;\n if (xMinor > yMinor) {\n return true;\n }\n if (xMinor < yMinor) {\n return false;\n }\n\n const xImageVersion = getDatedContainerImageVersion(version) ?? 0;\n const yImageVersion = getDatedContainerImageVersion(other) ?? 0;\n if (xImageVersion > yImageVersion) {\n return true;\n }\n if (xImageVersion < yImageVersion) {\n return false;\n }\n\n const xSuffixVersion = getDatedContainerImageSuffix(version) ?? 0;\n const ySuffixVersion = getDatedContainerImageSuffix(other) ?? 0;\n if (xSuffixVersion > ySuffixVersion) {\n return true;\n }\n if (xSuffixVersion < ySuffixVersion) {\n return false;\n }\n\n const xPatch = this.getPatch(version) ?? 0;\n const yPatch = this.getPatch(other) ?? 0;\n return xPatch > yPatch;\n }\n\n override getMajor(version: string): number | null {\n const ver = this._getBaseVersion(version);\n if (this.isValid(ver)) {\n const parsed = this._parse(ver);\n return parsed!.release[0];\n }\n return null;\n }\n\n override getMinor(version: string): number | null {\n const ver = this._getBaseVersion(version);\n if (this.isValid(ver)) {\n const parsed = this._parse(ver);\n return parsed?.release[1] ?? null;\n }\n return null;\n }\n\n override getPatch(version: string): number | null {\n const ver = this._getBaseVersion(version);\n if (this.isValid(ver)) {\n const parsed = this._parse(ver);\n return parsed?.release[2] ?? null;\n }\n return null;\n }\n\n protected override _parse(version: string): GenericVersion | null {\n let ver: string;\n if (isDatedCodeName(version, this._distroInfo)) {\n const codename = getDatedContainerImageCodename(version)!;\n ver = this._distroInfo.getVersionByCodename(codename);\n } else {\n ver = this._rollingReleases.getVersionByLts(version);\n ver = this._distroInfo.getVersionByCodename(ver);\n }\n if (!this._distroInfo.exists(ver)) {\n return null;\n }\n return { release: ver.split('.').map(Number) };\n }\n}\n\nexport const api: VersioningApi = new DebianVersioningApi();\n\nexport default api;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/debian/index.ts"],"sourcesContent":["import type { RangeStrategy } from '../../../types/index.ts';\nimport { DistroInfo } from '../distro.ts';\nimport { GenericVersioningApi } from '../generic.ts';\nimport type {\n GenericVersion,\n NewValueConfig,\n VersioningApi,\n} from '../types.ts';\nimport {\n RollingReleasesData,\n getDatedContainerImageCodename,\n getDatedContainerImageSuffix,\n getDatedContainerImageVersion,\n isDatedCodeName,\n} from './common.ts';\n\nexport const id = 'debian';\nexport const displayName = 'Debian';\nexport const urls = [\n '[Debian distro info data](https://debian.pages.debian.net/distro-info-data/debian.csv)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = ['replace'];\n\nexport class DebianVersioningApi extends GenericVersioningApi {\n private readonly _distroInfo: DistroInfo;\n private readonly _rollingReleases: RollingReleasesData;\n\n constructor() {\n super();\n this._distroInfo = new DistroInfo('data/debian-distro-info.json');\n this._rollingReleases = new RollingReleasesData(this._distroInfo);\n }\n\n override isValid(version: string): boolean {\n const isValid = super.isValid(version);\n let ver: string;\n ver = this._rollingReleases.getVersionByLts(version);\n ver = this._distroInfo.getVersionByCodename(ver);\n return (\n (isValid && this._distroInfo.isCreated(ver)) ||\n isDatedCodeName(version, this._distroInfo)\n );\n }\n\n override isStable(version: string): boolean {\n if (isDatedCodeName(version, this._distroInfo)) {\n const codename = getDatedContainerImageCodename(version)!;\n const versionByCodename = this._distroInfo.getVersionByCodename(codename);\n return (\n this._distroInfo.isReleased(versionByCodename) &&\n !this._distroInfo.isEolLts(versionByCodename)\n );\n }\n let ver: string;\n ver = this._rollingReleases.getVersionByLts(version);\n ver = this._distroInfo.getVersionByCodename(ver);\n return this._distroInfo.isReleased(ver) && !this._distroInfo.isEolLts(ver);\n }\n\n override getNewValue({ currentValue, newVersion }: NewValueConfig): string {\n // current value is [oldold|old|]stable\n if (this._rollingReleases.has(currentValue)) {\n return this._rollingReleases.getLtsByVersion(newVersion);\n }\n\n if (this._distroInfo.isCodename(currentValue)) {\n const di = this._rollingReleases.schedule(newVersion);\n let ver = this._getBaseVersion(newVersion);\n if (di) {\n ver = di.version;\n }\n return this._distroInfo.getCodenameByVersion(ver);\n }\n\n // newVersion is [oldold|old|]stable\n // current value is numeric\n if (this._rollingReleases.has(newVersion)) {\n // should never `undefined` if it exists\n return this._rollingReleases.schedule(newVersion)!.version;\n }\n\n // current value is numeric, so keep a dated codename (e.g. trixie-20260406)\n // as its numeric version rather than switching format\n if (isDatedCodeName(newVersion, this._distroInfo)) {\n return this._getBaseVersion(newVersion);\n }\n\n return this._distroInfo.getVersionByCodename(newVersion);\n }\n\n private _getBaseVersion(version: string): string {\n if (isDatedCodeName(version, this._distroInfo)) {\n const codename = getDatedContainerImageCodename(version)!;\n return this._distroInfo.getVersionByCodename(codename);\n }\n return version;\n }\n\n override equals(version: string, other: string): boolean {\n const verImage = getDatedContainerImageVersion(version);\n const otherImageVer = getDatedContainerImageVersion(other);\n if (verImage !== otherImageVer) {\n return false;\n }\n\n const verSuffix = getDatedContainerImageSuffix(version);\n const otherSuffix = getDatedContainerImageSuffix(other);\n if (verSuffix !== otherSuffix) {\n return false;\n }\n\n const ver = this._getBaseVersion(version);\n const otherVer = this._getBaseVersion(other);\n return super.equals(ver, otherVer);\n }\n\n override isGreaterThan(version: string, other: string): boolean {\n if (\n !isDatedCodeName(version, this._distroInfo) &&\n !isDatedCodeName(other, this._distroInfo)\n ) {\n return super.isGreaterThan(version, other);\n }\n const xMajor = this.getMajor(version) ?? 0;\n const yMajor = this.getMajor(other) ?? 0;\n if (xMajor > yMajor) {\n return true;\n }\n if (xMajor < yMajor) {\n return false;\n }\n\n const xMinor = this.getMinor(version) ?? 0;\n const yMinor = this.getMinor(other) ?? 0;\n if (xMinor > yMinor) {\n return true;\n }\n if (xMinor < yMinor) {\n return false;\n }\n\n const xImageVersion = getDatedContainerImageVersion(version) ?? 0;\n const yImageVersion = getDatedContainerImageVersion(other) ?? 0;\n if (xImageVersion > yImageVersion) {\n return true;\n }\n if (xImageVersion < yImageVersion) {\n return false;\n }\n\n const xSuffixVersion = getDatedContainerImageSuffix(version) ?? 0;\n const ySuffixVersion = getDatedContainerImageSuffix(other) ?? 0;\n if (xSuffixVersion > ySuffixVersion) {\n return true;\n }\n if (xSuffixVersion < ySuffixVersion) {\n return false;\n }\n\n const xPatch = this.getPatch(version) ?? 0;\n const yPatch = this.getPatch(other) ?? 0;\n return xPatch > yPatch;\n }\n\n override getMajor(version: string): number | null {\n const ver = this._getBaseVersion(version);\n if (this.isValid(ver)) {\n const parsed = this._parse(ver);\n return parsed!.release[0];\n }\n return null;\n }\n\n override getMinor(version: string): number | null {\n const ver = this._getBaseVersion(version);\n if (this.isValid(ver)) {\n const parsed = this._parse(ver);\n return parsed?.release[1] ?? null;\n }\n return null;\n }\n\n override getPatch(version: string): number | null {\n const ver = this._getBaseVersion(version);\n if (this.isValid(ver)) {\n const parsed = this._parse(ver);\n return parsed?.release[2] ?? null;\n }\n return null;\n }\n\n protected override _parse(version: string): GenericVersion | null {\n let ver: string;\n if (isDatedCodeName(version, this._distroInfo)) {\n const codename = getDatedContainerImageCodename(version)!;\n ver = this._distroInfo.getVersionByCodename(codename);\n } else {\n ver = this._rollingReleases.getVersionByLts(version);\n ver = this._distroInfo.getVersionByCodename(ver);\n }\n if (!this._distroInfo.exists(ver)) {\n return null;\n }\n return { release: ver.split('.').map(Number) };\n }\n}\n\nexport const api: VersioningApi = new DebianVersioningApi();\n\nexport default api;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/devbox/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 = 'devbox';\nexport const displayName = 'devbox';\nexport const urls = [];\nexport const supportsRanges = false;\n\nconst validPattern = regEx(/^((\\d|[1-9]\\d*)(\\.(\\d|[1-9]\\d*)){0,2})$/);\nconst versionPattern = regEx(/^((\\d|[1-9]\\d*)(\\.(\\d|[1-9]\\d*)){2})$/);\n\nclass DevboxVersioningApi extends GenericVersioningApi {\n protected _parse(version: string): GenericVersion | null {\n const matches = validPattern.exec(version);\n if (!matches) {\n return null;\n }\n const release = matches[0].split('.').map(Number);\n return { release };\n }\n\n override isValid(version: string): boolean {\n if (version === 'latest') {\n return true;\n }\n return this._parse(version) !== null;\n }\n\n override isVersion(version: string): boolean {\n if (version === 'latest') {\n return false;\n }\n const matches = versionPattern.exec(version);\n return !!matches;\n }\n\n override matches(version: string, range: string): boolean {\n return this.isVersion(version) && this.equals(version, range);\n }\n\n protected override _compare(version: string, other: string): number {\n const parsed1 = this._parse(version);\n const parsed2 = this._parse(other);\n\n // Treat \"latest\" as * and always return equal\n if (other === 'latest' && parsed1) {\n return 0;\n }\n\n // If either version is invalid, return unequal\n if (!(parsed1 && parsed2)) {\n return 1;\n }\n // support variable length compare\n const length = Math.max(parsed1.release.length, parsed2.release.length);\n for (let i = 0; i < length; i += 1) {\n // 2.1 and 2.1.0 are equivalent\n const part1 = parsed1.release[i];\n const part2 = parsed2.release[i];\n // if part1 or part2 is undefined, we should treat them as equal\n // e.g. 1.0.0 === 1.0\n if (part1 !== undefined && part2 !== undefined && part1 !== part2) {\n return part1 - part2;\n }\n }\n return 0;\n }\n}\n\nexport const api: VersioningApi = new DevboxVersioningApi();\n\nexport default api;\n"],"mappings":";;;AAKA,MAAa,KAAK;AAKlB,MAAM,eAAe,MAAM,yCAAyC;AACpE,MAAM,iBAAiB,MAAM,uCAAuC;AAEpE,IAAM,sBAAN,cAAkC,qBAAqB;CACrD,OAAiB,SAAwC;EACvD,MAAM,UAAU,aAAa,KAAK,OAAO;EACzC,IAAI,CAAC,SACH,OAAO;EAGT,OAAO,EAAE,SADO,QAAQ,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,MAC3B,EAAE;CACnB;CAEA,QAAiB,SAA0B;EACzC,IAAI,YAAY,UACd,OAAO;EAET,OAAO,KAAK,OAAO,OAAO,MAAM;CAClC;CAEA,UAAmB,SAA0B;EAC3C,IAAI,YAAY,UACd,OAAO;EAGT,OAAO,CAAC,CADQ,eAAe,KAAK,OACrB;CACjB;CAEA,QAAiB,SAAiB,OAAwB;EACxD,OAAO,KAAK,UAAU,OAAO,KAAK,KAAK,OAAO,SAAS,KAAK;CAC9D;CAEA,SAA4B,SAAiB,OAAuB;EAClE,MAAM,UAAU,KAAK,OAAO,OAAO;EACnC,MAAM,UAAU,KAAK,OAAO,KAAK;EAGjC,IAAI,UAAU,YAAY,SACxB,OAAO;EAIT,IAAI,EAAE,WAAW,UACf,OAAO;EAGT,MAAM,SAAS,KAAK,IAAI,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,MAAM;EACtE,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK,GAAG;GAElC,MAAM,QAAQ,QAAQ,QAAQ;GAC9B,MAAM,QAAQ,QAAQ,QAAQ;GAG9B,IAAI,UAAU,KAAA,KAAa,UAAU,KAAA,KAAa,UAAU,OAC1D,OAAO,QAAQ;EAEnB;EACA,OAAO;CACT;AACF;AAEA,MAAa,MAAqB,IAAI,oBAAoB"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/devbox/index.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport { GenericVersioningApi } from '../generic.ts';\nimport type { GenericVersion, VersioningApi } from '../types.ts';\n\nexport const id = 'devbox';\nexport const displayName = 'devbox';\nexport const urls = [];\nexport const supportsRanges = false;\n\nconst validPattern = regEx(/^((\\d|[1-9]\\d*)(\\.(\\d|[1-9]\\d*)){0,2})$/);\nconst versionPattern = regEx(/^((\\d|[1-9]\\d*)(\\.(\\d|[1-9]\\d*)){2})$/);\n\nclass DevboxVersioningApi extends GenericVersioningApi {\n protected _parse(version: string): GenericVersion | null {\n const matches = validPattern.exec(version);\n if (!matches) {\n return null;\n }\n const release = matches[0].split('.').map(Number);\n return { release };\n }\n\n override isValid(version: string): boolean {\n if (version === 'latest') {\n return true;\n }\n return this._parse(version) !== null;\n }\n\n override isVersion(version: string): boolean {\n if (version === 'latest') {\n return false;\n }\n const matches = versionPattern.exec(version);\n return !!matches;\n }\n\n override matches(version: string, range: string): boolean {\n return this.isVersion(version) && this.equals(version, range);\n }\n\n protected override _compare(version: string, other: string): number {\n const parsed1 = this._parse(version);\n const parsed2 = this._parse(other);\n\n // Treat \"latest\" as * and always return equal\n if (other === 'latest' && parsed1) {\n return 0;\n }\n\n // If either version is invalid, return unequal\n if (!(parsed1 && parsed2)) {\n return 1;\n }\n // support variable length compare\n const length = Math.max(parsed1.release.length, parsed2.release.length);\n for (let i = 0; i < length; i += 1) {\n // 2.1 and 2.1.0 are equivalent\n const part1 = parsed1.release[i];\n const part2 = parsed2.release[i];\n // if part1 or part2 is undefined, we should treat them as equal\n // e.g. 1.0.0 === 1.0\n if (part1 !== undefined && part2 !== undefined && part1 !== part2) {\n return part1 - part2;\n }\n }\n return 0;\n }\n}\n\nexport const api: VersioningApi = new DevboxVersioningApi();\n\nexport default api;\n"],"mappings":";;;AAIA,MAAa,KAAK;AAKlB,MAAM,eAAe,MAAM,yCAAyC;AACpE,MAAM,iBAAiB,MAAM,uCAAuC;AAEpE,IAAM,sBAAN,cAAkC,qBAAqB;CACrD,OAAiB,SAAwC;EACvD,MAAM,UAAU,aAAa,KAAK,OAAO;EACzC,IAAI,CAAC,SACH,OAAO;EAGT,OAAO,EAAE,SADO,QAAQ,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,MAC3B,EAAE;CACnB;CAEA,QAAiB,SAA0B;EACzC,IAAI,YAAY,UACd,OAAO;EAET,OAAO,KAAK,OAAO,OAAO,MAAM;CAClC;CAEA,UAAmB,SAA0B;EAC3C,IAAI,YAAY,UACd,OAAO;EAGT,OAAO,CAAC,CADQ,eAAe,KAAK,OACrB;CACjB;CAEA,QAAiB,SAAiB,OAAwB;EACxD,OAAO,KAAK,UAAU,OAAO,KAAK,KAAK,OAAO,SAAS,KAAK;CAC9D;CAEA,SAA4B,SAAiB,OAAuB;EAClE,MAAM,UAAU,KAAK,OAAO,OAAO;EACnC,MAAM,UAAU,KAAK,OAAO,KAAK;EAGjC,IAAI,UAAU,YAAY,SACxB,OAAO;EAIT,IAAI,EAAE,WAAW,UACf,OAAO;EAGT,MAAM,SAAS,KAAK,IAAI,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,MAAM;EACtE,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK,GAAG;GAElC,MAAM,QAAQ,QAAQ,QAAQ;GAC9B,MAAM,QAAQ,QAAQ,QAAQ;GAG9B,IAAI,UAAU,KAAA,KAAa,UAAU,KAAA,KAAa,UAAU,OAC1D,OAAO,QAAQ;EAEnB;EACA,OAAO;CACT;AACF;AAEA,MAAa,MAAqB,IAAI,oBAAoB"}
@@ -1 +1 @@
1
- {"version":3,"file":"distro.js","names":["dataFiles"],"sources":["../../../lib/modules/versioning/distro.ts"],"sourcesContent":["import { DateTime } from 'luxon';\nimport dataFiles from '../../data-files.generated.ts';\nimport { regEx } from '../../util/regex.ts';\n\nexport interface DistroSchedule {\n codename: string;\n series: string;\n created: string;\n release?: string;\n eol?: string;\n eol_server?: string;\n eol_esm?: string;\n eol_lts?: string;\n eol_elts?: string;\n}\n\nexport type DistroDataFile =\n | 'data/ubuntu-distro-info.json'\n | 'data/debian-distro-info.json';\n\nexport type DistroInfoRecord = Record<string, DistroSchedule>;\n\nexport type DistroInfoRecordWithVersion = { version: string } & DistroSchedule;\n\n// Days to delay new releases\nconst delay = 1;\n\nexport class DistroInfo {\n private readonly _codenameToVersion = new Map<\n string,\n DistroInfoRecordWithVersion\n >();\n\n private readonly _sortedInfo: DistroInfoRecordWithVersion[] = [];\n\n private readonly _distroInfo: DistroInfoRecord;\n\n constructor(distroJsonKey: DistroDataFile) {\n this._distroInfo = JSON.parse(\n dataFiles.get(distroJsonKey)!.replace(regEx(/v([\\d.]+)\\b/gm), '$1'),\n );\n\n for (const version of Object.keys(this._distroInfo)) {\n const schedule = this._distroInfo[version];\n this._codenameToVersion.set(schedule.series, { version, ...schedule });\n }\n\n const arr = Object.keys(this._distroInfo).sort(\n (a, b) => parseFloat(a) - parseFloat(b),\n );\n\n for (const v of arr) {\n const obj = { version: v, ...this._distroInfo[v.toString()] };\n if (!obj.release) {\n // istanbul ignore next\n continue;\n }\n this._sortedInfo.push(obj);\n }\n }\n\n /**\n * Check if input is a valid release codename\n * @param input A codename\n * @returns true if input is a codename, false otherwise\n */\n public isCodename(input: string): boolean {\n return this._codenameToVersion.has(input);\n }\n\n /**\n * Checks if given input string is a valid release version\n * @param input A codename/semVer\n * @returns true if release exists, false otherwise\n */\n public exists(input: string): boolean {\n const ver = this.getVersionByCodename(input);\n return !!this._distroInfo[ver];\n }\n\n /**\n * Get semVer representation of a given codename\n * @param input A codename\n * @returns A semVer if exists, otherwise input string is returned\n */\n public getVersionByCodename(input: string): string {\n const schedule = this._codenameToVersion.get(input);\n if (schedule) {\n return schedule.version;\n }\n return input;\n }\n\n /**\n * Get codename representation of a given semVer\n * @param input A semVer\n * @returns A codename if exists, otherwise input string is returned\n */\n public getCodenameByVersion(input: string): string {\n const di = this._distroInfo[input];\n if (di) {\n return di.series;\n }\n // istanbul ignore next\n return input;\n }\n\n /**\n * Get schedule of a given release\n * @param input A codename/semVer\n * @returns A schedule if available, otherwise undefined\n */\n public getSchedule(input: string): DistroSchedule | null {\n const ver = this.getVersionByCodename(input);\n return this._distroInfo[ver] ?? null;\n }\n\n /**\n * Check if a given release has passed its EOL\n * @param input A codename/semVer\n * @returns false if still supported, true otherwise\n */\n public isEolLts(input: string): boolean {\n const ver = this.getVersionByCodename(input);\n const schedule = this.getSchedule(ver);\n const endLts = schedule?.eol ?? null;\n let end = schedule?.eol_lts ?? null;\n\n // ubuntu: does not have eol_lts\n // debian: only \"Stable\" has no eol_lts, old and oldold has both\n end ??= endLts;\n\n if (end) {\n const now = DateTime.now().toUTC();\n const eol = DateTime.fromISO(end, { zone: 'utc' });\n return eol < now;\n }\n\n return true;\n }\n\n /**\n * Check if a given version has been released\n * @param input A codename/semVer\n * @returns false if unreleased or has no schedule, true otherwise\n */\n public isReleased(input: string): boolean {\n const ver = this.getVersionByCodename(input);\n const schedule = this.getSchedule(ver);\n\n if (!schedule?.release) {\n return false;\n }\n\n const now = DateTime.now().minus({ day: delay }).toUTC();\n const release = DateTime.fromISO(schedule.release, { zone: 'utc' });\n\n return release < now;\n }\n\n /**\n * Check if a given version has been created\n * @param input A codename/semVer\n * @returns false if unreleased or has no schedule, true otherwise\n */\n public isCreated(input: string): boolean {\n const ver = this.getVersionByCodename(input);\n const schedule = this.getSchedule(ver);\n\n if (!schedule) {\n return false;\n }\n\n const now = DateTime.now().minus({ day: delay }).toUTC();\n const created = DateTime.fromISO(schedule.created, { zone: 'utc' });\n\n return created < now;\n }\n\n /**\n * Get distro info for the release that has N other newer releases.\n * Example: n=0 corresponds to the latest available release, n=1 the release before, etc.\n * In Debian terms: N = 0 -> stable, N = 1 -> oldstable, N = 2 -> oldoldstalbe\n * @param n\n * @returns Distro info of the Nth latest release\n */\n public getNLatest(n: number): DistroInfoRecordWithVersion | null {\n const len = this._sortedInfo.length - 1;\n let idx = -1;\n\n if (n < 0) {\n return null;\n }\n\n for (let i = len; i >= 0; i--) {\n if (this.isReleased(this._sortedInfo[i].version)) {\n // 'i' holds the latest released version index\n // compensate for the requested 'n'\n idx = i - Math.floor(n);\n break;\n }\n }\n\n if (idx > len || idx < 0) {\n return null;\n }\n\n return this._sortedInfo[idx];\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"distro.js","names":["dataFiles"],"sources":["../../../lib/modules/versioning/distro.ts"],"sourcesContent":["import { DateTime } from 'luxon';\nimport dataFiles from '../../data-files.generated.ts';\nimport { regEx } from '../../util/regex.ts';\nimport type {\n DistroDataFile,\n DistroInfoRecord,\n DistroInfoRecordWithVersion,\n DistroSchedule,\n} from './types.ts';\n\n// Days to delay new releases\nconst delay = 1;\n\nexport class DistroInfo {\n private readonly _codenameToVersion = new Map<\n string,\n DistroInfoRecordWithVersion\n >();\n\n private readonly _sortedInfo: DistroInfoRecordWithVersion[] = [];\n\n private readonly _distroInfo: DistroInfoRecord;\n\n constructor(distroJsonKey: DistroDataFile) {\n this._distroInfo = JSON.parse(\n dataFiles.get(distroJsonKey)!.replace(regEx(/v([\\d.]+)\\b/gm), '$1'),\n );\n\n for (const version of Object.keys(this._distroInfo)) {\n const schedule = this._distroInfo[version];\n this._codenameToVersion.set(schedule.series, { version, ...schedule });\n }\n\n const arr = Object.keys(this._distroInfo).sort(\n (a, b) => parseFloat(a) - parseFloat(b),\n );\n\n for (const v of arr) {\n const obj = { version: v, ...this._distroInfo[v.toString()] };\n if (!obj.release) {\n // istanbul ignore next\n continue;\n }\n this._sortedInfo.push(obj);\n }\n }\n\n /**\n * Check if input is a valid release codename\n * @param input A codename\n * @returns true if input is a codename, false otherwise\n */\n public isCodename(input: string): boolean {\n return this._codenameToVersion.has(input);\n }\n\n /**\n * Checks if given input string is a valid release version\n * @param input A codename/semVer\n * @returns true if release exists, false otherwise\n */\n public exists(input: string): boolean {\n const ver = this.getVersionByCodename(input);\n return !!this._distroInfo[ver];\n }\n\n /**\n * Get semVer representation of a given codename\n * @param input A codename\n * @returns A semVer if exists, otherwise input string is returned\n */\n public getVersionByCodename(input: string): string {\n const schedule = this._codenameToVersion.get(input);\n if (schedule) {\n return schedule.version;\n }\n return input;\n }\n\n /**\n * Get codename representation of a given semVer\n * @param input A semVer\n * @returns A codename if exists, otherwise input string is returned\n */\n public getCodenameByVersion(input: string): string {\n const di = this._distroInfo[input];\n if (di) {\n return di.series;\n }\n // istanbul ignore next\n return input;\n }\n\n /**\n * Get schedule of a given release\n * @param input A codename/semVer\n * @returns A schedule if available, otherwise undefined\n */\n public getSchedule(input: string): DistroSchedule | null {\n const ver = this.getVersionByCodename(input);\n return this._distroInfo[ver] ?? null;\n }\n\n /**\n * Check if a given release has passed its EOL\n * @param input A codename/semVer\n * @returns false if still supported, true otherwise\n */\n public isEolLts(input: string): boolean {\n const ver = this.getVersionByCodename(input);\n const schedule = this.getSchedule(ver);\n const endLts = schedule?.eol ?? null;\n let end = schedule?.eol_lts ?? null;\n\n // ubuntu: does not have eol_lts\n // debian: only \"Stable\" has no eol_lts, old and oldold has both\n end ??= endLts;\n\n if (end) {\n const now = DateTime.now().toUTC();\n const eol = DateTime.fromISO(end, { zone: 'utc' });\n return eol < now;\n }\n\n return true;\n }\n\n /**\n * Check if a given version has been released\n * @param input A codename/semVer\n * @returns false if unreleased or has no schedule, true otherwise\n */\n public isReleased(input: string): boolean {\n const ver = this.getVersionByCodename(input);\n const schedule = this.getSchedule(ver);\n\n if (!schedule?.release) {\n return false;\n }\n\n const now = DateTime.now().minus({ day: delay }).toUTC();\n const release = DateTime.fromISO(schedule.release, { zone: 'utc' });\n\n return release < now;\n }\n\n /**\n * Check if a given version has been created\n * @param input A codename/semVer\n * @returns false if unreleased or has no schedule, true otherwise\n */\n public isCreated(input: string): boolean {\n const ver = this.getVersionByCodename(input);\n const schedule = this.getSchedule(ver);\n\n if (!schedule) {\n return false;\n }\n\n const now = DateTime.now().minus({ day: delay }).toUTC();\n const created = DateTime.fromISO(schedule.created, { zone: 'utc' });\n\n return created < now;\n }\n\n /**\n * Get distro info for the release that has N other newer releases.\n * Example: n=0 corresponds to the latest available release, n=1 the release before, etc.\n * In Debian terms: N = 0 -> stable, N = 1 -> oldstable, N = 2 -> oldoldstalbe\n * @param n\n * @returns Distro info of the Nth latest release\n */\n public getNLatest(n: number): DistroInfoRecordWithVersion | null {\n const len = this._sortedInfo.length - 1;\n let idx = -1;\n\n if (n < 0) {\n return null;\n }\n\n for (let i = len; i >= 0; i--) {\n if (this.isReleased(this._sortedInfo[i].version)) {\n // 'i' holds the latest released version index\n // compensate for the requested 'n'\n idx = i - Math.floor(n);\n break;\n }\n }\n\n if (idx > len || idx < 0) {\n return null;\n }\n\n return this._sortedInfo[idx];\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/docker/index.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport { coerceString } from '../../../util/string.ts';\nimport type { GenericVersion } from '../generic.ts';\nimport { GenericVersioningApi } from '../generic.ts';\nimport type { VersioningApi } from '../types.ts';\n\nexport const id = 'docker';\nexport const displayName = 'Docker';\nexport const urls = [\n '[Docker tag command](https://docs.docker.com/engine/reference/commandline/tag/)',\n];\nexport const supportsRanges = false;\n\nconst versionPattern = regEx(/^(?<version>\\d+(?:\\.\\d+)*)(?<prerelease>\\w*)$/);\nconst commitHashPattern = regEx(/^[a-f0-9]{7,40}$/);\nconst numericPattern = regEx(/^[0-9]+$/);\n\nclass DockerVersioningApi extends GenericVersioningApi {\n protected _parse(version: string): GenericVersion | null {\n if (!version) {\n return null;\n }\n if (commitHashPattern.test(version) && !numericPattern.test(version)) {\n return null;\n }\n const versionPieces = version.replace(regEx(/^v/), '').split('-');\n const [prefix, ...suffixPieces] = versionPieces;\n const matchGroups = prefix?.match(versionPattern)?.groups;\n if (!matchGroups) {\n return null;\n }\n\n const { version: ver, prerelease } = matchGroups;\n const release = ver.split('.').map(Number);\n return { release, suffix: suffixPieces.join('-'), prerelease };\n }\n\n protected override _compare(version: string, other: string): number {\n const parsed1 = this._parse(version);\n const parsed2 = this._parse(other);\n // istanbul ignore if\n if (!(parsed1 && parsed2)) {\n return 1;\n }\n const length = Math.max(parsed1.release.length, parsed2.release.length);\n for (let i = 0; i < length; i += 1) {\n const part1 = parsed1.release[i];\n const part2 = parsed2.release[i];\n // shorter is bigger 2.1 > 2.1.1\n if (part1 === undefined) {\n return 1;\n }\n if (part2 === undefined) {\n return -1;\n }\n if (part1 !== part2) {\n return part1 - part2;\n }\n }\n if (parsed1.prerelease !== parsed2.prerelease) {\n // unstable is lower\n if (!parsed1.prerelease && parsed2.prerelease) {\n return 1;\n }\n if (parsed1.prerelease && !parsed2.prerelease) {\n return -1;\n }\n // alphabetic order\n if (parsed1.prerelease && parsed2.prerelease) {\n return parsed1.prerelease.localeCompare(parsed2.prerelease);\n }\n }\n\n // equals\n const suffix1 = coerceString(parsed1.suffix);\n const suffix2 = coerceString(parsed2.suffix);\n return suffix2.localeCompare(suffix1);\n }\n\n override isCompatible(version: string, current: string): boolean {\n const parsed1 = this._parse(version);\n const parsed2 = this._parse(current);\n /* oxlint-disable typescript/prefer-optional-chain */\n return !!(\n parsed1 &&\n parsed2 &&\n parsed1.suffix === parsed2.suffix &&\n parsed1.release.length === parsed2.release.length\n );\n /* oxlint-enable typescript/prefer-optional-chain */\n }\n\n valueToVersion(value: string): string {\n // Remove any suffix after '-', e.g. '-alpine'\n return value ? value.split('-')[0] : value;\n }\n}\n\nexport const api: VersioningApi = new DockerVersioningApi();\n\nexport default api;\n"],"mappings":";;;;AAMA,MAAa,KAAK;AAOlB,MAAM,iBAAiB,MAAM,+CAA+C;AAC5E,MAAM,oBAAoB,MAAM,kBAAkB;AAClD,MAAM,iBAAiB,MAAM,UAAU;AAEvC,IAAM,sBAAN,cAAkC,qBAAqB;CACrD,OAAiB,SAAwC;EACvD,IAAI,CAAC,SACH,OAAO;EAET,IAAI,kBAAkB,KAAK,OAAO,KAAK,CAAC,eAAe,KAAK,OAAO,GACjE,OAAO;EAGT,MAAM,CAAC,QAAQ,GAAG,gBADI,QAAQ,QAAQ,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,MAAM,GACf;EAC9C,MAAM,cAAc,QAAQ,MAAM,cAAc,CAAC,EAAE;EACnD,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,EAAE,SAAS,KAAK,eAAe;EAErC,OAAO;GAAE,SADO,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,MACpB;GAAG,QAAQ,aAAa,KAAK,GAAG;GAAG;EAAW;CAC/D;CAEA,SAA4B,SAAiB,OAAuB;EAClE,MAAM,UAAU,KAAK,OAAO,OAAO;EACnC,MAAM,UAAU,KAAK,OAAO,KAAK;;EAEjC,IAAI,EAAE,WAAW,UACf,OAAO;EAET,MAAM,SAAS,KAAK,IAAI,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,MAAM;EACtE,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK,GAAG;GAClC,MAAM,QAAQ,QAAQ,QAAQ;GAC9B,MAAM,QAAQ,QAAQ,QAAQ;GAE9B,IAAI,UAAU,KAAA,GACZ,OAAO;GAET,IAAI,UAAU,KAAA,GACZ,OAAO;GAET,IAAI,UAAU,OACZ,OAAO,QAAQ;EAEnB;EACA,IAAI,QAAQ,eAAe,QAAQ,YAAY;GAE7C,IAAI,CAAC,QAAQ,cAAc,QAAQ,YACjC,OAAO;GAET,IAAI,QAAQ,cAAc,CAAC,QAAQ,YACjC,OAAO;GAGT,IAAI,QAAQ,cAAc,QAAQ,YAChC,OAAO,QAAQ,WAAW,cAAc,QAAQ,UAAU;EAE9D;EAGA,MAAM,UAAU,aAAa,QAAQ,MAAM;EAE3C,OADgB,aAAa,QAAQ,MACxB,CAAC,CAAC,cAAc,OAAO;CACtC;CAEA,aAAsB,SAAiB,SAA0B;EAC/D,MAAM,UAAU,KAAK,OAAO,OAAO;EACnC,MAAM,UAAU,KAAK,OAAO,OAAO;EAEnC,OAAO,CAAC,EACN,WACA,WACA,QAAQ,WAAW,QAAQ,UAC3B,QAAQ,QAAQ,WAAW,QAAQ,QAAQ;CAG/C;CAEA,eAAe,OAAuB;EAEpC,OAAO,QAAQ,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK;CACvC;AACF;AAEA,MAAa,MAAqB,IAAI,oBAAoB"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/docker/index.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport { coerceString } from '../../../util/string.ts';\nimport { GenericVersioningApi } from '../generic.ts';\nimport type { GenericVersion, VersioningApi } from '../types.ts';\n\nexport const id = 'docker';\nexport const displayName = 'Docker';\nexport const urls = [\n '[Docker tag command](https://docs.docker.com/engine/reference/commandline/tag/)',\n];\nexport const supportsRanges = false;\n\nconst versionPattern = regEx(/^(?<version>\\d+(?:\\.\\d+)*)(?<prerelease>\\w*)$/);\nconst commitHashPattern = regEx(/^[a-f0-9]{7,40}$/);\nconst numericPattern = regEx(/^[0-9]+$/);\n\nclass DockerVersioningApi extends GenericVersioningApi {\n protected _parse(version: string): GenericVersion | null {\n if (!version) {\n return null;\n }\n if (commitHashPattern.test(version) && !numericPattern.test(version)) {\n return null;\n }\n const versionPieces = version.replace(regEx(/^v/), '').split('-');\n const [prefix, ...suffixPieces] = versionPieces;\n const matchGroups = prefix?.match(versionPattern)?.groups;\n if (!matchGroups) {\n return null;\n }\n\n const { version: ver, prerelease } = matchGroups;\n const release = ver.split('.').map(Number);\n return { release, suffix: suffixPieces.join('-'), prerelease };\n }\n\n protected override _compare(version: string, other: string): number {\n const parsed1 = this._parse(version);\n const parsed2 = this._parse(other);\n // istanbul ignore if\n if (!(parsed1 && parsed2)) {\n return 1;\n }\n const length = Math.max(parsed1.release.length, parsed2.release.length);\n for (let i = 0; i < length; i += 1) {\n const part1 = parsed1.release[i];\n const part2 = parsed2.release[i];\n // shorter is bigger 2.1 > 2.1.1\n if (part1 === undefined) {\n return 1;\n }\n if (part2 === undefined) {\n return -1;\n }\n if (part1 !== part2) {\n return part1 - part2;\n }\n }\n if (parsed1.prerelease !== parsed2.prerelease) {\n // unstable is lower\n if (!parsed1.prerelease && parsed2.prerelease) {\n return 1;\n }\n if (parsed1.prerelease && !parsed2.prerelease) {\n return -1;\n }\n // alphabetic order\n if (parsed1.prerelease && parsed2.prerelease) {\n return parsed1.prerelease.localeCompare(parsed2.prerelease);\n }\n }\n\n // equals\n const suffix1 = coerceString(parsed1.suffix);\n const suffix2 = coerceString(parsed2.suffix);\n return suffix2.localeCompare(suffix1);\n }\n\n override isCompatible(version: string, current: string): boolean {\n const parsed1 = this._parse(version);\n const parsed2 = this._parse(current);\n /* oxlint-disable typescript/prefer-optional-chain */\n return !!(\n parsed1 &&\n parsed2 &&\n parsed1.suffix === parsed2.suffix &&\n parsed1.release.length === parsed2.release.length\n );\n /* oxlint-enable typescript/prefer-optional-chain */\n }\n\n valueToVersion(value: string): string {\n // Remove any suffix after '-', e.g. '-alpine'\n return value ? value.split('-')[0] : value;\n }\n}\n\nexport const api: VersioningApi = new DockerVersioningApi();\n\nexport default api;\n"],"mappings":";;;;AAKA,MAAa,KAAK;AAOlB,MAAM,iBAAiB,MAAM,+CAA+C;AAC5E,MAAM,oBAAoB,MAAM,kBAAkB;AAClD,MAAM,iBAAiB,MAAM,UAAU;AAEvC,IAAM,sBAAN,cAAkC,qBAAqB;CACrD,OAAiB,SAAwC;EACvD,IAAI,CAAC,SACH,OAAO;EAET,IAAI,kBAAkB,KAAK,OAAO,KAAK,CAAC,eAAe,KAAK,OAAO,GACjE,OAAO;EAGT,MAAM,CAAC,QAAQ,GAAG,gBADI,QAAQ,QAAQ,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,MAAM,GACf;EAC9C,MAAM,cAAc,QAAQ,MAAM,cAAc,CAAC,EAAE;EACnD,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,EAAE,SAAS,KAAK,eAAe;EAErC,OAAO;GAAE,SADO,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,MACpB;GAAG,QAAQ,aAAa,KAAK,GAAG;GAAG;EAAW;CAC/D;CAEA,SAA4B,SAAiB,OAAuB;EAClE,MAAM,UAAU,KAAK,OAAO,OAAO;EACnC,MAAM,UAAU,KAAK,OAAO,KAAK;;EAEjC,IAAI,EAAE,WAAW,UACf,OAAO;EAET,MAAM,SAAS,KAAK,IAAI,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,MAAM;EACtE,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK,GAAG;GAClC,MAAM,QAAQ,QAAQ,QAAQ;GAC9B,MAAM,QAAQ,QAAQ,QAAQ;GAE9B,IAAI,UAAU,KAAA,GACZ,OAAO;GAET,IAAI,UAAU,KAAA,GACZ,OAAO;GAET,IAAI,UAAU,OACZ,OAAO,QAAQ;EAEnB;EACA,IAAI,QAAQ,eAAe,QAAQ,YAAY;GAE7C,IAAI,CAAC,QAAQ,cAAc,QAAQ,YACjC,OAAO;GAET,IAAI,QAAQ,cAAc,CAAC,QAAQ,YACjC,OAAO;GAGT,IAAI,QAAQ,cAAc,QAAQ,YAChC,OAAO,QAAQ,WAAW,cAAc,QAAQ,UAAU;EAE9D;EAGA,MAAM,UAAU,aAAa,QAAQ,MAAM;EAE3C,OADgB,aAAa,QAAQ,MACxB,CAAC,CAAC,cAAc,OAAO;CACtC;CAEA,aAAsB,SAAiB,SAA0B;EAC/D,MAAM,UAAU,KAAK,OAAO,OAAO;EACnC,MAAM,UAAU,KAAK,OAAO,OAAO;EAEnC,OAAO,CAAC,EACN,WACA,WACA,QAAQ,WAAW,QAAQ,UAC3B,QAAQ,QAAQ,WAAW,QAAQ,QAAQ;CAG/C;CAEA,eAAe,OAAuB;EAEpC,OAAO,QAAQ,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK;CACvC;AACF;AAEA,MAAa,MAAqB,IAAI,oBAAoB"}
@@ -1,13 +1,5 @@
1
- import { NewValueConfig, VersioningApi } from "./types.js";
1
+ import { GenericVersion, NewValueConfig, VersioningApi } from "./types.js";
2
2
  //#region lib/modules/versioning/generic.d.ts
3
- interface GenericVersion {
4
- release: number[];
5
- /** prereleases are treated in the standard semver manner, if present */
6
- prerelease?: string;
7
- suffix?: string;
8
- }
9
- type VersionParser = (version: string) => GenericVersion;
10
- type VersionComparator = (version: string, other: string) => number;
11
3
  declare abstract class GenericVersioningApi<T extends GenericVersion = GenericVersion> implements VersioningApi {
12
4
  private _getSection;
13
5
  protected _compare(version: string, other: string): number;
@@ -32,5 +24,5 @@ declare abstract class GenericVersioningApi<T extends GenericVersion = GenericVe
32
24
  isSame(type: 'major' | 'minor' | 'patch', a: string, b: string): boolean;
33
25
  }
34
26
  //#endregion
35
- export { GenericVersion, GenericVersioningApi, VersionComparator, VersionParser };
27
+ export { GenericVersioningApi };
36
28
  //# sourceMappingURL=generic.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"generic.js","names":[],"sources":["../../../lib/modules/versioning/generic.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { regEx } from '../../util/regex.ts';\nimport type { NewValueConfig, VersioningApi } from './types.ts';\n\nexport interface GenericVersion {\n release: number[];\n /** prereleases are treated in the standard semver manner, if present */\n prerelease?: string;\n suffix?: string;\n}\nexport type VersionParser = (version: string) => GenericVersion;\n\nexport type VersionComparator = (version: string, other: string) => number;\n\nexport abstract class GenericVersioningApi<\n T extends GenericVersion = GenericVersion,\n> implements VersioningApi {\n private _getSection(version: string, index: number): number | null {\n const parsed = this._parse(version);\n return parsed && parsed.release.length > index\n ? parsed.release[index]\n : null;\n }\n\n protected _compare(version: string, other: string): number {\n const left = this._parse(version);\n const right = this._parse(other);\n\n // istanbul ignore if\n if (!(left && right)) {\n return 1;\n }\n\n // support variable length compare\n const length = Math.max(left.release.length, right.release.length);\n for (let i = 0; i < length; i += 1) {\n // 2.1 and 2.1.0 are equivalent\n const part1 = left.release[i] ?? 0;\n const part2 = right.release[i] ?? 0;\n if (part1 !== part2) {\n return part1 - part2;\n }\n }\n\n if (\n isNonEmptyString(left.prerelease) &&\n isNonEmptyString(right.prerelease)\n ) {\n const pre = left.prerelease.localeCompare(right.prerelease, undefined, {\n numeric: true,\n });\n\n if (pre !== 0) {\n return pre;\n }\n } else if (isNonEmptyString(left.prerelease)) {\n return -1;\n } else if (isNonEmptyString(right.prerelease)) {\n return 1;\n }\n\n return this._compareOther(left, right);\n }\n\n /*\n * virtual\n */\n\n protected _compareOther(_left: T, _right: T): number {\n return 0;\n }\n\n protected abstract _parse(version: string): T | null;\n\n isValid(version: string): boolean {\n return this._parse(version) !== null;\n }\n\n isCompatible(version: string, _current: string): boolean {\n return this.isValid(version);\n }\n\n isStable(version: string): boolean {\n const parsed = this._parse(version);\n return !!(parsed && !parsed.prerelease);\n }\n\n isSingleVersion(version: string): boolean {\n return this.isValid(version);\n }\n\n isVersion(version: string): boolean {\n return this.isValid(version);\n }\n\n getMajor(version: string): number | null {\n return this._getSection(version, 0);\n }\n\n getMinor(version: string): number | null {\n return this._getSection(version, 1);\n }\n\n getPatch(version: string): number | null {\n return this._getSection(version, 2);\n }\n\n equals(version: string, other: string): boolean {\n return this._compare(version, other) === 0;\n }\n\n isGreaterThan(version: string, other: string): boolean {\n return this._compare(version, other) > 0;\n }\n\n isLessThanRange(version: string, range: string): boolean {\n return this._compare(version, range) < 0;\n }\n\n getSatisfyingVersion(versions: string[], range: string): string | null {\n const result = versions.find((v) => this.equals(v, range));\n return result ?? null;\n }\n\n minSatisfyingVersion(versions: string[], range: string): string | null {\n const result = versions.find((v) => this.equals(v, range));\n return result ?? null;\n }\n\n getNewValue({\n currentValue,\n currentVersion,\n newVersion,\n }: NewValueConfig): string | null {\n if (currentVersion === `v${currentValue}`) {\n return newVersion.replace(regEx(/^v/), '');\n }\n return newVersion ?? null;\n }\n\n sortVersions(version: string, other: string): number {\n return this._compare(version, other);\n }\n\n matches(version: string, range: string): boolean {\n return this.equals(version, range);\n }\n\n isSame(type: 'major' | 'minor' | 'patch', a: string, b: string): boolean {\n if (type === 'major') {\n return this.getMajor(a) === this.getMajor(b);\n }\n if (type === 'minor') {\n return this.getMinor(a) === this.getMinor(b);\n }\n return this.getPatch(a) === this.getPatch(b);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"generic.js","names":[],"sources":["../../../lib/modules/versioning/generic.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { regEx } from '../../util/regex.ts';\nimport type { GenericVersion, NewValueConfig, VersioningApi } from './types.ts';\n\nexport abstract class GenericVersioningApi<\n T extends GenericVersion = GenericVersion,\n> implements VersioningApi {\n private _getSection(version: string, index: number): number | null {\n const parsed = this._parse(version);\n return parsed && parsed.release.length > index\n ? parsed.release[index]\n : null;\n }\n\n protected _compare(version: string, other: string): number {\n const left = this._parse(version);\n const right = this._parse(other);\n\n // istanbul ignore if\n if (!(left && right)) {\n return 1;\n }\n\n // support variable length compare\n const length = Math.max(left.release.length, right.release.length);\n for (let i = 0; i < length; i += 1) {\n // 2.1 and 2.1.0 are equivalent\n const part1 = left.release[i] ?? 0;\n const part2 = right.release[i] ?? 0;\n if (part1 !== part2) {\n return part1 - part2;\n }\n }\n\n if (\n isNonEmptyString(left.prerelease) &&\n isNonEmptyString(right.prerelease)\n ) {\n const pre = left.prerelease.localeCompare(right.prerelease, undefined, {\n numeric: true,\n });\n\n if (pre !== 0) {\n return pre;\n }\n } else if (isNonEmptyString(left.prerelease)) {\n return -1;\n } else if (isNonEmptyString(right.prerelease)) {\n return 1;\n }\n\n return this._compareOther(left, right);\n }\n\n /*\n * virtual\n */\n\n protected _compareOther(_left: T, _right: T): number {\n return 0;\n }\n\n protected abstract _parse(version: string): T | null;\n\n isValid(version: string): boolean {\n return this._parse(version) !== null;\n }\n\n isCompatible(version: string, _current: string): boolean {\n return this.isValid(version);\n }\n\n isStable(version: string): boolean {\n const parsed = this._parse(version);\n return !!(parsed && !parsed.prerelease);\n }\n\n isSingleVersion(version: string): boolean {\n return this.isValid(version);\n }\n\n isVersion(version: string): boolean {\n return this.isValid(version);\n }\n\n getMajor(version: string): number | null {\n return this._getSection(version, 0);\n }\n\n getMinor(version: string): number | null {\n return this._getSection(version, 1);\n }\n\n getPatch(version: string): number | null {\n return this._getSection(version, 2);\n }\n\n equals(version: string, other: string): boolean {\n return this._compare(version, other) === 0;\n }\n\n isGreaterThan(version: string, other: string): boolean {\n return this._compare(version, other) > 0;\n }\n\n isLessThanRange(version: string, range: string): boolean {\n return this._compare(version, range) < 0;\n }\n\n getSatisfyingVersion(versions: string[], range: string): string | null {\n const result = versions.find((v) => this.equals(v, range));\n return result ?? null;\n }\n\n minSatisfyingVersion(versions: string[], range: string): string | null {\n const result = versions.find((v) => this.equals(v, range));\n return result ?? null;\n }\n\n getNewValue({\n currentValue,\n currentVersion,\n newVersion,\n }: NewValueConfig): string | null {\n if (currentVersion === `v${currentValue}`) {\n return newVersion.replace(regEx(/^v/), '');\n }\n return newVersion ?? null;\n }\n\n sortVersions(version: string, other: string): number {\n return this._compare(version, other);\n }\n\n matches(version: string, range: string): boolean {\n return this.equals(version, range);\n }\n\n isSame(type: 'major' | 'minor' | 'patch', a: string, b: string): boolean {\n if (type === 'major') {\n return this.getMajor(a) === this.getMajor(b);\n }\n if (type === 'minor') {\n return this.getMinor(a) === this.getMinor(b);\n }\n return this.getPatch(a) === this.getPatch(b);\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/git/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 = 'git';\nexport const displayName = 'git';\nexport const urls = ['[Git](https://git-scm.com/)'];\nexport const supportsRanges = false;\n\nconst regex = regEx('^[0-9a-f]{7,40}$', 'i');\n\nclass GitVersioningApi extends GenericVersioningApi {\n protected _parse(version: string): GenericVersion | null {\n if (version?.match(regex)) {\n return { release: [1, 0, 0], suffix: version };\n }\n return null;\n }\n\n protected override _compare(_version: string, _other: string): number {\n return -1;\n }\n}\n\nexport const api: VersioningApi = new GitVersioningApi();\n\nexport default api;\n"],"mappings":";;AAUA,MAAM,QAAQ,MAAM,oBAAoB,GAAG;AAE3C,IAAM,mBAAN,cAA+B,qBAAqB;CAClD,OAAiB,SAAwC;EACvD,IAAI,SAAS,MAAM,KAAK,GACtB,OAAO;GAAE,SAAS;IAAC;IAAG;IAAG;GAAC;GAAG,QAAQ;EAAQ;EAE/C,OAAO;CACT;CAEA,SAA4B,UAAkB,QAAwB;EACpE,OAAO;CACT;AACF;AAEA,MAAa,MAAqB,IAAI,iBAAiB"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/git/index.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport { GenericVersioningApi } from '../generic.ts';\nimport type { GenericVersion, VersioningApi } from '../types.ts';\n\nexport const id = 'git';\nexport const displayName = 'git';\nexport const urls = ['[Git](https://git-scm.com/)'];\nexport const supportsRanges = false;\n\nconst regex = regEx('^[0-9a-f]{7,40}$', 'i');\n\nclass GitVersioningApi extends GenericVersioningApi {\n protected _parse(version: string): GenericVersion | null {\n if (version?.match(regex)) {\n return { release: [1, 0, 0], suffix: version };\n }\n return null;\n }\n\n protected override _compare(_version: string, _other: string): number {\n return -1;\n }\n}\n\nexport const api: VersioningApi = new GitVersioningApi();\n\nexport default api;\n"],"mappings":";;AASA,MAAM,QAAQ,MAAM,oBAAoB,GAAG;AAE3C,IAAM,mBAAN,cAA+B,qBAAqB;CAClD,OAAiB,SAAwC;EACvD,IAAI,SAAS,MAAM,KAAK,GACtB,OAAO;GAAE,SAAS;IAAC;IAAG;IAAG;GAAC;GAAG,QAAQ;EAAQ;EAE/C,OAAO;CACT;CAEA,SAA4B,UAAkB,QAAwB;EACpE,OAAO;CACT;AACF;AAEA,MAAa,MAAqB,IAAI,iBAAiB"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/glasskube/index.ts"],"sourcesContent":["import { SemVer } from 'semver';\nimport type { GenericVersion } from '../generic.ts';\nimport { GenericVersioningApi } from '../generic.ts';\nimport type { VersioningApi } from '../types.ts';\n\nexport const id = 'glasskube';\nexport const displayName = 'glasskube';\nexport const urls = [];\nexport const supportsRanges = false;\n\nexport class GlasskubeVersioningApi extends GenericVersioningApi {\n protected override _parse(version: string): GenericVersion | null {\n let parsedVersion: SemVer;\n try {\n parsedVersion = new SemVer(version);\n } catch {\n return null;\n }\n const result: GenericVersion = {\n release: [parsedVersion.major, parsedVersion.minor, parsedVersion.patch],\n prerelease:\n parsedVersion.prerelease.length > 0\n ? parsedVersion.prerelease.join('.')\n : undefined,\n };\n const build = parsedVersion.build.at(0);\n if (build) {\n try {\n result.release.push(parseInt(build, 10));\n } catch {\n /* noop */\n }\n }\n return result;\n }\n}\n\nexport const api: VersioningApi = new GlasskubeVersioningApi();\nexport default api;\n"],"mappings":";;;AAKA,MAAa,KAAK;AAKlB,IAAa,yBAAb,cAA4C,qBAAqB;CAC/D,OAA0B,SAAwC;EAChE,IAAI;EACJ,IAAI;GACF,gBAAgB,IAAI,OAAO,OAAO;EACpC,QAAQ;GACN,OAAO;EACT;EACA,MAAM,SAAyB;GAC7B,SAAS;IAAC,cAAc;IAAO,cAAc;IAAO,cAAc;GAAK;GACvE,YACE,cAAc,WAAW,SAAS,IAC9B,cAAc,WAAW,KAAK,GAAG,IACjC,KAAA;EACR;EACA,MAAM,QAAQ,cAAc,MAAM,GAAG,CAAC;EACtC,IAAI,OACF,IAAI;GACF,OAAO,QAAQ,KAAK,SAAS,OAAO,EAAE,CAAC;EACzC,QAAQ,CAER;EAEF,OAAO;CACT;AACF;AAEA,MAAa,MAAqB,IAAI,uBAAuB"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/glasskube/index.ts"],"sourcesContent":["import { SemVer } from 'semver';\nimport { GenericVersioningApi } from '../generic.ts';\nimport type { GenericVersion, VersioningApi } from '../types.ts';\n\nexport const id = 'glasskube';\nexport const displayName = 'glasskube';\nexport const urls = [];\nexport const supportsRanges = false;\n\nexport class GlasskubeVersioningApi extends GenericVersioningApi {\n protected override _parse(version: string): GenericVersion | null {\n let parsedVersion: SemVer;\n try {\n parsedVersion = new SemVer(version);\n } catch {\n return null;\n }\n const result: GenericVersion = {\n release: [parsedVersion.major, parsedVersion.minor, parsedVersion.patch],\n prerelease:\n parsedVersion.prerelease.length > 0\n ? parsedVersion.prerelease.join('.')\n : undefined,\n };\n const build = parsedVersion.build.at(0);\n if (build) {\n try {\n result.release.push(parseInt(build, 10));\n } catch {\n /* noop */\n }\n }\n return result;\n }\n}\n\nexport const api: VersioningApi = new GlasskubeVersioningApi();\nexport default api;\n"],"mappings":";;;AAIA,MAAa,KAAK;AAKlB,IAAa,yBAAb,cAA4C,qBAAqB;CAC/D,OAA0B,SAAwC;EAChE,IAAI;EACJ,IAAI;GACF,gBAAgB,IAAI,OAAO,OAAO;EACpC,QAAQ;GACN,OAAO;EACT;EACA,MAAM,SAAyB;GAC7B,SAAS;IAAC,cAAc;IAAO,cAAc;IAAO,cAAc;GAAK;GACvE,YACE,cAAc,WAAW,SAAS,IAC9B,cAAc,WAAW,KAAK,GAAG,IACjC,KAAA;EACR;EACA,MAAM,QAAQ,cAAc,MAAM,GAAG,CAAC;EACtC,IAAI,OACF,IAAI;GACF,OAAO,QAAQ,KAAK,SAAS,OAAO,EAAE,CAAC;EACzC,QAAQ,CAER;EAEF,OAAO;CACT;AACF;AAEA,MAAa,MAAqB,IAAI,uBAAuB"}