renovate 43.271.0 → 43.271.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 (134) hide show
  1. package/dist/config/options/index.js +1 -1
  2. package/dist/config/options/index.js.map +1 -1
  3. package/dist/config/presets/util.js +3 -1
  4. package/dist/config/presets/util.js.map +1 -1
  5. package/dist/global-config-option-defaults.generated.js +1 -1
  6. package/dist/global-config-option-defaults.generated.js.map +1 -1
  7. package/dist/logger/renovate-logger.js.map +1 -1
  8. package/dist/logger/with-sanitizer.js +2 -2
  9. package/dist/logger/with-sanitizer.js.map +1 -1
  10. package/dist/modules/datasource/docker/index.js +3 -1
  11. package/dist/modules/datasource/docker/index.js.map +1 -1
  12. package/dist/modules/datasource/index.d.ts +2 -2
  13. package/dist/modules/datasource/index.js +6 -2
  14. package/dist/modules/datasource/index.js.map +1 -1
  15. package/dist/modules/datasource/rubygems/metadata-cache.js +9 -7
  16. package/dist/modules/datasource/rubygems/metadata-cache.js.map +1 -1
  17. package/dist/modules/datasource/sbt-package/index.js +5 -3
  18. package/dist/modules/datasource/sbt-package/index.js.map +1 -1
  19. package/dist/modules/datasource/sbt-plugin/index.js +2 -2
  20. package/dist/modules/datasource/sbt-plugin/index.js.map +1 -1
  21. package/dist/modules/manager/bazel/artifacts.js +2 -2
  22. package/dist/modules/manager/bazel/artifacts.js.map +1 -1
  23. package/dist/modules/manager/custom/index.js.map +1 -1
  24. package/dist/modules/manager/deno/update.js +4 -2
  25. package/dist/modules/manager/deno/update.js.map +1 -1
  26. package/dist/modules/manager/deps-edn/parser.js +2 -2
  27. package/dist/modules/manager/deps-edn/parser.js.map +1 -1
  28. package/dist/modules/manager/fingerprint.generated.js +14 -14
  29. package/dist/modules/manager/fingerprint.generated.js.map +1 -1
  30. package/dist/modules/manager/gomod/artifacts.js +3 -1
  31. package/dist/modules/manager/gomod/artifacts.js.map +1 -1
  32. package/dist/modules/manager/gradle/parser/assignments.js +22 -18
  33. package/dist/modules/manager/gradle/parser/assignments.js.map +1 -1
  34. package/dist/modules/manager/gradle/parser/common.js +12 -8
  35. package/dist/modules/manager/gradle/parser/common.js.map +1 -1
  36. package/dist/modules/manager/gradle/parser/objects.js +11 -9
  37. package/dist/modules/manager/gradle/parser/objects.js.map +1 -1
  38. package/dist/modules/manager/gradle/parser/registry-urls.js +6 -6
  39. package/dist/modules/manager/gradle/parser/registry-urls.js.map +1 -1
  40. package/dist/modules/manager/index.d.ts +2 -2
  41. package/dist/modules/manager/index.js +6 -2
  42. package/dist/modules/manager/index.js.map +1 -1
  43. package/dist/modules/manager/leiningen/extract.js +8 -4
  44. package/dist/modules/manager/leiningen/extract.js.map +1 -1
  45. package/dist/modules/manager/maven/extract.js +13 -11
  46. package/dist/modules/manager/maven/extract.js.map +1 -1
  47. package/dist/modules/manager/npm/post-update/index.js +3 -1
  48. package/dist/modules/manager/npm/post-update/index.js.map +1 -1
  49. package/dist/modules/platform/azure/azure-helper.js +2 -2
  50. package/dist/modules/platform/azure/azure-helper.js.map +1 -1
  51. package/dist/modules/platform/bitbucket/comments.js +10 -4
  52. package/dist/modules/platform/bitbucket/comments.js.map +1 -1
  53. package/dist/modules/platform/bitbucket/index.js +3 -1
  54. package/dist/modules/platform/bitbucket/index.js.map +1 -1
  55. package/dist/modules/platform/bitbucket-server/index.js +13 -5
  56. package/dist/modules/platform/bitbucket-server/index.js.map +1 -1
  57. package/dist/modules/platform/forgejo/forgejo-helper.js +3 -1
  58. package/dist/modules/platform/forgejo/forgejo-helper.js.map +1 -1
  59. package/dist/modules/platform/gitea/gitea-helper.js +3 -1
  60. package/dist/modules/platform/gitea/gitea-helper.js.map +1 -1
  61. package/dist/modules/platform/github/index.js +10 -4
  62. package/dist/modules/platform/github/index.js.map +1 -1
  63. package/dist/modules/platform/github/massage-markdown-links.js +2 -2
  64. package/dist/modules/platform/github/massage-markdown-links.js.map +1 -1
  65. package/dist/modules/platform/gitlab/index.js +10 -4
  66. package/dist/modules/platform/gitlab/index.js.map +1 -1
  67. package/dist/modules/platform/index.d.ts +1 -1
  68. package/dist/modules/platform/index.js +3 -1
  69. package/dist/modules/platform/index.js.map +1 -1
  70. package/dist/modules/versioning/cargo/index.js +15 -5
  71. package/dist/modules/versioning/cargo/index.js.map +1 -1
  72. package/dist/modules/versioning/go-mod-directive/index.js +9 -3
  73. package/dist/modules/versioning/go-mod-directive/index.js.map +1 -1
  74. package/dist/modules/versioning/gradle/index.js +17 -15
  75. package/dist/modules/versioning/gradle/index.js.map +1 -1
  76. package/dist/modules/versioning/hex/index.js +6 -2
  77. package/dist/modules/versioning/hex/index.js.map +1 -1
  78. package/dist/modules/versioning/index.d.ts +2 -2
  79. package/dist/modules/versioning/index.js +6 -2
  80. package/dist/modules/versioning/index.js.map +1 -1
  81. package/dist/modules/versioning/maven/compare.js +5 -3
  82. package/dist/modules/versioning/maven/compare.js.map +1 -1
  83. package/dist/modules/versioning/maven/index.js +23 -17
  84. package/dist/modules/versioning/maven/index.js.map +1 -1
  85. package/dist/modules/versioning/npm/index.js +6 -2
  86. package/dist/modules/versioning/npm/index.js.map +1 -1
  87. package/dist/modules/versioning/pep440/index.js +5 -3
  88. package/dist/modules/versioning/pep440/index.js.map +1 -1
  89. package/dist/modules/versioning/ruby/index.js +39 -19
  90. package/dist/modules/versioning/ruby/index.js.map +1 -1
  91. package/dist/modules/versioning/ruby/operator.js +6 -2
  92. package/dist/modules/versioning/ruby/operator.js.map +1 -1
  93. package/dist/modules/versioning/ruby/range.js +4 -4
  94. package/dist/modules/versioning/ruby/range.js.map +1 -1
  95. package/dist/modules/versioning/ruby/version.js +35 -23
  96. package/dist/modules/versioning/ruby/version.js.map +1 -1
  97. package/dist/modules/versioning/semver/index.js +3 -1
  98. package/dist/modules/versioning/semver/index.js.map +1 -1
  99. package/dist/modules/versioning/semver-coerced/index.d.ts +1 -1
  100. package/dist/modules/versioning/semver-coerced/index.js +3 -1
  101. package/dist/modules/versioning/semver-coerced/index.js.map +1 -1
  102. package/dist/modules/versioning/swift/index.js +6 -2
  103. package/dist/modules/versioning/swift/index.js.map +1 -1
  104. package/dist/util/cache/package/with-cache.js +4 -2
  105. package/dist/util/cache/package/with-cache.js.map +1 -1
  106. package/dist/util/exec/common.d.ts +1 -1
  107. package/dist/util/exec/common.js +3 -1
  108. package/dist/util/exec/common.js.map +1 -1
  109. package/dist/util/git/index.js +2 -2
  110. package/dist/util/git/index.js.map +1 -1
  111. package/dist/util/http/bitbucket-server.js +2 -2
  112. package/dist/util/http/bitbucket-server.js.map +1 -1
  113. package/dist/util/http/forgejo.js +2 -2
  114. package/dist/util/http/forgejo.js.map +1 -1
  115. package/dist/util/http/gitea.js +2 -2
  116. package/dist/util/http/gitea.js.map +1 -1
  117. package/dist/util/http/github.d.ts +1 -1
  118. package/dist/util/http/github.js +2 -2
  119. package/dist/util/http/github.js.map +1 -1
  120. package/dist/util/http/gitlab.d.ts +1 -1
  121. package/dist/util/http/gitlab.js +2 -2
  122. package/dist/util/http/gitlab.js.map +1 -1
  123. package/dist/util/http/scm-manager.js +5 -3
  124. package/dist/util/http/scm-manager.js.map +1 -1
  125. package/dist/workers/repository/extract/index.js +2 -2
  126. package/dist/workers/repository/extract/index.js.map +1 -1
  127. package/dist/workers/repository/update/pr/changelog/source.js +3 -1
  128. package/dist/workers/repository/update/pr/changelog/source.js.map +1 -1
  129. package/dist/workers/repository/updates/flatten.js +3 -1
  130. package/dist/workers/repository/updates/flatten.js.map +1 -1
  131. package/dist/workers/repository/updates/generate.js +3 -1
  132. package/dist/workers/repository/updates/generate.js.map +1 -1
  133. package/package.json +2 -2
  134. package/renovate-schema.json +2 -2
@@ -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\nconst equals = (left: string, right: string): boolean =>\n eq(vtrim(left), vtrim(right));\n\nconst getMajor = (version: string): number =>\n parseVersion(vtrim(version)).major;\nconst getMinor = (version: string): number =>\n parseVersion(vtrim(version)).minor;\nconst getPatch = (version: string): number =>\n parseVersion(vtrim(version)).patch;\n\nexport const isVersion = (version: string): boolean => !!valid(vtrim(version));\nconst isGreaterThan = (left: string, right: string): boolean =>\n gt(vtrim(left), vtrim(right));\nconst isLessThanRange = (version: string, range: string): boolean =>\n !!ltr(vtrim(version), vtrim(range));\n\nconst 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 const isValid = (input: string): boolean =>\n 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\nexport const matches = (version: string, range: string): boolean =>\n satisfies(vtrim(version), vtrim(range));\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\nconst getPinnedValue = (value: string): string => {\n return vtrim(value);\n};\n\nconst 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 const sortVersions = (left: string, right: string): number =>\n gt(vtrim(left), vtrim(right)) ? 1 : -1;\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 { 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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"}
@@ -8,8 +8,12 @@ const ALL = [
8
8
  "<=",
9
9
  "~>"
10
10
  ];
11
- const isValidOperator = (operator) => ALL.includes(operator);
12
- const isSingleOperator = (operator) => SINGLE.includes(operator);
11
+ function isValidOperator(operator) {
12
+ return ALL.includes(operator);
13
+ }
14
+ function isSingleOperator(operator) {
15
+ return SINGLE.includes(operator);
16
+ }
13
17
  //#endregion
14
18
  export { isSingleOperator, isValidOperator };
15
19
 
@@ -1 +1 @@
1
- {"version":3,"file":"operator.js","names":[],"sources":["../../../../lib/modules/versioning/ruby/operator.ts"],"sourcesContent":["const EQUAL = '=';\nconst NOT_EQUAL = '!=';\n\nconst GT = '>';\nconst LT = '<';\n\nconst GTE = '>=';\nconst LTE = '<=';\nconst PGTE = '~>';\n\nconst SINGLE = [EQUAL];\nconst ALL = [EQUAL, NOT_EQUAL, GT, LT, GTE, LTE, PGTE];\n\nconst isValidOperator = (operator: string): boolean => ALL.includes(operator);\nconst isSingleOperator = (operator: string): boolean =>\n SINGLE.includes(operator);\n\nexport {\n EQUAL,\n GT,\n GTE,\n LT,\n LTE,\n NOT_EQUAL,\n PGTE,\n isSingleOperator,\n isValidOperator,\n};\n"],"mappings":"AAUA,MAAM,SAAS,CAAA,GAAM;AACrB,MAAM,MAAM;;;;;;;;AAAyC;AAErD,MAAM,mBAAmB,aAA8B,IAAI,SAAS,QAAQ;AAC5E,MAAM,oBAAoB,aACxB,OAAO,SAAS,QAAQ"}
1
+ {"version":3,"file":"operator.js","names":[],"sources":["../../../../lib/modules/versioning/ruby/operator.ts"],"sourcesContent":["const EQUAL = '=';\nconst NOT_EQUAL = '!=';\n\nconst GT = '>';\nconst LT = '<';\n\nconst GTE = '>=';\nconst LTE = '<=';\nconst PGTE = '~>';\n\nconst SINGLE = [EQUAL];\nconst ALL = [EQUAL, NOT_EQUAL, GT, LT, GTE, LTE, PGTE];\n\nfunction isValidOperator(operator: string): boolean {\n return ALL.includes(operator);\n}\nfunction isSingleOperator(operator: string): boolean {\n return SINGLE.includes(operator);\n}\n\nexport {\n EQUAL,\n GT,\n GTE,\n LT,\n LTE,\n NOT_EQUAL,\n PGTE,\n isSingleOperator,\n isValidOperator,\n};\n"],"mappings":"AAUA,MAAM,SAAS,CAAA,GAAM;AACrB,MAAM,MAAM;;;;;;;;AAAyC;AAErD,SAAS,gBAAgB,UAA2B;CAClD,OAAO,IAAI,SAAS,QAAQ;AAC9B;AACA,SAAS,iBAAiB,UAA2B;CACnD,OAAO,OAAO,SAAS,QAAQ;AACjC"}
@@ -4,7 +4,7 @@ import { satisfies } from "@renovatebot/ruby-semver";
4
4
  import { parse } from "@renovatebot/ruby-semver/dist/ruby/requirement.js";
5
5
  import { create } from "@renovatebot/ruby-semver/dist/ruby/version.js";
6
6
  //#region lib/modules/versioning/ruby/range.ts
7
- const parse$1 = (range) => {
7
+ function parse$1(range) {
8
8
  const regExp = regEx(/^(?<operator>[^\d\s]+)?(?<delimiter>\s*)(?<version>[0-9a-zA-Z-.]+)$/);
9
9
  const value = (range || "").trim();
10
10
  const match = regExp.exec(value);
@@ -21,7 +21,7 @@ const parse$1 = (range) => {
21
21
  operator: "",
22
22
  delimiter: " "
23
23
  };
24
- };
24
+ }
25
25
  /** Wrapper for {@link satisfies} for {@link Range} record. */
26
26
  function satisfiesRange(ver, range) {
27
27
  if (range.companion) return satisfies(ver, `${range.operator}${range.version}`) && satisfiesRange(ver, range.companion);
@@ -56,7 +56,7 @@ function stringifyRanges(ranges) {
56
56
  return `${r.operator}${r.delimiter}${r.version}`;
57
57
  }).join(", ");
58
58
  }
59
- const ltr = (version, range) => {
59
+ function ltr(version, range) {
60
60
  const gemVersion = create(version);
61
61
  if (!gemVersion) {
62
62
  logger.warn({ version }, `Invalid ruby version`);
@@ -77,7 +77,7 @@ const ltr = (version, range) => {
77
77
  return false;
78
78
  }
79
79
  }).reduce((accumulator, value) => accumulator && value, true);
80
- };
80
+ }
81
81
  //#endregion
82
82
  export { ltr, parse$1 as parse, parseRanges, satisfiesRange, stringifyRanges };
83
83
 
@@ -1 +1 @@
1
- {"version":3,"file":"range.js","names":["parse","_parse"],"sources":["../../../../lib/modules/versioning/ruby/range.ts"],"sourcesContent":["import { satisfies } from '@renovatebot/ruby-semver';\nimport { parse as _parse } from '@renovatebot/ruby-semver/dist/ruby/requirement.js';\nimport type { Version } from '@renovatebot/ruby-semver/dist/ruby/version.js';\nimport { create } from '@renovatebot/ruby-semver/dist/ruby/version.js';\nimport { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { EQUAL, GT, GTE, LT, LTE, NOT_EQUAL, PGTE } from './operator.ts';\n\nexport interface Range {\n version: string;\n operator: string;\n delimiter: string;\n /**\n * If the range is `~>` and immediately followed by `>=`,\n * the latter range is considered the former's companion\n * and assigned here instead of being an independent range.\n *\n * Example: `'~> 6.2', '>= 6.2.1'`\n */\n companion?: Range;\n}\n\nconst parse = (range: string): Range => {\n const regExp = regEx(\n /^(?<operator>[^\\d\\s]+)?(?<delimiter>\\s*)(?<version>[0-9a-zA-Z-.]+)$/,\n );\n\n const value = (range || '').trim();\n\n const match = regExp.exec(value);\n if (match?.groups) {\n const { version, operator = '', delimiter } = match.groups;\n return { version, operator, delimiter };\n }\n\n return {\n version: '',\n operator: '',\n delimiter: ' ',\n };\n};\n\n/** Wrapper for {@link satisfies} for {@link Range} record. */\nexport function satisfiesRange(ver: string, range: Range): boolean {\n if (range.companion) {\n return (\n satisfies(ver, `${range.operator}${range.version}`) &&\n satisfiesRange(ver, range.companion)\n );\n }\n return satisfies(ver, `${range.operator}${range.version}`);\n}\n\n/**\n * Parses a comma-delimited list of range parts,\n * with special treatment for a pair of `~>` and `>=` parts.\n */\nexport function parseRanges(range: string): Range[] {\n const originalRanges = range.split(',').map(parse);\n const ranges: Range[] = [];\n for (let i = 0; i < originalRanges.length; ) {\n if (\n i + 1 < originalRanges.length &&\n originalRanges[i].operator === PGTE &&\n originalRanges[i + 1].operator === GTE\n ) {\n ranges.push({\n ...originalRanges[i],\n companion: originalRanges[i + 1],\n });\n i += 2;\n } else {\n ranges.push(originalRanges[i]);\n i++;\n }\n }\n return ranges;\n}\n\n/**\n * Stringifies a list of range parts into a comma-separated string,\n * with special treatment for a pair of `~>` and `>=` parts.\n */\nexport function stringifyRanges(ranges: Range[]): string {\n return ranges\n .map((r) => {\n if (r.companion) {\n return `${r.operator}${r.delimiter}${r.version}, ${r.companion.operator}${r.companion.delimiter}${r.companion.version}`;\n }\n return `${r.operator}${r.delimiter}${r.version}`;\n })\n .join(', ');\n}\n\ntype GemRequirement = [string, Version];\n\nconst ltr = (version: string, range: string): boolean => {\n const gemVersion = create(version);\n if (!gemVersion) {\n logger.warn({ version }, `Invalid ruby version`);\n return false;\n }\n const requirements: GemRequirement[] = range.split(',').map(_parse);\n\n const results = requirements.map(([operator, ver]) => {\n switch (operator) {\n case GT:\n case LT:\n return gemVersion.compare(ver) <= 0;\n case GTE:\n case LTE:\n case EQUAL:\n case NOT_EQUAL:\n return gemVersion.compare(ver) < 0;\n case PGTE:\n return (\n gemVersion.compare(ver) < 0 &&\n gemVersion.release().compare(ver.bump()) <= 0\n );\n // istanbul ignore next\n default:\n logger.warn({ operator }, `Unsupported operator`);\n return false;\n }\n });\n\n return results.reduce((accumulator, value) => accumulator && value, true);\n};\n\nexport { ltr, parse };\n"],"mappings":";;;;;;AAsBA,MAAMA,WAAS,UAAyB;CACtC,MAAM,SAAS,MACb,qEACF;CAEA,MAAM,SAAS,SAAS,GAAA,CAAI,KAAK;CAEjC,MAAM,QAAQ,OAAO,KAAK,KAAK;CAC/B,IAAI,OAAO,QAAQ;EACjB,MAAM,EAAE,SAAS,WAAW,IAAI,cAAc,MAAM;EACpD,OAAO;GAAE;GAAS;GAAU;EAAU;CACxC;CAEA,OAAO;EACL,SAAS;EACT,UAAU;EACV,WAAW;CACb;AACF;;AAGA,SAAgB,eAAe,KAAa,OAAuB;CACjE,IAAI,MAAM,WACR,OACE,UAAU,KAAK,GAAG,MAAM,WAAW,MAAM,SAAS,KAClD,eAAe,KAAK,MAAM,SAAS;CAGvC,OAAO,UAAU,KAAK,GAAG,MAAM,WAAW,MAAM,SAAS;AAC3D;;;;;AAMA,SAAgB,YAAY,OAAwB;CAClD,MAAM,iBAAiB,MAAM,MAAM,GAAG,CAAC,CAAC,IAAIA,OAAK;CACjD,MAAM,SAAkB,CAAC;CACzB,KAAK,IAAI,IAAI,GAAG,IAAI,eAAe,SACjC,IACE,IAAI,IAAI,eAAe,UACvB,eAAe,EAAE,CAAC,aAAA,QAClB,eAAe,IAAI,EAAE,CAAC,aAAA,MACtB;EACA,OAAO,KAAK;GACV,GAAG,eAAe;GAClB,WAAW,eAAe,IAAI;EAChC,CAAC;EACD,KAAK;CACP,OAAO;EACL,OAAO,KAAK,eAAe,EAAE;EAC7B;CACF;CAEF,OAAO;AACT;;;;;AAMA,SAAgB,gBAAgB,QAAyB;CACvD,OAAO,OACJ,KAAK,MAAM;EACV,IAAI,EAAE,WACJ,OAAO,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,IAAI,EAAE,UAAU,WAAW,EAAE,UAAU,YAAY,EAAE,UAAU;EAEhH,OAAO,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE;CACzC,CAAC,CAAC,CACD,KAAK,IAAI;AACd;AAIA,MAAM,OAAO,SAAiB,UAA2B;CACvD,MAAM,aAAa,OAAO,OAAO;CACjC,IAAI,CAAC,YAAY;EACf,OAAO,KAAK,EAAE,QAAQ,GAAG,sBAAsB;EAC/C,OAAO;CACT;CAyBA,OAxBuC,MAAM,MAAM,GAAG,CAAC,CAAC,IAAIC,KAEjC,CAAC,CAAC,KAAK,CAAC,UAAU,SAAS;EACpD,QAAQ,UAAR;GACE,KAAA;GACA,KAAA,KACE,OAAO,WAAW,QAAQ,GAAG,KAAK;GACpC,KAAA;GACA,KAAA;GACA,KAAA;GACA,KAAA,MACE,OAAO,WAAW,QAAQ,GAAG,IAAI;GACnC,KAAA,MACE,OACE,WAAW,QAAQ,GAAG,IAAI,KAC1B,WAAW,QAAQ,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK;;GAGhD;IACE,OAAO,KAAK,EAAE,SAAS,GAAG,sBAAsB;IAChD,OAAO;EACX;CACF,CAEa,CAAC,CAAC,QAAQ,aAAa,UAAU,eAAe,OAAO,IAAI;AAC1E"}
1
+ {"version":3,"file":"range.js","names":["parse","_parse"],"sources":["../../../../lib/modules/versioning/ruby/range.ts"],"sourcesContent":["import { satisfies } from '@renovatebot/ruby-semver';\nimport { parse as _parse } from '@renovatebot/ruby-semver/dist/ruby/requirement.js';\nimport type { Version } from '@renovatebot/ruby-semver/dist/ruby/version.js';\nimport { create } from '@renovatebot/ruby-semver/dist/ruby/version.js';\nimport { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { EQUAL, GT, GTE, LT, LTE, NOT_EQUAL, PGTE } from './operator.ts';\n\nexport interface Range {\n version: string;\n operator: string;\n delimiter: string;\n /**\n * If the range is `~>` and immediately followed by `>=`,\n * the latter range is considered the former's companion\n * and assigned here instead of being an independent range.\n *\n * Example: `'~> 6.2', '>= 6.2.1'`\n */\n companion?: Range;\n}\n\nfunction parse(range: string): Range {\n const regExp = regEx(\n /^(?<operator>[^\\d\\s]+)?(?<delimiter>\\s*)(?<version>[0-9a-zA-Z-.]+)$/,\n );\n\n const value = (range || '').trim();\n\n const match = regExp.exec(value);\n if (match?.groups) {\n const { version, operator = '', delimiter } = match.groups;\n return { version, operator, delimiter };\n }\n\n return {\n version: '',\n operator: '',\n delimiter: ' ',\n };\n}\n\n/** Wrapper for {@link satisfies} for {@link Range} record. */\nexport function satisfiesRange(ver: string, range: Range): boolean {\n if (range.companion) {\n return (\n satisfies(ver, `${range.operator}${range.version}`) &&\n satisfiesRange(ver, range.companion)\n );\n }\n return satisfies(ver, `${range.operator}${range.version}`);\n}\n\n/**\n * Parses a comma-delimited list of range parts,\n * with special treatment for a pair of `~>` and `>=` parts.\n */\nexport function parseRanges(range: string): Range[] {\n const originalRanges = range.split(',').map(parse);\n const ranges: Range[] = [];\n for (let i = 0; i < originalRanges.length; ) {\n if (\n i + 1 < originalRanges.length &&\n originalRanges[i].operator === PGTE &&\n originalRanges[i + 1].operator === GTE\n ) {\n ranges.push({\n ...originalRanges[i],\n companion: originalRanges[i + 1],\n });\n i += 2;\n } else {\n ranges.push(originalRanges[i]);\n i++;\n }\n }\n return ranges;\n}\n\n/**\n * Stringifies a list of range parts into a comma-separated string,\n * with special treatment for a pair of `~>` and `>=` parts.\n */\nexport function stringifyRanges(ranges: Range[]): string {\n return ranges\n .map((r) => {\n if (r.companion) {\n return `${r.operator}${r.delimiter}${r.version}, ${r.companion.operator}${r.companion.delimiter}${r.companion.version}`;\n }\n return `${r.operator}${r.delimiter}${r.version}`;\n })\n .join(', ');\n}\n\ntype GemRequirement = [string, Version];\n\nfunction ltr(version: string, range: string): boolean {\n const gemVersion = create(version);\n if (!gemVersion) {\n logger.warn({ version }, `Invalid ruby version`);\n return false;\n }\n const requirements: GemRequirement[] = range.split(',').map(_parse);\n\n const results = requirements.map(([operator, ver]) => {\n switch (operator) {\n case GT:\n case LT:\n return gemVersion.compare(ver) <= 0;\n case GTE:\n case LTE:\n case EQUAL:\n case NOT_EQUAL:\n return gemVersion.compare(ver) < 0;\n case PGTE:\n return (\n gemVersion.compare(ver) < 0 &&\n gemVersion.release().compare(ver.bump()) <= 0\n );\n // istanbul ignore next\n default:\n logger.warn({ operator }, `Unsupported operator`);\n return false;\n }\n });\n\n return results.reduce((accumulator, value) => accumulator && value, true);\n}\n\nexport { ltr, parse };\n"],"mappings":";;;;;;AAsBA,SAASA,QAAM,OAAsB;CACnC,MAAM,SAAS,MACb,qEACF;CAEA,MAAM,SAAS,SAAS,GAAA,CAAI,KAAK;CAEjC,MAAM,QAAQ,OAAO,KAAK,KAAK;CAC/B,IAAI,OAAO,QAAQ;EACjB,MAAM,EAAE,SAAS,WAAW,IAAI,cAAc,MAAM;EACpD,OAAO;GAAE;GAAS;GAAU;EAAU;CACxC;CAEA,OAAO;EACL,SAAS;EACT,UAAU;EACV,WAAW;CACb;AACF;;AAGA,SAAgB,eAAe,KAAa,OAAuB;CACjE,IAAI,MAAM,WACR,OACE,UAAU,KAAK,GAAG,MAAM,WAAW,MAAM,SAAS,KAClD,eAAe,KAAK,MAAM,SAAS;CAGvC,OAAO,UAAU,KAAK,GAAG,MAAM,WAAW,MAAM,SAAS;AAC3D;;;;;AAMA,SAAgB,YAAY,OAAwB;CAClD,MAAM,iBAAiB,MAAM,MAAM,GAAG,CAAC,CAAC,IAAIA,OAAK;CACjD,MAAM,SAAkB,CAAC;CACzB,KAAK,IAAI,IAAI,GAAG,IAAI,eAAe,SACjC,IACE,IAAI,IAAI,eAAe,UACvB,eAAe,EAAE,CAAC,aAAA,QAClB,eAAe,IAAI,EAAE,CAAC,aAAA,MACtB;EACA,OAAO,KAAK;GACV,GAAG,eAAe;GAClB,WAAW,eAAe,IAAI;EAChC,CAAC;EACD,KAAK;CACP,OAAO;EACL,OAAO,KAAK,eAAe,EAAE;EAC7B;CACF;CAEF,OAAO;AACT;;;;;AAMA,SAAgB,gBAAgB,QAAyB;CACvD,OAAO,OACJ,KAAK,MAAM;EACV,IAAI,EAAE,WACJ,OAAO,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,IAAI,EAAE,UAAU,WAAW,EAAE,UAAU,YAAY,EAAE,UAAU;EAEhH,OAAO,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE;CACzC,CAAC,CAAC,CACD,KAAK,IAAI;AACd;AAIA,SAAS,IAAI,SAAiB,OAAwB;CACpD,MAAM,aAAa,OAAO,OAAO;CACjC,IAAI,CAAC,YAAY;EACf,OAAO,KAAK,EAAE,QAAQ,GAAG,sBAAsB;EAC/C,OAAO;CACT;CAyBA,OAxBuC,MAAM,MAAM,GAAG,CAAC,CAAC,IAAIC,KAEjC,CAAC,CAAC,KAAK,CAAC,UAAU,SAAS;EACpD,QAAQ,UAAR;GACE,KAAA;GACA,KAAA,KACE,OAAO,WAAW,QAAQ,GAAG,KAAK;GACpC,KAAA;GACA,KAAA;GACA,KAAA;GACA,KAAA,MACE,OAAO,WAAW,QAAQ,GAAG,IAAI;GACnC,KAAA,MACE,OACE,WAAW,QAAQ,GAAG,IAAI,KAC1B,WAAW,QAAQ,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK;;GAGhD;IACE,OAAO,KAAK,EAAE,SAAS,GAAG,sBAAsB;IAChD,OAAO;EACX;CACF,CAEa,CAAC,CAAC,QAAQ,aAAa,UAAU,eAAe,OAAO,IAAI;AAC1E"}
@@ -8,42 +8,52 @@ function releaseSegments(version) {
8
8
  /* istanbul ignore next */
9
9
  return [];
10
10
  }
11
- const parse = (version) => ({
12
- major: major(version),
13
- minor: minor(version),
14
- patch: patch(version),
15
- prerelease: prerelease(version)
16
- });
17
- const floor = (version) => {
11
+ function parse(version) {
12
+ return {
13
+ major: major(version),
14
+ minor: minor(version),
15
+ patch: patch(version),
16
+ prerelease: prerelease(version)
17
+ };
18
+ }
19
+ function floor(version) {
18
20
  const segments = releaseSegments(version);
19
21
  if (segments.length <= 1) return segments.join(".");
20
22
  return [...segments.slice(0, -1), 0].join(".");
21
- };
22
- const adapt = (left, right) => left.split(".").slice(0, right.split(".").length).join(".");
23
- const trimZeroes = (version) => {
23
+ }
24
+ function adapt(left, right) {
25
+ return left.split(".").slice(0, right.split(".").length).join(".");
26
+ }
27
+ function trimZeroes(version) {
24
28
  const segments = version.split(".");
25
29
  while (segments.length > 0 && segments.at(-1) === "0") segments.pop();
26
30
  return segments.join(".");
27
- };
28
- const pgteUpperBound = (version) => {
31
+ }
32
+ function pgteUpperBound(version) {
29
33
  const segments = releaseSegments(version);
30
34
  if (segments.length > 1) segments.pop();
31
35
  return incrementLastSegment(segments.join("."));
32
- };
36
+ }
33
37
  // istanbul ignore next
34
- const incrementLastSegment = (version) => {
38
+ function incrementLastSegment(version) {
35
39
  const segments = releaseSegments(version);
36
40
  const nextLast = parseInt(segments.pop(), 10) + 1;
37
41
  return [...segments, nextLast].join(".");
38
- };
42
+ }
39
43
  // istanbul ignore next
40
- const incrementMajor = (maj, min, ptch, pre) => min === 0 || ptch === 0 || pre.length === 0 ? maj + 1 : maj;
44
+ function incrementMajor(maj, min, ptch, pre) {
45
+ return min === 0 || ptch === 0 || pre.length === 0 ? maj + 1 : maj;
46
+ }
41
47
  // istanbul ignore next
42
- const incrementMinor = (min, ptch, pre) => ptch === 0 || pre.length === 0 ? min + 1 : min;
48
+ function incrementMinor(min, ptch, pre) {
49
+ return ptch === 0 || pre.length === 0 ? min + 1 : min;
50
+ }
43
51
  // istanbul ignore next
44
- const incrementPatch = (ptch, pre) => pre.length === 0 ? ptch + 1 : ptch;
52
+ function incrementPatch(ptch, pre) {
53
+ return pre.length === 0 ? ptch + 1 : ptch;
54
+ }
45
55
  // istanbul ignore next
46
- const increment = (from, to) => {
56
+ function increment(from, to) {
47
57
  const parsed = parse(from);
48
58
  const { major: maj, prerelease: pre } = parsed;
49
59
  let { minor: min, patch: ptch } = parsed;
@@ -52,7 +62,9 @@ const increment = (from, to) => {
52
62
  let nextVersion;
53
63
  const adapted = adapt(to, from);
54
64
  if (eq(from, adapted)) return incrementLastSegment(from);
55
- const isStable = (x) => regEx(/^[0-9.-/]+$/).test(x);
65
+ function isStable(x) {
66
+ return regEx(/^[0-9.-/]+$/).test(x);
67
+ }
56
68
  if (major(from) !== major(adapted)) nextVersion = [
57
69
  incrementMajor(maj, min, ptch, pre ?? []),
58
70
  0,
@@ -79,9 +91,9 @@ const increment = (from, to) => {
79
91
  ptch
80
92
  ].join(".");
81
93
  return increment(nextVersion, to);
82
- };
94
+ }
83
95
  // istanbul ignore next
84
- const decrement = (version) => {
96
+ function decrement(version) {
85
97
  return releaseSegments(version).reverse().reduce((accumulator, segment, index) => {
86
98
  if (index === 0) return [segment - 1];
87
99
  if (accumulator[index - 1] === -1) return [
@@ -91,7 +103,7 @@ const decrement = (version) => {
91
103
  ];
92
104
  return [...accumulator, segment];
93
105
  }, []).reverse().join(".");
94
- };
106
+ }
95
107
  //#endregion
96
108
  export { adapt, decrement, floor, increment, parse, pgteUpperBound, trimZeroes };
97
109
 
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","names":[],"sources":["../../../../lib/modules/versioning/ruby/version.ts"],"sourcesContent":["import { eq, major, minor, patch, prerelease } from '@renovatebot/ruby-semver';\nimport type { SegmentElement } from '@renovatebot/ruby-semver/dist/ruby/version.js';\nimport { create } from '@renovatebot/ruby-semver/dist/ruby/version.js';\nimport { regEx } from '../../../util/regex.ts';\n\ninterface RubyVersion {\n major: number;\n minor: number;\n patch: number;\n prerelease: string[] | null;\n}\n\nfunction releaseSegments(version: string): SegmentElement[] {\n const v = create(version);\n if (v) {\n return v.release().getSegments();\n }\n /* istanbul ignore next */\n return [];\n}\n\nconst parse = (version: string): RubyVersion => ({\n major: major(version),\n minor: minor(version),\n patch: patch(version),\n prerelease: prerelease(version),\n});\n\nconst floor = (version: string): string => {\n const segments = releaseSegments(version);\n if (segments.length <= 1) {\n // '~> 2' is equivalent to '~> 2.0', thus no need to floor\n return segments.join('.');\n }\n return [...segments.slice(0, -1), 0].join('.');\n};\n\nconst adapt = (left: string, right: string): string =>\n left.split('.').slice(0, right.split('.').length).join('.');\n\nconst trimZeroes = (version: string): string => {\n const segments = version.split('.');\n while (segments.length > 0 && segments.at(-1) === '0') {\n segments.pop();\n }\n return segments.join('.');\n};\n\n// Returns the upper bound of `~>` operator.\nconst pgteUpperBound = (version: string): string => {\n const segments = releaseSegments(version);\n if (segments.length > 1) {\n segments.pop();\n }\n return incrementLastSegment(segments.join('.'));\n};\n\n// istanbul ignore next\nconst incrementLastSegment = (version: string): string => {\n const segments = releaseSegments(version);\n const nextLast = parseInt(segments.pop() as string, 10) + 1;\n\n return [...segments, nextLast].join('.');\n};\n\n// istanbul ignore next\nconst incrementMajor = (\n maj: number,\n min: number,\n ptch: number,\n pre: string[],\n): number => (min === 0 || ptch === 0 || pre.length === 0 ? maj + 1 : maj);\n\n// istanbul ignore next\nconst incrementMinor = (min: number, ptch: number, pre: string[]): number =>\n ptch === 0 || pre.length === 0 ? min + 1 : min;\n\n// istanbul ignore next\nconst incrementPatch = (ptch: number, pre: string[]): number =>\n pre.length === 0 ? ptch + 1 : ptch;\n\n// istanbul ignore next\nconst increment = (from: string, to: string): string => {\n const parsed = parse(from);\n const { major: maj, prerelease: pre } = parsed;\n let { minor: min, patch: ptch } = parsed;\n min = min || 0;\n ptch = ptch || 0;\n\n let nextVersion: string;\n const adapted = adapt(to, from);\n if (eq(from, adapted)) {\n return incrementLastSegment(from);\n }\n\n const isStable = (x: string): boolean => regEx(/^[0-9.-/]+$/).test(x);\n if (major(from) !== major(adapted)) {\n nextVersion = [incrementMajor(maj, min, ptch, pre ?? []), 0, 0].join('.');\n } else if (minor(from) !== minor(adapted)) {\n nextVersion = [maj, incrementMinor(min, ptch, pre ?? []), 0].join('.');\n } else if (patch(from) !== patch(adapted)) {\n nextVersion = [maj, min, incrementPatch(ptch, pre ?? [])].join('.');\n } else if (isStable(from) && isStable(adapted)) {\n nextVersion = [maj, min, incrementPatch(ptch, pre ?? [])].join('.');\n } else {\n nextVersion = [maj, min, ptch].join('.');\n }\n\n return increment(nextVersion, to);\n};\n\n// istanbul ignore next\nconst decrement = (version: string): string => {\n const segments = releaseSegments(version);\n const nextSegments = segments\n .reverse()\n .reduce(\n (\n accumulator: number[],\n segment: SegmentElement,\n index: number,\n ): number[] => {\n if (index === 0) {\n return [(segment as number) - 1];\n }\n\n if (accumulator[index - 1] === -1) {\n return [\n ...accumulator.slice(0, index - 1),\n 0,\n (segment as number) - 1,\n ];\n }\n\n return [...accumulator, segment as number];\n },\n [],\n );\n\n return nextSegments.reverse().join('.');\n};\n\nexport {\n adapt,\n decrement,\n floor,\n increment,\n parse,\n pgteUpperBound,\n trimZeroes,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"version.js","names":[],"sources":["../../../../lib/modules/versioning/ruby/version.ts"],"sourcesContent":["import { eq, major, minor, patch, prerelease } from '@renovatebot/ruby-semver';\nimport type { SegmentElement } from '@renovatebot/ruby-semver/dist/ruby/version.js';\nimport { create } from '@renovatebot/ruby-semver/dist/ruby/version.js';\nimport { regEx } from '../../../util/regex.ts';\n\ninterface RubyVersion {\n major: number;\n minor: number;\n patch: number;\n prerelease: string[] | null;\n}\n\nfunction releaseSegments(version: string): SegmentElement[] {\n const v = create(version);\n if (v) {\n return v.release().getSegments();\n }\n /* istanbul ignore next */\n return [];\n}\n\nfunction parse(version: string): RubyVersion {\n return {\n major: major(version),\n minor: minor(version),\n patch: patch(version),\n prerelease: prerelease(version),\n };\n}\n\nfunction floor(version: string): string {\n const segments = releaseSegments(version);\n if (segments.length <= 1) {\n // '~> 2' is equivalent to '~> 2.0', thus no need to floor\n return segments.join('.');\n }\n return [...segments.slice(0, -1), 0].join('.');\n}\n\nfunction adapt(left: string, right: string): string {\n return left.split('.').slice(0, right.split('.').length).join('.');\n}\n\nfunction trimZeroes(version: string): string {\n const segments = version.split('.');\n while (segments.length > 0 && segments.at(-1) === '0') {\n segments.pop();\n }\n return segments.join('.');\n}\n\n// Returns the upper bound of `~>` operator.\nfunction pgteUpperBound(version: string): string {\n const segments = releaseSegments(version);\n if (segments.length > 1) {\n segments.pop();\n }\n return incrementLastSegment(segments.join('.'));\n}\n\n// istanbul ignore next\nfunction incrementLastSegment(version: string): string {\n const segments = releaseSegments(version);\n const nextLast = parseInt(segments.pop() as string, 10) + 1;\n\n return [...segments, nextLast].join('.');\n}\n\n// istanbul ignore next\nfunction incrementMajor(\n maj: number,\n min: number,\n ptch: number,\n pre: string[],\n): number {\n return min === 0 || ptch === 0 || pre.length === 0 ? maj + 1 : maj;\n}\n\n// istanbul ignore next\nfunction incrementMinor(min: number, ptch: number, pre: string[]): number {\n return ptch === 0 || pre.length === 0 ? min + 1 : min;\n}\n\n// istanbul ignore next\nfunction incrementPatch(ptch: number, pre: string[]): number {\n return pre.length === 0 ? ptch + 1 : ptch;\n}\n\n// istanbul ignore next\nfunction increment(from: string, to: string): string {\n const parsed = parse(from);\n const { major: maj, prerelease: pre } = parsed;\n let { minor: min, patch: ptch } = parsed;\n min = min || 0;\n ptch = ptch || 0;\n\n let nextVersion: string;\n const adapted = adapt(to, from);\n if (eq(from, adapted)) {\n return incrementLastSegment(from);\n }\n\n function isStable(x: string): boolean {\n return regEx(/^[0-9.-/]+$/).test(x);\n }\n if (major(from) !== major(adapted)) {\n nextVersion = [incrementMajor(maj, min, ptch, pre ?? []), 0, 0].join('.');\n } else if (minor(from) !== minor(adapted)) {\n nextVersion = [maj, incrementMinor(min, ptch, pre ?? []), 0].join('.');\n } else if (patch(from) !== patch(adapted)) {\n nextVersion = [maj, min, incrementPatch(ptch, pre ?? [])].join('.');\n } else if (isStable(from) && isStable(adapted)) {\n nextVersion = [maj, min, incrementPatch(ptch, pre ?? [])].join('.');\n } else {\n nextVersion = [maj, min, ptch].join('.');\n }\n\n return increment(nextVersion, to);\n}\n\n// istanbul ignore next\nfunction decrement(version: string): string {\n const segments = releaseSegments(version);\n const nextSegments = segments\n .reverse()\n .reduce(\n (\n accumulator: number[],\n segment: SegmentElement,\n index: number,\n ): number[] => {\n if (index === 0) {\n return [(segment as number) - 1];\n }\n\n if (accumulator[index - 1] === -1) {\n return [\n ...accumulator.slice(0, index - 1),\n 0,\n (segment as number) - 1,\n ];\n }\n\n return [...accumulator, segment as number];\n },\n [],\n );\n\n return nextSegments.reverse().join('.');\n}\n\nexport {\n adapt,\n decrement,\n floor,\n increment,\n parse,\n pgteUpperBound,\n trimZeroes,\n};\n"],"mappings":"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"}
@@ -4,7 +4,9 @@ import stable from "semver-stable";
4
4
  const id = "semver";
5
5
  const { is: isStable } = stable;
6
6
  const { compare: sortVersions, maxSatisfying: getSatisfyingVersion, minSatisfying: minSatisfyingVersion, major: getMajor, minor: getMinor, patch: getPatch, satisfies: matches, valid: valid$1, ltr: isLessThanRange, gt: isGreaterThan, eq: equals } = semver;
7
- const isVersion = (input) => !!valid$1(input);
7
+ function isVersion(input) {
8
+ return !!valid$1(input);
9
+ }
8
10
  function getNewValue({ currentValue, currentVersion, newVersion }) {
9
11
  if (currentVersion === `v${currentValue}`) return newVersion.replace(/^v/, "");
10
12
  return newVersion;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["valid"],"sources":["../../../../lib/modules/versioning/semver/index.ts"],"sourcesContent":["import semver from 'semver';\nimport stable from 'semver-stable';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\n\nexport const id = 'semver';\nexport const displayName = 'Semantic';\nexport const urls = ['[Semantic Versioning](https://semver.org/)'];\nexport const supportsRanges = false;\n\nconst { is: isStable } = stable;\n\nconst {\n compare: sortVersions,\n maxSatisfying: getSatisfyingVersion,\n minSatisfying: minSatisfyingVersion,\n major: getMajor,\n minor: getMinor,\n patch: getPatch,\n satisfies: matches,\n valid,\n ltr: isLessThanRange,\n gt: isGreaterThan,\n eq: equals,\n} = semver;\n\n// If this is left as an alias, inputs like \"17.04.0\" throw errors\nexport const isVersion = (input: string): boolean => !!valid(input);\n\nexport { getSatisfyingVersion, isVersion as isValid };\n\nfunction getNewValue({\n currentValue,\n currentVersion,\n newVersion,\n}: NewValueConfig): string {\n if (currentVersion === `v${currentValue}`) {\n return newVersion.replace(/^v/, '');\n }\n return newVersion;\n}\n\nexport function isBreaking(current: string, version: string): boolean {\n // The change may be breaking if either version is unstable\n if (!isStable(version) || !isStable(current)) {\n return true;\n }\n const currentMajor = getMajor(current);\n if (currentMajor === 0) {\n // All v0.x updates might be breaking\n return true;\n }\n // Otherwise, only major updates are breaking\n return currentMajor !== getMajor(version);\n}\n\nfunction isCompatible(version: string): boolean {\n return isVersion(version);\n}\n\nfunction isSingleVersion(version: string): boolean {\n return isVersion(version);\n}\n\nfunction isValid(input: string): boolean {\n return isVersion(input);\n}\n\nexport const api: VersioningApi = {\n equals,\n getMajor,\n getMinor,\n getPatch,\n isBreaking,\n isCompatible,\n isGreaterThan,\n isLessThanRange,\n isSingleVersion,\n isStable,\n isValid,\n isVersion,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n getNewValue,\n sortVersions,\n};\nexport default api;\n"],"mappings":";;;AAIA,MAAa,KAAK;AAKlB,MAAM,EAAE,IAAI,aAAa;AAEzB,MAAM,EACJ,SAAS,cACT,eAAe,sBACf,eAAe,sBACf,OAAO,UACP,OAAO,UACP,OAAO,UACP,WAAW,SACX,OAAA,SACA,KAAK,iBACL,IAAI,eACJ,IAAI,WACF;AAGJ,MAAa,aAAa,UAA2B,CAAC,CAACA,QAAM,KAAK;AAIlE,SAAS,YAAY,EACnB,cACA,gBACA,cACyB;CACzB,IAAI,mBAAmB,IAAI,gBACzB,OAAO,WAAW,QAAQ,MAAM,EAAE;CAEpC,OAAO;AACT;AAEA,SAAgB,WAAW,SAAiB,SAA0B;CAEpE,IAAI,CAAC,SAAS,OAAO,KAAK,CAAC,SAAS,OAAO,GACzC,OAAO;CAET,MAAM,eAAe,SAAS,OAAO;CACrC,IAAI,iBAAiB,GAEnB,OAAO;CAGT,OAAO,iBAAiB,SAAS,OAAO;AAC1C;AAEA,SAAS,aAAa,SAA0B;CAC9C,OAAO,UAAU,OAAO;AAC1B;AAEA,SAAS,gBAAgB,SAA0B;CACjD,OAAO,UAAU,OAAO;AAC1B;AAEA,SAAS,QAAQ,OAAwB;CACvC,OAAO,UAAU,KAAK;AACxB;AAEA,MAAa,MAAqB;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
1
+ {"version":3,"file":"index.js","names":["valid"],"sources":["../../../../lib/modules/versioning/semver/index.ts"],"sourcesContent":["import semver from 'semver';\nimport stable from 'semver-stable';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\n\nexport const id = 'semver';\nexport const displayName = 'Semantic';\nexport const urls = ['[Semantic Versioning](https://semver.org/)'];\nexport const supportsRanges = false;\n\nconst { is: isStable } = stable;\n\nconst {\n compare: sortVersions,\n maxSatisfying: getSatisfyingVersion,\n minSatisfying: minSatisfyingVersion,\n major: getMajor,\n minor: getMinor,\n patch: getPatch,\n satisfies: matches,\n valid,\n ltr: isLessThanRange,\n gt: isGreaterThan,\n eq: equals,\n} = semver;\n\n// If this is left as an alias, inputs like \"17.04.0\" throw errors\nexport function isVersion(input: string): boolean {\n return !!valid(input);\n}\n\nexport { getSatisfyingVersion, isVersion as isValid };\n\nfunction getNewValue({\n currentValue,\n currentVersion,\n newVersion,\n}: NewValueConfig): string {\n if (currentVersion === `v${currentValue}`) {\n return newVersion.replace(/^v/, '');\n }\n return newVersion;\n}\n\nexport function isBreaking(current: string, version: string): boolean {\n // The change may be breaking if either version is unstable\n if (!isStable(version) || !isStable(current)) {\n return true;\n }\n const currentMajor = getMajor(current);\n if (currentMajor === 0) {\n // All v0.x updates might be breaking\n return true;\n }\n // Otherwise, only major updates are breaking\n return currentMajor !== getMajor(version);\n}\n\nfunction isCompatible(version: string): boolean {\n return isVersion(version);\n}\n\nfunction isSingleVersion(version: string): boolean {\n return isVersion(version);\n}\n\nfunction isValid(input: string): boolean {\n return isVersion(input);\n}\n\nexport const api: VersioningApi = {\n equals,\n getMajor,\n getMinor,\n getPatch,\n isBreaking,\n isCompatible,\n isGreaterThan,\n isLessThanRange,\n isSingleVersion,\n isStable,\n isValid,\n isVersion,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n getNewValue,\n sortVersions,\n};\nexport default api;\n"],"mappings":";;;AAIA,MAAa,KAAK;AAKlB,MAAM,EAAE,IAAI,aAAa;AAEzB,MAAM,EACJ,SAAS,cACT,eAAe,sBACf,eAAe,sBACf,OAAO,UACP,OAAO,UACP,OAAO,UACP,WAAW,SACX,OAAA,SACA,KAAK,iBACL,IAAI,eACJ,IAAI,WACF;AAGJ,SAAgB,UAAU,OAAwB;CAChD,OAAO,CAAC,CAACA,QAAM,KAAK;AACtB;AAIA,SAAS,YAAY,EACnB,cACA,gBACA,cACyB;CACzB,IAAI,mBAAmB,IAAI,gBACzB,OAAO,WAAW,QAAQ,MAAM,EAAE;CAEpC,OAAO;AACT;AAEA,SAAgB,WAAW,SAAiB,SAA0B;CAEpE,IAAI,CAAC,SAAS,OAAO,KAAK,CAAC,SAAS,OAAO,GACzC,OAAO;CAET,MAAM,eAAe,SAAS,OAAO;CACrC,IAAI,iBAAiB,GAEnB,OAAO;CAGT,OAAO,iBAAiB,SAAS,OAAO;AAC1C;AAEA,SAAS,aAAa,SAA0B;CAC9C,OAAO,UAAU,OAAO;AAC1B;AAEA,SAAS,gBAAgB,SAA0B;CACjD,OAAO,UAAU,OAAO;AAC1B;AAEA,SAAS,QAAQ,OAAwB;CACvC,OAAO,UAAU,KAAK;AACxB;AAEA,MAAa,MAAqB;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
@@ -7,7 +7,7 @@ declare const displayName = "Coerced Semantic Versioning";
7
7
  declare const urls: string[];
8
8
  declare const supportsRanges = false;
9
9
  declare function getSatisfyingVersion(versions: string[], range: string): string | null;
10
- declare const isVersion: (input: string) => boolean;
10
+ declare function isVersion(input: string): boolean;
11
11
  declare const api: VersioningApi;
12
12
  //#endregion
13
13
  export { api, api as default, displayName, getSatisfyingVersion, id, index_d_exports, isVersion as isValid, isVersion, supportsRanges, urls };
@@ -81,7 +81,9 @@ function isSingleVersion(version) {
81
81
  if (!version.startsWith("v") && !startsWithNumberRegex.exec(version)) return false;
82
82
  return !!semver.valid(semver.coerce(version));
83
83
  }
84
- const isVersion = (input) => isValid(input);
84
+ function isVersion(input) {
85
+ return isValid(input);
86
+ }
85
87
  function getNewValue({ currentValue, currentVersion, newVersion }) {
86
88
  if (currentVersion === `v${currentValue}`) return newVersion.replace(/^v/, "");
87
89
  return newVersion;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["semverIsBreaking"],"sources":["../../../../lib/modules/versioning/semver-coerced/index.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport type { SemVer } from 'semver';\nimport semver from 'semver';\nimport stable from 'semver-stable';\nimport { regEx } from '../../../util/regex.ts';\nimport { isBreaking as semverIsBreaking } from '../semver/index.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\n\nexport const id = 'semver-coerced';\nexport const displayName = 'Coerced Semantic Versioning';\nexport const urls = ['[Semantic Versioning](https://semver.org/)'];\nexport const supportsRanges = false;\n\nfunction isStable(version: string): boolean {\n // matching a version with the semver prefix\n // v1.2.3, 1.2.3, v1.2, 1.2, v1, 1\n const regx = regEx(\n /^v?(?<major>\\d+)(?<minor>\\.\\d+)?(?<patch>\\.\\d+)?(?<others>.+)?/,\n );\n const m = regx.exec(version);\n\n if (!m?.groups) {\n return false;\n }\n\n const major = m.groups.major;\n const newMinor = m.groups.minor ?? '.0';\n const newPatch = m.groups.patch ?? '.0';\n const others = m.groups.others ?? '';\n const fixed = major + newMinor + newPatch + others;\n return stable.is(fixed);\n}\n\nfunction sortVersions(a: string, b: string): number {\n const aCoerced = semver.coerce(a);\n const bCoerced = semver.coerce(b);\n\n return aCoerced && bCoerced ? semver.compare(aCoerced, bCoerced) : 0;\n}\n\nfunction getMajor(a: string | SemVer): number | null {\n const aCoerced = semver.coerce(a);\n return aCoerced ? semver.major(aCoerced) : null;\n}\n\nfunction getMinor(a: string | SemVer): number | null {\n const aCoerced = semver.coerce(a);\n return aCoerced ? semver.minor(aCoerced) : null;\n}\n\nfunction getPatch(a: string | SemVer): number | null {\n const aCoerced = semver.coerce(a);\n return aCoerced ? semver.patch(aCoerced) : null;\n}\n\nfunction matches(version: string, range: string): boolean {\n const coercedVersion = semver.coerce(version);\n return coercedVersion ? semver.satisfies(coercedVersion, range) : false;\n}\n\nfunction equals(a: string, b: string): boolean {\n const aCoerced = semver.coerce(a);\n const bCoerced = semver.coerce(b);\n return aCoerced && bCoerced ? semver.eq(aCoerced, bCoerced) : false;\n}\n\nfunction isValid(version: string): boolean {\n return !!semver.valid(semver.coerce(version));\n}\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n const coercedVersions = versions\n .map((version) =>\n semver.valid(version) ? version : semver.coerce(version)?.version,\n )\n .filter(isString);\n\n return semver.maxSatisfying(coercedVersions, range);\n}\n\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n const coercedVersions = versions\n .map((version) => semver.coerce(version)?.version)\n .filter(isString);\n\n return semver.minSatisfying(coercedVersions, range);\n}\n\nfunction isLessThanRange(version: string, range: string): boolean {\n const coercedVersion = semver.coerce(version);\n return coercedVersion ? semver.ltr(coercedVersion, range) : false;\n}\n\nfunction isGreaterThan(version: string, other: string): boolean {\n const coercedVersion = semver.coerce(version);\n const coercedOther = semver.coerce(other);\n if (!coercedVersion || !coercedOther) {\n return false;\n }\n return semver.gt(coercedVersion, coercedOther);\n}\n\nconst startsWithNumberRegex = regEx(`^\\\\d`);\n\nfunction isSingleVersion(version: string): boolean {\n // Since coercion accepts ranges as well as versions, we have to manually\n // check that the version string starts with either 'v' or a digit.\n if (!version.startsWith('v') && !startsWithNumberRegex.exec(version)) {\n return false;\n }\n\n return !!semver.valid(semver.coerce(version));\n}\n\n// If this is left as an alias, inputs like \"17.04.0\" throw errors\nexport const isVersion = (input: string): boolean => isValid(input);\n\nexport { getSatisfyingVersion, isVersion as isValid };\n\nfunction getNewValue({\n currentValue,\n currentVersion,\n newVersion,\n}: NewValueConfig): string {\n if (currentVersion === `v${currentValue}`) {\n return newVersion.replace(/^v/, '');\n }\n return newVersion;\n}\n\nfunction isBreaking(version: string, current: string): boolean {\n const coercedVersion = semver.coerce(version)?.toString();\n const coercedCurrent = semver.coerce(current)?.toString();\n return !!(\n coercedVersion &&\n coercedCurrent &&\n semverIsBreaking(coercedVersion, coercedCurrent)\n );\n}\n\nfunction isCompatible(version: string): boolean {\n return isVersion(version);\n}\n\nexport const api: VersioningApi = {\n equals,\n getMajor,\n getMinor,\n getPatch,\n isBreaking,\n isCompatible,\n isGreaterThan,\n isLessThanRange,\n isSingleVersion,\n isStable,\n isValid,\n isVersion,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n getNewValue,\n sortVersions,\n};\nexport default api;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["semverIsBreaking"],"sources":["../../../../lib/modules/versioning/semver-coerced/index.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport type { SemVer } from 'semver';\nimport semver from 'semver';\nimport stable from 'semver-stable';\nimport { regEx } from '../../../util/regex.ts';\nimport { isBreaking as semverIsBreaking } from '../semver/index.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\n\nexport const id = 'semver-coerced';\nexport const displayName = 'Coerced Semantic Versioning';\nexport const urls = ['[Semantic Versioning](https://semver.org/)'];\nexport const supportsRanges = false;\n\nfunction isStable(version: string): boolean {\n // matching a version with the semver prefix\n // v1.2.3, 1.2.3, v1.2, 1.2, v1, 1\n const regx = regEx(\n /^v?(?<major>\\d+)(?<minor>\\.\\d+)?(?<patch>\\.\\d+)?(?<others>.+)?/,\n );\n const m = regx.exec(version);\n\n if (!m?.groups) {\n return false;\n }\n\n const major = m.groups.major;\n const newMinor = m.groups.minor ?? '.0';\n const newPatch = m.groups.patch ?? '.0';\n const others = m.groups.others ?? '';\n const fixed = major + newMinor + newPatch + others;\n return stable.is(fixed);\n}\n\nfunction sortVersions(a: string, b: string): number {\n const aCoerced = semver.coerce(a);\n const bCoerced = semver.coerce(b);\n\n return aCoerced && bCoerced ? semver.compare(aCoerced, bCoerced) : 0;\n}\n\nfunction getMajor(a: string | SemVer): number | null {\n const aCoerced = semver.coerce(a);\n return aCoerced ? semver.major(aCoerced) : null;\n}\n\nfunction getMinor(a: string | SemVer): number | null {\n const aCoerced = semver.coerce(a);\n return aCoerced ? semver.minor(aCoerced) : null;\n}\n\nfunction getPatch(a: string | SemVer): number | null {\n const aCoerced = semver.coerce(a);\n return aCoerced ? semver.patch(aCoerced) : null;\n}\n\nfunction matches(version: string, range: string): boolean {\n const coercedVersion = semver.coerce(version);\n return coercedVersion ? semver.satisfies(coercedVersion, range) : false;\n}\n\nfunction equals(a: string, b: string): boolean {\n const aCoerced = semver.coerce(a);\n const bCoerced = semver.coerce(b);\n return aCoerced && bCoerced ? semver.eq(aCoerced, bCoerced) : false;\n}\n\nfunction isValid(version: string): boolean {\n return !!semver.valid(semver.coerce(version));\n}\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n const coercedVersions = versions\n .map((version) =>\n semver.valid(version) ? version : semver.coerce(version)?.version,\n )\n .filter(isString);\n\n return semver.maxSatisfying(coercedVersions, range);\n}\n\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n const coercedVersions = versions\n .map((version) => semver.coerce(version)?.version)\n .filter(isString);\n\n return semver.minSatisfying(coercedVersions, range);\n}\n\nfunction isLessThanRange(version: string, range: string): boolean {\n const coercedVersion = semver.coerce(version);\n return coercedVersion ? semver.ltr(coercedVersion, range) : false;\n}\n\nfunction isGreaterThan(version: string, other: string): boolean {\n const coercedVersion = semver.coerce(version);\n const coercedOther = semver.coerce(other);\n if (!coercedVersion || !coercedOther) {\n return false;\n }\n return semver.gt(coercedVersion, coercedOther);\n}\n\nconst startsWithNumberRegex = regEx(`^\\\\d`);\n\nfunction isSingleVersion(version: string): boolean {\n // Since coercion accepts ranges as well as versions, we have to manually\n // check that the version string starts with either 'v' or a digit.\n if (!version.startsWith('v') && !startsWithNumberRegex.exec(version)) {\n return false;\n }\n\n return !!semver.valid(semver.coerce(version));\n}\n\n// If this is left as an alias, inputs like \"17.04.0\" throw errors\nexport function isVersion(input: string): boolean {\n return isValid(input);\n}\n\nexport { getSatisfyingVersion, isVersion as isValid };\n\nfunction getNewValue({\n currentValue,\n currentVersion,\n newVersion,\n}: NewValueConfig): string {\n if (currentVersion === `v${currentValue}`) {\n return newVersion.replace(/^v/, '');\n }\n return newVersion;\n}\n\nfunction isBreaking(version: string, current: string): boolean {\n const coercedVersion = semver.coerce(version)?.toString();\n const coercedCurrent = semver.coerce(current)?.toString();\n return !!(\n coercedVersion &&\n coercedCurrent &&\n semverIsBreaking(coercedVersion, coercedCurrent)\n );\n}\n\nfunction isCompatible(version: string): boolean {\n return isVersion(version);\n}\n\nexport const api: VersioningApi = {\n equals,\n getMajor,\n getMinor,\n getPatch,\n isBreaking,\n isCompatible,\n isGreaterThan,\n isLessThanRange,\n isSingleVersion,\n isStable,\n isValid,\n isVersion,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n getNewValue,\n sortVersions,\n};\nexport default api;\n"],"mappings":"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"}
@@ -6,8 +6,12 @@ import stable from "semver-stable";
6
6
  const id = "swift";
7
7
  const { is: isStable } = stable;
8
8
  const { compare: sortVersions, maxSatisfying, minSatisfying, major: getMajor, minor: getMinor, patch: getPatch, satisfies: satisfies$1, valid: valid$1, validRange, ltr, gt: isGreaterThan, eq: equals } = semver;
9
- const isValid = (input) => !!valid$1(input) || !!validRange(toSemverRange(input));
10
- const isVersion = (input) => !!valid$1(input);
9
+ function isValid(input) {
10
+ return !!valid$1(input) || !!validRange(toSemverRange(input));
11
+ }
12
+ function isVersion(input) {
13
+ return !!valid$1(input);
14
+ }
11
15
  function getSatisfyingVersion(versions, range) {
12
16
  const normalizedVersions = versions.map((v) => v.replace(regEx(/^v/), ""));
13
17
  const semverRange = toSemverRange(range);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["valid","satisfies"],"sources":["../../../../lib/modules/versioning/swift/index.ts"],"sourcesContent":["import semver from 'semver';\nimport stable from 'semver-stable';\nimport type { RangeStrategy } from '../../../types/versioning.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type { VersioningApi } from '../types.ts';\nimport { getNewValue, toSemverRange } from './range.ts';\n\nexport const id = 'swift';\nexport const displayName = 'Swift';\nexport const urls = [\n '[Swift Package Manager](https://swift.org/package-manager/)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = [\n 'bump',\n 'widen',\n 'replace',\n];\n\nconst { is: isStable } = stable;\n\nconst {\n compare: sortVersions,\n maxSatisfying,\n minSatisfying,\n major: getMajor,\n minor: getMinor,\n patch: getPatch,\n satisfies,\n valid,\n validRange,\n ltr,\n gt: isGreaterThan,\n eq: equals,\n} = semver;\n\nexport const isValid = (input: string): boolean =>\n !!valid(input) || !!validRange(toSemverRange(input));\n\nexport const isVersion = (input: string): boolean => !!valid(input);\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n const normalizedVersions = versions.map((v) => v.replace(regEx(/^v/), ''));\n const semverRange = toSemverRange(range);\n return semverRange ? maxSatisfying(normalizedVersions, semverRange) : null;\n}\n\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n const normalizedVersions = versions.map((v) => v.replace(regEx(/^v/), ''));\n const semverRange = toSemverRange(range);\n return semverRange ? minSatisfying(normalizedVersions, semverRange) : null;\n}\n\nfunction isLessThanRange(version: string, range: string): boolean {\n const semverRange = toSemverRange(range);\n return semverRange ? ltr(version, semverRange) : false;\n}\n\nfunction matches(version: string, range: string): boolean {\n // Check if both are an exact version\n if (isVersion(range) && equals(version, range)) {\n return true;\n }\n const semverRange = toSemverRange(range);\n return semverRange ? satisfies(version, semverRange) : false;\n}\n\nexport const api: VersioningApi = {\n equals,\n getMajor,\n getMinor,\n getNewValue,\n getPatch,\n isCompatible: isVersion,\n isGreaterThan,\n isLessThanRange,\n isSingleVersion: isVersion,\n isStable,\n isValid,\n isVersion,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n sortVersions,\n};\n\nexport default api;\n"],"mappings":";;;;;AAOA,MAAa,KAAK;AAYlB,MAAM,EAAE,IAAI,aAAa;AAEzB,MAAM,EACJ,SAAS,cACT,eACA,eACA,OAAO,UACP,OAAO,UACP,OAAO,UACP,WAAA,aACA,OAAA,SACA,YACA,KACA,IAAI,eACJ,IAAI,WACF;AAEJ,MAAa,WAAW,UACtB,CAAC,CAACA,QAAM,KAAK,KAAK,CAAC,CAAC,WAAW,cAAc,KAAK,CAAC;AAErD,MAAa,aAAa,UAA2B,CAAC,CAACA,QAAM,KAAK;AAElE,SAAS,qBACP,UACA,OACe;CACf,MAAM,qBAAqB,SAAS,KAAK,MAAM,EAAE,QAAQ,MAAM,IAAI,GAAG,EAAE,CAAC;CACzE,MAAM,cAAc,cAAc,KAAK;CACvC,OAAO,cAAc,cAAc,oBAAoB,WAAW,IAAI;AACxE;AAEA,SAAS,qBACP,UACA,OACe;CACf,MAAM,qBAAqB,SAAS,KAAK,MAAM,EAAE,QAAQ,MAAM,IAAI,GAAG,EAAE,CAAC;CACzE,MAAM,cAAc,cAAc,KAAK;CACvC,OAAO,cAAc,cAAc,oBAAoB,WAAW,IAAI;AACxE;AAEA,SAAS,gBAAgB,SAAiB,OAAwB;CAChE,MAAM,cAAc,cAAc,KAAK;CACvC,OAAO,cAAc,IAAI,SAAS,WAAW,IAAI;AACnD;AAEA,SAAS,QAAQ,SAAiB,OAAwB;CAExD,IAAI,UAAU,KAAK,KAAK,OAAO,SAAS,KAAK,GAC3C,OAAO;CAET,MAAM,cAAc,cAAc,KAAK;CACvC,OAAO,cAAcC,YAAU,SAAS,WAAW,IAAI;AACzD;AAEA,MAAa,MAAqB;CAChC;CACA;CACA;CACA;CACA;CACA,cAAc;CACd;CACA;CACA,iBAAiB;CACjB;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
1
+ {"version":3,"file":"index.js","names":["valid","satisfies"],"sources":["../../../../lib/modules/versioning/swift/index.ts"],"sourcesContent":["import semver from 'semver';\nimport stable from 'semver-stable';\nimport type { RangeStrategy } from '../../../types/versioning.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type { VersioningApi } from '../types.ts';\nimport { getNewValue, toSemverRange } from './range.ts';\n\nexport const id = 'swift';\nexport const displayName = 'Swift';\nexport const urls = [\n '[Swift Package Manager](https://swift.org/package-manager/)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = [\n 'bump',\n 'widen',\n 'replace',\n];\n\nconst { is: isStable } = stable;\n\nconst {\n compare: sortVersions,\n maxSatisfying,\n minSatisfying,\n major: getMajor,\n minor: getMinor,\n patch: getPatch,\n satisfies,\n valid,\n validRange,\n ltr,\n gt: isGreaterThan,\n eq: equals,\n} = semver;\n\nexport function isValid(input: string): boolean {\n return !!valid(input) || !!validRange(toSemverRange(input));\n}\n\nexport function isVersion(input: string): boolean {\n return !!valid(input);\n}\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n const normalizedVersions = versions.map((v) => v.replace(regEx(/^v/), ''));\n const semverRange = toSemverRange(range);\n return semverRange ? maxSatisfying(normalizedVersions, semverRange) : null;\n}\n\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n const normalizedVersions = versions.map((v) => v.replace(regEx(/^v/), ''));\n const semverRange = toSemverRange(range);\n return semverRange ? minSatisfying(normalizedVersions, semverRange) : null;\n}\n\nfunction isLessThanRange(version: string, range: string): boolean {\n const semverRange = toSemverRange(range);\n return semverRange ? ltr(version, semverRange) : false;\n}\n\nfunction matches(version: string, range: string): boolean {\n // Check if both are an exact version\n if (isVersion(range) && equals(version, range)) {\n return true;\n }\n const semverRange = toSemverRange(range);\n return semverRange ? satisfies(version, semverRange) : false;\n}\n\nexport const api: VersioningApi = {\n equals,\n getMajor,\n getMinor,\n getNewValue,\n getPatch,\n isCompatible: isVersion,\n isGreaterThan,\n isLessThanRange,\n isSingleVersion: isVersion,\n isStable,\n isValid,\n isVersion,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n sortVersions,\n};\n\nexport default api;\n"],"mappings":";;;;;AAOA,MAAa,KAAK;AAYlB,MAAM,EAAE,IAAI,aAAa;AAEzB,MAAM,EACJ,SAAS,cACT,eACA,eACA,OAAO,UACP,OAAO,UACP,OAAO,UACP,WAAA,aACA,OAAA,SACA,YACA,KACA,IAAI,eACJ,IAAI,WACF;AAEJ,SAAgB,QAAQ,OAAwB;CAC9C,OAAO,CAAC,CAACA,QAAM,KAAK,KAAK,CAAC,CAAC,WAAW,cAAc,KAAK,CAAC;AAC5D;AAEA,SAAgB,UAAU,OAAwB;CAChD,OAAO,CAAC,CAACA,QAAM,KAAK;AACtB;AAEA,SAAS,qBACP,UACA,OACe;CACf,MAAM,qBAAqB,SAAS,KAAK,MAAM,EAAE,QAAQ,MAAM,IAAI,GAAG,EAAE,CAAC;CACzE,MAAM,cAAc,cAAc,KAAK;CACvC,OAAO,cAAc,cAAc,oBAAoB,WAAW,IAAI;AACxE;AAEA,SAAS,qBACP,UACA,OACe;CACf,MAAM,qBAAqB,SAAS,KAAK,MAAM,EAAE,QAAQ,MAAM,IAAI,GAAG,EAAE,CAAC;CACzE,MAAM,cAAc,cAAc,KAAK;CACvC,OAAO,cAAc,cAAc,oBAAoB,WAAW,IAAI;AACxE;AAEA,SAAS,gBAAgB,SAAiB,OAAwB;CAChE,MAAM,cAAc,cAAc,KAAK;CACvC,OAAO,cAAc,IAAI,SAAS,WAAW,IAAI;AACnD;AAEA,SAAS,QAAQ,SAAiB,OAAwB;CAExD,IAAI,UAAU,KAAK,KAAK,OAAO,SAAS,KAAK,GAC3C,OAAO;CAET,MAAM,cAAc,cAAc,KAAK;CACvC,OAAO,cAAcC,YAAU,SAAS,WAAW,IAAI;AACzD;AAEA,MAAa,MAAqB;CAChC;CACA;CACA;CACA;CACA;CACA,cAAc;CACd;CACA;CACA,iBAAiB;CACjB;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
@@ -16,8 +16,10 @@ import { DateTime } from "luxon";
16
16
  async function withCache(options, fn) {
17
17
  const { namespace, key, ttlMinutes = 30, cacheable = true, fallback = false } = options;
18
18
  if (!(GlobalConfig.get("cachePrivatePackages") || cacheable)) return fn();
19
- let shouldCacheResult = (value) => true;
20
- if (options.shouldCacheResult) shouldCacheResult = options.shouldCacheResult;
19
+ function defaultShouldCacheResult(_value) {
20
+ return true;
21
+ }
22
+ const shouldCacheResult = options.shouldCacheResult ?? defaultShouldCacheResult;
21
23
  // istanbul ignore if -- TODO: add test #40625
22
24
  if (!namespace || !key) return fn();
23
25
  const cacheKey = `cache-decorator:${key}`;
@@ -1 +1 @@
1
- {"version":3,"file":"with-cache.js","names":["packageCache.get","packageCache.setWithRawTtl"],"sources":["../../../../lib/util/cache/package/with-cache.ts"],"sourcesContent":["import { isUndefined } from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { acquireLock } from '../../mutex.ts';\nimport * as packageCache from './index.ts';\nimport { resolveTtlValues } from './ttl.ts';\nimport type { CachedRecord, PackageCacheNamespace } from './types.ts';\n\ninterface CachedOptions {\n /**\n * The cache namespace.\n */\n namespace: PackageCacheNamespace;\n\n /**\n * The cache key.\n */\n key: string;\n\n /**\n * The TTL (or expiry) of the key in minutes.\n * @default 30\n */\n ttlMinutes?: number;\n\n /**\n * Whether caching is enabled for this call.\n * When false, the function is called directly without caching.\n * @default true\n */\n cacheable?: boolean;\n\n /**\n * Whether a cache result is safe to use and store for this call.\n * @default value !== undefined\n */\n shouldCacheResult?: (value: unknown) => boolean;\n\n /**\n * Enable extended hard TTL for graceful degradation.\n * When true and upstream errors occur, stale cached data is returned.\n * @default false\n */\n fallback?: boolean;\n}\n\n/**\n * Caches the result of an async function.\n *\n * @param options - Cache options\n * @param fn - The async function to cache\n * @returns The cached or fresh result\n */\nexport async function withCache<T>(\n options: CachedOptions,\n fn: () => T | Promise<T>,\n): Promise<T> {\n const {\n namespace,\n key,\n ttlMinutes = 30,\n cacheable = true,\n fallback = false,\n } = options;\n\n const cachePrivatePackages = GlobalConfig.get('cachePrivatePackages');\n const isCacheable = cachePrivatePackages || cacheable;\n if (!isCacheable) {\n return fn();\n }\n\n let shouldCacheResult = (value: unknown): boolean => true;\n if (options.shouldCacheResult) {\n shouldCacheResult = options.shouldCacheResult;\n }\n\n // istanbul ignore if -- TODO: add test #40625\n if (!namespace || !key) {\n return fn();\n }\n\n const cacheKey = `cache-decorator:${key}`;\n\n // prevent concurrent processing and cache writes\n const releaseLock = await acquireLock(cacheKey, namespace);\n\n try {\n const cachedRecord = await packageCache.get<CachedRecord>(\n namespace,\n cacheKey,\n );\n\n const { softTtlMinutes, hardTtlMinutes: resolvedHardTtl } =\n resolveTtlValues(namespace, ttlMinutes);\n\n // The separation between \"soft\" and \"hard\" TTL allows us to treat\n // data as obsolete according to the \"soft\" TTL while physically storing it\n // according to the \"hard\" TTL.\n //\n // This helps us return obsolete data in case of upstream server errors,\n // which is more useful than throwing exceptions ourselves.\n //\n // The `fallback` option controls whether this extended TTL behavior is used.\n // When false, the \"soft\" just equals the \"hard\" ttl.\n const hardTtlMinutes = fallback ? resolvedHardTtl : softTtlMinutes;\n\n let fallbackValue: unknown;\n if (cachedRecord && shouldCacheResult(cachedRecord.value)) {\n const now = DateTime.local();\n const cachedAt = DateTime.fromISO(cachedRecord.cachedAt);\n\n const softDeadline = cachedAt.plus({ minutes: softTtlMinutes });\n if (now < softDeadline) {\n return cachedRecord.value as T;\n }\n\n const hardDeadline = cachedAt.plus({ minutes: hardTtlMinutes });\n if (now < hardDeadline) {\n fallbackValue = cachedRecord.value;\n }\n }\n\n let newValue: T;\n try {\n newValue = await fn();\n } catch (err) {\n if (!isUndefined(fallbackValue)) {\n logger.debug(\n { err },\n 'Package cache: callback error, returning stale data',\n );\n return fallbackValue as T;\n }\n throw err;\n }\n\n if (!isUndefined(newValue) && shouldCacheResult(newValue)) {\n const newRecord: CachedRecord = {\n cachedAt: DateTime.local().toISO(),\n value: newValue,\n };\n await packageCache.setWithRawTtl(\n namespace,\n cacheKey,\n newRecord,\n hardTtlMinutes,\n );\n }\n\n return newValue;\n } finally {\n releaseLock();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAsDA,eAAsB,UACpB,SACA,IACY;CACZ,MAAM,EACJ,WACA,KACA,aAAa,IACb,YAAY,MACZ,WAAW,UACT;CAIJ,IAAI,EAFyB,aAAa,IAAI,sBACP,KAAK,YAE1C,OAAO,GAAG;CAGZ,IAAI,qBAAqB,UAA4B;CACrD,IAAI,QAAQ,mBACV,oBAAoB,QAAQ;;CAI9B,IAAI,CAAC,aAAa,CAAC,KACjB,OAAO,GAAG;CAGZ,MAAM,WAAW,mBAAmB;CAGpC,MAAM,cAAc,MAAM,YAAY,UAAU,SAAS;CAEzD,IAAI;EACF,MAAM,eAAe,MAAMA,IACzB,WACA,QACF;EAEA,MAAM,EAAE,gBAAgB,gBAAgB,oBACtC,iBAAiB,WAAW,UAAU;EAWxC,MAAM,iBAAiB,WAAW,kBAAkB;EAEpD,IAAI;EACJ,IAAI,gBAAgB,kBAAkB,aAAa,KAAK,GAAG;GACzD,MAAM,MAAM,SAAS,MAAM;GAC3B,MAAM,WAAW,SAAS,QAAQ,aAAa,QAAQ;GAGvD,IAAI,MADiB,SAAS,KAAK,EAAE,SAAS,eAAe,CACxC,GACnB,OAAO,aAAa;GAItB,IAAI,MADiB,SAAS,KAAK,EAAE,SAAS,eAAe,CACxC,GACnB,gBAAgB,aAAa;EAEjC;EAEA,IAAI;EACJ,IAAI;GACF,WAAW,MAAM,GAAG;EACtB,SAAS,KAAK;GACZ,IAAI,CAAC,YAAY,aAAa,GAAG;IAC/B,OAAO,MACL,EAAE,IAAI,GACN,qDACF;IACA,OAAO;GACT;GACA,MAAM;EACR;EAEA,IAAI,CAAC,YAAY,QAAQ,KAAK,kBAAkB,QAAQ,GAKtD,MAAMC,cACJ,WACA,UACA;GANA,UAAU,SAAS,MAAM,CAAC,CAAC,MAAM;GACjC,OAAO;EAKP,GACA,cACF;EAGF,OAAO;CACT,UAAU;EACR,YAAY;CACd;AACF"}
1
+ {"version":3,"file":"with-cache.js","names":["packageCache.get","packageCache.setWithRawTtl"],"sources":["../../../../lib/util/cache/package/with-cache.ts"],"sourcesContent":["import { isUndefined } from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { acquireLock } from '../../mutex.ts';\nimport * as packageCache from './index.ts';\nimport { resolveTtlValues } from './ttl.ts';\nimport type { CachedRecord, PackageCacheNamespace } from './types.ts';\n\ninterface CachedOptions {\n /**\n * The cache namespace.\n */\n namespace: PackageCacheNamespace;\n\n /**\n * The cache key.\n */\n key: string;\n\n /**\n * The TTL (or expiry) of the key in minutes.\n * @default 30\n */\n ttlMinutes?: number;\n\n /**\n * Whether caching is enabled for this call.\n * When false, the function is called directly without caching.\n * @default true\n */\n cacheable?: boolean;\n\n /**\n * Whether a cache result is safe to use and store for this call.\n * @default value !== undefined\n */\n shouldCacheResult?: (value: unknown) => boolean;\n\n /**\n * Enable extended hard TTL for graceful degradation.\n * When true and upstream errors occur, stale cached data is returned.\n * @default false\n */\n fallback?: boolean;\n}\n\n/**\n * Caches the result of an async function.\n *\n * @param options - Cache options\n * @param fn - The async function to cache\n * @returns The cached or fresh result\n */\nexport async function withCache<T>(\n options: CachedOptions,\n fn: () => T | Promise<T>,\n): Promise<T> {\n const {\n namespace,\n key,\n ttlMinutes = 30,\n cacheable = true,\n fallback = false,\n } = options;\n\n const cachePrivatePackages = GlobalConfig.get('cachePrivatePackages');\n const isCacheable = cachePrivatePackages || cacheable;\n if (!isCacheable) {\n return fn();\n }\n\n function defaultShouldCacheResult(_value: unknown): boolean {\n return true;\n }\n const shouldCacheResult =\n options.shouldCacheResult ?? defaultShouldCacheResult;\n\n // istanbul ignore if -- TODO: add test #40625\n if (!namespace || !key) {\n return fn();\n }\n\n const cacheKey = `cache-decorator:${key}`;\n\n // prevent concurrent processing and cache writes\n const releaseLock = await acquireLock(cacheKey, namespace);\n\n try {\n const cachedRecord = await packageCache.get<CachedRecord>(\n namespace,\n cacheKey,\n );\n\n const { softTtlMinutes, hardTtlMinutes: resolvedHardTtl } =\n resolveTtlValues(namespace, ttlMinutes);\n\n // The separation between \"soft\" and \"hard\" TTL allows us to treat\n // data as obsolete according to the \"soft\" TTL while physically storing it\n // according to the \"hard\" TTL.\n //\n // This helps us return obsolete data in case of upstream server errors,\n // which is more useful than throwing exceptions ourselves.\n //\n // The `fallback` option controls whether this extended TTL behavior is used.\n // When false, the \"soft\" just equals the \"hard\" ttl.\n const hardTtlMinutes = fallback ? resolvedHardTtl : softTtlMinutes;\n\n let fallbackValue: unknown;\n if (cachedRecord && shouldCacheResult(cachedRecord.value)) {\n const now = DateTime.local();\n const cachedAt = DateTime.fromISO(cachedRecord.cachedAt);\n\n const softDeadline = cachedAt.plus({ minutes: softTtlMinutes });\n if (now < softDeadline) {\n return cachedRecord.value as T;\n }\n\n const hardDeadline = cachedAt.plus({ minutes: hardTtlMinutes });\n if (now < hardDeadline) {\n fallbackValue = cachedRecord.value;\n }\n }\n\n let newValue: T;\n try {\n newValue = await fn();\n } catch (err) {\n if (!isUndefined(fallbackValue)) {\n logger.debug(\n { err },\n 'Package cache: callback error, returning stale data',\n );\n return fallbackValue as T;\n }\n throw err;\n }\n\n if (!isUndefined(newValue) && shouldCacheResult(newValue)) {\n const newRecord: CachedRecord = {\n cachedAt: DateTime.local().toISO(),\n value: newValue,\n };\n await packageCache.setWithRawTtl(\n namespace,\n cacheKey,\n newRecord,\n hardTtlMinutes,\n );\n }\n\n return newValue;\n } finally {\n releaseLock();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAsDA,eAAsB,UACpB,SACA,IACY;CACZ,MAAM,EACJ,WACA,KACA,aAAa,IACb,YAAY,MACZ,WAAW,UACT;CAIJ,IAAI,EAFyB,aAAa,IAAI,sBACP,KAAK,YAE1C,OAAO,GAAG;CAGZ,SAAS,yBAAyB,QAA0B;EAC1D,OAAO;CACT;CACA,MAAM,oBACJ,QAAQ,qBAAqB;;CAG/B,IAAI,CAAC,aAAa,CAAC,KACjB,OAAO,GAAG;CAGZ,MAAM,WAAW,mBAAmB;CAGpC,MAAM,cAAc,MAAM,YAAY,UAAU,SAAS;CAEzD,IAAI;EACF,MAAM,eAAe,MAAMA,IACzB,WACA,QACF;EAEA,MAAM,EAAE,gBAAgB,gBAAgB,oBACtC,iBAAiB,WAAW,UAAU;EAWxC,MAAM,iBAAiB,WAAW,kBAAkB;EAEpD,IAAI;EACJ,IAAI,gBAAgB,kBAAkB,aAAa,KAAK,GAAG;GACzD,MAAM,MAAM,SAAS,MAAM;GAC3B,MAAM,WAAW,SAAS,QAAQ,aAAa,QAAQ;GAGvD,IAAI,MADiB,SAAS,KAAK,EAAE,SAAS,eAAe,CACxC,GACnB,OAAO,aAAa;GAItB,IAAI,MADiB,SAAS,KAAK,EAAE,SAAS,eAAe,CACxC,GACnB,gBAAgB,aAAa;EAEjC;EAEA,IAAI;EACJ,IAAI;GACF,WAAW,MAAM,GAAG;EACtB,SAAS,KAAK;GACZ,IAAI,CAAC,YAAY,aAAa,GAAG;IAC/B,OAAO,MACL,EAAE,IAAI,GACN,qDACF;IACA,OAAO;GACT;GACA,MAAM;EACR;EAEA,IAAI,CAAC,YAAY,QAAQ,KAAK,kBAAkB,QAAQ,GAKtD,MAAMC,cACJ,WACA,UACA;GANA,UAAU,SAAS,MAAM,CAAC,CAAC,MAAM;GACjC,OAAO;EAKP,GACA,cACF;EAGF,OAAO;CACT,UAAU;EACR,YAAY;CACd;AACF"}
@@ -1,7 +1,7 @@
1
1
  import { CommandWithOptions, ExecResult, RawExecOptions } from "./types.js";
2
2
  //#region lib/util/exec/common.d.ts
3
3
  declare function exec(commandArgument: string | CommandWithOptions, opts: RawExecOptions): Promise<ExecResult>;
4
- declare const rawExec: (cmd: string | CommandWithOptions, opts: RawExecOptions) => Promise<ExecResult>;
4
+ declare function rawExec(cmd: string | CommandWithOptions, opts: RawExecOptions): Promise<ExecResult>;
5
5
  //#endregion
6
6
  export { exec, rawExec };
7
7
  //# sourceMappingURL=common.d.ts.map
@@ -147,7 +147,9 @@ function kill(cp, signal) {
147
147
  return false;
148
148
  }
149
149
  }
150
- const rawExec = (cmd, opts) => instrument(`rawExec: ${sanitize(asRawCommand(cmd))}`, () => exec(cmd, opts));
150
+ function rawExec(cmd, opts) {
151
+ return instrument(`rawExec: ${sanitize(asRawCommand(cmd))}`, () => exec(cmd, opts));
152
+ }
151
153
  //#endregion
152
154
  export { exec, rawExec };
153
155
 
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","names":[],"sources":["../../../lib/util/exec/common.ts"],"sourcesContent":["import type { ChildProcess } from 'node:child_process';\nimport type { Readable } from 'node:stream';\nimport { isNullOrUndefined } from '@sindresorhus/is';\nimport { execa } from 'execa';\nimport { join, split } from 'shlex';\nimport { instrument } from '../../instrumentation/index.ts';\nimport { logger } from '../../logger/index.ts';\nimport { getEnv } from '../env.ts';\nimport { sanitize } from '../sanitize.ts';\nimport type { ExecErrorData } from './exec-error.ts';\nimport { ExecError } from './exec-error.ts';\nimport type {\n CommandWithOptions,\n DataListener,\n ExecResult,\n RawExecOptions,\n} from './types.ts';\nimport { asRawCommand, isCommandWithOptions } from './utils.ts';\n\n// https://man7.org/linux/man-pages/man7/signal.7.html#NAME\n// Non TERM/CORE signals\n// The following is step 3. in https://github.com/renovatebot/renovate/issues/16197#issuecomment-1171423890\nconst NONTERM = [\n 'SIGCHLD',\n 'SIGCLD',\n 'SIGCONT',\n 'SIGSTOP',\n 'SIGTSTP',\n 'SIGTTIN',\n 'SIGTTOU',\n 'SIGURG',\n 'SIGWINCH',\n];\n\nconst encoding = 'utf8';\n\nfunction stringify(list: Buffer[]): string {\n return Buffer.concat(list).toString(encoding);\n}\n\nfunction initStreamListeners(\n cp: ChildProcess,\n opts: RawExecOptions & { maxBuffer: number },\n): [Buffer[], Buffer[]] {\n const stdout: Buffer[] = [];\n const stderr: Buffer[] = [];\n let stdoutLen = 0;\n let stderrLen = 0;\n\n registerDataListeners(cp.stdout, opts.outputListeners?.stdout);\n registerDataListeners(cp.stderr, opts.outputListeners?.stderr);\n\n cp.stdout?.on('data', (chunk: Buffer) => {\n // process.stdout.write(data.toString());\n const len = Buffer.byteLength(chunk, encoding);\n stdoutLen += len;\n if (stdoutLen > opts.maxBuffer) {\n cp.emit('error', new Error('stdout maxBuffer exceeded'));\n } else {\n stdout.push(chunk);\n }\n });\n\n cp.stderr?.on('data', (chunk: Buffer) => {\n // process.stderr.write(data.toString());\n const len = Buffer.byteLength(chunk, encoding);\n stderrLen += len;\n if (stderrLen > opts.maxBuffer) {\n cp.emit('error', new Error('stderr maxBuffer exceeded'));\n } else {\n stderr.push(chunk);\n }\n });\n return [stdout, stderr];\n}\n\nfunction registerDataListeners(\n readable: Readable | null,\n dataListeners: DataListener[] | undefined,\n): void {\n if (isNullOrUndefined(readable) || isNullOrUndefined(dataListeners)) {\n return;\n }\n\n for (const listener of dataListeners) {\n readable.on('data', listener);\n }\n}\n\nexport function exec(\n commandArgument: string | CommandWithOptions,\n opts: RawExecOptions,\n): Promise<ExecResult> {\n let theCmd = commandArgument;\n let ignoreFailure = false;\n if (isCommandWithOptions(commandArgument)) {\n theCmd = join(commandArgument.command);\n if (commandArgument.ignoreFailure !== undefined) {\n ignoreFailure = commandArgument.ignoreFailure;\n }\n }\n\n return new Promise((resolve, reject) => {\n let cmd = asRawCommand(theCmd);\n let args: string[] = [];\n const maxBuffer = opts.maxBuffer ?? 10 * 1024 * 1024; // Set default max buffer size to 10MB\n\n // don't use shell by default, as it leads to potential security issues\n let shell = opts.shell ?? false;\n if (\n isCommandWithOptions(commandArgument) &&\n commandArgument.shell !== undefined\n ) {\n shell = commandArgument.shell;\n }\n\n // if we're not in shell mode, we need to provide the command and arguments\n if (shell === false) {\n const parts = split(cmd);\n // v8 ignore else -- TODO: add test #40625\n if (parts) {\n cmd = parts[0];\n args = parts.slice(1);\n }\n }\n\n const cp = execa(cmd, args, {\n ...opts,\n // force detached on non WIN platforms\n // https://github.com/nodejs/node/issues/21825#issuecomment-611328888\n detached: process.platform !== 'win32',\n shell,\n extendEnv: false,\n });\n\n // handle streams\n const [stdout, stderr] = initStreamListeners(cp, {\n ...opts,\n maxBuffer,\n });\n\n // handle process events\n void cp.on('error', (error) => {\n kill(cp, 'SIGTERM');\n // rethrowing, use originally emitted error message\n reject(new ExecError(error.message, rejectInfo(), error));\n });\n\n void cp.on('exit', (code: number, signal: NodeJS.Signals) => {\n if (NONTERM.includes(signal)) {\n return;\n }\n if (signal) {\n kill(cp, signal);\n reject(\n new ExecError(\n `Command failed: ${cp.spawnargs.join(' ')}\\nInterrupted by ${signal}`,\n {\n ...rejectInfo(),\n signal,\n },\n ),\n );\n return;\n }\n if (code !== 0) {\n if (ignoreFailure === undefined || ignoreFailure === false) {\n reject(\n new ExecError(\n `Command failed: ${cp.spawnargs.join(' ')}\\n${stringify(stderr)}`,\n {\n ...rejectInfo(),\n exitCode: code,\n },\n ),\n );\n return;\n }\n\n logger.once.debug(\n {\n command: cp.spawnargs.join(' '),\n stdout: stringify(stdout),\n stderr: stringify(stderr),\n exitCode: code,\n },\n `Ignoring failure to execute comamnd \\`${cp.spawnargs.join(' ')}\\`, as ignoreFailure=true is set`,\n );\n\n resolve({\n stderr: stringify(stderr),\n stdout: stringify(stdout),\n exitCode: code,\n });\n return;\n }\n resolve({\n stderr: stringify(stderr),\n stdout: stringify(stdout),\n });\n });\n\n function rejectInfo(): ExecErrorData {\n return {\n cmd: cp.spawnargs.join(' '),\n options: opts,\n stdout: stringify(stdout),\n stderr: stringify(stderr),\n };\n }\n });\n}\n\nfunction kill(cp: ChildProcess, signal: NodeJS.Signals): boolean {\n try {\n if (cp.pid && getEnv().RENOVATE_X_EXEC_GPID_HANDLE) {\n /**\n * If `pid` is negative, but not `-1`, signal shall be sent to all processes\n * (excluding an unspecified set of system processes),\n * whose process group ID (pgid) is equal to the absolute value of pid,\n * and for which the process has permission to send a signal.\n */\n return process.kill(-cp.pid, signal);\n }\n // destroying stdio is needed for unref to work\n // https://nodejs.org/api/child_process.html#subprocessunref\n // https://github.com/nodejs/node/blob/4d5ff25a813fd18939c9f76b17e36291e3ea15c3/lib/child_process.js#L412-L426\n cp.stderr?.destroy();\n cp.stdout?.destroy();\n cp.unref();\n return cp.kill(signal);\n } catch {\n // cp is a single node tree, therefore -pid is invalid as there is no such pgid,\n return false;\n }\n}\n\nexport const rawExec: (\n cmd: string | CommandWithOptions,\n opts: RawExecOptions,\n) => Promise<ExecResult> = (\n cmd: string | CommandWithOptions,\n opts: RawExecOptions,\n) =>\n instrument(`rawExec: ${sanitize(asRawCommand(cmd))}`, () => exec(cmd, opts));\n"],"mappings":"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"}
1
+ {"version":3,"file":"common.js","names":[],"sources":["../../../lib/util/exec/common.ts"],"sourcesContent":["import type { ChildProcess } from 'node:child_process';\nimport type { Readable } from 'node:stream';\nimport { isNullOrUndefined } from '@sindresorhus/is';\nimport { execa } from 'execa';\nimport { join, split } from 'shlex';\nimport { instrument } from '../../instrumentation/index.ts';\nimport { logger } from '../../logger/index.ts';\nimport { getEnv } from '../env.ts';\nimport { sanitize } from '../sanitize.ts';\nimport type { ExecErrorData } from './exec-error.ts';\nimport { ExecError } from './exec-error.ts';\nimport type {\n CommandWithOptions,\n DataListener,\n ExecResult,\n RawExecOptions,\n} from './types.ts';\nimport { asRawCommand, isCommandWithOptions } from './utils.ts';\n\n// https://man7.org/linux/man-pages/man7/signal.7.html#NAME\n// Non TERM/CORE signals\n// The following is step 3. in https://github.com/renovatebot/renovate/issues/16197#issuecomment-1171423890\nconst NONTERM = [\n 'SIGCHLD',\n 'SIGCLD',\n 'SIGCONT',\n 'SIGSTOP',\n 'SIGTSTP',\n 'SIGTTIN',\n 'SIGTTOU',\n 'SIGURG',\n 'SIGWINCH',\n];\n\nconst encoding = 'utf8';\n\nfunction stringify(list: Buffer[]): string {\n return Buffer.concat(list).toString(encoding);\n}\n\nfunction initStreamListeners(\n cp: ChildProcess,\n opts: RawExecOptions & { maxBuffer: number },\n): [Buffer[], Buffer[]] {\n const stdout: Buffer[] = [];\n const stderr: Buffer[] = [];\n let stdoutLen = 0;\n let stderrLen = 0;\n\n registerDataListeners(cp.stdout, opts.outputListeners?.stdout);\n registerDataListeners(cp.stderr, opts.outputListeners?.stderr);\n\n cp.stdout?.on('data', (chunk: Buffer) => {\n // process.stdout.write(data.toString());\n const len = Buffer.byteLength(chunk, encoding);\n stdoutLen += len;\n if (stdoutLen > opts.maxBuffer) {\n cp.emit('error', new Error('stdout maxBuffer exceeded'));\n } else {\n stdout.push(chunk);\n }\n });\n\n cp.stderr?.on('data', (chunk: Buffer) => {\n // process.stderr.write(data.toString());\n const len = Buffer.byteLength(chunk, encoding);\n stderrLen += len;\n if (stderrLen > opts.maxBuffer) {\n cp.emit('error', new Error('stderr maxBuffer exceeded'));\n } else {\n stderr.push(chunk);\n }\n });\n return [stdout, stderr];\n}\n\nfunction registerDataListeners(\n readable: Readable | null,\n dataListeners: DataListener[] | undefined,\n): void {\n if (isNullOrUndefined(readable) || isNullOrUndefined(dataListeners)) {\n return;\n }\n\n for (const listener of dataListeners) {\n readable.on('data', listener);\n }\n}\n\nexport function exec(\n commandArgument: string | CommandWithOptions,\n opts: RawExecOptions,\n): Promise<ExecResult> {\n let theCmd = commandArgument;\n let ignoreFailure = false;\n if (isCommandWithOptions(commandArgument)) {\n theCmd = join(commandArgument.command);\n if (commandArgument.ignoreFailure !== undefined) {\n ignoreFailure = commandArgument.ignoreFailure;\n }\n }\n\n return new Promise((resolve, reject) => {\n let cmd = asRawCommand(theCmd);\n let args: string[] = [];\n const maxBuffer = opts.maxBuffer ?? 10 * 1024 * 1024; // Set default max buffer size to 10MB\n\n // don't use shell by default, as it leads to potential security issues\n let shell = opts.shell ?? false;\n if (\n isCommandWithOptions(commandArgument) &&\n commandArgument.shell !== undefined\n ) {\n shell = commandArgument.shell;\n }\n\n // if we're not in shell mode, we need to provide the command and arguments\n if (shell === false) {\n const parts = split(cmd);\n // v8 ignore else -- TODO: add test #40625\n if (parts) {\n cmd = parts[0];\n args = parts.slice(1);\n }\n }\n\n const cp = execa(cmd, args, {\n ...opts,\n // force detached on non WIN platforms\n // https://github.com/nodejs/node/issues/21825#issuecomment-611328888\n detached: process.platform !== 'win32',\n shell,\n extendEnv: false,\n });\n\n // handle streams\n const [stdout, stderr] = initStreamListeners(cp, {\n ...opts,\n maxBuffer,\n });\n\n // handle process events\n void cp.on('error', (error) => {\n kill(cp, 'SIGTERM');\n // rethrowing, use originally emitted error message\n reject(new ExecError(error.message, rejectInfo(), error));\n });\n\n void cp.on('exit', (code: number, signal: NodeJS.Signals) => {\n if (NONTERM.includes(signal)) {\n return;\n }\n if (signal) {\n kill(cp, signal);\n reject(\n new ExecError(\n `Command failed: ${cp.spawnargs.join(' ')}\\nInterrupted by ${signal}`,\n {\n ...rejectInfo(),\n signal,\n },\n ),\n );\n return;\n }\n if (code !== 0) {\n if (ignoreFailure === undefined || ignoreFailure === false) {\n reject(\n new ExecError(\n `Command failed: ${cp.spawnargs.join(' ')}\\n${stringify(stderr)}`,\n {\n ...rejectInfo(),\n exitCode: code,\n },\n ),\n );\n return;\n }\n\n logger.once.debug(\n {\n command: cp.spawnargs.join(' '),\n stdout: stringify(stdout),\n stderr: stringify(stderr),\n exitCode: code,\n },\n `Ignoring failure to execute comamnd \\`${cp.spawnargs.join(' ')}\\`, as ignoreFailure=true is set`,\n );\n\n resolve({\n stderr: stringify(stderr),\n stdout: stringify(stdout),\n exitCode: code,\n });\n return;\n }\n resolve({\n stderr: stringify(stderr),\n stdout: stringify(stdout),\n });\n });\n\n function rejectInfo(): ExecErrorData {\n return {\n cmd: cp.spawnargs.join(' '),\n options: opts,\n stdout: stringify(stdout),\n stderr: stringify(stderr),\n };\n }\n });\n}\n\nfunction kill(cp: ChildProcess, signal: NodeJS.Signals): boolean {\n try {\n if (cp.pid && getEnv().RENOVATE_X_EXEC_GPID_HANDLE) {\n /**\n * If `pid` is negative, but not `-1`, signal shall be sent to all processes\n * (excluding an unspecified set of system processes),\n * whose process group ID (pgid) is equal to the absolute value of pid,\n * and for which the process has permission to send a signal.\n */\n return process.kill(-cp.pid, signal);\n }\n // destroying stdio is needed for unref to work\n // https://nodejs.org/api/child_process.html#subprocessunref\n // https://github.com/nodejs/node/blob/4d5ff25a813fd18939c9f76b17e36291e3ea15c3/lib/child_process.js#L412-L426\n cp.stderr?.destroy();\n cp.stdout?.destroy();\n cp.unref();\n return cp.kill(signal);\n } catch {\n // cp is a single node tree, therefore -pid is invalid as there is no such pgid,\n return false;\n }\n}\n\nexport function rawExec(\n cmd: string | CommandWithOptions,\n opts: RawExecOptions,\n): Promise<ExecResult> {\n return instrument(`rawExec: ${sanitize(asRawCommand(cmd))}`, () =>\n exec(cmd, opts),\n );\n}\n"],"mappings":"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"}
@@ -365,10 +365,10 @@ const syncGit = withInstrumenting({ name: "syncGit" }, async () => {
365
365
  opts.push("--filter=blob:none");
366
366
  }
367
367
  if (config.extraCloneOpts) Object.entries(config.extraCloneOpts).forEach((e) => opts.push(e[0], `${e[1]}`));
368
- const emptyDirAndClone = async () => {
368
+ async function emptyDirAndClone() {
369
369
  await instrument(`fs.emptyDir(${localDir})`, () => fs.emptyDir(localDir));
370
370
  await git.clone(config.url, ".", opts);
371
- };
371
+ }
372
372
  await gitRetry(() => instrument("emptyDirAndClone", emptyDirAndClone));
373
373
  } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {
374
374
  logger.debug({ err }, "git clone error");