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.
- package/dist/config/options/index.js +1 -1
- package/dist/config/options/index.js.map +1 -1
- package/dist/config/presets/util.js +3 -1
- package/dist/config/presets/util.js.map +1 -1
- package/dist/global-config-option-defaults.generated.js +1 -1
- package/dist/global-config-option-defaults.generated.js.map +1 -1
- package/dist/logger/renovate-logger.js.map +1 -1
- package/dist/logger/with-sanitizer.js +2 -2
- package/dist/logger/with-sanitizer.js.map +1 -1
- package/dist/modules/datasource/docker/index.js +3 -1
- package/dist/modules/datasource/docker/index.js.map +1 -1
- package/dist/modules/datasource/index.d.ts +2 -2
- package/dist/modules/datasource/index.js +6 -2
- package/dist/modules/datasource/index.js.map +1 -1
- package/dist/modules/datasource/rubygems/metadata-cache.js +9 -7
- package/dist/modules/datasource/rubygems/metadata-cache.js.map +1 -1
- package/dist/modules/datasource/sbt-package/index.js +5 -3
- package/dist/modules/datasource/sbt-package/index.js.map +1 -1
- package/dist/modules/datasource/sbt-plugin/index.js +2 -2
- package/dist/modules/datasource/sbt-plugin/index.js.map +1 -1
- package/dist/modules/manager/bazel/artifacts.js +2 -2
- package/dist/modules/manager/bazel/artifacts.js.map +1 -1
- package/dist/modules/manager/custom/index.js.map +1 -1
- package/dist/modules/manager/deno/update.js +4 -2
- package/dist/modules/manager/deno/update.js.map +1 -1
- package/dist/modules/manager/deps-edn/parser.js +2 -2
- package/dist/modules/manager/deps-edn/parser.js.map +1 -1
- package/dist/modules/manager/fingerprint.generated.js +14 -14
- package/dist/modules/manager/fingerprint.generated.js.map +1 -1
- package/dist/modules/manager/gomod/artifacts.js +3 -1
- package/dist/modules/manager/gomod/artifacts.js.map +1 -1
- package/dist/modules/manager/gradle/parser/assignments.js +22 -18
- package/dist/modules/manager/gradle/parser/assignments.js.map +1 -1
- package/dist/modules/manager/gradle/parser/common.js +12 -8
- package/dist/modules/manager/gradle/parser/common.js.map +1 -1
- package/dist/modules/manager/gradle/parser/objects.js +11 -9
- package/dist/modules/manager/gradle/parser/objects.js.map +1 -1
- package/dist/modules/manager/gradle/parser/registry-urls.js +6 -6
- package/dist/modules/manager/gradle/parser/registry-urls.js.map +1 -1
- package/dist/modules/manager/index.d.ts +2 -2
- package/dist/modules/manager/index.js +6 -2
- package/dist/modules/manager/index.js.map +1 -1
- package/dist/modules/manager/leiningen/extract.js +8 -4
- package/dist/modules/manager/leiningen/extract.js.map +1 -1
- package/dist/modules/manager/maven/extract.js +13 -11
- package/dist/modules/manager/maven/extract.js.map +1 -1
- package/dist/modules/manager/npm/post-update/index.js +3 -1
- package/dist/modules/manager/npm/post-update/index.js.map +1 -1
- package/dist/modules/platform/azure/azure-helper.js +2 -2
- package/dist/modules/platform/azure/azure-helper.js.map +1 -1
- package/dist/modules/platform/bitbucket/comments.js +10 -4
- package/dist/modules/platform/bitbucket/comments.js.map +1 -1
- package/dist/modules/platform/bitbucket/index.js +3 -1
- package/dist/modules/platform/bitbucket/index.js.map +1 -1
- package/dist/modules/platform/bitbucket-server/index.js +13 -5
- package/dist/modules/platform/bitbucket-server/index.js.map +1 -1
- package/dist/modules/platform/forgejo/forgejo-helper.js +3 -1
- package/dist/modules/platform/forgejo/forgejo-helper.js.map +1 -1
- package/dist/modules/platform/gitea/gitea-helper.js +3 -1
- package/dist/modules/platform/gitea/gitea-helper.js.map +1 -1
- package/dist/modules/platform/github/index.js +10 -4
- package/dist/modules/platform/github/index.js.map +1 -1
- package/dist/modules/platform/github/massage-markdown-links.js +2 -2
- package/dist/modules/platform/github/massage-markdown-links.js.map +1 -1
- package/dist/modules/platform/gitlab/index.js +10 -4
- package/dist/modules/platform/gitlab/index.js.map +1 -1
- package/dist/modules/platform/index.d.ts +1 -1
- package/dist/modules/platform/index.js +3 -1
- package/dist/modules/platform/index.js.map +1 -1
- package/dist/modules/versioning/cargo/index.js +15 -5
- package/dist/modules/versioning/cargo/index.js.map +1 -1
- package/dist/modules/versioning/go-mod-directive/index.js +9 -3
- package/dist/modules/versioning/go-mod-directive/index.js.map +1 -1
- package/dist/modules/versioning/gradle/index.js +17 -15
- package/dist/modules/versioning/gradle/index.js.map +1 -1
- package/dist/modules/versioning/hex/index.js +6 -2
- package/dist/modules/versioning/hex/index.js.map +1 -1
- package/dist/modules/versioning/index.d.ts +2 -2
- package/dist/modules/versioning/index.js +6 -2
- package/dist/modules/versioning/index.js.map +1 -1
- package/dist/modules/versioning/maven/compare.js +5 -3
- package/dist/modules/versioning/maven/compare.js.map +1 -1
- package/dist/modules/versioning/maven/index.js +23 -17
- package/dist/modules/versioning/maven/index.js.map +1 -1
- package/dist/modules/versioning/npm/index.js +6 -2
- package/dist/modules/versioning/npm/index.js.map +1 -1
- package/dist/modules/versioning/pep440/index.js +5 -3
- package/dist/modules/versioning/pep440/index.js.map +1 -1
- package/dist/modules/versioning/ruby/index.js +39 -19
- package/dist/modules/versioning/ruby/index.js.map +1 -1
- package/dist/modules/versioning/ruby/operator.js +6 -2
- package/dist/modules/versioning/ruby/operator.js.map +1 -1
- package/dist/modules/versioning/ruby/range.js +4 -4
- package/dist/modules/versioning/ruby/range.js.map +1 -1
- package/dist/modules/versioning/ruby/version.js +35 -23
- package/dist/modules/versioning/ruby/version.js.map +1 -1
- package/dist/modules/versioning/semver/index.js +3 -1
- package/dist/modules/versioning/semver/index.js.map +1 -1
- package/dist/modules/versioning/semver-coerced/index.d.ts +1 -1
- package/dist/modules/versioning/semver-coerced/index.js +3 -1
- package/dist/modules/versioning/semver-coerced/index.js.map +1 -1
- package/dist/modules/versioning/swift/index.js +6 -2
- package/dist/modules/versioning/swift/index.js.map +1 -1
- package/dist/util/cache/package/with-cache.js +4 -2
- package/dist/util/cache/package/with-cache.js.map +1 -1
- package/dist/util/exec/common.d.ts +1 -1
- package/dist/util/exec/common.js +3 -1
- package/dist/util/exec/common.js.map +1 -1
- package/dist/util/git/index.js +2 -2
- package/dist/util/git/index.js.map +1 -1
- package/dist/util/http/bitbucket-server.js +2 -2
- package/dist/util/http/bitbucket-server.js.map +1 -1
- package/dist/util/http/forgejo.js +2 -2
- package/dist/util/http/forgejo.js.map +1 -1
- package/dist/util/http/gitea.js +2 -2
- package/dist/util/http/gitea.js.map +1 -1
- package/dist/util/http/github.d.ts +1 -1
- package/dist/util/http/github.js +2 -2
- package/dist/util/http/github.js.map +1 -1
- package/dist/util/http/gitlab.d.ts +1 -1
- package/dist/util/http/gitlab.js +2 -2
- package/dist/util/http/gitlab.js.map +1 -1
- package/dist/util/http/scm-manager.js +5 -3
- package/dist/util/http/scm-manager.js.map +1 -1
- package/dist/workers/repository/extract/index.js +2 -2
- package/dist/workers/repository/extract/index.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/source.js +3 -1
- package/dist/workers/repository/update/pr/changelog/source.js.map +1 -1
- package/dist/workers/repository/updates/flatten.js +3 -1
- package/dist/workers/repository/updates/flatten.js.map +1 -1
- package/dist/workers/repository/updates/generate.js +3 -1
- package/dist/workers/repository/updates/generate.js.map +1 -1
- package/package.json +2 -2
- 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\
|
|
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
|
-
|
|
12
|
-
|
|
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\
|
|
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
|
-
|
|
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
|
-
|
|
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\
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
23
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
48
|
+
function incrementMinor(min, ptch, pre) {
|
|
49
|
+
return ptch === 0 || pre.length === 0 ? min + 1 : min;
|
|
50
|
+
}
|
|
43
51
|
// istanbul ignore next
|
|
44
|
-
|
|
52
|
+
function incrementPatch(ptch, pre) {
|
|
53
|
+
return pre.length === 0 ? ptch + 1 : ptch;
|
|
54
|
+
}
|
|
45
55
|
// istanbul ignore next
|
|
46
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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\
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
10
|
-
|
|
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
|
|
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
|
-
|
|
20
|
-
|
|
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
|
|
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
|
|
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
|
package/dist/util/exec/common.js
CHANGED
|
@@ -147,7 +147,9 @@ function kill(cp, signal) {
|
|
|
147
147
|
return false;
|
|
148
148
|
}
|
|
149
149
|
}
|
|
150
|
-
|
|
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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"}
|
package/dist/util/git/index.js
CHANGED
|
@@ -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
|
-
|
|
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");
|