renovate 44.28.0 → 44.29.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/dist/config/options/index.js +1 -2
  2. package/dist/config/options/index.js.map +1 -1
  3. package/dist/config/presets/index.js +39 -12
  4. package/dist/config/presets/index.js.map +1 -1
  5. package/dist/config/presets/parse.js +64 -7
  6. package/dist/config/presets/parse.js.map +1 -1
  7. package/dist/config/presets/relative.js +66 -0
  8. package/dist/config/presets/relative.js.map +1 -0
  9. package/dist/config/presets/util.js +3 -1
  10. package/dist/config/presets/util.js.map +1 -1
  11. package/dist/config/validation.js +48 -4
  12. package/dist/config/validation.js.map +1 -1
  13. package/dist/global-config-option-defaults.generated.js +1 -1
  14. package/dist/global-config-option-defaults.generated.js.map +1 -1
  15. package/dist/logger/bunyan.js +2 -2
  16. package/dist/logger/bunyan.js.map +1 -1
  17. package/dist/logger/cmd-serializer.js +2 -1
  18. package/dist/logger/cmd-serializer.js.map +1 -1
  19. package/dist/modules/datasource/go/goproxy-parser.js +2 -2
  20. package/dist/modules/datasource/go/goproxy-parser.js.map +1 -1
  21. package/dist/modules/datasource/index.js +3 -3
  22. package/dist/modules/datasource/index.js.map +1 -1
  23. package/dist/modules/datasource/nuget/common.js +2 -1
  24. package/dist/modules/datasource/nuget/common.js.map +1 -1
  25. package/dist/modules/datasource/packagist/schema.js +2 -2
  26. package/dist/modules/datasource/packagist/schema.js.map +1 -1
  27. package/dist/modules/datasource/rpm/providers/common.js +3 -2
  28. package/dist/modules/datasource/rpm/providers/common.js.map +1 -1
  29. package/dist/modules/manager/ant/update.js +2 -1
  30. package/dist/modules/manager/ant/update.js.map +1 -1
  31. package/dist/modules/manager/bazel-module/parser/fragments.js +4 -3
  32. package/dist/modules/manager/bazel-module/parser/fragments.js.map +1 -1
  33. package/dist/modules/manager/bun/extract.js +2 -2
  34. package/dist/modules/manager/bun/extract.js.map +1 -1
  35. package/dist/modules/manager/circleci/extract.js +2 -1
  36. package/dist/modules/manager/circleci/extract.js.map +1 -1
  37. package/dist/modules/manager/deno/post.js +2 -2
  38. package/dist/modules/manager/deno/post.js.map +1 -1
  39. package/dist/modules/manager/fingerprint.generated.js +1 -1
  40. package/dist/modules/manager/fingerprint.generated.js.map +1 -1
  41. package/dist/modules/manager/helm-values/extract.js +2 -1
  42. package/dist/modules/manager/helm-values/extract.js.map +1 -1
  43. package/dist/modules/manager/helm-values/util.js +3 -2
  44. package/dist/modules/manager/helm-values/util.js.map +1 -1
  45. package/dist/modules/manager/npm/extract/common/dependency.js +1 -1
  46. package/dist/modules/manager/npm/extract/common/dependency.js.map +1 -1
  47. package/dist/modules/manager/npm/extract/post/monorepo.js +3 -3
  48. package/dist/modules/manager/npm/extract/post/monorepo.js.map +1 -1
  49. package/dist/modules/manager/npm/post-update/rules.js +2 -2
  50. package/dist/modules/manager/npm/post-update/rules.js.map +1 -1
  51. package/dist/modules/manager/osgi/extract.js +2 -2
  52. package/dist/modules/manager/osgi/extract.js.map +1 -1
  53. package/dist/modules/manager/pipenv/extract.js +2 -2
  54. package/dist/modules/manager/pipenv/extract.js.map +1 -1
  55. package/dist/modules/manager/pre-commit/parsing.js +3 -2
  56. package/dist/modules/manager/pre-commit/parsing.js.map +1 -1
  57. package/dist/modules/manager/proto/schema.js +2 -1
  58. package/dist/modules/manager/proto/schema.js.map +1 -1
  59. package/dist/modules/manager/renovate-config/extract.js +16 -2
  60. package/dist/modules/manager/renovate-config/extract.js.map +1 -1
  61. package/dist/modules/manager/woodpecker/extract.js +2 -2
  62. package/dist/modules/manager/woodpecker/extract.js.map +1 -1
  63. package/dist/modules/versioning/apk/index.js +2 -1
  64. package/dist/modules/versioning/apk/index.js.map +1 -1
  65. package/dist/modules/versioning/bazel-module/bzlmod-version.js +2 -1
  66. package/dist/modules/versioning/bazel-module/bzlmod-version.js.map +1 -1
  67. package/dist/modules/versioning/bazel-module/index.js +2 -1
  68. package/dist/modules/versioning/bazel-module/index.js.map +1 -1
  69. package/dist/modules/versioning/conan/common.js +2 -1
  70. package/dist/modules/versioning/conan/common.js.map +1 -1
  71. package/dist/modules/versioning/conan/range.js +5 -3
  72. package/dist/modules/versioning/conan/range.js.map +1 -1
  73. package/dist/modules/versioning/gradle/compare.js +1 -1
  74. package/dist/modules/versioning/gradle/compare.js.map +1 -1
  75. package/dist/modules/versioning/lambda-node/index.js +2 -1
  76. package/dist/modules/versioning/lambda-node/index.js.map +1 -1
  77. package/dist/modules/versioning/maven/compare.js +4 -3
  78. package/dist/modules/versioning/maven/compare.js.map +1 -1
  79. package/dist/modules/versioning/pep440/range.js +2 -1
  80. package/dist/modules/versioning/pep440/range.js.map +1 -1
  81. package/dist/modules/versioning/pvp/index.js +2 -1
  82. package/dist/modules/versioning/pvp/index.js.map +1 -1
  83. package/dist/modules/versioning/ruby/index.js +2 -1
  84. package/dist/modules/versioning/ruby/index.js.map +1 -1
  85. package/dist/util/cache/package/impl/file.js +2 -1
  86. package/dist/util/cache/package/impl/file.js.map +1 -1
  87. package/dist/util/cache/package/legacy.js +2 -1
  88. package/dist/util/cache/package/legacy.js.map +1 -1
  89. package/dist/util/date.js +2 -1
  90. package/dist/util/date.js.map +1 -1
  91. package/dist/util/exec/docker/index.js +2 -2
  92. package/dist/util/exec/docker/index.js.map +1 -1
  93. package/dist/util/exec/index.js +2 -2
  94. package/dist/util/exec/index.js.map +1 -1
  95. package/dist/util/exec/utils.js +2 -2
  96. package/dist/util/exec/utils.js.map +1 -1
  97. package/dist/util/fingerprint.js.map +1 -1
  98. package/dist/util/git/index.js +3 -3
  99. package/dist/util/git/index.js.map +1 -1
  100. package/dist/util/git/instrument.js +3 -2
  101. package/dist/util/git/instrument.js.map +1 -1
  102. package/dist/util/host-rules.js +1 -1
  103. package/dist/util/host-rules.js.map +1 -1
  104. package/dist/util/http/github.js +2 -2
  105. package/dist/util/http/github.js.map +1 -1
  106. package/dist/util/object.js.map +1 -1
  107. package/dist/util/result.js.map +1 -1
  108. package/dist/util/s3.js +2 -2
  109. package/dist/util/s3.js.map +1 -1
  110. package/dist/util/schema-utils/index.js.map +1 -1
  111. package/dist/util/timestamp.js +2 -1
  112. package/dist/util/timestamp.js.map +1 -1
  113. package/dist/workers/global/config/parse/index.js +2 -2
  114. package/dist/workers/global/config/parse/index.js.map +1 -1
  115. package/dist/workers/global/index.js +2 -2
  116. package/dist/workers/global/index.js.map +1 -1
  117. package/dist/workers/repository/update/branch/execute-post-upgrade-commands.js +2 -2
  118. package/dist/workers/repository/update/branch/execute-post-upgrade-commands.js.map +1 -1
  119. package/dist/workers/repository/update/pr/changelog/release-notes.js +2 -2
  120. package/dist/workers/repository/update/pr/changelog/release-notes.js.map +1 -1
  121. package/package.json +2 -2
  122. package/renovate-schema.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"compare.js","names":[],"sources":["../../../../lib/modules/versioning/maven/compare.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\n\nconst PREFIX_DOT = 'PREFIX_DOT';\nconst PREFIX_HYPHEN = 'PREFIX_HYPHEN';\nconst ALPHA_SUFFIX = '-alpha';\n\nconst TYPE_NUMBER = 'TYPE_NUMBER';\nconst TYPE_QUALIFIER = 'TYPE_QUALIFIER';\n\nexport interface BaseToken {\n prefix: string;\n type: typeof TYPE_NUMBER | typeof TYPE_QUALIFIER;\n val: number | string;\n isTransition?: boolean;\n}\n\nexport interface NumberToken extends BaseToken {\n type: typeof TYPE_NUMBER;\n val: number;\n}\n\nexport interface QualifierToken extends BaseToken {\n type: typeof TYPE_QUALIFIER;\n val: string;\n}\n\nexport type Token = NumberToken | QualifierToken;\n\nfunction iterateChars(\n str: string,\n cb: (p: string | null, n: string | null) => void,\n): void {\n let prev = null;\n let next = null;\n for (let i = 0; i < str.length; i += 1) {\n next = str.charAt(i);\n cb(prev, next);\n prev = next;\n }\n cb(prev, null);\n}\n\nfunction isDigit(char: string): boolean {\n return regEx(/^\\d$/).test(char);\n}\n\nfunction isLetter(char: string): boolean {\n return regEx(/^[a-z_+]$/i).test(char);\n}\n\nfunction isTransition(prevChar: string, nextChar: string): boolean {\n return (\n (isDigit(prevChar) && isLetter(nextChar)) ||\n (isLetter(prevChar) && isDigit(nextChar))\n );\n}\n\nfunction iterateTokens(versionStr: string, cb: (token: Token) => void): void {\n let currentPrefix = '';\n let currentVal = '';\n\n function yieldToken(transition = false): void {\n const val = currentVal || '0';\n if (regEx(/^\\d+$/).test(val)) {\n cb({\n prefix: currentPrefix,\n type: TYPE_NUMBER,\n val: parseInt(val, 10),\n isTransition: transition,\n });\n } else {\n cb({\n prefix: currentPrefix,\n type: TYPE_QUALIFIER,\n val,\n isTransition: transition,\n });\n }\n }\n\n iterateChars(versionStr, (prevChar, nextChar) => {\n if (nextChar === null) {\n yieldToken();\n } else if (nextChar === '-') {\n yieldToken();\n currentPrefix = PREFIX_HYPHEN;\n currentVal = '';\n } else if (nextChar === '.') {\n yieldToken();\n currentPrefix = PREFIX_DOT;\n currentVal = '';\n } else if (prevChar === null && (nextChar === 'v' || nextChar === 'V')) {\n currentPrefix = nextChar;\n } else {\n if (currentVal !== '' && isTransition(prevChar!, nextChar)) {\n yieldToken(true);\n currentPrefix = PREFIX_HYPHEN;\n currentVal = nextChar;\n } else if (\n currentVal === '' &&\n (currentPrefix === 'v' || currentPrefix === 'V') &&\n !isDigit(nextChar)\n ) {\n currentVal = currentVal.concat(currentPrefix, nextChar);\n currentPrefix = '';\n } else {\n currentVal = currentVal.concat(nextChar);\n }\n }\n });\n}\n\nfunction isNull(token: Token): boolean {\n const val = token.val;\n return (\n val === 0 ||\n val === '' ||\n val === 'final' ||\n val === 'ga' ||\n val === 'release' ||\n val === 'latest' ||\n val === 'sr'\n );\n}\n\nfunction tokenize(versionStr: string, preserveMinorZeroes = false): Token[] {\n let buf: Token[] = [];\n let result: Token[] = [];\n let leadingZero = true;\n iterateTokens(versionStr.toLowerCase(), (token) => {\n if (token.prefix === PREFIX_HYPHEN || token.type === TYPE_QUALIFIER) {\n buf = [];\n }\n buf.push(token);\n if (!isNull(token)) {\n leadingZero = false;\n result = result.concat(buf);\n buf = [];\n } else if (leadingZero || preserveMinorZeroes) {\n result = result.concat(buf);\n buf = [];\n }\n });\n return result;\n}\n\nfunction nullFor(token: Token): Token {\n return token.type === TYPE_NUMBER\n ? {\n prefix: token.prefix,\n type: TYPE_NUMBER,\n val: 0,\n }\n : {\n prefix: token.prefix,\n type: TYPE_QUALIFIER,\n val: '',\n };\n}\n\nfunction commonOrder(token: Token): number {\n if (token.type === TYPE_QUALIFIER) {\n return 1;\n }\n if (token.prefix === PREFIX_HYPHEN && token.type === TYPE_NUMBER) {\n return 2;\n }\n return 3;\n}\n\nexport const QualifierTypes = {\n Alpha: 1,\n Beta: 2,\n Milestone: 3,\n RC: 4,\n Snapshot: 5,\n Release: 6,\n SP: 7,\n} as const;\n\nexport function qualifierType(token: Token): number | null {\n const val = token.val;\n if (val === 'alpha' || (token.isTransition && val === 'a')) {\n return QualifierTypes.Alpha;\n }\n if (val === 'beta' || (token.isTransition && val === 'b')) {\n return QualifierTypes.Beta;\n }\n if (val === 'milestone' || (token.isTransition && val === 'm')) {\n return QualifierTypes.Milestone;\n }\n if (val === 'rc' || val === 'cr' || val === 'preview') {\n return QualifierTypes.RC;\n }\n if (val === 'snapshot' || val === 'snap') {\n return QualifierTypes.Snapshot;\n }\n if (\n val === '' ||\n val === 'final' ||\n val === 'ga' ||\n val === 'release' ||\n val === 'latest' ||\n val === 'sr'\n ) {\n return QualifierTypes.Release;\n }\n if (val === 'sp') {\n return QualifierTypes.SP;\n }\n return null;\n}\n\nfunction qualifierCmp(left: Token, right: Token): number {\n const leftOrder = qualifierType(left);\n const rightOrder = qualifierType(right);\n if (leftOrder && rightOrder) {\n if (leftOrder < rightOrder) {\n return -1;\n }\n if (leftOrder > rightOrder) {\n return 1;\n }\n return 0;\n }\n\n if (leftOrder && leftOrder < QualifierTypes.Release) {\n return -1;\n }\n if (rightOrder && rightOrder < QualifierTypes.Release) {\n return 1;\n }\n\n if (left.val < right.val) {\n return -1;\n }\n if (left.val > right.val) {\n return 1;\n }\n return 0;\n}\n\nfunction tokenCmp(left: Token, right: Token): number {\n const leftOrder = commonOrder(left);\n const rightOrder = commonOrder(right);\n\n if (leftOrder < rightOrder) {\n return -1;\n }\n if (leftOrder > rightOrder) {\n return 1;\n }\n\n if (left.type === TYPE_NUMBER && right.type === TYPE_NUMBER) {\n if (left.val < right.val) {\n return -1;\n }\n if (left.val > right.val) {\n return 1;\n }\n return 0;\n }\n\n return qualifierCmp(left, right);\n}\n\nfunction compare(left: string, right: string): number {\n const leftTokens = tokenize(left);\n const rightTokens = tokenize(right);\n const length = Math.max(leftTokens.length, rightTokens.length);\n for (let idx = 0; idx < length; idx += 1) {\n const leftToken = leftTokens[idx] || nullFor(rightTokens[idx]);\n const rightToken = rightTokens[idx] || nullFor(leftTokens[idx]);\n const cmpResult = tokenCmp(leftToken, rightToken);\n if (cmpResult !== 0) {\n return cmpResult;\n }\n }\n return 0;\n}\n\nfunction isVersion(version: unknown): version is string {\n if (!version || typeof version !== 'string') {\n return false;\n }\n if (!regEx(/^[-.a-z_+0-9]+$/i).test(version)) {\n return false;\n }\n if (regEx(/^[.-]/).test(version)) {\n return false;\n }\n if (regEx(/[.-]$/).test(version)) {\n return false;\n }\n if (['latest', 'release'].includes(version.toLowerCase())) {\n return false;\n }\n const tokens = tokenize(version);\n return !!tokens.length;\n}\n\nconst INCLUDING_POINT = 'INCLUDING_POINT';\nconst EXCLUDING_POINT = 'EXCLUDING_POINT';\n\nfunction parseRange(rangeStr: string): Range[] | null {\n function emptyInterval(): Range {\n return {\n leftType: null,\n leftValue: null,\n leftBracket: null,\n rightType: null,\n rightValue: null,\n rightBracket: null,\n };\n }\n\n const commaSplit = rangeStr.split(regEx(/\\s*,\\s*/));\n let ranges: Range[] | null = [];\n let interval = emptyInterval();\n\n commaSplit.forEach((subStr) => {\n if (!ranges) {\n return;\n }\n if (interval.leftType === null) {\n if (regEx(/^\\[.*]$/).test(subStr)) {\n const ver = subStr.slice(1, -1);\n ranges.push({\n leftType: INCLUDING_POINT,\n leftValue: ver,\n leftBracket: '[',\n rightType: INCLUDING_POINT,\n rightValue: ver,\n rightBracket: ']',\n });\n interval = emptyInterval();\n } else if (subStr.startsWith('[')) {\n const ver = subStr.slice(1);\n interval.leftType = INCLUDING_POINT;\n interval.leftValue = ver;\n interval.leftBracket = '[';\n } else if (subStr.startsWith('(') || subStr.startsWith(']')) {\n const ver = subStr.slice(1);\n interval.leftType = EXCLUDING_POINT;\n interval.leftValue = ver;\n interval.leftBracket = subStr[0];\n } else {\n ranges = null;\n }\n } else if (subStr.endsWith(']')) {\n const ver = subStr.slice(0, -1);\n interval.rightType = INCLUDING_POINT;\n interval.rightValue = ver;\n interval.rightBracket = ']';\n ranges.push(interval);\n interval = emptyInterval();\n } else if (subStr.endsWith(')') || subStr.endsWith('[')) {\n const ver = subStr.slice(0, -1);\n interval.rightType = EXCLUDING_POINT;\n interval.rightValue = ver;\n interval.rightBracket = subStr.endsWith(')') ? ')' : '[';\n ranges.push(interval);\n interval = emptyInterval();\n } else {\n ranges = null;\n }\n });\n\n if (interval.leftType) {\n return null;\n } // something like '[1,2],[3'\n if (!ranges?.length) {\n return null;\n }\n\n const lastIdx = ranges.length - 1;\n let prevValue: string | null = null;\n const result: Range[] = [];\n for (let idx = 0; idx < ranges.length; idx += 1) {\n const range = ranges[idx];\n const { leftType, leftValue, rightType, rightValue } = range;\n\n if (idx === 0 && leftValue === '') {\n if (leftType === EXCLUDING_POINT && isVersion(rightValue)) {\n prevValue = rightValue;\n result.push({ ...range, leftValue: null });\n continue;\n }\n return null;\n }\n if (idx === lastIdx && rightValue === '') {\n if (rightType === EXCLUDING_POINT && isVersion(leftValue)) {\n if (prevValue && compare(prevValue, leftValue) === 1) {\n return null;\n }\n result.push({ ...range, rightValue: null });\n continue;\n }\n return null;\n }\n if (isVersion(leftValue) && isVersion(rightValue)) {\n if (compare(leftValue, rightValue) === 1) {\n return null;\n }\n if (prevValue && compare(prevValue, leftValue) === 1) {\n return null;\n }\n prevValue = rightValue;\n result.push(range);\n continue;\n }\n return null;\n }\n return result;\n}\n\nfunction isValid(str: string): boolean {\n if (!str) {\n return false;\n }\n return isVersion(str) || !!parseRange(str);\n}\n\nexport interface Range {\n leftType: typeof INCLUDING_POINT | typeof EXCLUDING_POINT | null;\n leftValue: string | null;\n leftBracket: string | null;\n rightType: typeof INCLUDING_POINT | typeof EXCLUDING_POINT | null;\n rightValue: string | null;\n rightBracket: string | null;\n}\n\nfunction rangeToStr(fullRange: Range[] | null): string | null {\n if (fullRange === null) {\n return null;\n }\n\n function valToStr(val: string | null): string {\n return val ?? '';\n }\n\n if (fullRange.length === 1) {\n const { leftBracket, rightBracket, leftValue, rightValue } = fullRange[0];\n if (\n leftValue === rightValue &&\n leftBracket === '[' &&\n rightBracket === ']'\n ) {\n return `[${valToStr(leftValue)}]`;\n }\n }\n\n const intervals = fullRange.map((val) =>\n [\n val.leftBracket,\n valToStr(val.leftValue),\n ',',\n valToStr(val.rightValue),\n val.rightBracket,\n ].join(''),\n );\n return intervals.join(',');\n}\n\nfunction tokensToStr(tokens: Token[]): string {\n let isTransition: boolean | undefined = false;\n return tokens.reduce((result: string, token: Token) => {\n let prefix: string;\n if (token.prefix === PREFIX_DOT) {\n prefix = '.';\n } else if (token.prefix === PREFIX_HYPHEN) {\n prefix = isTransition === true ? '' : '-';\n } else {\n prefix = token.prefix;\n }\n isTransition = token.isTransition;\n return `${result}${prefix}${token.val}`;\n }, '');\n}\n\nfunction coerceRangeValue(prev: string, next: string): string {\n const prevTokens = tokenize(prev, true);\n const nextTokens = tokenize(next, true);\n const resultTokens = nextTokens.slice(0, prevTokens.length);\n const align = Math.max(0, prevTokens.length - nextTokens.length);\n if (align > 0) {\n resultTokens.push(...prevTokens.slice(prevTokens.length - align));\n }\n return tokensToStr(resultTokens);\n}\n\nfunction incrementRangeValue(value: string): string {\n const tokens = tokenize(value);\n const lastToken = tokens.at(-1)!;\n if (typeof lastToken.val === 'number') {\n lastToken.val += 1;\n return coerceRangeValue(value, tokensToStr(tokens));\n }\n return value;\n}\n\nfunction autoExtendMavenRange(\n currentRepresentation: string,\n newValue: string,\n): string | null {\n const range = parseRange(currentRepresentation);\n if (!range) {\n return currentRepresentation;\n }\n function isPoint(vals: Range[]): boolean {\n if (vals.length !== 1) {\n return false;\n }\n const { leftType, leftValue, rightType, rightValue } = vals[0];\n return (\n leftType === 'INCLUDING_POINT' &&\n leftType === rightType &&\n leftValue === rightValue\n );\n }\n if (isPoint(range)) {\n return `[${newValue}]`;\n }\n\n const interval = [...range].reverse().find((elem) => {\n const { rightType, rightValue } = elem;\n return (\n rightValue === null ||\n (rightType === INCLUDING_POINT && compare(rightValue, newValue) === -1) ||\n (rightType === EXCLUDING_POINT && compare(rightValue, newValue) !== 1)\n );\n });\n\n if (!interval) {\n return currentRepresentation;\n }\n\n const { leftValue, rightValue } = interval;\n if (\n leftValue !== null &&\n rightValue !== null &&\n incrementRangeValue(leftValue) === rightValue\n ) {\n // if a range was detected where incrementing the lower value once results in the upper value\n // and the new version is outside the range, construct a new range that follows the same semantic\n // [1,2) / 4.3.2 => [4,5)\n if (compare(newValue, leftValue) !== -1) {\n interval.leftValue = coerceRangeValue(leftValue, newValue);\n interval.rightValue = incrementRangeValue(interval.leftValue);\n }\n } else if (\n leftValue !== null &&\n rightValue !== null &&\n incrementRangeValue(leftValue) + ALPHA_SUFFIX === rightValue\n ) {\n // same as last if, but properly considering Maven ordering specification documented at\n // https://maven.apache.org/pom.html#Version_Order_Specification\n // 4-alpha is smaller than 4.0.0 for example\n // while often people that intend to only match version 1.x use [1,2)\n // this is not correct as it matches various 2.x versions, mostly pre-versions\n // so the correct range definition would be [1,2-alpha) as nothing\n // starting with 2 can be lower than 2-alpha in Maven version ordering logic\n //\n // so this if handles the conceptually same case as the last if\n // just for the case when proper Maven ranges are used\n // [1,2-alpha) / 4.3.2 => [4,5-alpha)\n interval.leftValue = coerceRangeValue(leftValue, newValue);\n interval.rightValue =\n incrementRangeValue(interval.leftValue) + ALPHA_SUFFIX;\n } else if (rightValue !== null) {\n if (interval.rightType === INCLUDING_POINT) {\n const tokens = tokenize(rightValue);\n const lastToken = tokens.at(-1)!;\n if (typeof lastToken.val === 'number') {\n interval.rightValue = coerceRangeValue(rightValue, newValue);\n } else {\n interval.rightValue = newValue;\n }\n } else {\n interval.rightValue = incrementRangeValue(\n coerceRangeValue(rightValue, newValue),\n );\n }\n } else if (leftValue !== null) {\n interval.leftValue = coerceRangeValue(leftValue, newValue);\n }\n\n return rangeToStr(range);\n}\n\nfunction isSubversion(majorVersion: string, minorVersion: string): boolean {\n const majorTokens = tokenize(majorVersion);\n const minorTokens = tokenize(minorVersion);\n\n let result = true;\n const len = majorTokens.length;\n for (let idx = 0; idx < len; idx += 1) {\n const major = majorTokens[idx];\n const minor = minorTokens[idx] || nullFor(majorTokens[idx]);\n const cmpResult = tokenCmp(major, minor);\n if (cmpResult !== 0) {\n result = false;\n break;\n }\n }\n return result;\n}\n\nexport {\n EXCLUDING_POINT,\n INCLUDING_POINT,\n PREFIX_DOT,\n PREFIX_HYPHEN,\n TYPE_NUMBER,\n TYPE_QUALIFIER,\n autoExtendMavenRange,\n compare,\n isSubversion,\n isValid,\n isVersion,\n isVersion as isSingleVersion,\n parseRange,\n rangeToStr,\n tokenize,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"compare.js","names":["isNull"],"sources":["../../../../lib/modules/versioning/maven/compare.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport { regEx } from '../../../util/regex.ts';\n\nconst PREFIX_DOT = 'PREFIX_DOT';\nconst PREFIX_HYPHEN = 'PREFIX_HYPHEN';\nconst ALPHA_SUFFIX = '-alpha';\n\nconst TYPE_NUMBER = 'TYPE_NUMBER';\nconst TYPE_QUALIFIER = 'TYPE_QUALIFIER';\n\nexport interface BaseToken {\n prefix: string;\n type: typeof TYPE_NUMBER | typeof TYPE_QUALIFIER;\n val: number | string;\n isTransition?: boolean;\n}\n\nexport interface NumberToken extends BaseToken {\n type: typeof TYPE_NUMBER;\n val: number;\n}\n\nexport interface QualifierToken extends BaseToken {\n type: typeof TYPE_QUALIFIER;\n val: string;\n}\n\nexport type Token = NumberToken | QualifierToken;\n\nfunction iterateChars(\n str: string,\n cb: (p: string | null, n: string | null) => void,\n): void {\n let prev = null;\n let next = null;\n for (let i = 0; i < str.length; i += 1) {\n next = str.charAt(i);\n cb(prev, next);\n prev = next;\n }\n cb(prev, null);\n}\n\nfunction isDigit(char: string): boolean {\n return regEx(/^\\d$/).test(char);\n}\n\nfunction isLetter(char: string): boolean {\n return regEx(/^[a-z_+]$/i).test(char);\n}\n\nfunction isTransition(prevChar: string, nextChar: string): boolean {\n return (\n (isDigit(prevChar) && isLetter(nextChar)) ||\n (isLetter(prevChar) && isDigit(nextChar))\n );\n}\n\nfunction iterateTokens(versionStr: string, cb: (token: Token) => void): void {\n let currentPrefix = '';\n let currentVal = '';\n\n function yieldToken(transition = false): void {\n const val = currentVal || '0';\n if (regEx(/^\\d+$/).test(val)) {\n cb({\n prefix: currentPrefix,\n type: TYPE_NUMBER,\n val: parseInt(val, 10),\n isTransition: transition,\n });\n } else {\n cb({\n prefix: currentPrefix,\n type: TYPE_QUALIFIER,\n val,\n isTransition: transition,\n });\n }\n }\n\n iterateChars(versionStr, (prevChar, nextChar) => {\n if (nextChar === null) {\n yieldToken();\n } else if (nextChar === '-') {\n yieldToken();\n currentPrefix = PREFIX_HYPHEN;\n currentVal = '';\n } else if (nextChar === '.') {\n yieldToken();\n currentPrefix = PREFIX_DOT;\n currentVal = '';\n } else if (prevChar === null && (nextChar === 'v' || nextChar === 'V')) {\n currentPrefix = nextChar;\n } else {\n if (currentVal !== '' && isTransition(prevChar!, nextChar)) {\n yieldToken(true);\n currentPrefix = PREFIX_HYPHEN;\n currentVal = nextChar;\n } else if (\n currentVal === '' &&\n (currentPrefix === 'v' || currentPrefix === 'V') &&\n !isDigit(nextChar)\n ) {\n currentVal = currentVal.concat(currentPrefix, nextChar);\n currentPrefix = '';\n } else {\n currentVal = currentVal.concat(nextChar);\n }\n }\n });\n}\n\nfunction isNull(token: Token): boolean {\n const val = token.val;\n return (\n val === 0 ||\n val === '' ||\n val === 'final' ||\n val === 'ga' ||\n val === 'release' ||\n val === 'latest' ||\n val === 'sr'\n );\n}\n\nfunction tokenize(versionStr: string, preserveMinorZeroes = false): Token[] {\n let buf: Token[] = [];\n let result: Token[] = [];\n let leadingZero = true;\n iterateTokens(versionStr.toLowerCase(), (token) => {\n if (token.prefix === PREFIX_HYPHEN || token.type === TYPE_QUALIFIER) {\n buf = [];\n }\n buf.push(token);\n if (!isNull(token)) {\n leadingZero = false;\n result = result.concat(buf);\n buf = [];\n } else if (leadingZero || preserveMinorZeroes) {\n result = result.concat(buf);\n buf = [];\n }\n });\n return result;\n}\n\nfunction nullFor(token: Token): Token {\n return token.type === TYPE_NUMBER\n ? {\n prefix: token.prefix,\n type: TYPE_NUMBER,\n val: 0,\n }\n : {\n prefix: token.prefix,\n type: TYPE_QUALIFIER,\n val: '',\n };\n}\n\nfunction commonOrder(token: Token): number {\n if (token.type === TYPE_QUALIFIER) {\n return 1;\n }\n if (token.prefix === PREFIX_HYPHEN && token.type === TYPE_NUMBER) {\n return 2;\n }\n return 3;\n}\n\nexport const QualifierTypes = {\n Alpha: 1,\n Beta: 2,\n Milestone: 3,\n RC: 4,\n Snapshot: 5,\n Release: 6,\n SP: 7,\n} as const;\n\nexport function qualifierType(token: Token): number | null {\n const val = token.val;\n if (val === 'alpha' || (token.isTransition && val === 'a')) {\n return QualifierTypes.Alpha;\n }\n if (val === 'beta' || (token.isTransition && val === 'b')) {\n return QualifierTypes.Beta;\n }\n if (val === 'milestone' || (token.isTransition && val === 'm')) {\n return QualifierTypes.Milestone;\n }\n if (val === 'rc' || val === 'cr' || val === 'preview') {\n return QualifierTypes.RC;\n }\n if (val === 'snapshot' || val === 'snap') {\n return QualifierTypes.Snapshot;\n }\n if (\n val === '' ||\n val === 'final' ||\n val === 'ga' ||\n val === 'release' ||\n val === 'latest' ||\n val === 'sr'\n ) {\n return QualifierTypes.Release;\n }\n if (val === 'sp') {\n return QualifierTypes.SP;\n }\n return null;\n}\n\nfunction qualifierCmp(left: Token, right: Token): number {\n const leftOrder = qualifierType(left);\n const rightOrder = qualifierType(right);\n if (leftOrder && rightOrder) {\n if (leftOrder < rightOrder) {\n return -1;\n }\n if (leftOrder > rightOrder) {\n return 1;\n }\n return 0;\n }\n\n if (leftOrder && leftOrder < QualifierTypes.Release) {\n return -1;\n }\n if (rightOrder && rightOrder < QualifierTypes.Release) {\n return 1;\n }\n\n if (left.val < right.val) {\n return -1;\n }\n if (left.val > right.val) {\n return 1;\n }\n return 0;\n}\n\nfunction tokenCmp(left: Token, right: Token): number {\n const leftOrder = commonOrder(left);\n const rightOrder = commonOrder(right);\n\n if (leftOrder < rightOrder) {\n return -1;\n }\n if (leftOrder > rightOrder) {\n return 1;\n }\n\n if (left.type === TYPE_NUMBER && right.type === TYPE_NUMBER) {\n if (left.val < right.val) {\n return -1;\n }\n if (left.val > right.val) {\n return 1;\n }\n return 0;\n }\n\n return qualifierCmp(left, right);\n}\n\nfunction compare(left: string, right: string): number {\n const leftTokens = tokenize(left);\n const rightTokens = tokenize(right);\n const length = Math.max(leftTokens.length, rightTokens.length);\n for (let idx = 0; idx < length; idx += 1) {\n const leftToken = leftTokens[idx] || nullFor(rightTokens[idx]);\n const rightToken = rightTokens[idx] || nullFor(leftTokens[idx]);\n const cmpResult = tokenCmp(leftToken, rightToken);\n if (cmpResult !== 0) {\n return cmpResult;\n }\n }\n return 0;\n}\n\nfunction isVersion(version: unknown): version is string {\n if (!version || !isString(version)) {\n return false;\n }\n if (!regEx(/^[-.a-z_+0-9]+$/i).test(version)) {\n return false;\n }\n if (regEx(/^[.-]/).test(version)) {\n return false;\n }\n if (regEx(/[.-]$/).test(version)) {\n return false;\n }\n if (['latest', 'release'].includes(version.toLowerCase())) {\n return false;\n }\n const tokens = tokenize(version);\n return !!tokens.length;\n}\n\nconst INCLUDING_POINT = 'INCLUDING_POINT';\nconst EXCLUDING_POINT = 'EXCLUDING_POINT';\n\nfunction parseRange(rangeStr: string): Range[] | null {\n function emptyInterval(): Range {\n return {\n leftType: null,\n leftValue: null,\n leftBracket: null,\n rightType: null,\n rightValue: null,\n rightBracket: null,\n };\n }\n\n const commaSplit = rangeStr.split(regEx(/\\s*,\\s*/));\n let ranges: Range[] | null = [];\n let interval = emptyInterval();\n\n commaSplit.forEach((subStr) => {\n if (!ranges) {\n return;\n }\n if (interval.leftType === null) {\n if (regEx(/^\\[.*]$/).test(subStr)) {\n const ver = subStr.slice(1, -1);\n ranges.push({\n leftType: INCLUDING_POINT,\n leftValue: ver,\n leftBracket: '[',\n rightType: INCLUDING_POINT,\n rightValue: ver,\n rightBracket: ']',\n });\n interval = emptyInterval();\n } else if (subStr.startsWith('[')) {\n const ver = subStr.slice(1);\n interval.leftType = INCLUDING_POINT;\n interval.leftValue = ver;\n interval.leftBracket = '[';\n } else if (subStr.startsWith('(') || subStr.startsWith(']')) {\n const ver = subStr.slice(1);\n interval.leftType = EXCLUDING_POINT;\n interval.leftValue = ver;\n interval.leftBracket = subStr[0];\n } else {\n ranges = null;\n }\n } else if (subStr.endsWith(']')) {\n const ver = subStr.slice(0, -1);\n interval.rightType = INCLUDING_POINT;\n interval.rightValue = ver;\n interval.rightBracket = ']';\n ranges.push(interval);\n interval = emptyInterval();\n } else if (subStr.endsWith(')') || subStr.endsWith('[')) {\n const ver = subStr.slice(0, -1);\n interval.rightType = EXCLUDING_POINT;\n interval.rightValue = ver;\n interval.rightBracket = subStr.endsWith(')') ? ')' : '[';\n ranges.push(interval);\n interval = emptyInterval();\n } else {\n ranges = null;\n }\n });\n\n if (interval.leftType) {\n return null;\n } // something like '[1,2],[3'\n if (!ranges?.length) {\n return null;\n }\n\n const lastIdx = ranges.length - 1;\n let prevValue: string | null = null;\n const result: Range[] = [];\n for (let idx = 0; idx < ranges.length; idx += 1) {\n const range = ranges[idx];\n const { leftType, leftValue, rightType, rightValue } = range;\n\n if (idx === 0 && leftValue === '') {\n if (leftType === EXCLUDING_POINT && isVersion(rightValue)) {\n prevValue = rightValue;\n result.push({ ...range, leftValue: null });\n continue;\n }\n return null;\n }\n if (idx === lastIdx && rightValue === '') {\n if (rightType === EXCLUDING_POINT && isVersion(leftValue)) {\n if (prevValue && compare(prevValue, leftValue) === 1) {\n return null;\n }\n result.push({ ...range, rightValue: null });\n continue;\n }\n return null;\n }\n if (isVersion(leftValue) && isVersion(rightValue)) {\n if (compare(leftValue, rightValue) === 1) {\n return null;\n }\n if (prevValue && compare(prevValue, leftValue) === 1) {\n return null;\n }\n prevValue = rightValue;\n result.push(range);\n continue;\n }\n return null;\n }\n return result;\n}\n\nfunction isValid(str: string): boolean {\n if (!str) {\n return false;\n }\n return isVersion(str) || !!parseRange(str);\n}\n\nexport interface Range {\n leftType: typeof INCLUDING_POINT | typeof EXCLUDING_POINT | null;\n leftValue: string | null;\n leftBracket: string | null;\n rightType: typeof INCLUDING_POINT | typeof EXCLUDING_POINT | null;\n rightValue: string | null;\n rightBracket: string | null;\n}\n\nfunction rangeToStr(fullRange: Range[] | null): string | null {\n if (fullRange === null) {\n return null;\n }\n\n function valToStr(val: string | null): string {\n return val ?? '';\n }\n\n if (fullRange.length === 1) {\n const { leftBracket, rightBracket, leftValue, rightValue } = fullRange[0];\n if (\n leftValue === rightValue &&\n leftBracket === '[' &&\n rightBracket === ']'\n ) {\n return `[${valToStr(leftValue)}]`;\n }\n }\n\n const intervals = fullRange.map((val) =>\n [\n val.leftBracket,\n valToStr(val.leftValue),\n ',',\n valToStr(val.rightValue),\n val.rightBracket,\n ].join(''),\n );\n return intervals.join(',');\n}\n\nfunction tokensToStr(tokens: Token[]): string {\n let isTransition: boolean | undefined = false;\n return tokens.reduce((result: string, token: Token) => {\n let prefix: string;\n if (token.prefix === PREFIX_DOT) {\n prefix = '.';\n } else if (token.prefix === PREFIX_HYPHEN) {\n prefix = isTransition === true ? '' : '-';\n } else {\n prefix = token.prefix;\n }\n isTransition = token.isTransition;\n return `${result}${prefix}${token.val}`;\n }, '');\n}\n\nfunction coerceRangeValue(prev: string, next: string): string {\n const prevTokens = tokenize(prev, true);\n const nextTokens = tokenize(next, true);\n const resultTokens = nextTokens.slice(0, prevTokens.length);\n const align = Math.max(0, prevTokens.length - nextTokens.length);\n if (align > 0) {\n resultTokens.push(...prevTokens.slice(prevTokens.length - align));\n }\n return tokensToStr(resultTokens);\n}\n\nfunction incrementRangeValue(value: string): string {\n const tokens = tokenize(value);\n const lastToken = tokens.at(-1)!;\n if (typeof lastToken.val === 'number') {\n lastToken.val += 1;\n return coerceRangeValue(value, tokensToStr(tokens));\n }\n return value;\n}\n\nfunction autoExtendMavenRange(\n currentRepresentation: string,\n newValue: string,\n): string | null {\n const range = parseRange(currentRepresentation);\n if (!range) {\n return currentRepresentation;\n }\n function isPoint(vals: Range[]): boolean {\n if (vals.length !== 1) {\n return false;\n }\n const { leftType, leftValue, rightType, rightValue } = vals[0];\n return (\n leftType === 'INCLUDING_POINT' &&\n leftType === rightType &&\n leftValue === rightValue\n );\n }\n if (isPoint(range)) {\n return `[${newValue}]`;\n }\n\n const interval = [...range].reverse().find((elem) => {\n const { rightType, rightValue } = elem;\n return (\n rightValue === null ||\n (rightType === INCLUDING_POINT && compare(rightValue, newValue) === -1) ||\n (rightType === EXCLUDING_POINT && compare(rightValue, newValue) !== 1)\n );\n });\n\n if (!interval) {\n return currentRepresentation;\n }\n\n const { leftValue, rightValue } = interval;\n if (\n leftValue !== null &&\n rightValue !== null &&\n incrementRangeValue(leftValue) === rightValue\n ) {\n // if a range was detected where incrementing the lower value once results in the upper value\n // and the new version is outside the range, construct a new range that follows the same semantic\n // [1,2) / 4.3.2 => [4,5)\n if (compare(newValue, leftValue) !== -1) {\n interval.leftValue = coerceRangeValue(leftValue, newValue);\n interval.rightValue = incrementRangeValue(interval.leftValue);\n }\n } else if (\n leftValue !== null &&\n rightValue !== null &&\n incrementRangeValue(leftValue) + ALPHA_SUFFIX === rightValue\n ) {\n // same as last if, but properly considering Maven ordering specification documented at\n // https://maven.apache.org/pom.html#Version_Order_Specification\n // 4-alpha is smaller than 4.0.0 for example\n // while often people that intend to only match version 1.x use [1,2)\n // this is not correct as it matches various 2.x versions, mostly pre-versions\n // so the correct range definition would be [1,2-alpha) as nothing\n // starting with 2 can be lower than 2-alpha in Maven version ordering logic\n //\n // so this if handles the conceptually same case as the last if\n // just for the case when proper Maven ranges are used\n // [1,2-alpha) / 4.3.2 => [4,5-alpha)\n interval.leftValue = coerceRangeValue(leftValue, newValue);\n interval.rightValue =\n incrementRangeValue(interval.leftValue) + ALPHA_SUFFIX;\n } else if (rightValue !== null) {\n if (interval.rightType === INCLUDING_POINT) {\n const tokens = tokenize(rightValue);\n const lastToken = tokens.at(-1)!;\n if (typeof lastToken.val === 'number') {\n interval.rightValue = coerceRangeValue(rightValue, newValue);\n } else {\n interval.rightValue = newValue;\n }\n } else {\n interval.rightValue = incrementRangeValue(\n coerceRangeValue(rightValue, newValue),\n );\n }\n } else if (leftValue !== null) {\n interval.leftValue = coerceRangeValue(leftValue, newValue);\n }\n\n return rangeToStr(range);\n}\n\nfunction isSubversion(majorVersion: string, minorVersion: string): boolean {\n const majorTokens = tokenize(majorVersion);\n const minorTokens = tokenize(minorVersion);\n\n let result = true;\n const len = majorTokens.length;\n for (let idx = 0; idx < len; idx += 1) {\n const major = majorTokens[idx];\n const minor = minorTokens[idx] || nullFor(majorTokens[idx]);\n const cmpResult = tokenCmp(major, minor);\n if (cmpResult !== 0) {\n result = false;\n break;\n }\n }\n return result;\n}\n\nexport {\n EXCLUDING_POINT,\n INCLUDING_POINT,\n PREFIX_DOT,\n PREFIX_HYPHEN,\n TYPE_NUMBER,\n TYPE_QUALIFIER,\n autoExtendMavenRange,\n compare,\n isSubversion,\n isValid,\n isVersion,\n isVersion as isSingleVersion,\n parseRange,\n rangeToStr,\n tokenize,\n};\n"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { regEx } from "../../../util/regex.js";
2
2
  import { logger } from "../../../logger/index.js";
3
3
  import { coerceArray } from "../../../util/array.js";
4
+ import { isTruthy } from "@sindresorhus/is";
4
5
  import { gte, lt, lte, satisfies } from "@renovatebot/pep440";
5
6
  import { parse } from "@renovatebot/pep440/lib/specifier.js";
6
7
  import { parse as parse$1 } from "@renovatebot/pep440/lib/version.js";
@@ -116,7 +117,7 @@ function getNewValue({ currentValue, rangeStrategy, currentVersion, newVersion,
116
117
  newVersion
117
118
  });
118
119
  }
119
- let result = updatedRange.filter(Boolean).join(", ");
120
+ let result = updatedRange.filter(isTruthy).join(", ");
120
121
  if (result.includes(", ") && !currentValue.includes(", ")) result = result.replace(regEx(/, /g), ",");
121
122
  const checkedResult = checkRangeAndRemoveUnnecessaryRangeLimit(result, newVersion);
122
123
  // istanbul ignore if
@@ -1 +1 @@
1
- {"version":3,"file":"range.js","names":["parseVersion","parseRange"],"sources":["../../../../lib/modules/versioning/pep440/range.ts"],"sourcesContent":["import { gte, lt, lte, satisfies } from '@renovatebot/pep440';\nimport { parse as parseRange } from '@renovatebot/pep440/lib/specifier.js';\nimport { parse as parseVersion } from '@renovatebot/pep440/lib/version.js';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type { NewValueConfig } from '../types.ts';\n\nconst UserPolicyPrecisionMap = {\n Major: 0,\n Minor: 1,\n Micro: 2,\n Bug: 3,\n None: Infinity,\n} as const;\nconst PrecisionUserPolicyMap = {\n 0: 'Major',\n 1: 'Minor',\n 2: 'Micro',\n 3: 'Bug',\n} as const;\n\ntype UserPolicy =\n (typeof UserPolicyPrecisionMap)[keyof typeof UserPolicyPrecisionMap];\n\n/**\n * Calculate current update range precision.\n * @param ranges A {@link Range} consists of current range\n * @returns A {@link UserPolicy}\n */\nfunction getRangePrecision(ranges: Range[]): UserPolicy {\n const bound = coerceArray(\n parseVersion((ranges[1] || ranges[0]).version)?.release,\n );\n let rangePrecision = -1;\n // range is defined by a single bound.\n // ie. <1.2.2.3,\n // >=7\n if (ranges.length === 1) {\n rangePrecision = bound.length - 1;\n }\n // Range is defined by both upper and lower bounds.\n if (ranges.length === 2) {\n const lowerBound = coerceArray(parseVersion(ranges[0].version)?.release);\n rangePrecision = bound.findIndex((el, index) => el > lowerBound[index]);\n }\n // Tune down Major precision if followed by a zero\n if (\n rangePrecision === UserPolicyPrecisionMap.Major &&\n rangePrecision + 1 < bound.length &&\n bound[rangePrecision + 1] === 0\n ) {\n rangePrecision++;\n }\n // Could not calculate user precision\n // Default to the smallest possible\n // istanbul ignore next\n if (rangePrecision === -1) {\n rangePrecision = bound.length - 1;\n }\n const key =\n PrecisionUserPolicyMap[\n rangePrecision as keyof typeof PrecisionUserPolicyMap\n ];\n return UserPolicyPrecisionMap[key as keyof typeof UserPolicyPrecisionMap];\n}\n\n/**\n * @param policy Required range precision\n * @param newVersion The newly accepted version\n * @param baseVersion Optional Current upper bound\n * @returns A string represents a future version upper bound.\n */\nfunction getFutureVersion(\n policy: UserPolicy,\n newVersion: string,\n baseVersion?: string,\n): number[] {\n const toRelease = coerceArray(parseVersion(newVersion)?.release);\n const baseRelease = coerceArray(\n parseVersion(baseVersion ?? newVersion)?.release,\n );\n return baseRelease.map((_, index) => {\n const toPart = toRelease[index] ?? 0;\n if (index < policy) {\n return toPart;\n }\n if (index === policy) {\n return toPart + (baseVersion === undefined ? 0 : 1);\n }\n return 0;\n });\n}\n\ninterface Range {\n operator: string;\n prefix?: string;\n version: string;\n}\n\nexport function getPinnedValue(newVersion: string): string {\n return `==${newVersion}`;\n}\n\nexport function getNewValue({\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n isReplacement,\n}: NewValueConfig): string | null {\n let ranges: Range[];\n let updatedRange: (string | null)[];\n\n // no symbol: accept only that specific version specified\n if (currentValue === currentVersion || isReplacement) {\n return newVersion;\n }\n\n // Handle bare versions (e.g., \"v0.7.15\") that don't strictly equal\n // currentVersion due to normalization, treating them as pinned while\n // preserving the v-prefix.\n if (parseVersion(currentValue)) {\n const vPrefix = regEx(/^(?<prefix>[vV])/).exec(currentValue);\n if (vPrefix) {\n return `${vPrefix.groups!.prefix}${newVersion}`;\n }\n return newVersion;\n }\n\n try {\n ranges = parseCurrentRange(currentValue);\n if (!ranges.length) {\n // an empty string is an allowed value for PEP440 range\n // it means get any version\n logger.warn({ currentValue }, 'Empty currentValue');\n return currentValue;\n }\n } catch (err) {\n logger.warn({ currentValue, err }, 'Unexpected range error');\n return null;\n }\n\n // return early if newVersion is excluded from range\n if (\n ranges.some(\n (range) => range.operator === '!=' && range.version === newVersion,\n )\n ) {\n logger.debug(\n `Cannot calculate new value as the newVersion:\\`${newVersion}\\` is excluded from range: \\`${currentValue}\\``,\n );\n return null;\n }\n\n switch (rangeStrategy) {\n case 'auto':\n case 'replace':\n updatedRange = handleReplaceStrategy(\n {\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n },\n ranges,\n );\n break;\n case 'widen':\n updatedRange = handleWidenStrategy(\n {\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n },\n ranges,\n );\n break;\n case 'bump':\n updatedRange = handleBumpStrategy(\n {\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n },\n ranges,\n );\n break;\n default:\n // Unsupported rangeStrategy\n // Valid rangeStrategy values are: bump, extend, pin, replace.\n // https://docs.renovatebot.com/modules/versioning/#pep440-versioning\n logger.debug(\n `Unsupported rangeStrategy: ${rangeStrategy}. Using \"replace\" instead.`,\n );\n return getNewValue({\n currentValue,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n }\n\n let result = updatedRange.filter(Boolean).join(', ');\n\n if (result.includes(', ') && !currentValue.includes(', ')) {\n result = result.replace(regEx(/, /g), ',');\n }\n const checkedResult = checkRangeAndRemoveUnnecessaryRangeLimit(\n result,\n newVersion,\n );\n\n // istanbul ignore if\n if (!satisfies(newVersion, checkedResult)) {\n // we failed at creating the range\n logger.warn(\n { result, newVersion, currentValue },\n 'pep440: failed to calculate newValue',\n );\n return null;\n }\n return checkedResult;\n}\n\nexport function isLessThanRange(input: string, range: string): boolean {\n try {\n let invertResult = true;\n\n const results = range\n .split(',')\n .map((x) =>\n x\n .replace(regEx(/\\s*/g), '')\n .split(regEx(/(~=|==|!=|<=|>=|<|>|===)/))\n .slice(1),\n )\n .map(([op, version]) => {\n if (['!=', '<=', '<'].includes(op)) {\n return true;\n }\n invertResult = false;\n if (['~=', '==', '>=', '==='].includes(op)) {\n return lt(input, version);\n }\n if (op === '>') {\n return lte(input, version);\n }\n // istanbul ignore next\n return false;\n });\n\n const result = results.every((res) => res === true);\n\n return invertResult ? !result : result;\n } catch /* istanbul ignore next */ {\n return false;\n }\n}\n\nfunction parseCurrentRange(currentValue: string): Range[] {\n const ranges: Range[] = parseRange(currentValue);\n if (!ranges) {\n throw new TypeError('Invalid pep440 currentValue');\n }\n if (ranges.some((range) => range.operator === '===')) {\n // the operator \"===\" is used for legacy non PEP440 versions\n throw new TypeError('PEP440 arbitrary equality (===) not supported');\n }\n return ranges;\n}\n\nfunction handleLowerBound(range: Range, newVersion: string): string | null {\n // used to mark minimum supported version\n // lower the bound if the new version is lower than current range\n if (['>', '>='].includes(range.operator)) {\n if (lte(newVersion, range.version)) {\n // this looks like a rollback\n return `>=${newVersion}`;\n }\n // otherwise, treat it same as exclude\n return range.operator + range.version;\n }\n // istanbul ignore next\n return null;\n}\n\nfunction handleUpperBound(range: Range, newVersion: string): string | null {\n // this is used to exclude future versions\n if (range.operator === '<') {\n // if newVersion is that future version\n if (gte(newVersion, range.version)) {\n // now here things get tricky\n // we calculate the new future version\n const precision = getRangePrecision([range]);\n const futureVersion = getFutureVersion(\n precision,\n newVersion,\n range.version,\n );\n return range.operator + futureVersion.join('.');\n }\n // newVersion is in range, for other than \"replace\" strategies\n return range.operator + range.version;\n }\n // istanbul ignore next\n return null;\n}\n\nfunction updateRangeValue(\n { currentValue, newVersion }: NewValueConfig,\n range: Range,\n): string | null {\n // used to exclude versions,\n // we assume that's for a good reason\n if (range.operator === '!=') {\n return range.operator + range.version;\n }\n\n // keep the .* suffix\n if (range.prefix) {\n const futureVersion = getFutureVersion(\n UserPolicyPrecisionMap.None,\n newVersion,\n range.version,\n ).join('.');\n return `${range.operator}${futureVersion}.*`;\n }\n if (range.operator === '~=') {\n const baseVersion = coerceArray(parseVersion(range.version)?.release);\n const futureVersion = coerceArray(parseVersion(newVersion)?.release);\n const baseLen = baseVersion.length;\n const newVerLen = futureVersion.length;\n // trim redundant trailing version specifiers\n if (baseLen < newVerLen) {\n return (\n range.operator + futureVersion.slice(0, baseVersion.length).join('.')\n );\n }\n // pad with specifiers\n if (baseLen > newVerLen) {\n for (let i = baseLen - newVerLen - 1; i >= 0; i--) {\n futureVersion.push(0);\n }\n return range.operator + futureVersion.join('.');\n }\n return range.operator + newVersion;\n }\n if (['==', '<='].includes(range.operator)) {\n if (lte(newVersion, range.version)) {\n return range.operator + range.version;\n }\n return range.operator + newVersion;\n }\n\n let output = handleUpperBound(range, newVersion);\n if (output) {\n // manged to update upperbound\n // no need to try anything else\n return output;\n }\n output = handleLowerBound(range, newVersion);\n if (output) {\n return output;\n }\n\n // unless PEP440 changes, this won't happen\n // istanbul ignore next\n logger.error(\n { newVersion, currentValue, range },\n 'pep440: failed to process range',\n );\n // istanbul ignore next\n return null;\n}\n\n/**\n * Checks for zero specifiers.\n * returns true if one of the bounds' length is < 3.\n * @param ranges A {@link Range} array.\n * @returns A boolean value\n * Used mainly for cosmetics for the rez versioning syntax.\n */\nfunction hasZeroSpecifier(ranges: Range[]): boolean {\n return ranges.some((range) => {\n const release = parseVersion(range.version)?.release;\n return release && release.length < 3;\n });\n}\n\nfunction trimTrailingZeros(numbers: number[]): number[] {\n let i = numbers.length - 1;\n while (numbers[i] === 0) {\n i--;\n }\n return numbers.slice(0, i + 1);\n}\n\nfunction divideCompatibleReleaseRange(currentRange: Range): Range[] {\n const currentVersionUpperBound = currentRange.version\n .split('.')\n .map((num) => parseInt(num, 10));\n if (currentVersionUpperBound.length > 1) {\n currentVersionUpperBound.splice(-1);\n }\n currentVersionUpperBound[currentVersionUpperBound.length - 1] += 1;\n return [\n { operator: '>=', version: currentRange.version },\n {\n operator: '<',\n version: currentVersionUpperBound.join('.'),\n },\n ];\n}\n\nfunction handleWidenStrategy(\n { currentValue, rangeStrategy, currentVersion, newVersion }: NewValueConfig,\n ranges: Range[],\n): (string | null)[] {\n // newVersion is within range\n if (satisfies(newVersion, currentValue)) {\n return [currentValue];\n }\n let rangePrecision = getRangePrecision(ranges);\n const trimZeros = hasZeroSpecifier(ranges);\n let newRanges: Range[] = [];\n if (ranges.length === 1 && ranges[0].operator === '~=') {\n // If range operator is '~=', divide the range into its logical equivalent.\n // Example: ~=1.0 --> >=1.0,<2\n newRanges = divideCompatibleReleaseRange(ranges[0]);\n } else {\n newRanges = ranges;\n }\n return newRanges.map((range) => {\n // newVersion is over the upper bound\n if (range.operator === '<' && gte(newVersion, range.version)) {\n const upperBound = coerceArray(parseVersion(range.version)?.release);\n const len = upperBound.length;\n // Match the precision of the smallest specifier if other than 0\n if (upperBound[len - 1] !== 0) {\n const key =\n PrecisionUserPolicyMap[\n (len - 1) as keyof typeof PrecisionUserPolicyMap\n ];\n rangePrecision =\n UserPolicyPrecisionMap[key as keyof typeof UserPolicyPrecisionMap];\n }\n let futureVersion = getFutureVersion(\n rangePrecision,\n newVersion,\n range.version,\n );\n if (trimZeros) {\n futureVersion = trimTrailingZeros(futureVersion);\n }\n return range.operator + futureVersion.join('.');\n }\n // default\n return updateRangeValue(\n {\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n },\n range,\n );\n });\n}\n\nfunction handleReplaceStrategy(\n { currentValue, rangeStrategy, currentVersion, newVersion }: NewValueConfig,\n ranges: Range[],\n): (string | null)[] {\n // newVersion is within range\n if (satisfies(newVersion, currentValue)) {\n return [currentValue];\n }\n const trimZeros = hasZeroSpecifier(ranges);\n return ranges.map((range) => {\n // newVersion is over the upper bound\n if (range.operator === '<' && gte(newVersion, range.version)) {\n const rangePrecision = getRangePrecision(ranges);\n let futureVersion = getFutureVersion(\n rangePrecision,\n newVersion,\n range.version,\n );\n if (trimZeros) {\n futureVersion = trimTrailingZeros(futureVersion);\n }\n return range.operator + futureVersion.join('.');\n }\n // handle lower bound\n if (['>', '>='].includes(range.operator)) {\n if (lte(newVersion, range.version)) {\n // this looks like a rollback\n return `>=${newVersion}`;\n }\n // update the lower bound to reflect the accepted new version\n const lowerBound = coerceArray(parseVersion(range.version)?.release);\n const rangePrecision = lowerBound.length - 1;\n let newBase = getFutureVersion(rangePrecision, newVersion);\n if (trimZeros) {\n newBase = trimTrailingZeros(newBase);\n }\n // trim last element of the newBase when new accepted version is out of range.\n // example: let new bound be >8.2.5 & newVersion be 8.2.5\n // return value will be: >8.2\n if (\n range.operator === '>' &&\n newVersion === newBase.join('.') &&\n newBase.length > 1\n ) {\n newBase.pop();\n }\n return range.operator + newBase.join('.');\n }\n // default\n return updateRangeValue(\n {\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n },\n range,\n );\n });\n}\n\nfunction handleBumpStrategy(\n { currentValue, rangeStrategy, currentVersion, newVersion }: NewValueConfig,\n ranges: Range[],\n): (string | null)[] {\n return ranges.map((range) => {\n // bump lower bound to current new version\n if (range.operator === '>=') {\n return range.operator + newVersion;\n }\n return updateRangeValue(\n {\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n },\n range,\n );\n });\n}\n\nexport function checkRangeAndRemoveUnnecessaryRangeLimit(\n rangeInput: string,\n newVersion: string,\n): string {\n let newRange: string = rangeInput;\n if (rangeInput.includes(',')) {\n const newRes = rangeInput.split(',');\n if (\n newRes[0].includes('.*') &&\n newRes[0].includes('==') &&\n newRes[1].includes('>=') &&\n satisfies(newVersion, newRes[0])\n ) {\n newRange = newRes[0];\n }\n } else {\n return rangeInput;\n }\n\n return newRange;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"range.js","names":["parseVersion","parseRange"],"sources":["../../../../lib/modules/versioning/pep440/range.ts"],"sourcesContent":["import { gte, lt, lte, satisfies } from '@renovatebot/pep440';\nimport { parse as parseRange } from '@renovatebot/pep440/lib/specifier.js';\nimport { parse as parseVersion } from '@renovatebot/pep440/lib/version.js';\nimport { isTruthy } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type { NewValueConfig } from '../types.ts';\n\nconst UserPolicyPrecisionMap = {\n Major: 0,\n Minor: 1,\n Micro: 2,\n Bug: 3,\n None: Infinity,\n} as const;\nconst PrecisionUserPolicyMap = {\n 0: 'Major',\n 1: 'Minor',\n 2: 'Micro',\n 3: 'Bug',\n} as const;\n\ntype UserPolicy =\n (typeof UserPolicyPrecisionMap)[keyof typeof UserPolicyPrecisionMap];\n\n/**\n * Calculate current update range precision.\n * @param ranges A {@link Range} consists of current range\n * @returns A {@link UserPolicy}\n */\nfunction getRangePrecision(ranges: Range[]): UserPolicy {\n const bound = coerceArray(\n parseVersion((ranges[1] || ranges[0]).version)?.release,\n );\n let rangePrecision = -1;\n // range is defined by a single bound.\n // ie. <1.2.2.3,\n // >=7\n if (ranges.length === 1) {\n rangePrecision = bound.length - 1;\n }\n // Range is defined by both upper and lower bounds.\n if (ranges.length === 2) {\n const lowerBound = coerceArray(parseVersion(ranges[0].version)?.release);\n rangePrecision = bound.findIndex((el, index) => el > lowerBound[index]);\n }\n // Tune down Major precision if followed by a zero\n if (\n rangePrecision === UserPolicyPrecisionMap.Major &&\n rangePrecision + 1 < bound.length &&\n bound[rangePrecision + 1] === 0\n ) {\n rangePrecision++;\n }\n // Could not calculate user precision\n // Default to the smallest possible\n // istanbul ignore next\n if (rangePrecision === -1) {\n rangePrecision = bound.length - 1;\n }\n const key =\n PrecisionUserPolicyMap[\n rangePrecision as keyof typeof PrecisionUserPolicyMap\n ];\n return UserPolicyPrecisionMap[key as keyof typeof UserPolicyPrecisionMap];\n}\n\n/**\n * @param policy Required range precision\n * @param newVersion The newly accepted version\n * @param baseVersion Optional Current upper bound\n * @returns A string represents a future version upper bound.\n */\nfunction getFutureVersion(\n policy: UserPolicy,\n newVersion: string,\n baseVersion?: string,\n): number[] {\n const toRelease = coerceArray(parseVersion(newVersion)?.release);\n const baseRelease = coerceArray(\n parseVersion(baseVersion ?? newVersion)?.release,\n );\n return baseRelease.map((_, index) => {\n const toPart = toRelease[index] ?? 0;\n if (index < policy) {\n return toPart;\n }\n if (index === policy) {\n return toPart + (baseVersion === undefined ? 0 : 1);\n }\n return 0;\n });\n}\n\ninterface Range {\n operator: string;\n prefix?: string;\n version: string;\n}\n\nexport function getPinnedValue(newVersion: string): string {\n return `==${newVersion}`;\n}\n\nexport function getNewValue({\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n isReplacement,\n}: NewValueConfig): string | null {\n let ranges: Range[];\n let updatedRange: (string | null)[];\n\n // no symbol: accept only that specific version specified\n if (currentValue === currentVersion || isReplacement) {\n return newVersion;\n }\n\n // Handle bare versions (e.g., \"v0.7.15\") that don't strictly equal\n // currentVersion due to normalization, treating them as pinned while\n // preserving the v-prefix.\n if (parseVersion(currentValue)) {\n const vPrefix = regEx(/^(?<prefix>[vV])/).exec(currentValue);\n if (vPrefix) {\n return `${vPrefix.groups!.prefix}${newVersion}`;\n }\n return newVersion;\n }\n\n try {\n ranges = parseCurrentRange(currentValue);\n if (!ranges.length) {\n // an empty string is an allowed value for PEP440 range\n // it means get any version\n logger.warn({ currentValue }, 'Empty currentValue');\n return currentValue;\n }\n } catch (err) {\n logger.warn({ currentValue, err }, 'Unexpected range error');\n return null;\n }\n\n // return early if newVersion is excluded from range\n if (\n ranges.some(\n (range) => range.operator === '!=' && range.version === newVersion,\n )\n ) {\n logger.debug(\n `Cannot calculate new value as the newVersion:\\`${newVersion}\\` is excluded from range: \\`${currentValue}\\``,\n );\n return null;\n }\n\n switch (rangeStrategy) {\n case 'auto':\n case 'replace':\n updatedRange = handleReplaceStrategy(\n {\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n },\n ranges,\n );\n break;\n case 'widen':\n updatedRange = handleWidenStrategy(\n {\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n },\n ranges,\n );\n break;\n case 'bump':\n updatedRange = handleBumpStrategy(\n {\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n },\n ranges,\n );\n break;\n default:\n // Unsupported rangeStrategy\n // Valid rangeStrategy values are: bump, extend, pin, replace.\n // https://docs.renovatebot.com/modules/versioning/#pep440-versioning\n logger.debug(\n `Unsupported rangeStrategy: ${rangeStrategy}. Using \"replace\" instead.`,\n );\n return getNewValue({\n currentValue,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n }\n\n let result = updatedRange.filter(isTruthy).join(', ');\n\n if (result.includes(', ') && !currentValue.includes(', ')) {\n result = result.replace(regEx(/, /g), ',');\n }\n const checkedResult = checkRangeAndRemoveUnnecessaryRangeLimit(\n result,\n newVersion,\n );\n\n // istanbul ignore if\n if (!satisfies(newVersion, checkedResult)) {\n // we failed at creating the range\n logger.warn(\n { result, newVersion, currentValue },\n 'pep440: failed to calculate newValue',\n );\n return null;\n }\n return checkedResult;\n}\n\nexport function isLessThanRange(input: string, range: string): boolean {\n try {\n let invertResult = true;\n\n const results = range\n .split(',')\n .map((x) =>\n x\n .replace(regEx(/\\s*/g), '')\n .split(regEx(/(~=|==|!=|<=|>=|<|>|===)/))\n .slice(1),\n )\n .map(([op, version]) => {\n if (['!=', '<=', '<'].includes(op)) {\n return true;\n }\n invertResult = false;\n if (['~=', '==', '>=', '==='].includes(op)) {\n return lt(input, version);\n }\n if (op === '>') {\n return lte(input, version);\n }\n // istanbul ignore next\n return false;\n });\n\n const result = results.every((res) => res === true);\n\n return invertResult ? !result : result;\n } catch /* istanbul ignore next */ {\n return false;\n }\n}\n\nfunction parseCurrentRange(currentValue: string): Range[] {\n const ranges: Range[] = parseRange(currentValue);\n if (!ranges) {\n throw new TypeError('Invalid pep440 currentValue');\n }\n if (ranges.some((range) => range.operator === '===')) {\n // the operator \"===\" is used for legacy non PEP440 versions\n throw new TypeError('PEP440 arbitrary equality (===) not supported');\n }\n return ranges;\n}\n\nfunction handleLowerBound(range: Range, newVersion: string): string | null {\n // used to mark minimum supported version\n // lower the bound if the new version is lower than current range\n if (['>', '>='].includes(range.operator)) {\n if (lte(newVersion, range.version)) {\n // this looks like a rollback\n return `>=${newVersion}`;\n }\n // otherwise, treat it same as exclude\n return range.operator + range.version;\n }\n // istanbul ignore next\n return null;\n}\n\nfunction handleUpperBound(range: Range, newVersion: string): string | null {\n // this is used to exclude future versions\n if (range.operator === '<') {\n // if newVersion is that future version\n if (gte(newVersion, range.version)) {\n // now here things get tricky\n // we calculate the new future version\n const precision = getRangePrecision([range]);\n const futureVersion = getFutureVersion(\n precision,\n newVersion,\n range.version,\n );\n return range.operator + futureVersion.join('.');\n }\n // newVersion is in range, for other than \"replace\" strategies\n return range.operator + range.version;\n }\n // istanbul ignore next\n return null;\n}\n\nfunction updateRangeValue(\n { currentValue, newVersion }: NewValueConfig,\n range: Range,\n): string | null {\n // used to exclude versions,\n // we assume that's for a good reason\n if (range.operator === '!=') {\n return range.operator + range.version;\n }\n\n // keep the .* suffix\n if (range.prefix) {\n const futureVersion = getFutureVersion(\n UserPolicyPrecisionMap.None,\n newVersion,\n range.version,\n ).join('.');\n return `${range.operator}${futureVersion}.*`;\n }\n if (range.operator === '~=') {\n const baseVersion = coerceArray(parseVersion(range.version)?.release);\n const futureVersion = coerceArray(parseVersion(newVersion)?.release);\n const baseLen = baseVersion.length;\n const newVerLen = futureVersion.length;\n // trim redundant trailing version specifiers\n if (baseLen < newVerLen) {\n return (\n range.operator + futureVersion.slice(0, baseVersion.length).join('.')\n );\n }\n // pad with specifiers\n if (baseLen > newVerLen) {\n for (let i = baseLen - newVerLen - 1; i >= 0; i--) {\n futureVersion.push(0);\n }\n return range.operator + futureVersion.join('.');\n }\n return range.operator + newVersion;\n }\n if (['==', '<='].includes(range.operator)) {\n if (lte(newVersion, range.version)) {\n return range.operator + range.version;\n }\n return range.operator + newVersion;\n }\n\n let output = handleUpperBound(range, newVersion);\n if (output) {\n // manged to update upperbound\n // no need to try anything else\n return output;\n }\n output = handleLowerBound(range, newVersion);\n if (output) {\n return output;\n }\n\n // unless PEP440 changes, this won't happen\n // istanbul ignore next\n logger.error(\n { newVersion, currentValue, range },\n 'pep440: failed to process range',\n );\n // istanbul ignore next\n return null;\n}\n\n/**\n * Checks for zero specifiers.\n * returns true if one of the bounds' length is < 3.\n * @param ranges A {@link Range} array.\n * @returns A boolean value\n * Used mainly for cosmetics for the rez versioning syntax.\n */\nfunction hasZeroSpecifier(ranges: Range[]): boolean {\n return ranges.some((range) => {\n const release = parseVersion(range.version)?.release;\n return release && release.length < 3;\n });\n}\n\nfunction trimTrailingZeros(numbers: number[]): number[] {\n let i = numbers.length - 1;\n while (numbers[i] === 0) {\n i--;\n }\n return numbers.slice(0, i + 1);\n}\n\nfunction divideCompatibleReleaseRange(currentRange: Range): Range[] {\n const currentVersionUpperBound = currentRange.version\n .split('.')\n .map((num) => parseInt(num, 10));\n if (currentVersionUpperBound.length > 1) {\n currentVersionUpperBound.splice(-1);\n }\n currentVersionUpperBound[currentVersionUpperBound.length - 1] += 1;\n return [\n { operator: '>=', version: currentRange.version },\n {\n operator: '<',\n version: currentVersionUpperBound.join('.'),\n },\n ];\n}\n\nfunction handleWidenStrategy(\n { currentValue, rangeStrategy, currentVersion, newVersion }: NewValueConfig,\n ranges: Range[],\n): (string | null)[] {\n // newVersion is within range\n if (satisfies(newVersion, currentValue)) {\n return [currentValue];\n }\n let rangePrecision = getRangePrecision(ranges);\n const trimZeros = hasZeroSpecifier(ranges);\n let newRanges: Range[] = [];\n if (ranges.length === 1 && ranges[0].operator === '~=') {\n // If range operator is '~=', divide the range into its logical equivalent.\n // Example: ~=1.0 --> >=1.0,<2\n newRanges = divideCompatibleReleaseRange(ranges[0]);\n } else {\n newRanges = ranges;\n }\n return newRanges.map((range) => {\n // newVersion is over the upper bound\n if (range.operator === '<' && gte(newVersion, range.version)) {\n const upperBound = coerceArray(parseVersion(range.version)?.release);\n const len = upperBound.length;\n // Match the precision of the smallest specifier if other than 0\n if (upperBound[len - 1] !== 0) {\n const key =\n PrecisionUserPolicyMap[\n (len - 1) as keyof typeof PrecisionUserPolicyMap\n ];\n rangePrecision =\n UserPolicyPrecisionMap[key as keyof typeof UserPolicyPrecisionMap];\n }\n let futureVersion = getFutureVersion(\n rangePrecision,\n newVersion,\n range.version,\n );\n if (trimZeros) {\n futureVersion = trimTrailingZeros(futureVersion);\n }\n return range.operator + futureVersion.join('.');\n }\n // default\n return updateRangeValue(\n {\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n },\n range,\n );\n });\n}\n\nfunction handleReplaceStrategy(\n { currentValue, rangeStrategy, currentVersion, newVersion }: NewValueConfig,\n ranges: Range[],\n): (string | null)[] {\n // newVersion is within range\n if (satisfies(newVersion, currentValue)) {\n return [currentValue];\n }\n const trimZeros = hasZeroSpecifier(ranges);\n return ranges.map((range) => {\n // newVersion is over the upper bound\n if (range.operator === '<' && gte(newVersion, range.version)) {\n const rangePrecision = getRangePrecision(ranges);\n let futureVersion = getFutureVersion(\n rangePrecision,\n newVersion,\n range.version,\n );\n if (trimZeros) {\n futureVersion = trimTrailingZeros(futureVersion);\n }\n return range.operator + futureVersion.join('.');\n }\n // handle lower bound\n if (['>', '>='].includes(range.operator)) {\n if (lte(newVersion, range.version)) {\n // this looks like a rollback\n return `>=${newVersion}`;\n }\n // update the lower bound to reflect the accepted new version\n const lowerBound = coerceArray(parseVersion(range.version)?.release);\n const rangePrecision = lowerBound.length - 1;\n let newBase = getFutureVersion(rangePrecision, newVersion);\n if (trimZeros) {\n newBase = trimTrailingZeros(newBase);\n }\n // trim last element of the newBase when new accepted version is out of range.\n // example: let new bound be >8.2.5 & newVersion be 8.2.5\n // return value will be: >8.2\n if (\n range.operator === '>' &&\n newVersion === newBase.join('.') &&\n newBase.length > 1\n ) {\n newBase.pop();\n }\n return range.operator + newBase.join('.');\n }\n // default\n return updateRangeValue(\n {\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n },\n range,\n );\n });\n}\n\nfunction handleBumpStrategy(\n { currentValue, rangeStrategy, currentVersion, newVersion }: NewValueConfig,\n ranges: Range[],\n): (string | null)[] {\n return ranges.map((range) => {\n // bump lower bound to current new version\n if (range.operator === '>=') {\n return range.operator + newVersion;\n }\n return updateRangeValue(\n {\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n },\n range,\n );\n });\n}\n\nexport function checkRangeAndRemoveUnnecessaryRangeLimit(\n rangeInput: string,\n newVersion: string,\n): string {\n let newRange: string = rangeInput;\n if (rangeInput.includes(',')) {\n const newRes = rangeInput.split(',');\n if (\n newRes[0].includes('.*') &&\n newRes[0].includes('==') &&\n newRes[1].includes('>=') &&\n satisfies(newVersion, newRes[0])\n ) {\n newRange = newRes[0];\n }\n } else {\n return rangeInput;\n }\n\n return newRange;\n}\n"],"mappings":"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"}
@@ -2,6 +2,7 @@ import { regEx } from "../../../util/regex.js";
2
2
  import { logger } from "../../../logger/index.js";
3
3
  import { parseRange } from "./range.js";
4
4
  import { compareIntArray, extractAllParts, getParts, plusOne } from "./util.js";
5
+ import { isString } from "@sindresorhus/is";
5
6
  const digitsAndDots = regEx(/^[\d.]+$/);
6
7
  function isGreaterThan(version, other) {
7
8
  const versionIntMajor = extractAllParts(version);
@@ -106,7 +107,7 @@ function subset(subRange, superRange) {
106
107
  return true;
107
108
  }
108
109
  function isVersion(maybeRange) {
109
- return typeof maybeRange === "string" && parseRange(maybeRange) === null;
110
+ return isString(maybeRange) && parseRange(maybeRange) === null;
110
111
  }
111
112
  function isValid(ver) {
112
113
  return extractAllParts(ver) !== null || parseRange(ver) !== null;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/pvp/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport type { RangeStrategy } from '../../../types/versioning.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\nimport { parseRange } from './range.ts';\nimport { compareIntArray, extractAllParts, getParts, plusOne } from './util.ts';\n\nexport const id = 'pvp';\nexport const displayName = 'Package Versioning Policy (Haskell)';\nexport const urls = [\n '[Haskell Package Versioning Policy](https://pvp.haskell.org)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = ['widen'];\n\nconst digitsAndDots = regEx(/^[\\d.]+$/);\n\nfunction isGreaterThan(version: string, other: string): boolean {\n const versionIntMajor = extractAllParts(version);\n const otherIntMajor = extractAllParts(other);\n if (versionIntMajor === null || otherIntMajor === null) {\n return false;\n }\n return compareIntArray(versionIntMajor, otherIntMajor) === 'gt';\n}\n\nfunction getMajor(version: string): number | null {\n // This basically can't be implemented correctly, since\n // 1.1 and 1.10 become equal when converted to float.\n // Consumers should use isSame instead.\n const parts = getParts(version);\n if (parts === null) {\n return null;\n }\n return Number(parts.major.join('.'));\n}\n\nfunction getMinor(version: string): number | null {\n const parts = getParts(version);\n if (parts === null || parts.minor.length === 0) {\n return null;\n }\n return Number(parts.minor.join('.'));\n}\n\nfunction getPatch(version: string): number | null {\n const parts = getParts(version);\n if (parts === null || parts.patch.length === 0) {\n return null;\n }\n return Number(`${parts.patch[0]}.${parts.patch.slice(1).join('')}`);\n}\n\nfunction matches(version: string, range: string): boolean {\n const parsed = parseRange(range);\n if (parsed === null) {\n return false;\n }\n const ver = extractAllParts(version);\n const lower = extractAllParts(parsed.lower);\n const upper = extractAllParts(parsed.upper);\n if (ver === null || lower === null || upper === null) {\n return false;\n }\n return (\n 'gt' === compareIntArray(upper, ver) &&\n ['eq', 'lt'].includes(compareIntArray(lower, ver))\n );\n}\n\nfunction satisfyingVersion(\n versions: string[],\n range: string,\n reverse: boolean,\n): string | null {\n const copy = versions.slice(0);\n copy.sort((a, b) => {\n const multiplier = reverse ? 1 : -1;\n return sortVersions(a, b) * multiplier;\n });\n const result = copy.find((v) => matches(v, range));\n return result ?? null;\n}\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return satisfyingVersion(versions, range, false);\n}\n\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return satisfyingVersion(versions, range, true);\n}\n\nfunction isLessThanRange(version: string, range: string): boolean {\n const parsed = parseRange(range);\n if (parsed === null) {\n return false;\n }\n const compos = extractAllParts(version);\n const lower = extractAllParts(parsed.lower);\n if (compos === null || lower === null) {\n return false;\n }\n return 'lt' === compareIntArray(compos, lower);\n}\n\nfunction getNewValue({\n currentValue,\n newVersion,\n rangeStrategy,\n}: NewValueConfig): string | null {\n if (rangeStrategy !== 'widen') {\n logger.info(\n { rangeStrategy, currentValue, newVersion },\n `PVP can't handle this range strategy.`,\n );\n return null;\n }\n const parsed = parseRange(currentValue);\n if (parsed === null) {\n logger.info(\n { currentValue, newVersion },\n 'could not parse PVP version range',\n );\n return null;\n }\n if (isLessThanRange(newVersion, currentValue)) {\n // ignore new releases in old release series\n return null;\n }\n if (matches(newVersion, currentValue)) {\n // the upper bound is already high enough\n return null;\n }\n const compos = getParts(newVersion);\n if (compos === null) {\n return null;\n }\n const majorPlusOne = plusOne(compos.major);\n // istanbul ignore next: since all versions that can be parsed, can also be bumped, this can never happen\n if (!matches(newVersion, `>=${parsed.lower} && <${majorPlusOne}`)) {\n logger.warn(\n { newVersion },\n \"Even though the major bound was bumped, the newVersion still isn't accepted.\",\n );\n return null;\n }\n return `>=${parsed.lower} && <${majorPlusOne}`;\n}\n\nfunction isSame(\n type: 'major' | 'minor' | 'patch',\n a: string,\n b: string,\n): boolean {\n const aParts = getParts(a);\n const bParts = getParts(b);\n if (aParts === null || bParts === null) {\n return false;\n }\n if (type === 'major') {\n return 'eq' === compareIntArray(aParts.major, bParts.major);\n }\n if (type === 'minor') {\n return 'eq' === compareIntArray(aParts.minor, bParts.minor);\n }\n return 'eq' === compareIntArray(aParts.patch, bParts.patch);\n}\n\nfunction subset(subRange: string, superRange: string): boolean | undefined {\n const sub = parseRange(subRange);\n const sup = parseRange(superRange);\n if (sub === null || sup === null) {\n return undefined;\n }\n const subLower = extractAllParts(sub.lower);\n const subUpper = extractAllParts(sub.upper);\n const supLower = extractAllParts(sup.lower);\n const supUpper = extractAllParts(sup.upper);\n if (\n subLower === null ||\n subUpper === null ||\n supLower === null ||\n supUpper === null\n ) {\n return undefined;\n }\n if ('lt' === compareIntArray(subLower, supLower)) {\n return false;\n }\n if ('gt' === compareIntArray(subUpper, supUpper)) {\n return false;\n }\n return true;\n}\n\nfunction isVersion(maybeRange: string | undefined | null): boolean {\n return typeof maybeRange === 'string' && parseRange(maybeRange) === null;\n}\n\nfunction isValid(ver: string): boolean {\n return extractAllParts(ver) !== null || parseRange(ver) !== null;\n}\n\nfunction isSingleVersion(range: string): boolean {\n const noSpaces = range.trim();\n return noSpaces.startsWith('==') && digitsAndDots.test(noSpaces.slice(2));\n}\n\nfunction equals(a: string, b: string): boolean {\n const aParts = extractAllParts(a);\n const bParts = extractAllParts(b);\n if (aParts === null || bParts === null) {\n return false;\n }\n return 'eq' === compareIntArray(aParts, bParts);\n}\n\nfunction sortVersions(a: string, b: string): number {\n if (equals(a, b)) {\n return 0;\n }\n return isGreaterThan(a, b) ? 1 : -1;\n}\n\nfunction isStable(_version: string): boolean {\n return true;\n}\n\nfunction isCompatible(_version: string): boolean {\n return true;\n}\n\nexport const api: VersioningApi = {\n isValid,\n isVersion,\n isStable,\n isCompatible,\n getMajor,\n getMinor,\n getPatch,\n isSingleVersion,\n sortVersions,\n equals,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n isLessThanRange,\n isGreaterThan,\n getNewValue,\n isSame,\n subset,\n};\nexport default api;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/pvp/index.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport type { RangeStrategy } from '../../../types/versioning.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\nimport { parseRange } from './range.ts';\nimport { compareIntArray, extractAllParts, getParts, plusOne } from './util.ts';\n\nexport const id = 'pvp';\nexport const displayName = 'Package Versioning Policy (Haskell)';\nexport const urls = [\n '[Haskell Package Versioning Policy](https://pvp.haskell.org)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = ['widen'];\n\nconst digitsAndDots = regEx(/^[\\d.]+$/);\n\nfunction isGreaterThan(version: string, other: string): boolean {\n const versionIntMajor = extractAllParts(version);\n const otherIntMajor = extractAllParts(other);\n if (versionIntMajor === null || otherIntMajor === null) {\n return false;\n }\n return compareIntArray(versionIntMajor, otherIntMajor) === 'gt';\n}\n\nfunction getMajor(version: string): number | null {\n // This basically can't be implemented correctly, since\n // 1.1 and 1.10 become equal when converted to float.\n // Consumers should use isSame instead.\n const parts = getParts(version);\n if (parts === null) {\n return null;\n }\n return Number(parts.major.join('.'));\n}\n\nfunction getMinor(version: string): number | null {\n const parts = getParts(version);\n if (parts === null || parts.minor.length === 0) {\n return null;\n }\n return Number(parts.minor.join('.'));\n}\n\nfunction getPatch(version: string): number | null {\n const parts = getParts(version);\n if (parts === null || parts.patch.length === 0) {\n return null;\n }\n return Number(`${parts.patch[0]}.${parts.patch.slice(1).join('')}`);\n}\n\nfunction matches(version: string, range: string): boolean {\n const parsed = parseRange(range);\n if (parsed === null) {\n return false;\n }\n const ver = extractAllParts(version);\n const lower = extractAllParts(parsed.lower);\n const upper = extractAllParts(parsed.upper);\n if (ver === null || lower === null || upper === null) {\n return false;\n }\n return (\n 'gt' === compareIntArray(upper, ver) &&\n ['eq', 'lt'].includes(compareIntArray(lower, ver))\n );\n}\n\nfunction satisfyingVersion(\n versions: string[],\n range: string,\n reverse: boolean,\n): string | null {\n const copy = versions.slice(0);\n copy.sort((a, b) => {\n const multiplier = reverse ? 1 : -1;\n return sortVersions(a, b) * multiplier;\n });\n const result = copy.find((v) => matches(v, range));\n return result ?? null;\n}\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return satisfyingVersion(versions, range, false);\n}\n\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return satisfyingVersion(versions, range, true);\n}\n\nfunction isLessThanRange(version: string, range: string): boolean {\n const parsed = parseRange(range);\n if (parsed === null) {\n return false;\n }\n const compos = extractAllParts(version);\n const lower = extractAllParts(parsed.lower);\n if (compos === null || lower === null) {\n return false;\n }\n return 'lt' === compareIntArray(compos, lower);\n}\n\nfunction getNewValue({\n currentValue,\n newVersion,\n rangeStrategy,\n}: NewValueConfig): string | null {\n if (rangeStrategy !== 'widen') {\n logger.info(\n { rangeStrategy, currentValue, newVersion },\n `PVP can't handle this range strategy.`,\n );\n return null;\n }\n const parsed = parseRange(currentValue);\n if (parsed === null) {\n logger.info(\n { currentValue, newVersion },\n 'could not parse PVP version range',\n );\n return null;\n }\n if (isLessThanRange(newVersion, currentValue)) {\n // ignore new releases in old release series\n return null;\n }\n if (matches(newVersion, currentValue)) {\n // the upper bound is already high enough\n return null;\n }\n const compos = getParts(newVersion);\n if (compos === null) {\n return null;\n }\n const majorPlusOne = plusOne(compos.major);\n // istanbul ignore next: since all versions that can be parsed, can also be bumped, this can never happen\n if (!matches(newVersion, `>=${parsed.lower} && <${majorPlusOne}`)) {\n logger.warn(\n { newVersion },\n \"Even though the major bound was bumped, the newVersion still isn't accepted.\",\n );\n return null;\n }\n return `>=${parsed.lower} && <${majorPlusOne}`;\n}\n\nfunction isSame(\n type: 'major' | 'minor' | 'patch',\n a: string,\n b: string,\n): boolean {\n const aParts = getParts(a);\n const bParts = getParts(b);\n if (aParts === null || bParts === null) {\n return false;\n }\n if (type === 'major') {\n return 'eq' === compareIntArray(aParts.major, bParts.major);\n }\n if (type === 'minor') {\n return 'eq' === compareIntArray(aParts.minor, bParts.minor);\n }\n return 'eq' === compareIntArray(aParts.patch, bParts.patch);\n}\n\nfunction subset(subRange: string, superRange: string): boolean | undefined {\n const sub = parseRange(subRange);\n const sup = parseRange(superRange);\n if (sub === null || sup === null) {\n return undefined;\n }\n const subLower = extractAllParts(sub.lower);\n const subUpper = extractAllParts(sub.upper);\n const supLower = extractAllParts(sup.lower);\n const supUpper = extractAllParts(sup.upper);\n if (\n subLower === null ||\n subUpper === null ||\n supLower === null ||\n supUpper === null\n ) {\n return undefined;\n }\n if ('lt' === compareIntArray(subLower, supLower)) {\n return false;\n }\n if ('gt' === compareIntArray(subUpper, supUpper)) {\n return false;\n }\n return true;\n}\n\nfunction isVersion(maybeRange: string | undefined | null): boolean {\n return isString(maybeRange) && parseRange(maybeRange) === null;\n}\n\nfunction isValid(ver: string): boolean {\n return extractAllParts(ver) !== null || parseRange(ver) !== null;\n}\n\nfunction isSingleVersion(range: string): boolean {\n const noSpaces = range.trim();\n return noSpaces.startsWith('==') && digitsAndDots.test(noSpaces.slice(2));\n}\n\nfunction equals(a: string, b: string): boolean {\n const aParts = extractAllParts(a);\n const bParts = extractAllParts(b);\n if (aParts === null || bParts === null) {\n return false;\n }\n return 'eq' === compareIntArray(aParts, bParts);\n}\n\nfunction sortVersions(a: string, b: string): number {\n if (equals(a, b)) {\n return 0;\n }\n return isGreaterThan(a, b) ? 1 : -1;\n}\n\nfunction isStable(_version: string): boolean {\n return true;\n}\n\nfunction isCompatible(_version: string): boolean {\n return true;\n}\n\nexport const api: VersioningApi = {\n isValid,\n isVersion,\n isStable,\n isCompatible,\n getMajor,\n getMinor,\n getPatch,\n isSingleVersion,\n sortVersions,\n equals,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n isLessThanRange,\n isGreaterThan,\n getNewValue,\n isSame,\n subset,\n};\nexport default api;\n"],"mappings":"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"}
@@ -7,11 +7,12 @@ import replace_default from "./strategies/replace.js";
7
7
  import bump_default from "./strategies/bump.js";
8
8
  import widen_default from "./strategies/widen.js";
9
9
  import "./strategies/index.js";
10
+ import { isString } from "@sindresorhus/is";
10
11
  import { eq, gt, maxSatisfying, minSatisfying, satisfies, valid } from "@renovatebot/ruby-semver";
11
12
  //#region lib/modules/versioning/ruby/index.ts
12
13
  const id = "ruby";
13
14
  function vtrim(version) {
14
- if (typeof version === "string") return version.replace(regEx(/^v/), "").replace(regEx(/('|")/g), "");
15
+ if (isString(version)) return version.replace(regEx(/^v/), "").replace(regEx(/('|")/g), "");
15
16
  return version;
16
17
  }
17
18
  function equals(left, right) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["parseVersion","parseRange","bump","replace","widen"],"sources":["../../../../lib/modules/versioning/ruby/index.ts"],"sourcesContent":["import {\n eq,\n gt,\n maxSatisfying,\n minSatisfying,\n satisfies,\n valid,\n} from '@renovatebot/ruby-semver';\nimport { logger } from '../../../logger/index.ts';\nimport type { RangeStrategy } from '../../../types/versioning.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\nimport { isSingleOperator, isValidOperator } from './operator.ts';\nimport { ltr, parse as parseRange } from './range.ts';\nimport { bump, replace, widen } from './strategies/index.ts';\nimport { parse as parseVersion } from './version.ts';\n\nexport const id = 'ruby';\nexport const displayName = 'Ruby';\nexport const urls = [\n '[RubyGems patterns](https://guides.rubygems.org/patterns/)',\n '[Bundler Gemfile guide](https://bundler.io/guides/gemfile.html)',\n '[Understanding Gem versions](https://www.devalot.com/articles/2012/04/gem-versions.html)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = [\n 'bump',\n 'widen',\n 'replace',\n];\n\nfunction vtrim<T = unknown>(version: T): string | T {\n if (typeof version === 'string') {\n return version.replace(regEx(/^v/), '').replace(regEx(/('|\")/g), '');\n }\n return version;\n}\n\nfunction equals(left: string, right: string): boolean {\n return eq(vtrim(left), vtrim(right));\n}\n\nfunction getMajor(version: string): number {\n return parseVersion(vtrim(version)).major;\n}\nfunction getMinor(version: string): number {\n return parseVersion(vtrim(version)).minor;\n}\nfunction getPatch(version: string): number {\n return parseVersion(vtrim(version)).patch;\n}\n\nexport function isVersion(version: string): boolean {\n return !!valid(vtrim(version));\n}\nfunction isGreaterThan(left: string, right: string): boolean {\n return gt(vtrim(left), vtrim(right));\n}\nfunction isLessThanRange(version: string, range: string): boolean {\n return !!ltr(vtrim(version), vtrim(range));\n}\n\nfunction isSingleVersion(range: string): boolean {\n const { version, operator } = parseRange(vtrim(range));\n\n return operator\n ? isVersion(version) && isSingleOperator(operator)\n : isVersion(version);\n}\n\nfunction isStable(version: string): boolean {\n const v = vtrim(version);\n return parseVersion(v).prerelease ? false : isVersion(v);\n}\n\nexport function isValid(input: string): boolean {\n return input\n .split(',')\n .map((piece) => vtrim(piece.trim()))\n .every((range) => {\n const { version, operator } = parseRange(range);\n\n return operator\n ? isVersion(version) && isValidOperator(operator)\n : isVersion(version);\n });\n}\n\nexport function matches(version: string, range: string): boolean {\n return satisfies(vtrim(version), vtrim(range));\n}\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return maxSatisfying(versions.map(vtrim), vtrim(range));\n}\n\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return minSatisfying(versions.map(vtrim), vtrim(range));\n}\n\nfunction getPinnedValue(value: string): string {\n return vtrim(value);\n}\n\nfunction getNewValue({\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n}: NewValueConfig): string | null {\n let newValue = null;\n if (isVersion(currentValue)) {\n newValue =\n currentValue.startsWith('v') && !newVersion.startsWith('v')\n ? `v${newVersion}`\n : newVersion;\n } else if (currentValue.replace(regEx(/^=\\s*/), '') === currentVersion) {\n newValue = currentValue.replace(currentVersion, newVersion);\n } else {\n switch (rangeStrategy) {\n case 'update-lockfile':\n if (satisfies(newVersion, vtrim(currentValue))) {\n newValue = vtrim(currentValue);\n } else {\n return getNewValue({\n currentValue,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n }\n break;\n case 'bump':\n newValue = bump({ range: vtrim(currentValue), to: vtrim(newVersion) });\n break;\n case 'auto':\n case 'replace':\n newValue = replace({\n range: vtrim(currentValue),\n to: vtrim(newVersion),\n });\n break;\n case 'widen':\n newValue = widen({\n range: vtrim(currentValue),\n to: vtrim(newVersion),\n });\n break;\n // istanbul ignore next\n default:\n logger.warn({ rangeStrategy }, 'Unsupported range strategy');\n }\n }\n if (newValue && regEx(/^('|\")/).exec(currentValue)) {\n const delimiter = currentValue[0];\n return newValue\n .split(',')\n .map((element) =>\n element.replace(\n regEx(`^(?<whitespace>\\\\s*)`),\n `$<whitespace>${delimiter}`,\n ),\n )\n .map(\n (element) =>\n element.replace(/(?<whitespace>\\s*)$/, `${delimiter}$<whitespace>`), // TODO #12875 adds ' at front when re2 is used\n )\n .join(',');\n }\n return newValue;\n}\n\nexport function sortVersions(left: string, right: string): number {\n return gt(vtrim(left), vtrim(right)) ? 1 : -1;\n}\n\nexport const api: VersioningApi = {\n equals,\n getMajor,\n getMinor,\n getPatch,\n isCompatible: isVersion,\n isGreaterThan,\n isLessThanRange,\n isSingleVersion,\n isStable,\n isValid,\n isVersion,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n getPinnedValue,\n getNewValue,\n sortVersions,\n};\nexport default api;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["parseVersion","parseRange","bump","replace","widen"],"sources":["../../../../lib/modules/versioning/ruby/index.ts"],"sourcesContent":["import {\n eq,\n gt,\n maxSatisfying,\n minSatisfying,\n satisfies,\n valid,\n} from '@renovatebot/ruby-semver';\nimport { isString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport type { RangeStrategy } from '../../../types/versioning.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\nimport { isSingleOperator, isValidOperator } from './operator.ts';\nimport { ltr, parse as parseRange } from './range.ts';\nimport { bump, replace, widen } from './strategies/index.ts';\nimport { parse as parseVersion } from './version.ts';\n\nexport const id = 'ruby';\nexport const displayName = 'Ruby';\nexport const urls = [\n '[RubyGems patterns](https://guides.rubygems.org/patterns/)',\n '[Bundler Gemfile guide](https://bundler.io/guides/gemfile.html)',\n '[Understanding Gem versions](https://www.devalot.com/articles/2012/04/gem-versions.html)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = [\n 'bump',\n 'widen',\n 'replace',\n];\n\nfunction vtrim<T = unknown>(version: T): string | T {\n if (isString(version)) {\n return version.replace(regEx(/^v/), '').replace(regEx(/('|\")/g), '');\n }\n return version;\n}\n\nfunction equals(left: string, right: string): boolean {\n return eq(vtrim(left), vtrim(right));\n}\n\nfunction getMajor(version: string): number {\n return parseVersion(vtrim(version)).major;\n}\nfunction getMinor(version: string): number {\n return parseVersion(vtrim(version)).minor;\n}\nfunction getPatch(version: string): number {\n return parseVersion(vtrim(version)).patch;\n}\n\nexport function isVersion(version: string): boolean {\n return !!valid(vtrim(version));\n}\nfunction isGreaterThan(left: string, right: string): boolean {\n return gt(vtrim(left), vtrim(right));\n}\nfunction isLessThanRange(version: string, range: string): boolean {\n return !!ltr(vtrim(version), vtrim(range));\n}\n\nfunction isSingleVersion(range: string): boolean {\n const { version, operator } = parseRange(vtrim(range));\n\n return operator\n ? isVersion(version) && isSingleOperator(operator)\n : isVersion(version);\n}\n\nfunction isStable(version: string): boolean {\n const v = vtrim(version);\n return parseVersion(v).prerelease ? false : isVersion(v);\n}\n\nexport function isValid(input: string): boolean {\n return input\n .split(',')\n .map((piece) => vtrim(piece.trim()))\n .every((range) => {\n const { version, operator } = parseRange(range);\n\n return operator\n ? isVersion(version) && isValidOperator(operator)\n : isVersion(version);\n });\n}\n\nexport function matches(version: string, range: string): boolean {\n return satisfies(vtrim(version), vtrim(range));\n}\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return maxSatisfying(versions.map(vtrim), vtrim(range));\n}\n\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return minSatisfying(versions.map(vtrim), vtrim(range));\n}\n\nfunction getPinnedValue(value: string): string {\n return vtrim(value);\n}\n\nfunction getNewValue({\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n}: NewValueConfig): string | null {\n let newValue = null;\n if (isVersion(currentValue)) {\n newValue =\n currentValue.startsWith('v') && !newVersion.startsWith('v')\n ? `v${newVersion}`\n : newVersion;\n } else if (currentValue.replace(regEx(/^=\\s*/), '') === currentVersion) {\n newValue = currentValue.replace(currentVersion, newVersion);\n } else {\n switch (rangeStrategy) {\n case 'update-lockfile':\n if (satisfies(newVersion, vtrim(currentValue))) {\n newValue = vtrim(currentValue);\n } else {\n return getNewValue({\n currentValue,\n rangeStrategy: 'replace',\n currentVersion,\n newVersion,\n });\n }\n break;\n case 'bump':\n newValue = bump({ range: vtrim(currentValue), to: vtrim(newVersion) });\n break;\n case 'auto':\n case 'replace':\n newValue = replace({\n range: vtrim(currentValue),\n to: vtrim(newVersion),\n });\n break;\n case 'widen':\n newValue = widen({\n range: vtrim(currentValue),\n to: vtrim(newVersion),\n });\n break;\n // istanbul ignore next\n default:\n logger.warn({ rangeStrategy }, 'Unsupported range strategy');\n }\n }\n if (newValue && regEx(/^('|\")/).exec(currentValue)) {\n const delimiter = currentValue[0];\n return newValue\n .split(',')\n .map((element) =>\n element.replace(\n regEx(`^(?<whitespace>\\\\s*)`),\n `$<whitespace>${delimiter}`,\n ),\n )\n .map(\n (element) =>\n element.replace(/(?<whitespace>\\s*)$/, `${delimiter}$<whitespace>`), // TODO #12875 adds ' at front when re2 is used\n )\n .join(',');\n }\n return newValue;\n}\n\nexport function sortVersions(left: string, right: string): number {\n return gt(vtrim(left), vtrim(right)) ? 1 : -1;\n}\n\nexport const api: VersioningApi = {\n equals,\n getMajor,\n getMinor,\n getPatch,\n isCompatible: isVersion,\n isGreaterThan,\n isLessThanRange,\n isSingleVersion,\n isStable,\n isValid,\n isVersion,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n getPinnedValue,\n getNewValue,\n sortVersions,\n};\nexport default api;\n"],"mappings":";;;;;;;;;;;;AAkBA,MAAa,KAAK;AAclB,SAAS,MAAmB,SAAwB;CAClD,IAAI,SAAS,OAAO,GAClB,OAAO,QAAQ,QAAQ,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,QAAQ,MAAM,QAAQ,GAAG,EAAE;CAErE,OAAO;AACT;AAEA,SAAS,OAAO,MAAc,OAAwB;CACpD,OAAO,GAAG,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC;AACrC;AAEA,SAAS,SAAS,SAAyB;CACzC,OAAOA,QAAa,MAAM,OAAO,CAAC,CAAC,CAAC;AACtC;AACA,SAAS,SAAS,SAAyB;CACzC,OAAOA,QAAa,MAAM,OAAO,CAAC,CAAC,CAAC;AACtC;AACA,SAAS,SAAS,SAAyB;CACzC,OAAOA,QAAa,MAAM,OAAO,CAAC,CAAC,CAAC;AACtC;AAEA,SAAgB,UAAU,SAA0B;CAClD,OAAO,CAAC,CAAC,MAAM,MAAM,OAAO,CAAC;AAC/B;AACA,SAAS,cAAc,MAAc,OAAwB;CAC3D,OAAO,GAAG,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC;AACrC;AACA,SAAS,gBAAgB,SAAiB,OAAwB;CAChE,OAAO,CAAC,CAAC,IAAI,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC;AAC3C;AAEA,SAAS,gBAAgB,OAAwB;CAC/C,MAAM,EAAE,SAAS,aAAaC,MAAW,MAAM,KAAK,CAAC;CAErD,OAAO,WACH,UAAU,OAAO,KAAK,iBAAiB,QAAQ,IAC/C,UAAU,OAAO;AACvB;AAEA,SAAS,SAAS,SAA0B;CAC1C,MAAM,IAAI,MAAM,OAAO;CACvB,OAAOD,QAAa,CAAC,CAAC,CAAC,aAAa,QAAQ,UAAU,CAAC;AACzD;AAEA,SAAgB,QAAQ,OAAwB;CAC9C,OAAO,MACJ,MAAM,GAAG,CAAC,CACV,KAAK,UAAU,MAAM,MAAM,KAAK,CAAC,CAAC,CAAC,CACnC,OAAO,UAAU;EAChB,MAAM,EAAE,SAAS,aAAaC,MAAW,KAAK;EAE9C,OAAO,WACH,UAAU,OAAO,KAAK,gBAAgB,QAAQ,IAC9C,UAAU,OAAO;CACvB,CAAC;AACL;AAEA,SAAgB,QAAQ,SAAiB,OAAwB;CAC/D,OAAO,UAAU,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC;AAC/C;AAEA,SAAS,qBACP,UACA,OACe;CACf,OAAO,cAAc,SAAS,IAAI,KAAK,GAAG,MAAM,KAAK,CAAC;AACxD;AAEA,SAAS,qBACP,UACA,OACe;CACf,OAAO,cAAc,SAAS,IAAI,KAAK,GAAG,MAAM,KAAK,CAAC;AACxD;AAEA,SAAS,eAAe,OAAuB;CAC7C,OAAO,MAAM,KAAK;AACpB;AAEA,SAAS,YAAY,EACnB,cACA,eACA,gBACA,cACgC;CAChC,IAAI,WAAW;CACf,IAAI,UAAU,YAAY,GACxB,WACE,aAAa,WAAW,GAAG,KAAK,CAAC,WAAW,WAAW,GAAG,IACtD,IAAI,eACJ;MACD,IAAI,aAAa,QAAQ,MAAM,OAAO,GAAG,EAAE,MAAM,gBACtD,WAAW,aAAa,QAAQ,gBAAgB,UAAU;MAE1D,QAAQ,eAAR;EACE,KAAK;GACH,IAAI,UAAU,YAAY,MAAM,YAAY,CAAC,GAC3C,WAAW,MAAM,YAAY;QAE7B,OAAO,YAAY;IACjB;IACA,eAAe;IACf;IACA;GACF,CAAC;GAEH;EACF,KAAK;GACH,WAAWC,aAAK;IAAE,OAAO,MAAM,YAAY;IAAG,IAAI,MAAM,UAAU;GAAE,CAAC;GACrE;EACF,KAAK;EACL,KAAK;GACH,WAAWC,gBAAQ;IACjB,OAAO,MAAM,YAAY;IACzB,IAAI,MAAM,UAAU;GACtB,CAAC;GACD;EACF,KAAK;GACH,WAAWC,cAAM;IACf,OAAO,MAAM,YAAY;IACzB,IAAI,MAAM,UAAU;GACtB,CAAC;GACD;;EAEF,SACE,OAAO,KAAK,EAAE,cAAc,GAAG,4BAA4B;CAC/D;CAEF,IAAI,YAAY,MAAM,QAAQ,CAAC,CAAC,KAAK,YAAY,GAAG;EAClD,MAAM,YAAY,aAAa;EAC/B,OAAO,SACJ,MAAM,GAAG,CAAC,CACV,KAAK,YACJ,QAAQ,QACN,MAAM,sBAAsB,GAC5B,gBAAgB,WAClB,CACF,CAAC,CACA,KACE,YACC,QAAQ,QAAQ,uBAAuB,GAAG,UAAU,cAAc,CACtE,CAAC,CACA,KAAK,GAAG;CACb;CACA,OAAO;AACT;AAEA,SAAgB,aAAa,MAAc,OAAuB;CAChE,OAAO,GAAG,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,IAAI;AAC7C;AAEA,MAAa,MAAqB;CAChC;CACA;CACA;CACA;CACA,cAAc;CACd;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
@@ -1,6 +1,7 @@
1
1
  import { logger } from "../../../../logger/index.js";
2
2
  import { encodeEntry } from "../codec.js";
3
3
  import { PackageCacheBase } from "./base.js";
4
+ import { isObject } from "@sindresorhus/is";
4
5
  import { DateTime } from "luxon";
5
6
  import upath from "upath";
6
7
  import cacache from "cacache";
@@ -74,7 +75,7 @@ var PackageCacheFile = class PackageCacheFile extends PackageCacheBase {
74
75
  }
75
76
  };
76
77
  function getMetadataExpiry(metadata) {
77
- if (!metadata || typeof metadata !== "object") return;
78
+ if (!isObject(metadata)) return;
78
79
  const { expiry } = metadata;
79
80
  return typeof expiry === "number" ? expiry : void 0;
80
81
  }
@@ -1 +1 @@
1
- {"version":3,"file":"file.js","names":[],"sources":["../../../../../lib/util/cache/package/impl/file.ts"],"sourcesContent":["import cacache from 'cacache';\nimport { DateTime } from 'luxon';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport { encodeEntry } from '../codec.ts';\nimport type { LegacyEntry } from '../legacy.ts';\nimport type { PackageCacheNamespace } from '../types.ts';\nimport { PackageCacheBase } from './base.ts';\n\ninterface FileCacheMetadata {\n expiry?: unknown;\n}\n\nexport class PackageCacheFile extends PackageCacheBase {\n static create(cacheDir: string): PackageCacheFile {\n const cacheFileName = upath.join(cacheDir, '/renovate/renovate-cache-v1');\n logger.debug(`Initializing Renovate internal cache into ${cacheFileName}`);\n return new PackageCacheFile(cacheFileName);\n }\n\n private readonly cacheFileName: string;\n\n private constructor(cacheFileName: string) {\n super();\n this.cacheFileName = cacheFileName;\n }\n\n private getKey(namespace: PackageCacheNamespace, key: string): string {\n return `${namespace}-${key}`;\n }\n\n override async destroy(): Promise<void> {\n logger.debug('Checking file package cache for expired items');\n let totalCount = 0;\n let deletedCount = 0;\n let errorCount = 0;\n const startTime = Date.now();\n for await (const item of cacache.ls.stream(this.cacheFileName)) {\n try {\n totalCount += 1;\n const cacheEntry = item as unknown as cacache.CacheObject;\n if (hasFutureExpiry(cacheEntry.metadata)) {\n continue;\n }\n\n // Entries without native expiry metadata include legacy and foreign\n // entries. The sweep evicts them so future reads converge on envelopes.\n await cacache.rm.entry(this.cacheFileName, cacheEntry.key);\n await cacache.rm.content(this.cacheFileName, cacheEntry.integrity);\n deletedCount += 1;\n } catch (err) {\n logger.trace({ err }, 'Error cleaning up cache entry');\n errorCount += 1;\n }\n }\n if (errorCount > 0) {\n logger.debug(`Error count cleaning up cache: ${errorCount}`);\n }\n const durationMs = Date.now() - startTime;\n logger.debug(\n `Deleted ${deletedCount} of ${totalCount} file cached entries in ${durationMs}ms`,\n );\n }\n\n protected override async readRaw(\n namespace: PackageCacheNamespace,\n key: string,\n ): Promise<Buffer | undefined> {\n const cacheKey = this.getKey(namespace, key);\n try {\n // TODO: Once legacy file entries are unsupported, use get.info first and\n // require valid future expiry metadata before reading content.\n const entry = await cacache.get(this.cacheFileName, cacheKey);\n if (hasExpiredMetadata(entry.metadata)) {\n // Do not call rm here: rm.entry only tombstones the index entry, which\n // would hide this item from the sweep and orphan its content file.\n return undefined;\n }\n\n return entry.data;\n } catch {\n return undefined;\n }\n }\n\n protected override async writeRaw(\n namespace: PackageCacheNamespace,\n key: string,\n data: Buffer,\n ttlSeconds: number,\n ): Promise<void> {\n await this.putEntry(\n this.getKey(namespace, key),\n data,\n Date.now() + ttlSeconds * 1000,\n );\n }\n\n protected override async rm(\n namespace: PackageCacheNamespace,\n key: string,\n ): Promise<void> {\n logger.trace({ namespace, key }, 'Removing cache entry');\n await cacache.rm.entry(this.cacheFileName, this.getKey(namespace, key));\n }\n\n // TODO: Delete together with the legacy decoder once pre-envelope entries\n // have expired.\n protected override async upgradeLegacyEntry(\n namespace: PackageCacheNamespace,\n key: string,\n entry: LegacyEntry,\n ): Promise<void> {\n const { expiry } = entry;\n if (!expiry?.isValid) {\n return;\n }\n\n try {\n await this.putEntry(\n this.getKey(namespace, key),\n await encodeEntry(entry.value, DateTime.local()),\n expiry.toMillis(),\n );\n } catch (err) {\n logger.once.debug({ err }, 'Error while upgrading legacy cache entry');\n }\n }\n\n private async putEntry(\n cacheKey: string,\n data: Buffer,\n expiry: number,\n ): Promise<void> {\n await cacache.put(this.cacheFileName, cacheKey, data, {\n metadata: { expiry },\n });\n }\n}\n\nfunction getMetadataExpiry(metadata: unknown): number | undefined {\n if (!metadata || typeof metadata !== 'object') {\n return undefined;\n }\n\n const { expiry } = metadata as FileCacheMetadata;\n return typeof expiry === 'number' ? expiry : undefined;\n}\n\n// TODO: Treat missing or invalid expiry metadata as expired in readRaw once\n// legacy file entries are unsupported.\nfunction hasExpiredMetadata(metadata: unknown): boolean {\n const expiry = getMetadataExpiry(metadata);\n return expiry !== undefined && Date.now() >= expiry;\n}\n\nfunction hasFutureExpiry(metadata: unknown): boolean {\n const expiry = getMetadataExpiry(metadata);\n return expiry !== undefined && Date.now() < expiry;\n}\n"],"mappings":";;;;;;;AAaA,IAAa,mBAAb,MAAa,yBAAyB,iBAAiB;CACrD,OAAO,OAAO,UAAoC;EAChD,MAAM,gBAAgB,MAAM,KAAK,UAAU,6BAA6B;EACxE,OAAO,MAAM,6CAA6C,eAAe;EACzE,OAAO,IAAI,iBAAiB,aAAa;CAC3C;CAEA;CAEA,YAAoB,eAAuB;EACzC,MAAM;EACN,KAAK,gBAAgB;CACvB;CAEA,OAAe,WAAkC,KAAqB;EACpE,OAAO,GAAG,UAAU,GAAG;CACzB;CAEA,MAAe,UAAyB;EACtC,OAAO,MAAM,+CAA+C;EAC5D,IAAI,aAAa;EACjB,IAAI,eAAe;EACnB,IAAI,aAAa;EACjB,MAAM,YAAY,KAAK,IAAI;EAC3B,WAAW,MAAM,QAAQ,QAAQ,GAAG,OAAO,KAAK,aAAa,GAC3D,IAAI;GACF,cAAc;GACd,MAAM,aAAa;GACnB,IAAI,gBAAgB,WAAW,QAAQ,GACrC;GAKF,MAAM,QAAQ,GAAG,MAAM,KAAK,eAAe,WAAW,GAAG;GACzD,MAAM,QAAQ,GAAG,QAAQ,KAAK,eAAe,WAAW,SAAS;GACjE,gBAAgB;EAClB,SAAS,KAAK;GACZ,OAAO,MAAM,EAAE,IAAI,GAAG,+BAA+B;GACrD,cAAc;EAChB;EAEF,IAAI,aAAa,GACf,OAAO,MAAM,kCAAkC,YAAY;EAE7D,MAAM,aAAa,KAAK,IAAI,IAAI;EAChC,OAAO,MACL,WAAW,aAAa,MAAM,WAAW,0BAA0B,WAAW,GAChF;CACF;CAEA,MAAyB,QACvB,WACA,KAC6B;EAC7B,MAAM,WAAW,KAAK,OAAO,WAAW,GAAG;EAC3C,IAAI;GAGF,MAAM,QAAQ,MAAM,QAAQ,IAAI,KAAK,eAAe,QAAQ;GAC5D,IAAI,mBAAmB,MAAM,QAAQ,GAGnC;GAGF,OAAO,MAAM;EACf,QAAQ;GACN;EACF;CACF;CAEA,MAAyB,SACvB,WACA,KACA,MACA,YACe;EACf,MAAM,KAAK,SACT,KAAK,OAAO,WAAW,GAAG,GAC1B,MACA,KAAK,IAAI,IAAI,aAAa,GAC5B;CACF;CAEA,MAAyB,GACvB,WACA,KACe;EACf,OAAO,MAAM;GAAE;GAAW;EAAI,GAAG,sBAAsB;EACvD,MAAM,QAAQ,GAAG,MAAM,KAAK,eAAe,KAAK,OAAO,WAAW,GAAG,CAAC;CACxE;CAIA,MAAyB,mBACvB,WACA,KACA,OACe;EACf,MAAM,EAAE,WAAW;EACnB,IAAI,CAAC,QAAQ,SACX;EAGF,IAAI;GACF,MAAM,KAAK,SACT,KAAK,OAAO,WAAW,GAAG,GAC1B,MAAM,YAAY,MAAM,OAAO,SAAS,MAAM,CAAC,GAC/C,OAAO,SAAS,CAClB;EACF,SAAS,KAAK;GACZ,OAAO,KAAK,MAAM,EAAE,IAAI,GAAG,0CAA0C;EACvE;CACF;CAEA,MAAc,SACZ,UACA,MACA,QACe;EACf,MAAM,QAAQ,IAAI,KAAK,eAAe,UAAU,MAAM,EACpD,UAAU,EAAE,OAAO,EACrB,CAAC;CACH;AACF;AAEA,SAAS,kBAAkB,UAAuC;CAChE,IAAI,CAAC,YAAY,OAAO,aAAa,UACnC;CAGF,MAAM,EAAE,WAAW;CACnB,OAAO,OAAO,WAAW,WAAW,SAAS,KAAA;AAC/C;AAIA,SAAS,mBAAmB,UAA4B;CACtD,MAAM,SAAS,kBAAkB,QAAQ;CACzC,OAAO,WAAW,KAAA,KAAa,KAAK,IAAI,KAAK;AAC/C;AAEA,SAAS,gBAAgB,UAA4B;CACnD,MAAM,SAAS,kBAAkB,QAAQ;CACzC,OAAO,WAAW,KAAA,KAAa,KAAK,IAAI,IAAI;AAC9C"}
1
+ {"version":3,"file":"file.js","names":[],"sources":["../../../../../lib/util/cache/package/impl/file.ts"],"sourcesContent":["import { isObject } from '@sindresorhus/is';\nimport cacache from 'cacache';\nimport { DateTime } from 'luxon';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport { encodeEntry } from '../codec.ts';\nimport type { LegacyEntry } from '../legacy.ts';\nimport type { PackageCacheNamespace } from '../types.ts';\nimport { PackageCacheBase } from './base.ts';\n\ninterface FileCacheMetadata {\n expiry?: unknown;\n}\n\nexport class PackageCacheFile extends PackageCacheBase {\n static create(cacheDir: string): PackageCacheFile {\n const cacheFileName = upath.join(cacheDir, '/renovate/renovate-cache-v1');\n logger.debug(`Initializing Renovate internal cache into ${cacheFileName}`);\n return new PackageCacheFile(cacheFileName);\n }\n\n private readonly cacheFileName: string;\n\n private constructor(cacheFileName: string) {\n super();\n this.cacheFileName = cacheFileName;\n }\n\n private getKey(namespace: PackageCacheNamespace, key: string): string {\n return `${namespace}-${key}`;\n }\n\n override async destroy(): Promise<void> {\n logger.debug('Checking file package cache for expired items');\n let totalCount = 0;\n let deletedCount = 0;\n let errorCount = 0;\n const startTime = Date.now();\n for await (const item of cacache.ls.stream(this.cacheFileName)) {\n try {\n totalCount += 1;\n const cacheEntry = item as unknown as cacache.CacheObject;\n if (hasFutureExpiry(cacheEntry.metadata)) {\n continue;\n }\n\n // Entries without native expiry metadata include legacy and foreign\n // entries. The sweep evicts them so future reads converge on envelopes.\n await cacache.rm.entry(this.cacheFileName, cacheEntry.key);\n await cacache.rm.content(this.cacheFileName, cacheEntry.integrity);\n deletedCount += 1;\n } catch (err) {\n logger.trace({ err }, 'Error cleaning up cache entry');\n errorCount += 1;\n }\n }\n if (errorCount > 0) {\n logger.debug(`Error count cleaning up cache: ${errorCount}`);\n }\n const durationMs = Date.now() - startTime;\n logger.debug(\n `Deleted ${deletedCount} of ${totalCount} file cached entries in ${durationMs}ms`,\n );\n }\n\n protected override async readRaw(\n namespace: PackageCacheNamespace,\n key: string,\n ): Promise<Buffer | undefined> {\n const cacheKey = this.getKey(namespace, key);\n try {\n // TODO: Once legacy file entries are unsupported, use get.info first and\n // require valid future expiry metadata before reading content.\n const entry = await cacache.get(this.cacheFileName, cacheKey);\n if (hasExpiredMetadata(entry.metadata)) {\n // Do not call rm here: rm.entry only tombstones the index entry, which\n // would hide this item from the sweep and orphan its content file.\n return undefined;\n }\n\n return entry.data;\n } catch {\n return undefined;\n }\n }\n\n protected override async writeRaw(\n namespace: PackageCacheNamespace,\n key: string,\n data: Buffer,\n ttlSeconds: number,\n ): Promise<void> {\n await this.putEntry(\n this.getKey(namespace, key),\n data,\n Date.now() + ttlSeconds * 1000,\n );\n }\n\n protected override async rm(\n namespace: PackageCacheNamespace,\n key: string,\n ): Promise<void> {\n logger.trace({ namespace, key }, 'Removing cache entry');\n await cacache.rm.entry(this.cacheFileName, this.getKey(namespace, key));\n }\n\n // TODO: Delete together with the legacy decoder once pre-envelope entries\n // have expired.\n protected override async upgradeLegacyEntry(\n namespace: PackageCacheNamespace,\n key: string,\n entry: LegacyEntry,\n ): Promise<void> {\n const { expiry } = entry;\n if (!expiry?.isValid) {\n return;\n }\n\n try {\n await this.putEntry(\n this.getKey(namespace, key),\n await encodeEntry(entry.value, DateTime.local()),\n expiry.toMillis(),\n );\n } catch (err) {\n logger.once.debug({ err }, 'Error while upgrading legacy cache entry');\n }\n }\n\n private async putEntry(\n cacheKey: string,\n data: Buffer,\n expiry: number,\n ): Promise<void> {\n await cacache.put(this.cacheFileName, cacheKey, data, {\n metadata: { expiry },\n });\n }\n}\n\nfunction getMetadataExpiry(metadata: unknown): number | undefined {\n if (!isObject(metadata)) {\n return undefined;\n }\n\n const { expiry } = metadata as FileCacheMetadata;\n return typeof expiry === 'number' ? expiry : undefined;\n}\n\n// TODO: Treat missing or invalid expiry metadata as expired in readRaw once\n// legacy file entries are unsupported.\nfunction hasExpiredMetadata(metadata: unknown): boolean {\n const expiry = getMetadataExpiry(metadata);\n return expiry !== undefined && Date.now() >= expiry;\n}\n\nfunction hasFutureExpiry(metadata: unknown): boolean {\n const expiry = getMetadataExpiry(metadata);\n return expiry !== undefined && Date.now() < expiry;\n}\n"],"mappings":";;;;;;;;AAcA,IAAa,mBAAb,MAAa,yBAAyB,iBAAiB;CACrD,OAAO,OAAO,UAAoC;EAChD,MAAM,gBAAgB,MAAM,KAAK,UAAU,6BAA6B;EACxE,OAAO,MAAM,6CAA6C,eAAe;EACzE,OAAO,IAAI,iBAAiB,aAAa;CAC3C;CAEA;CAEA,YAAoB,eAAuB;EACzC,MAAM;EACN,KAAK,gBAAgB;CACvB;CAEA,OAAe,WAAkC,KAAqB;EACpE,OAAO,GAAG,UAAU,GAAG;CACzB;CAEA,MAAe,UAAyB;EACtC,OAAO,MAAM,+CAA+C;EAC5D,IAAI,aAAa;EACjB,IAAI,eAAe;EACnB,IAAI,aAAa;EACjB,MAAM,YAAY,KAAK,IAAI;EAC3B,WAAW,MAAM,QAAQ,QAAQ,GAAG,OAAO,KAAK,aAAa,GAC3D,IAAI;GACF,cAAc;GACd,MAAM,aAAa;GACnB,IAAI,gBAAgB,WAAW,QAAQ,GACrC;GAKF,MAAM,QAAQ,GAAG,MAAM,KAAK,eAAe,WAAW,GAAG;GACzD,MAAM,QAAQ,GAAG,QAAQ,KAAK,eAAe,WAAW,SAAS;GACjE,gBAAgB;EAClB,SAAS,KAAK;GACZ,OAAO,MAAM,EAAE,IAAI,GAAG,+BAA+B;GACrD,cAAc;EAChB;EAEF,IAAI,aAAa,GACf,OAAO,MAAM,kCAAkC,YAAY;EAE7D,MAAM,aAAa,KAAK,IAAI,IAAI;EAChC,OAAO,MACL,WAAW,aAAa,MAAM,WAAW,0BAA0B,WAAW,GAChF;CACF;CAEA,MAAyB,QACvB,WACA,KAC6B;EAC7B,MAAM,WAAW,KAAK,OAAO,WAAW,GAAG;EAC3C,IAAI;GAGF,MAAM,QAAQ,MAAM,QAAQ,IAAI,KAAK,eAAe,QAAQ;GAC5D,IAAI,mBAAmB,MAAM,QAAQ,GAGnC;GAGF,OAAO,MAAM;EACf,QAAQ;GACN;EACF;CACF;CAEA,MAAyB,SACvB,WACA,KACA,MACA,YACe;EACf,MAAM,KAAK,SACT,KAAK,OAAO,WAAW,GAAG,GAC1B,MACA,KAAK,IAAI,IAAI,aAAa,GAC5B;CACF;CAEA,MAAyB,GACvB,WACA,KACe;EACf,OAAO,MAAM;GAAE;GAAW;EAAI,GAAG,sBAAsB;EACvD,MAAM,QAAQ,GAAG,MAAM,KAAK,eAAe,KAAK,OAAO,WAAW,GAAG,CAAC;CACxE;CAIA,MAAyB,mBACvB,WACA,KACA,OACe;EACf,MAAM,EAAE,WAAW;EACnB,IAAI,CAAC,QAAQ,SACX;EAGF,IAAI;GACF,MAAM,KAAK,SACT,KAAK,OAAO,WAAW,GAAG,GAC1B,MAAM,YAAY,MAAM,OAAO,SAAS,MAAM,CAAC,GAC/C,OAAO,SAAS,CAClB;EACF,SAAS,KAAK;GACZ,OAAO,KAAK,MAAM,EAAE,IAAI,GAAG,0CAA0C;EACvE;CACF;CAEA,MAAc,SACZ,UACA,MACA,QACe;EACf,MAAM,QAAQ,IAAI,KAAK,eAAe,UAAU,MAAM,EACpD,UAAU,EAAE,OAAO,EACrB,CAAC;CACH;AACF;AAEA,SAAS,kBAAkB,UAAuC;CAChE,IAAI,CAAC,SAAS,QAAQ,GACpB;CAGF,MAAM,EAAE,WAAW;CACnB,OAAO,OAAO,WAAW,WAAW,SAAS,KAAA;AAC/C;AAIA,SAAS,mBAAmB,UAA4B;CACtD,MAAM,SAAS,kBAAkB,QAAQ;CACzC,OAAO,WAAW,KAAA,KAAa,KAAK,IAAI,KAAK;AAC/C;AAEA,SAAS,gBAAgB,UAA4B;CACnD,MAAM,SAAS,kBAAkB,QAAQ;CACzC,OAAO,WAAW,KAAA,KAAa,KAAK,IAAI,IAAI;AAC9C"}
@@ -1,4 +1,5 @@
1
1
  import { decompressFromBase64, decompressFromBuffer } from "../../compress.js";
2
+ import { isString } from "@sindresorhus/is";
2
3
  import { DateTime } from "luxon";
3
4
  //#region lib/util/cache/package/legacy.ts
4
5
  async function decodeLegacyEntry(data) {
@@ -7,7 +8,7 @@ async function decodeLegacyEntry(data) {
7
8
  }
8
9
  async function decodeLegacyJsonEntry(data) {
9
10
  const cached = JSON.parse(data.toString("utf8"));
10
- if (typeof cached.value !== "string" || typeof cached.expiry !== "string") throw new Error("Invalid legacy JSON package cache entry");
11
+ if (!isString(cached.value) || !isString(cached.expiry)) throw new Error("Invalid legacy JSON package cache entry");
11
12
  const json = await decompressFromBase64(cached.value);
12
13
  return {
13
14
  value: JSON.parse(json),
@@ -1 +1 @@
1
- {"version":3,"file":"legacy.js","names":[],"sources":["../../../../lib/util/cache/package/legacy.ts"],"sourcesContent":["import { DateTime } from 'luxon';\nimport { decompressFromBase64, decompressFromBuffer } from '../../compress.ts';\n\n// TODO: Delete this decode-only support, legacy.spec.ts, and the single call\n// site in impl/base.ts once pre-envelope entries have expired.\n\nexport interface LegacyEntry {\n value: unknown;\n expiry: DateTime | undefined;\n}\n\ninterface LegacyJsonEntry {\n value: unknown;\n expiry: unknown;\n}\n\nexport async function decodeLegacyEntry(data: Buffer): Promise<LegacyEntry> {\n if (data[0] === 0x7b) {\n return await decodeLegacyJsonEntry(data);\n }\n\n return await decodeLegacySqliteEntry(data);\n}\n\nasync function decodeLegacyJsonEntry(data: Buffer): Promise<LegacyEntry> {\n const cached = JSON.parse(data.toString('utf8')) as LegacyJsonEntry;\n\n if (typeof cached.value !== 'string' || typeof cached.expiry !== 'string') {\n throw new Error('Invalid legacy JSON package cache entry');\n }\n\n const json = await decompressFromBase64(cached.value);\n\n return {\n value: JSON.parse(json),\n expiry: DateTime.fromISO(cached.expiry),\n };\n}\n\nasync function decodeLegacySqliteEntry(data: Buffer): Promise<LegacyEntry> {\n const json = await decompressFromBuffer(data);\n\n return {\n value: JSON.parse(json),\n expiry: undefined,\n };\n}\n"],"mappings":";;;AAgBA,eAAsB,kBAAkB,MAAoC;CAC1E,IAAI,KAAK,OAAO,KACd,OAAO,MAAM,sBAAsB,IAAI;CAGzC,OAAO,MAAM,wBAAwB,IAAI;AAC3C;AAEA,eAAe,sBAAsB,MAAoC;CACvE,MAAM,SAAS,KAAK,MAAM,KAAK,SAAS,MAAM,CAAC;CAE/C,IAAI,OAAO,OAAO,UAAU,YAAY,OAAO,OAAO,WAAW,UAC/D,MAAM,IAAI,MAAM,yCAAyC;CAG3D,MAAM,OAAO,MAAM,qBAAqB,OAAO,KAAK;CAEpD,OAAO;EACL,OAAO,KAAK,MAAM,IAAI;EACtB,QAAQ,SAAS,QAAQ,OAAO,MAAM;CACxC;AACF;AAEA,eAAe,wBAAwB,MAAoC;CACzE,MAAM,OAAO,MAAM,qBAAqB,IAAI;CAE5C,OAAO;EACL,OAAO,KAAK,MAAM,IAAI;EACtB,QAAQ,KAAA;CACV;AACF"}
1
+ {"version":3,"file":"legacy.js","names":[],"sources":["../../../../lib/util/cache/package/legacy.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport { decompressFromBase64, decompressFromBuffer } from '../../compress.ts';\n\n// TODO: Delete this decode-only support, legacy.spec.ts, and the single call\n// site in impl/base.ts once pre-envelope entries have expired.\n\nexport interface LegacyEntry {\n value: unknown;\n expiry: DateTime | undefined;\n}\n\ninterface LegacyJsonEntry {\n value: unknown;\n expiry: unknown;\n}\n\nexport async function decodeLegacyEntry(data: Buffer): Promise<LegacyEntry> {\n if (data[0] === 0x7b) {\n return await decodeLegacyJsonEntry(data);\n }\n\n return await decodeLegacySqliteEntry(data);\n}\n\nasync function decodeLegacyJsonEntry(data: Buffer): Promise<LegacyEntry> {\n const cached = JSON.parse(data.toString('utf8')) as LegacyJsonEntry;\n\n if (!isString(cached.value) || !isString(cached.expiry)) {\n throw new Error('Invalid legacy JSON package cache entry');\n }\n\n const json = await decompressFromBase64(cached.value);\n\n return {\n value: JSON.parse(json),\n expiry: DateTime.fromISO(cached.expiry),\n };\n}\n\nasync function decodeLegacySqliteEntry(data: Buffer): Promise<LegacyEntry> {\n const json = await decompressFromBuffer(data);\n\n return {\n value: JSON.parse(json),\n expiry: undefined,\n };\n}\n"],"mappings":";;;;AAiBA,eAAsB,kBAAkB,MAAoC;CAC1E,IAAI,KAAK,OAAO,KACd,OAAO,MAAM,sBAAsB,IAAI;CAGzC,OAAO,MAAM,wBAAwB,IAAI;AAC3C;AAEA,eAAe,sBAAsB,MAAoC;CACvE,MAAM,SAAS,KAAK,MAAM,KAAK,SAAS,MAAM,CAAC;CAE/C,IAAI,CAAC,SAAS,OAAO,KAAK,KAAK,CAAC,SAAS,OAAO,MAAM,GACpD,MAAM,IAAI,MAAM,yCAAyC;CAG3D,MAAM,OAAO,MAAM,qBAAqB,OAAO,KAAK;CAEpD,OAAO;EACL,OAAO,KAAK,MAAM,IAAI;EACtB,QAAQ,SAAS,QAAQ,OAAO,MAAM;CACxC;AACF;AAEA,eAAe,wBAAwB,MAAoC;CACzE,MAAM,OAAO,MAAM,qBAAqB,IAAI;CAE5C,OAAO;EACL,OAAO,KAAK,MAAM,IAAI;EACtB,QAAQ,KAAA;CACV;AACF"}
package/dist/util/date.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { isString } from "@sindresorhus/is";
1
2
  import { DateTime } from "luxon";
2
3
  //#region lib/util/date.ts
3
4
  const ONE_MINUTE_MS = 6e4;
@@ -11,7 +12,7 @@ function getElapsedMinutes(date) {
11
12
  return Math.floor(((/* @__PURE__ */ new Date()).getTime() - date.getTime()) / ONE_MINUTE_MS);
12
13
  }
13
14
  function getElapsedHours(date) {
14
- const pastDate = typeof date === "string" ? DateTime.fromISO(date) : DateTime.fromJSDate(date);
15
+ const pastDate = isString(date) ? DateTime.fromISO(date) : DateTime.fromJSDate(date);
15
16
  if (!pastDate.isValid) return 0;
16
17
  const diff = DateTime.now().diff(pastDate, "hours");
17
18
  return Math.floor(diff.hours);
@@ -1 +1 @@
1
- {"version":3,"file":"date.js","names":[],"sources":["../../lib/util/date.ts"],"sourcesContent":["import { DateTime } from 'luxon';\n\nconst ONE_MINUTE_MS = 60 * 1000;\n\nexport function getElapsedDays(timestamp: string, floor = true): number {\n const currentVersionTimestampDate = DateTime.fromISO(timestamp);\n const now = DateTime.now();\n const diffInDays = now.diff(currentVersionTimestampDate, 'days').as('days');\n if (floor) {\n return Math.floor(diffInDays);\n }\n\n return diffInDays;\n}\n\nexport function getElapsedMinutes(date: Date): number {\n return Math.floor((new Date().getTime() - date.getTime()) / ONE_MINUTE_MS);\n}\n\nexport function getElapsedHours(date: Date | string): number {\n const pastDate =\n typeof date === 'string'\n ? DateTime.fromISO(date)\n : DateTime.fromJSDate(date);\n\n if (!pastDate.isValid) {\n return 0;\n }\n\n const diff = DateTime.now().diff(pastDate, 'hours');\n return Math.floor(diff.hours);\n}\n\nexport function getElapsedMs(timestamp: string): number {\n return new Date().getTime() - new Date(timestamp).getTime();\n}\n"],"mappings":";;AAEA,MAAM,gBAAgB;AAEtB,SAAgB,eAAe,WAAmB,QAAQ,MAAc;CACtE,MAAM,8BAA8B,SAAS,QAAQ,SAAS;CAE9D,MAAM,aADM,SAAS,IACA,CAAC,CAAC,KAAK,6BAA6B,MAAM,CAAC,CAAC,GAAG,MAAM;CAC1E,IAAI,OACF,OAAO,KAAK,MAAM,UAAU;CAG9B,OAAO;AACT;AAEA,SAAgB,kBAAkB,MAAoB;CACpD,OAAO,KAAK,wBAAO,IAAI,KAAK,EAAA,CAAE,QAAQ,IAAI,KAAK,QAAQ,KAAK,aAAa;AAC3E;AAEA,SAAgB,gBAAgB,MAA6B;CAC3D,MAAM,WACJ,OAAO,SAAS,WACZ,SAAS,QAAQ,IAAI,IACrB,SAAS,WAAW,IAAI;CAE9B,IAAI,CAAC,SAAS,SACZ,OAAO;CAGT,MAAM,OAAO,SAAS,IAAI,CAAC,CAAC,KAAK,UAAU,OAAO;CAClD,OAAO,KAAK,MAAM,KAAK,KAAK;AAC9B;AAEA,SAAgB,aAAa,WAA2B;CACtD,wBAAO,IAAI,KAAK,EAAA,CAAE,QAAQ,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,QAAQ;AAC5D"}
1
+ {"version":3,"file":"date.js","names":[],"sources":["../../lib/util/date.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\n\nconst ONE_MINUTE_MS = 60 * 1000;\n\nexport function getElapsedDays(timestamp: string, floor = true): number {\n const currentVersionTimestampDate = DateTime.fromISO(timestamp);\n const now = DateTime.now();\n const diffInDays = now.diff(currentVersionTimestampDate, 'days').as('days');\n if (floor) {\n return Math.floor(diffInDays);\n }\n\n return diffInDays;\n}\n\nexport function getElapsedMinutes(date: Date): number {\n return Math.floor((new Date().getTime() - date.getTime()) / ONE_MINUTE_MS);\n}\n\nexport function getElapsedHours(date: Date | string): number {\n const pastDate = isString(date)\n ? DateTime.fromISO(date)\n : DateTime.fromJSDate(date);\n\n if (!pastDate.isValid) {\n return 0;\n }\n\n const diff = DateTime.now().diff(pastDate, 'hours');\n return Math.floor(diff.hours);\n}\n\nexport function getElapsedMs(timestamp: string): number {\n return new Date().getTime() - new Date(timestamp).getTime();\n}\n"],"mappings":";;;AAGA,MAAM,gBAAgB;AAEtB,SAAgB,eAAe,WAAmB,QAAQ,MAAc;CACtE,MAAM,8BAA8B,SAAS,QAAQ,SAAS;CAE9D,MAAM,aADM,SAAS,IACA,CAAC,CAAC,KAAK,6BAA6B,MAAM,CAAC,CAAC,GAAG,MAAM;CAC1E,IAAI,OACF,OAAO,KAAK,MAAM,UAAU;CAG9B,OAAO;AACT;AAEA,SAAgB,kBAAkB,MAAoB;CACpD,OAAO,KAAK,wBAAO,IAAI,KAAK,EAAA,CAAE,QAAQ,IAAI,KAAK,QAAQ,KAAK,aAAa;AAC3E;AAEA,SAAgB,gBAAgB,MAA6B;CAC3D,MAAM,WAAW,SAAS,IAAI,IAC1B,SAAS,QAAQ,IAAI,IACrB,SAAS,WAAW,IAAI;CAE5B,IAAI,CAAC,SAAS,SACZ,OAAO;CAGT,MAAM,OAAO,SAAS,IAAI,CAAC,CAAC,KAAK,UAAU,OAAO;CAClD,OAAO,KAAK,MAAM,KAAK,KAAK;AAC9B;AAEA,SAAgB,aAAa,WAA2B;CACtD,wBAAO,IAAI,KAAK,EAAA,CAAE,QAAQ,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,QAAQ;AAC5D"}
@@ -5,7 +5,7 @@ import { logger } from "../../../logger/index.js";
5
5
  import { isCommandWithOptions } from "../utils.js";
6
6
  import { rawExec } from "../common.js";
7
7
  import { uniq } from "../../uniq.js";
8
- import { isNonEmptyString, isString } from "@sindresorhus/is";
8
+ import { isNonEmptyString, isString, isTruthy } from "@sindresorhus/is";
9
9
  import { join, quote } from "shlex";
10
10
  //#region lib/util/exec/docker/index.ts
11
11
  const prefetchedImages = /* @__PURE__ */ new Map();
@@ -74,7 +74,7 @@ async function removeDanglingContainers() {
74
74
  logger.debug(`Removing dangling child containers with label ${containerLabel}`);
75
75
  const res = await rawExec(`docker ps --filter label=${containerLabel} -aq`, {});
76
76
  if (res?.stdout?.trim().length) {
77
- const containerIds = res.stdout.trim().split(newlineRegex).map((container) => container.trim()).filter(Boolean);
77
+ const containerIds = res.stdout.trim().split(newlineRegex).map((container) => container.trim()).filter(isTruthy);
78
78
  logger.debug({ containerIds }, "Removing dangling child containers");
79
79
  await rawExec(`docker rm -f ${containerIds.join(" ")}`, {});
80
80
  } else logger.debug("No dangling containers to remove");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/util/exec/docker/index.ts"],"sourcesContent":["import { isNonEmptyString, isString } from '@sindresorhus/is';\nimport { join, quote } from 'shlex';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { SYSTEM_INSUFFICIENT_MEMORY } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { newlineRegex, regEx } from '../../regex.ts';\nimport { uniq } from '../../uniq.ts';\nimport { rawExec } from '../common.ts';\nimport type {\n CommandWithOptions,\n DockerOptions,\n VolumeOption,\n VolumesPair,\n} from '../types.ts';\nimport { isCommandWithOptions } from '../utils.ts';\n\nconst prefetchedImages = new Map<string, string>();\n\nconst digestRegex = regEx('Digest: (.*?)\\n');\n\nexport const sideCarName = 'sidecar';\n\nexport async function prefetchDockerImage(taggedImage: string): Promise<void> {\n if (prefetchedImages.has(taggedImage)) {\n logger.debug(\n `Docker image is already prefetched: ${taggedImage}@${prefetchedImages.get(\n taggedImage,\n )!}`,\n );\n } else {\n logger.debug(`Fetching Docker image: ${taggedImage}`);\n const res = await rawExec(`docker pull ${taggedImage}`, {});\n const imageDigest = digestRegex.exec(res?.stdout)?.[1] ?? 'unknown';\n logger.debug(\n `Finished fetching Docker image ${taggedImage}@${imageDigest}`,\n );\n prefetchedImages.set(taggedImage, imageDigest);\n }\n}\n\nexport function resetPrefetchedImages(): void {\n prefetchedImages.clear();\n}\n\nfunction expandVolumeOption(x: VolumeOption): VolumesPair | null {\n if (isNonEmptyString(x)) {\n return [x, x];\n }\n if (Array.isArray(x) && x.length === 2) {\n const [from, to] = x;\n // v8 ignore else -- TODO: add test #40625\n if (isNonEmptyString(from) && isNonEmptyString(to)) {\n return [from, to];\n }\n }\n return null;\n}\n\nfunction volumesEql(x: VolumesPair, y: VolumesPair): boolean {\n const [xFrom, xTo] = x;\n const [yFrom, yTo] = y;\n return xFrom === yFrom && xTo === yTo;\n}\n\nfunction prepareVolumes(volumes: VolumeOption[]): string[] {\n const expanded: (VolumesPair | null)[] = volumes.map(expandVolumeOption);\n const filtered: VolumesPair[] = expanded.filter(\n (vol): vol is VolumesPair => vol !== null,\n );\n const unique: VolumesPair[] = uniq<VolumesPair>(filtered, volumesEql);\n return unique.map(([from, to]) => `-v \"${from}\":\"${to}\"`);\n}\n\nfunction getContainerName(name: string, prefix?: string): string {\n return `${prefix ?? 'renovate_'}${name}`.replace(regEx(/\\//g), '_');\n}\n\nfunction getContainerLabel(prefix: string | undefined): string {\n return `${prefix ?? 'renovate_'}child`;\n}\n\nexport async function removeDockerContainer(\n image: string,\n prefix: string,\n): Promise<void> {\n const containerName = getContainerName(sideCarName, prefix);\n let cmd = `docker ps --filter name=${containerName} -aq`;\n try {\n const res = await rawExec(cmd, {});\n const containerId = res?.stdout?.trim() || '';\n if (containerId.length) {\n logger.debug(`Removing container with ID: ${containerId}`);\n cmd = `docker rm -f ${containerId}`;\n await rawExec(cmd, {});\n } else {\n logger.trace({ image, containerName }, 'No running containers to remove');\n }\n } catch (err) {\n logger.warn(\n { image, containerName, cmd, err },\n 'Could not remove Docker container',\n );\n }\n}\n\nexport async function removeDanglingContainers(): Promise<void> {\n if (GlobalConfig.get('binarySource') !== 'docker') {\n return;\n }\n\n try {\n const containerLabel = getContainerLabel(\n GlobalConfig.get('dockerChildPrefix'),\n );\n logger.debug(\n `Removing dangling child containers with label ${containerLabel}`,\n );\n const res = await rawExec(\n `docker ps --filter label=${containerLabel} -aq`,\n {},\n );\n if (res?.stdout?.trim().length) {\n const containerIds = res.stdout\n .trim()\n .split(newlineRegex)\n .map((container) => container.trim())\n .filter(Boolean);\n logger.debug({ containerIds }, 'Removing dangling child containers');\n await rawExec(`docker rm -f ${containerIds.join(' ')}`, {});\n } else {\n logger.debug('No dangling containers to remove');\n }\n } catch (err) {\n if (err.errno === 'ENOMEM') {\n throw new Error(SYSTEM_INSUFFICIENT_MEMORY);\n }\n if (err.stderr?.includes('Cannot connect to the Docker daemon')) {\n logger.info('No docker daemon found');\n } else {\n logger.warn({ err }, 'Error removing dangling containers');\n }\n }\n}\n\nexport async function generateDockerCommand(\n commands: (string | CommandWithOptions)[],\n preCommands: (string | CommandWithOptions)[],\n options: DockerOptions,\n sideCarImage: string,\n): Promise<string> {\n const { envVars, cwd } = options;\n const volumes = options.volumes ?? [];\n const {\n localDir,\n cacheDir,\n containerbaseDir,\n dockerUser,\n dockerChildPrefix,\n dockerCliOptions,\n } = GlobalConfig.get();\n const result = ['docker run --rm'];\n const containerName = getContainerName(sideCarName, dockerChildPrefix);\n const containerLabel = getContainerLabel(dockerChildPrefix);\n result.push(`--name=${containerName}`);\n result.push(`--label=${containerLabel}`);\n if (dockerUser) {\n result.push(`--user=${dockerUser}`);\n }\n if (dockerCliOptions) {\n result.push(dockerCliOptions);\n }\n\n const volumeDirs: VolumeOption[] = [localDir, cacheDir];\n if (containerbaseDir) {\n if (cacheDir && containerbaseDir.startsWith(cacheDir)) {\n logger.debug('containerbaseDir is inside cacheDir');\n } else {\n logger.debug('containerbaseDir is separate from cacheDir');\n volumeDirs.push(containerbaseDir);\n }\n } else {\n logger.debug('containerbaseDir is missing');\n }\n volumeDirs.push(...volumes);\n result.push(...prepareVolumes(volumeDirs));\n\n // v8 ignore else -- TODO: add test #40625\n if (envVars) {\n result.push(\n ...uniq(envVars)\n .filter(isString)\n .map((e) => `-e ${e}`),\n );\n }\n\n if (cwd) {\n result.push(`-w \"${cwd}\"`);\n }\n\n logger.debug({ image: sideCarImage }, 'Resolved tag constraint');\n\n await prefetchDockerImage(sideCarImage);\n result.push(sideCarImage);\n\n const bashCommandParts = [];\n\n for (const preCommand of preCommands) {\n if (\n isCommandWithOptions(preCommand) &&\n isString(join(preCommand.command))\n ) {\n if (preCommand.ignoreFailure) {\n bashCommandParts.push(`${join(preCommand.command)} || true`);\n } else {\n bashCommandParts.push(join(preCommand.command));\n }\n } else if (isString(preCommand)) {\n bashCommandParts.push(preCommand);\n }\n }\n\n for (const command of commands) {\n if (isCommandWithOptions(command)) {\n if (command.ignoreFailure) {\n bashCommandParts.push(`${join(command.command)} || true`);\n } else {\n bashCommandParts.push(join(command.command));\n }\n } else {\n bashCommandParts.push(command);\n }\n }\n\n const bashCommand = bashCommandParts.join(' && ');\n // Single-quote the whole `-c` argument rather than hand-escaping `\"`. Escaping\n // only `\"` left `\\` unhandled, so a value containing `\\\"` produced a string that\n // `shlex.split` rejects outright (\"Got EOF while in a quoted string\"), failing\n // the update.\n //\n // It also left `$` and backticks live in the outer context, which silently\n // defeats the `quote()` calls the managers apply: their single quotes are not\n // special inside double quotes. That is inert while nothing pairs\n // `ExecOptions.shell` with `docker` — `rawExec` otherwise splits argv without a\n // shell — but it made the wrapper one `shell: true` away from turning a quoted\n // dep name into host-side command substitution, which is how the flux manager\n // was configured until it moved to `CommandWithOptions`. Being correct here\n // means that pairing is no longer load-bearing.\n result.push(`bash -l -c ${quote(bashCommand)}`);\n\n return result.join(' ');\n}\n"],"mappings":";;;;;;;;;;AAgBA,MAAM,mCAAmB,IAAI,IAAoB;AAEjD,MAAM,cAAc,MAAM,iBAAiB;AAE3C,MAAa,cAAc;AAE3B,eAAsB,oBAAoB,aAAoC;CAC5E,IAAI,iBAAiB,IAAI,WAAW,GAClC,OAAO,MACL,uCAAuC,YAAY,GAAG,iBAAiB,IACrE,WACF,GACF;MACK;EACL,OAAO,MAAM,0BAA0B,aAAa;EACpD,MAAM,MAAM,MAAM,QAAQ,eAAe,eAAe,CAAC,CAAC;EAC1D,MAAM,cAAc,YAAY,KAAK,KAAK,MAAM,CAAC,GAAG,MAAM;EAC1D,OAAO,MACL,kCAAkC,YAAY,GAAG,aACnD;EACA,iBAAiB,IAAI,aAAa,WAAW;CAC/C;AACF;AAMA,SAAS,mBAAmB,GAAqC;CAC/D,IAAI,iBAAiB,CAAC,GACpB,OAAO,CAAC,GAAG,CAAC;CAEd,IAAI,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG;EACtC,MAAM,CAAC,MAAM,MAAM;;EAEnB,IAAI,iBAAiB,IAAI,KAAK,iBAAiB,EAAE,GAC/C,OAAO,CAAC,MAAM,EAAE;CAEpB;CACA,OAAO;AACT;AAEA,SAAS,WAAW,GAAgB,GAAyB;CAC3D,MAAM,CAAC,OAAO,OAAO;CACrB,MAAM,CAAC,OAAO,OAAO;CACrB,OAAO,UAAU,SAAS,QAAQ;AACpC;AAEA,SAAS,eAAe,SAAmC;CAEzD,MAAM,WADmC,QAAQ,IAAI,kBACd,CAAC,CAAC,QACtC,QAA4B,QAAQ,IACvC;CAEA,OAD8B,KAAkB,UAAU,UAC9C,CAAC,CAAC,KAAK,CAAC,MAAM,QAAQ,OAAO,KAAK,KAAK,GAAG,EAAE;AAC1D;AAEA,SAAS,iBAAiB,MAAc,QAAyB;CAC/D,OAAO,GAAG,UAAU,cAAc,OAAO,QAAQ,MAAM,KAAK,GAAG,GAAG;AACpE;AAEA,SAAS,kBAAkB,QAAoC;CAC7D,OAAO,GAAG,UAAU,YAAY;AAClC;AAEA,eAAsB,sBACpB,OACA,QACe;CACf,MAAM,gBAAgB,iBAAiB,aAAa,MAAM;CAC1D,IAAI,MAAM,2BAA2B,cAAc;CACnD,IAAI;EAEF,MAAM,eAAc,MADF,QAAQ,KAAK,CAAC,CAAC,EAAA,EACR,QAAQ,KAAK,KAAK;EAC3C,IAAI,YAAY,QAAQ;GACtB,OAAO,MAAM,+BAA+B,aAAa;GACzD,MAAM,gBAAgB;GACtB,MAAM,QAAQ,KAAK,CAAC,CAAC;EACvB,OACE,OAAO,MAAM;GAAE;GAAO;EAAc,GAAG,iCAAiC;CAE5E,SAAS,KAAK;EACZ,OAAO,KACL;GAAE;GAAO;GAAe;GAAK;EAAI,GACjC,mCACF;CACF;AACF;AAEA,eAAsB,2BAA0C;CAC9D,IAAI,aAAa,IAAI,cAAc,MAAM,UACvC;CAGF,IAAI;EACF,MAAM,iBAAiB,kBACrB,aAAa,IAAI,mBAAmB,CACtC;EACA,OAAO,MACL,iDAAiD,gBACnD;EACA,MAAM,MAAM,MAAM,QAChB,4BAA4B,eAAe,OAC3C,CAAC,CACH;EACA,IAAI,KAAK,QAAQ,KAAK,CAAC,CAAC,QAAQ;GAC9B,MAAM,eAAe,IAAI,OACtB,KAAK,CAAC,CACN,MAAM,YAAY,CAAC,CACnB,KAAK,cAAc,UAAU,KAAK,CAAC,CAAC,CACpC,OAAO,OAAO;GACjB,OAAO,MAAM,EAAE,aAAa,GAAG,oCAAoC;GACnE,MAAM,QAAQ,gBAAgB,aAAa,KAAK,GAAG,KAAK,CAAC,CAAC;EAC5D,OACE,OAAO,MAAM,kCAAkC;CAEnD,SAAS,KAAK;EACZ,IAAI,IAAI,UAAU,UAChB,MAAM,IAAI,MAAM,0BAA0B;EAE5C,IAAI,IAAI,QAAQ,SAAS,qCAAqC,GAC5D,OAAO,KAAK,wBAAwB;OAEpC,OAAO,KAAK,EAAE,IAAI,GAAG,oCAAoC;CAE7D;AACF;AAEA,eAAsB,sBACpB,UACA,aACA,SACA,cACiB;CACjB,MAAM,EAAE,SAAS,QAAQ;CACzB,MAAM,UAAU,QAAQ,WAAW,CAAC;CACpC,MAAM,EACJ,UACA,UACA,kBACA,YACA,mBACA,qBACE,aAAa,IAAI;CACrB,MAAM,SAAS,CAAC,iBAAiB;CACjC,MAAM,gBAAgB,iBAAiB,aAAa,iBAAiB;CACrE,MAAM,iBAAiB,kBAAkB,iBAAiB;CAC1D,OAAO,KAAK,UAAU,eAAe;CACrC,OAAO,KAAK,WAAW,gBAAgB;CACvC,IAAI,YACF,OAAO,KAAK,UAAU,YAAY;CAEpC,IAAI,kBACF,OAAO,KAAK,gBAAgB;CAG9B,MAAM,aAA6B,CAAC,UAAU,QAAQ;CACtD,IAAI,kBACF,IAAI,YAAY,iBAAiB,WAAW,QAAQ,GAClD,OAAO,MAAM,qCAAqC;MAC7C;EACL,OAAO,MAAM,4CAA4C;EACzD,WAAW,KAAK,gBAAgB;CAClC;MAEA,OAAO,MAAM,6BAA6B;CAE5C,WAAW,KAAK,GAAG,OAAO;CAC1B,OAAO,KAAK,GAAG,eAAe,UAAU,CAAC;;CAGzC,IAAI,SACF,OAAO,KACL,GAAG,KAAK,OAAO,CAAC,CACb,OAAO,QAAQ,CAAC,CAChB,KAAK,MAAM,MAAM,GAAG,CACzB;CAGF,IAAI,KACF,OAAO,KAAK,OAAO,IAAI,EAAE;CAG3B,OAAO,MAAM,EAAE,OAAO,aAAa,GAAG,yBAAyB;CAE/D,MAAM,oBAAoB,YAAY;CACtC,OAAO,KAAK,YAAY;CAExB,MAAM,mBAAmB,CAAC;CAE1B,KAAK,MAAM,cAAc,aACvB,IACE,qBAAqB,UAAU,KAC/B,SAAS,KAAK,WAAW,OAAO,CAAC,GAEjC,IAAI,WAAW,eACb,iBAAiB,KAAK,GAAG,KAAK,WAAW,OAAO,EAAE,SAAS;MAE3D,iBAAiB,KAAK,KAAK,WAAW,OAAO,CAAC;MAE3C,IAAI,SAAS,UAAU,GAC5B,iBAAiB,KAAK,UAAU;CAIpC,KAAK,MAAM,WAAW,UACpB,IAAI,qBAAqB,OAAO,GAC9B,IAAI,QAAQ,eACV,iBAAiB,KAAK,GAAG,KAAK,QAAQ,OAAO,EAAE,SAAS;MAExD,iBAAiB,KAAK,KAAK,QAAQ,OAAO,CAAC;MAG7C,iBAAiB,KAAK,OAAO;CAIjC,MAAM,cAAc,iBAAiB,KAAK,MAAM;CAchD,OAAO,KAAK,cAAc,MAAM,WAAW,GAAG;CAE9C,OAAO,OAAO,KAAK,GAAG;AACxB"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/util/exec/docker/index.ts"],"sourcesContent":["import { isNonEmptyString, isString, isTruthy } from '@sindresorhus/is';\nimport { join, quote } from 'shlex';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { SYSTEM_INSUFFICIENT_MEMORY } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { newlineRegex, regEx } from '../../regex.ts';\nimport { uniq } from '../../uniq.ts';\nimport { rawExec } from '../common.ts';\nimport type {\n CommandWithOptions,\n DockerOptions,\n VolumeOption,\n VolumesPair,\n} from '../types.ts';\nimport { isCommandWithOptions } from '../utils.ts';\n\nconst prefetchedImages = new Map<string, string>();\n\nconst digestRegex = regEx('Digest: (.*?)\\n');\n\nexport const sideCarName = 'sidecar';\n\nexport async function prefetchDockerImage(taggedImage: string): Promise<void> {\n if (prefetchedImages.has(taggedImage)) {\n logger.debug(\n `Docker image is already prefetched: ${taggedImage}@${prefetchedImages.get(\n taggedImage,\n )!}`,\n );\n } else {\n logger.debug(`Fetching Docker image: ${taggedImage}`);\n const res = await rawExec(`docker pull ${taggedImage}`, {});\n const imageDigest = digestRegex.exec(res?.stdout)?.[1] ?? 'unknown';\n logger.debug(\n `Finished fetching Docker image ${taggedImage}@${imageDigest}`,\n );\n prefetchedImages.set(taggedImage, imageDigest);\n }\n}\n\nexport function resetPrefetchedImages(): void {\n prefetchedImages.clear();\n}\n\nfunction expandVolumeOption(x: VolumeOption): VolumesPair | null {\n if (isNonEmptyString(x)) {\n return [x, x];\n }\n if (Array.isArray(x) && x.length === 2) {\n const [from, to] = x;\n // v8 ignore else -- TODO: add test #40625\n if (isNonEmptyString(from) && isNonEmptyString(to)) {\n return [from, to];\n }\n }\n return null;\n}\n\nfunction volumesEql(x: VolumesPair, y: VolumesPair): boolean {\n const [xFrom, xTo] = x;\n const [yFrom, yTo] = y;\n return xFrom === yFrom && xTo === yTo;\n}\n\nfunction prepareVolumes(volumes: VolumeOption[]): string[] {\n const expanded: (VolumesPair | null)[] = volumes.map(expandVolumeOption);\n const filtered: VolumesPair[] = expanded.filter(\n (vol): vol is VolumesPair => vol !== null,\n );\n const unique: VolumesPair[] = uniq<VolumesPair>(filtered, volumesEql);\n return unique.map(([from, to]) => `-v \"${from}\":\"${to}\"`);\n}\n\nfunction getContainerName(name: string, prefix?: string): string {\n return `${prefix ?? 'renovate_'}${name}`.replace(regEx(/\\//g), '_');\n}\n\nfunction getContainerLabel(prefix: string | undefined): string {\n return `${prefix ?? 'renovate_'}child`;\n}\n\nexport async function removeDockerContainer(\n image: string,\n prefix: string,\n): Promise<void> {\n const containerName = getContainerName(sideCarName, prefix);\n let cmd = `docker ps --filter name=${containerName} -aq`;\n try {\n const res = await rawExec(cmd, {});\n const containerId = res?.stdout?.trim() || '';\n if (containerId.length) {\n logger.debug(`Removing container with ID: ${containerId}`);\n cmd = `docker rm -f ${containerId}`;\n await rawExec(cmd, {});\n } else {\n logger.trace({ image, containerName }, 'No running containers to remove');\n }\n } catch (err) {\n logger.warn(\n { image, containerName, cmd, err },\n 'Could not remove Docker container',\n );\n }\n}\n\nexport async function removeDanglingContainers(): Promise<void> {\n if (GlobalConfig.get('binarySource') !== 'docker') {\n return;\n }\n\n try {\n const containerLabel = getContainerLabel(\n GlobalConfig.get('dockerChildPrefix'),\n );\n logger.debug(\n `Removing dangling child containers with label ${containerLabel}`,\n );\n const res = await rawExec(\n `docker ps --filter label=${containerLabel} -aq`,\n {},\n );\n if (res?.stdout?.trim().length) {\n const containerIds = res.stdout\n .trim()\n .split(newlineRegex)\n .map((container) => container.trim())\n .filter(isTruthy);\n logger.debug({ containerIds }, 'Removing dangling child containers');\n await rawExec(`docker rm -f ${containerIds.join(' ')}`, {});\n } else {\n logger.debug('No dangling containers to remove');\n }\n } catch (err) {\n if (err.errno === 'ENOMEM') {\n throw new Error(SYSTEM_INSUFFICIENT_MEMORY);\n }\n if (err.stderr?.includes('Cannot connect to the Docker daemon')) {\n logger.info('No docker daemon found');\n } else {\n logger.warn({ err }, 'Error removing dangling containers');\n }\n }\n}\n\nexport async function generateDockerCommand(\n commands: (string | CommandWithOptions)[],\n preCommands: (string | CommandWithOptions)[],\n options: DockerOptions,\n sideCarImage: string,\n): Promise<string> {\n const { envVars, cwd } = options;\n const volumes = options.volumes ?? [];\n const {\n localDir,\n cacheDir,\n containerbaseDir,\n dockerUser,\n dockerChildPrefix,\n dockerCliOptions,\n } = GlobalConfig.get();\n const result = ['docker run --rm'];\n const containerName = getContainerName(sideCarName, dockerChildPrefix);\n const containerLabel = getContainerLabel(dockerChildPrefix);\n result.push(`--name=${containerName}`);\n result.push(`--label=${containerLabel}`);\n if (dockerUser) {\n result.push(`--user=${dockerUser}`);\n }\n if (dockerCliOptions) {\n result.push(dockerCliOptions);\n }\n\n const volumeDirs: VolumeOption[] = [localDir, cacheDir];\n if (containerbaseDir) {\n if (cacheDir && containerbaseDir.startsWith(cacheDir)) {\n logger.debug('containerbaseDir is inside cacheDir');\n } else {\n logger.debug('containerbaseDir is separate from cacheDir');\n volumeDirs.push(containerbaseDir);\n }\n } else {\n logger.debug('containerbaseDir is missing');\n }\n volumeDirs.push(...volumes);\n result.push(...prepareVolumes(volumeDirs));\n\n // v8 ignore else -- TODO: add test #40625\n if (envVars) {\n result.push(\n ...uniq(envVars)\n .filter(isString)\n .map((e) => `-e ${e}`),\n );\n }\n\n if (cwd) {\n result.push(`-w \"${cwd}\"`);\n }\n\n logger.debug({ image: sideCarImage }, 'Resolved tag constraint');\n\n await prefetchDockerImage(sideCarImage);\n result.push(sideCarImage);\n\n const bashCommandParts = [];\n\n for (const preCommand of preCommands) {\n if (\n isCommandWithOptions(preCommand) &&\n isString(join(preCommand.command))\n ) {\n if (preCommand.ignoreFailure) {\n bashCommandParts.push(`${join(preCommand.command)} || true`);\n } else {\n bashCommandParts.push(join(preCommand.command));\n }\n } else if (isString(preCommand)) {\n bashCommandParts.push(preCommand);\n }\n }\n\n for (const command of commands) {\n if (isCommandWithOptions(command)) {\n if (command.ignoreFailure) {\n bashCommandParts.push(`${join(command.command)} || true`);\n } else {\n bashCommandParts.push(join(command.command));\n }\n } else {\n bashCommandParts.push(command);\n }\n }\n\n const bashCommand = bashCommandParts.join(' && ');\n // Single-quote the whole `-c` argument rather than hand-escaping `\"`. Escaping\n // only `\"` left `\\` unhandled, so a value containing `\\\"` produced a string that\n // `shlex.split` rejects outright (\"Got EOF while in a quoted string\"), failing\n // the update.\n //\n // It also left `$` and backticks live in the outer context, which silently\n // defeats the `quote()` calls the managers apply: their single quotes are not\n // special inside double quotes. That is inert while nothing pairs\n // `ExecOptions.shell` with `docker` — `rawExec` otherwise splits argv without a\n // shell — but it made the wrapper one `shell: true` away from turning a quoted\n // dep name into host-side command substitution, which is how the flux manager\n // was configured until it moved to `CommandWithOptions`. Being correct here\n // means that pairing is no longer load-bearing.\n result.push(`bash -l -c ${quote(bashCommand)}`);\n\n return result.join(' ');\n}\n"],"mappings":"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"}