renovate 44.214.0 → 44.215.0
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/migrations/custom/constraints-migration.js +47 -0
- package/dist/config/migrations/custom/constraints-migration.js.map +1 -0
- package/dist/config/migrations/migrations-service.js +3 -1
- package/dist/config/migrations/migrations-service.js.map +1 -1
- package/dist/modules/manager/mix/artifacts.js +1 -1
- package/dist/modules/manager/mix/artifacts.js.map +1 -1
- package/dist/util/exec/containerbase.js +2 -2
- package/dist/util/exec/containerbase.js.map +1 -1
- package/package.json +1 -1
- package/renovate-schema.json +2 -2
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { regEx } from "../../../util/regex.js";
|
|
2
|
+
import { AbstractMigration } from "../base/abstract-migration.js";
|
|
3
|
+
import { isPlainObject, isString } from "@sindresorhus/is";
|
|
4
|
+
// lib/config/migrations/custom/constraints-migration.ts
|
|
5
|
+
const comparatorPattern = regEx(/(?<lead>^|[^<>=~^])(?<operator>==|=|\^|~>|~)\s*(?<prefix>[vV]?)(?<release>\d+(?:\.\d+)*)(?:\.[xX*](?:\.(?:\d+|[xX*]))*)?(?<suffix>[-+][0-9A-Za-z.+-]*)?/g);
|
|
6
|
+
/**
|
|
7
|
+
* Returns `>=version <next`, where `next` is the release cut after `index` with that part raised by one.
|
|
8
|
+
*/
|
|
9
|
+
function toRange(version, prefix, parts, index) {
|
|
10
|
+
const next = parts.slice(0, index + 1);
|
|
11
|
+
next[index] = (BigInt(next[index]) + 1n).toString();
|
|
12
|
+
return `>=${version} <${prefix}${next.join(".")}`;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Rewrites one npm `=`, `==`, `^`, `~` or `~>` comparator to comparators or a bare
|
|
16
|
+
* version with the same meaning.
|
|
17
|
+
*/
|
|
18
|
+
function migrateComparator(operator, prefix, release, suffix) {
|
|
19
|
+
const version = `${prefix}${release}${suffix}`;
|
|
20
|
+
const parts = release.split(".");
|
|
21
|
+
if (operator.startsWith("=")) return version;
|
|
22
|
+
if (operator === "^") {
|
|
23
|
+
if (parts.length === 1) return version;
|
|
24
|
+
const nonZero = parts.findIndex((part) => BigInt(part) !== 0n);
|
|
25
|
+
return toRange(version, prefix, parts, nonZero === -1 ? parts.length - 1 : nonZero);
|
|
26
|
+
}
|
|
27
|
+
if (parts.length < 3) return version;
|
|
28
|
+
return toRange(version, prefix, parts, 1);
|
|
29
|
+
}
|
|
30
|
+
var ConstraintsMigration = class extends AbstractMigration {
|
|
31
|
+
propertyName = "constraints";
|
|
32
|
+
run(value) {
|
|
33
|
+
if (!isPlainObject(value)) return;
|
|
34
|
+
const { erlang } = value;
|
|
35
|
+
if (!isString(erlang)) return;
|
|
36
|
+
this.rewrite({
|
|
37
|
+
...value,
|
|
38
|
+
erlang: erlang.replace(comparatorPattern, (...args) => {
|
|
39
|
+
const { lead, operator, prefix, release, suffix = "" } = args.at(-1);
|
|
40
|
+
return `${lead}${migrateComparator(operator, prefix, release, suffix)}`;
|
|
41
|
+
})
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
export { ConstraintsMigration };
|
|
46
|
+
|
|
47
|
+
//# sourceMappingURL=constraints-migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constraints-migration.js","names":[],"sources":["../../../../lib/config/migrations/custom/constraints-migration.ts"],"sourcesContent":["import { isPlainObject, isString } from '@sindresorhus/is';\nimport { regEx } from '../../../util/regex.ts';\nimport { AbstractMigration } from '../base/abstract-migration.ts';\n\nconst comparatorPattern = regEx(\n /(?<lead>^|[^<>=~^])(?<operator>==|=|\\^|~>|~)\\s*(?<prefix>[vV]?)(?<release>\\d+(?:\\.\\d+)*)(?:\\.[xX*](?:\\.(?:\\d+|[xX*]))*)?(?<suffix>[-+][0-9A-Za-z.+-]*)?/g,\n);\n\n/**\n * Returns `>=version <next`, where `next` is the release cut after `index` with that part raised by one.\n */\nfunction toRange(\n version: string,\n prefix: string,\n parts: string[],\n index: number,\n): string {\n const next = parts.slice(0, index + 1);\n next[index] = (BigInt(next[index]) + 1n).toString();\n return `>=${version} <${prefix}${next.join('.')}`;\n}\n\n/**\n * Rewrites one npm `=`, `==`, `^`, `~` or `~>` comparator to comparators or a bare\n * version with the same meaning.\n */\nfunction migrateComparator(\n operator: string,\n prefix: string,\n release: string,\n suffix: string,\n): string {\n const version = `${prefix}${release}${suffix}`;\n const parts = release.split('.');\n if (operator.startsWith('=')) {\n return version;\n }\n if (operator === '^') {\n if (parts.length === 1) {\n return version;\n }\n const nonZero = parts.findIndex((part) => BigInt(part) !== 0n);\n return toRange(\n version,\n prefix,\n parts,\n nonZero === -1 ? parts.length - 1 : nonZero,\n );\n }\n if (parts.length < 3) {\n return version;\n }\n return toRange(version, prefix, parts, 1);\n}\n\nexport class ConstraintsMigration extends AbstractMigration {\n override readonly propertyName = 'constraints';\n\n override run(value: unknown): void {\n if (!isPlainObject(value)) {\n return;\n }\n const { erlang } = value;\n if (!isString(erlang)) {\n return;\n }\n this.rewrite({\n ...value,\n erlang: erlang.replace(comparatorPattern, (...args: unknown[]) => {\n const {\n lead,\n operator,\n prefix,\n release,\n suffix = '',\n } = args.at(-1) as Record<string, string | undefined>;\n return `${lead}${migrateComparator(operator!, prefix!, release!, suffix)}`;\n }),\n });\n }\n}\n"],"mappings":";;;;AAIA,MAAM,oBAAoB,MACxB,0JACF;;;;AAKA,SAAS,QACP,SACA,QACA,OACA,OACQ;CACR,MAAM,OAAO,MAAM,MAAM,GAAG,QAAQ,CAAC;CACrC,KAAK,UAAU,OAAO,KAAK,MAAM,IAAI,GAAA,CAAI,SAAS;CAClD,OAAO,KAAK,QAAQ,IAAI,SAAS,KAAK,KAAK,GAAG;AAChD;;;;;AAMA,SAAS,kBACP,UACA,QACA,SACA,QACQ;CACR,MAAM,UAAU,GAAG,SAAS,UAAU;CACtC,MAAM,QAAQ,QAAQ,MAAM,GAAG;CAC/B,IAAI,SAAS,WAAW,GAAG,GACzB,OAAO;CAET,IAAI,aAAa,KAAK;EACpB,IAAI,MAAM,WAAW,GACnB,OAAO;EAET,MAAM,UAAU,MAAM,WAAW,SAAS,OAAO,IAAI,MAAM,EAAE;EAC7D,OAAO,QACL,SACA,QACA,OACA,YAAY,KAAK,MAAM,SAAS,IAAI,OACtC;CACF;CACA,IAAI,MAAM,SAAS,GACjB,OAAO;CAET,OAAO,QAAQ,SAAS,QAAQ,OAAO,CAAC;AAC1C;AAEA,IAAa,uBAAb,cAA0C,kBAAkB;CAC1D,eAAiC;CAEjC,IAAa,OAAsB;EACjC,IAAI,CAAC,cAAc,KAAK,GACtB;EAEF,MAAM,EAAE,WAAW;EACnB,IAAI,CAAC,SAAS,MAAM,GAClB;EAEF,KAAK,QAAQ;GACX,GAAG;GACH,QAAQ,OAAO,QAAQ,oBAAoB,GAAG,SAAoB;IAChE,MAAM,EACJ,MACA,UACA,QACA,SACA,SAAS,OACP,KAAK,GAAG,EAAE;IACd,OAAO,GAAG,OAAO,kBAAkB,UAAW,QAAS,SAAU,MAAM;GACzE,CAAC;EACH,CAAC;CACH;AACF"}
|
|
@@ -12,6 +12,7 @@ import { BranchNameMigration } from "./custom/branch-name-migration.js";
|
|
|
12
12
|
import { BranchPrefixMigration } from "./custom/branch-prefix-migration.js";
|
|
13
13
|
import { CompatibilityMigration } from "./custom/compatibility-migration.js";
|
|
14
14
|
import { ComposerIgnorePlatformReqsMigration } from "./custom/composer-ignore-platform-reqs-migration.js";
|
|
15
|
+
import { ConstraintsMigration } from "./custom/constraints-migration.js";
|
|
15
16
|
import { CustomManagersMigration } from "./custom/custom-managers-migration.js";
|
|
16
17
|
import { DatasourceMigration } from "./custom/datasource-migration.js";
|
|
17
18
|
import { DepTypesMigration } from "./custom/dep-types-migration.js";
|
|
@@ -164,7 +165,8 @@ var MigrationsService = class MigrationsService {
|
|
|
164
165
|
CustomManagersMigration,
|
|
165
166
|
PlatformCommitMigration,
|
|
166
167
|
FileMatchMigration,
|
|
167
|
-
UpdateLockFilesMigration
|
|
168
|
+
UpdateLockFilesMigration,
|
|
169
|
+
ConstraintsMigration
|
|
168
170
|
];
|
|
169
171
|
static run(originalConfig, parentKey) {
|
|
170
172
|
const migratedConfig = {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations-service.js","names":[],"sources":["../../../lib/config/migrations/migrations-service.ts"],"sourcesContent":["import { isRegExp } from '@sindresorhus/is';\nimport { dequal } from 'dequal';\nimport type { RenovateConfig } from '../types.ts';\nimport { RemovePropertyMigration } from './base/remove-property-migration.ts';\nimport { RenamePropertyMigration } from './base/rename-property-migration.ts';\nimport { AutomergeMajorMigration } from './custom/automerge-major-migration.ts';\nimport { AutomergeMigration } from './custom/automerge-migration.ts';\nimport { AutomergeMinorMigration } from './custom/automerge-minor-migration.ts';\nimport { AutomergePatchMigration } from './custom/automerge-patch-migration.ts';\nimport { AutomergeTypeMigration } from './custom/automerge-type-migration.ts';\nimport { AzureGitLabAutomergeMigration } from './custom/azure-gitlab-automerge-migration.ts';\nimport { BaseBranchMigration } from './custom/base-branch-migration.ts';\nimport { BinarySourceMigration } from './custom/binary-source-migration.ts';\nimport { BranchNameMigration } from './custom/branch-name-migration.ts';\nimport { BranchPrefixMigration } from './custom/branch-prefix-migration.ts';\nimport { CompatibilityMigration } from './custom/compatibility-migration.ts';\nimport { ComposerIgnorePlatformReqsMigration } from './custom/composer-ignore-platform-reqs-migration.ts';\nimport { CustomManagersMigration } from './custom/custom-managers-migration.ts';\nimport { DatasourceMigration } from './custom/datasource-migration.ts';\nimport { DepTypesMigration } from './custom/dep-types-migration.ts';\nimport { DryRunMigration } from './custom/dry-run-migration.ts';\nimport { EnabledManagersMigration } from './custom/enabled-managers-migration.ts';\nimport { ExtendsMigration } from './custom/extends-migration.ts';\nimport { FetchReleaseNotesMigration } from './custom/fetch-release-notes-migration.ts';\nimport { FileMatchMigration } from './custom/file-match-migration.ts';\nimport { GoModTidyMigration } from './custom/go-mod-tidy-migration.ts';\nimport { HostRulesMigration } from './custom/host-rules-migration.ts';\nimport { IgnoreNodeModulesMigration } from './custom/ignore-node-modules-migration.ts';\nimport { IgnoreNpmrcFileMigration } from './custom/ignore-npmrc-file-migration.ts';\nimport { IncludeForksMigration } from './custom/include-forks-migration.ts';\nimport { MatchDatasourcesMigration } from './custom/match-datasources-migration.ts';\nimport { MatchManagersMigration } from './custom/match-managers-migration.ts';\nimport { MatchStringsMigration } from './custom/match-strings-migration.ts';\nimport { NodeMigration } from './custom/node-migration.ts';\nimport { PackageFilesMigration } from './custom/package-files-migration.ts';\nimport { PackageNameMigration } from './custom/package-name-migration.ts';\nimport { PackagePatternMigration } from './custom/package-pattern-migration.ts';\nimport { PackageRulesMigration } from './custom/package-rules-migration.ts';\nimport { PackagesMigration } from './custom/packages-migration.ts';\nimport { PathRulesMigration } from './custom/path-rules-migration.ts';\nimport { PinVersionsMigration } from './custom/pin-versions-migration.ts';\nimport { PlatformCommitMigration } from './custom/platform-commit-migration.ts';\nimport { PostUpdateOptionsMigration } from './custom/post-update-options-migration.ts';\nimport { RebaseConflictedPrs } from './custom/rebase-conflicted-prs-migration.ts';\nimport { RebaseStalePrsMigration } from './custom/rebase-stale-prs-migration.ts';\nimport { RecreateClosedMigration } from './custom/recreate-closed-migration.ts';\nimport { RenovateForkMigration } from './custom/renovate-fork-migration.ts';\nimport { RequireConfigMigration } from './custom/require-config-migration.ts';\nimport { RequiredStatusChecksMigration } from './custom/required-status-checks-migration.ts';\nimport { ScheduleMigration } from './custom/schedule-migration.ts';\nimport { SemanticCommitsMigration } from './custom/semantic-commits-migration.ts';\nimport { SemanticPrefixMigration } from './custom/semantic-prefix-migration.ts';\nimport { SeparateMajorReleasesMigration } from './custom/separate-major-release-migration.ts';\nimport { SeparateMultipleMajorMigration } from './custom/separate-multiple-major-migration.ts';\nimport { StabilityDaysMigration } from './custom/stability-days-migration.ts';\nimport { SuppressNotificationsMigration } from './custom/suppress-notifications-migration.ts';\nimport { TrustLevelMigration } from './custom/trust-level-migration.ts';\nimport { UnpublishSafeMigration } from './custom/unpublish-safe-migration.ts';\nimport { UpdateLockFilesMigration } from './custom/update-lock-files-migration.ts';\nimport { UpgradeInRangeMigration } from './custom/upgrade-in-range-migration.ts';\nimport { VersionStrategyMigration } from './custom/version-strategy-migration.ts';\nimport type {\n MigratableConfig,\n Migration,\n MigrationConstructor,\n} from './types.ts';\n\nexport class MigrationsService {\n static readonly removedProperties: ReadonlySet<string> = new Set([\n 'allowCommandTemplating',\n 'allowPostUpgradeCommandTemplating',\n 'deepExtract',\n 'gitFs',\n 'groupBranchName',\n 'groupCommitMessage',\n 'groupPrBody',\n 'groupPrTitle',\n 'lazyGrouping',\n 'maintainYarnLock',\n 'raiseDeprecationWarnings',\n 'statusCheckVerify',\n 'supportPolicy',\n 'transitiveRemediation',\n 'yarnCacheFolder',\n 'yarnMaintenanceBranchName',\n 'yarnMaintenanceCommitMessage',\n 'yarnMaintenancePrBody',\n 'yarnMaintenancePrTitle',\n ]);\n\n static readonly renamedProperties: ReadonlyMap<string, string> = new Map([\n ['adoptium-java', 'java-version'],\n ['allowCustomCrateRegistries', 'allowCustomCrateGitRegistries'],\n ['allowedPostUpgradeCommands', 'allowedCommands'],\n ['azureAutoApprove', 'autoApprove'],\n ['customChangelogUrl', 'changelogUrl'],\n ['endpoints', 'hostRules'],\n ['excludedPackageNames', 'excludePackageNames'],\n ['exposeEnv', 'exposeAllEnv'],\n ['keepalive', 'keepAlive'],\n ['managerBranchPrefix', 'additionalBranchPrefix'],\n ['multipleMajorPrs', 'separateMultipleMajor'],\n ['separatePatchReleases', 'separateMinorPatch'],\n ['versionScheme', 'versioning'],\n ['lookupNameTemplate', 'packageNameTemplate'],\n ['aliases', 'registryAliases'],\n ['masterIssue', 'dependencyDashboard'],\n ['masterIssueApproval', 'dependencyDashboardApproval'],\n ['masterIssueAutoclose', 'dependencyDashboardAutoclose'],\n ['masterIssueHeader', 'dependencyDashboardHeader'],\n ['masterIssueFooter', 'dependencyDashboardFooter'],\n ['masterIssueTitle', 'dependencyDashboardTitle'],\n ['masterIssueLabels', 'dependencyDashboardLabels'],\n ['regexManagers', 'customManagers'],\n ['baseBranches', 'baseBranchPatterns'],\n ['renovate-config-presets', 'renovate-config'],\n ]);\n\n static readonly customMigrations: readonly MigrationConstructor[] = [\n AutomergeMajorMigration,\n AutomergeMigration,\n AutomergeMinorMigration,\n AutomergePatchMigration,\n AutomergeTypeMigration,\n AzureGitLabAutomergeMigration,\n BaseBranchMigration,\n BinarySourceMigration,\n BranchNameMigration,\n BranchPrefixMigration,\n CompatibilityMigration,\n ComposerIgnorePlatformReqsMigration,\n EnabledManagersMigration,\n ExtendsMigration,\n GoModTidyMigration,\n HostRulesMigration,\n IgnoreNodeModulesMigration,\n IgnoreNpmrcFileMigration,\n IncludeForksMigration,\n MatchStringsMigration,\n PackageNameMigration,\n PackagePatternMigration,\n PackagesMigration,\n PathRulesMigration,\n PinVersionsMigration,\n PostUpdateOptionsMigration,\n RebaseConflictedPrs,\n RebaseStalePrsMigration,\n RenovateForkMigration,\n RequiredStatusChecksMigration,\n ScheduleMigration,\n SemanticCommitsMigration,\n SeparateMajorReleasesMigration,\n SeparateMultipleMajorMigration,\n SuppressNotificationsMigration,\n TrustLevelMigration,\n UnpublishSafeMigration,\n UpgradeInRangeMigration,\n VersionStrategyMigration,\n DryRunMigration,\n RequireConfigMigration,\n PackageFilesMigration,\n DepTypesMigration,\n PackageRulesMigration,\n NodeMigration,\n SemanticPrefixMigration,\n MatchDatasourcesMigration,\n DatasourceMigration,\n RecreateClosedMigration,\n StabilityDaysMigration,\n FetchReleaseNotesMigration,\n MatchManagersMigration,\n CustomManagersMigration,\n PlatformCommitMigration,\n FileMatchMigration,\n UpdateLockFilesMigration,\n ];\n\n static run(\n originalConfig: MigratableConfig,\n parentKey?: string,\n ): RenovateConfig {\n const migratedConfig: RenovateConfig = {};\n const migrations = this.getMigrations(originalConfig, migratedConfig);\n\n for (const [key, value] of Object.entries(originalConfig) as [\n keyof RenovateConfig,\n unknown,\n ][]) {\n // @ts-expect-error -- can't be narrowed\n migratedConfig[key] ??= value;\n const migration = MigrationsService.getMigration(migrations, key);\n\n if (migration) {\n migration.run(value, key, parentKey);\n\n if (migration.deprecated) {\n delete migratedConfig[key];\n }\n }\n }\n\n return migratedConfig;\n }\n\n static isMigrated(\n originalConfig: MigratableConfig,\n migratedConfig: RenovateConfig,\n ): boolean {\n return !dequal(originalConfig, migratedConfig);\n }\n\n public static getMigrations(\n originalConfig: MigratableConfig,\n migratedConfig: RenovateConfig,\n ): readonly Migration[] {\n const migrations: Migration[] = [];\n\n for (const propertyName of MigrationsService.removedProperties) {\n migrations.push(\n new RemovePropertyMigration(\n propertyName,\n originalConfig,\n migratedConfig,\n ),\n );\n }\n\n for (const [\n oldPropertyName,\n newPropertyName,\n ] of MigrationsService.renamedProperties.entries()) {\n migrations.push(\n new RenamePropertyMigration(\n oldPropertyName,\n newPropertyName,\n originalConfig,\n migratedConfig,\n ),\n );\n }\n\n for (const CustomMigration of this.customMigrations) {\n migrations.push(new CustomMigration(originalConfig, migratedConfig));\n }\n\n return migrations;\n }\n\n private static getMigration(\n migrations: readonly Migration[],\n key: string,\n ): Migration | undefined {\n return migrations.find((migration) => {\n if (isRegExp(migration.propertyName)) {\n return migration.propertyName.test(key);\n }\n\n return migration.propertyName === key;\n });\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"migrations-service.js","names":[],"sources":["../../../lib/config/migrations/migrations-service.ts"],"sourcesContent":["import { isRegExp } from '@sindresorhus/is';\nimport { dequal } from 'dequal';\nimport type { RenovateConfig } from '../types.ts';\nimport { RemovePropertyMigration } from './base/remove-property-migration.ts';\nimport { RenamePropertyMigration } from './base/rename-property-migration.ts';\nimport { AutomergeMajorMigration } from './custom/automerge-major-migration.ts';\nimport { AutomergeMigration } from './custom/automerge-migration.ts';\nimport { AutomergeMinorMigration } from './custom/automerge-minor-migration.ts';\nimport { AutomergePatchMigration } from './custom/automerge-patch-migration.ts';\nimport { AutomergeTypeMigration } from './custom/automerge-type-migration.ts';\nimport { AzureGitLabAutomergeMigration } from './custom/azure-gitlab-automerge-migration.ts';\nimport { BaseBranchMigration } from './custom/base-branch-migration.ts';\nimport { BinarySourceMigration } from './custom/binary-source-migration.ts';\nimport { BranchNameMigration } from './custom/branch-name-migration.ts';\nimport { BranchPrefixMigration } from './custom/branch-prefix-migration.ts';\nimport { CompatibilityMigration } from './custom/compatibility-migration.ts';\nimport { ComposerIgnorePlatformReqsMigration } from './custom/composer-ignore-platform-reqs-migration.ts';\nimport { ConstraintsMigration } from './custom/constraints-migration.ts';\nimport { CustomManagersMigration } from './custom/custom-managers-migration.ts';\nimport { DatasourceMigration } from './custom/datasource-migration.ts';\nimport { DepTypesMigration } from './custom/dep-types-migration.ts';\nimport { DryRunMigration } from './custom/dry-run-migration.ts';\nimport { EnabledManagersMigration } from './custom/enabled-managers-migration.ts';\nimport { ExtendsMigration } from './custom/extends-migration.ts';\nimport { FetchReleaseNotesMigration } from './custom/fetch-release-notes-migration.ts';\nimport { FileMatchMigration } from './custom/file-match-migration.ts';\nimport { GoModTidyMigration } from './custom/go-mod-tidy-migration.ts';\nimport { HostRulesMigration } from './custom/host-rules-migration.ts';\nimport { IgnoreNodeModulesMigration } from './custom/ignore-node-modules-migration.ts';\nimport { IgnoreNpmrcFileMigration } from './custom/ignore-npmrc-file-migration.ts';\nimport { IncludeForksMigration } from './custom/include-forks-migration.ts';\nimport { MatchDatasourcesMigration } from './custom/match-datasources-migration.ts';\nimport { MatchManagersMigration } from './custom/match-managers-migration.ts';\nimport { MatchStringsMigration } from './custom/match-strings-migration.ts';\nimport { NodeMigration } from './custom/node-migration.ts';\nimport { PackageFilesMigration } from './custom/package-files-migration.ts';\nimport { PackageNameMigration } from './custom/package-name-migration.ts';\nimport { PackagePatternMigration } from './custom/package-pattern-migration.ts';\nimport { PackageRulesMigration } from './custom/package-rules-migration.ts';\nimport { PackagesMigration } from './custom/packages-migration.ts';\nimport { PathRulesMigration } from './custom/path-rules-migration.ts';\nimport { PinVersionsMigration } from './custom/pin-versions-migration.ts';\nimport { PlatformCommitMigration } from './custom/platform-commit-migration.ts';\nimport { PostUpdateOptionsMigration } from './custom/post-update-options-migration.ts';\nimport { RebaseConflictedPrs } from './custom/rebase-conflicted-prs-migration.ts';\nimport { RebaseStalePrsMigration } from './custom/rebase-stale-prs-migration.ts';\nimport { RecreateClosedMigration } from './custom/recreate-closed-migration.ts';\nimport { RenovateForkMigration } from './custom/renovate-fork-migration.ts';\nimport { RequireConfigMigration } from './custom/require-config-migration.ts';\nimport { RequiredStatusChecksMigration } from './custom/required-status-checks-migration.ts';\nimport { ScheduleMigration } from './custom/schedule-migration.ts';\nimport { SemanticCommitsMigration } from './custom/semantic-commits-migration.ts';\nimport { SemanticPrefixMigration } from './custom/semantic-prefix-migration.ts';\nimport { SeparateMajorReleasesMigration } from './custom/separate-major-release-migration.ts';\nimport { SeparateMultipleMajorMigration } from './custom/separate-multiple-major-migration.ts';\nimport { StabilityDaysMigration } from './custom/stability-days-migration.ts';\nimport { SuppressNotificationsMigration } from './custom/suppress-notifications-migration.ts';\nimport { TrustLevelMigration } from './custom/trust-level-migration.ts';\nimport { UnpublishSafeMigration } from './custom/unpublish-safe-migration.ts';\nimport { UpdateLockFilesMigration } from './custom/update-lock-files-migration.ts';\nimport { UpgradeInRangeMigration } from './custom/upgrade-in-range-migration.ts';\nimport { VersionStrategyMigration } from './custom/version-strategy-migration.ts';\nimport type {\n MigratableConfig,\n Migration,\n MigrationConstructor,\n} from './types.ts';\n\nexport class MigrationsService {\n static readonly removedProperties: ReadonlySet<string> = new Set([\n 'allowCommandTemplating',\n 'allowPostUpgradeCommandTemplating',\n 'deepExtract',\n 'gitFs',\n 'groupBranchName',\n 'groupCommitMessage',\n 'groupPrBody',\n 'groupPrTitle',\n 'lazyGrouping',\n 'maintainYarnLock',\n 'raiseDeprecationWarnings',\n 'statusCheckVerify',\n 'supportPolicy',\n 'transitiveRemediation',\n 'yarnCacheFolder',\n 'yarnMaintenanceBranchName',\n 'yarnMaintenanceCommitMessage',\n 'yarnMaintenancePrBody',\n 'yarnMaintenancePrTitle',\n ]);\n\n static readonly renamedProperties: ReadonlyMap<string, string> = new Map([\n ['adoptium-java', 'java-version'],\n ['allowCustomCrateRegistries', 'allowCustomCrateGitRegistries'],\n ['allowedPostUpgradeCommands', 'allowedCommands'],\n ['azureAutoApprove', 'autoApprove'],\n ['customChangelogUrl', 'changelogUrl'],\n ['endpoints', 'hostRules'],\n ['excludedPackageNames', 'excludePackageNames'],\n ['exposeEnv', 'exposeAllEnv'],\n ['keepalive', 'keepAlive'],\n ['managerBranchPrefix', 'additionalBranchPrefix'],\n ['multipleMajorPrs', 'separateMultipleMajor'],\n ['separatePatchReleases', 'separateMinorPatch'],\n ['versionScheme', 'versioning'],\n ['lookupNameTemplate', 'packageNameTemplate'],\n ['aliases', 'registryAliases'],\n ['masterIssue', 'dependencyDashboard'],\n ['masterIssueApproval', 'dependencyDashboardApproval'],\n ['masterIssueAutoclose', 'dependencyDashboardAutoclose'],\n ['masterIssueHeader', 'dependencyDashboardHeader'],\n ['masterIssueFooter', 'dependencyDashboardFooter'],\n ['masterIssueTitle', 'dependencyDashboardTitle'],\n ['masterIssueLabels', 'dependencyDashboardLabels'],\n ['regexManagers', 'customManagers'],\n ['baseBranches', 'baseBranchPatterns'],\n ['renovate-config-presets', 'renovate-config'],\n ]);\n\n static readonly customMigrations: readonly MigrationConstructor[] = [\n AutomergeMajorMigration,\n AutomergeMigration,\n AutomergeMinorMigration,\n AutomergePatchMigration,\n AutomergeTypeMigration,\n AzureGitLabAutomergeMigration,\n BaseBranchMigration,\n BinarySourceMigration,\n BranchNameMigration,\n BranchPrefixMigration,\n CompatibilityMigration,\n ComposerIgnorePlatformReqsMigration,\n EnabledManagersMigration,\n ExtendsMigration,\n GoModTidyMigration,\n HostRulesMigration,\n IgnoreNodeModulesMigration,\n IgnoreNpmrcFileMigration,\n IncludeForksMigration,\n MatchStringsMigration,\n PackageNameMigration,\n PackagePatternMigration,\n PackagesMigration,\n PathRulesMigration,\n PinVersionsMigration,\n PostUpdateOptionsMigration,\n RebaseConflictedPrs,\n RebaseStalePrsMigration,\n RenovateForkMigration,\n RequiredStatusChecksMigration,\n ScheduleMigration,\n SemanticCommitsMigration,\n SeparateMajorReleasesMigration,\n SeparateMultipleMajorMigration,\n SuppressNotificationsMigration,\n TrustLevelMigration,\n UnpublishSafeMigration,\n UpgradeInRangeMigration,\n VersionStrategyMigration,\n DryRunMigration,\n RequireConfigMigration,\n PackageFilesMigration,\n DepTypesMigration,\n PackageRulesMigration,\n NodeMigration,\n SemanticPrefixMigration,\n MatchDatasourcesMigration,\n DatasourceMigration,\n RecreateClosedMigration,\n StabilityDaysMigration,\n FetchReleaseNotesMigration,\n MatchManagersMigration,\n CustomManagersMigration,\n PlatformCommitMigration,\n FileMatchMigration,\n UpdateLockFilesMigration,\n ConstraintsMigration,\n ];\n\n static run(\n originalConfig: MigratableConfig,\n parentKey?: string,\n ): RenovateConfig {\n const migratedConfig: RenovateConfig = {};\n const migrations = this.getMigrations(originalConfig, migratedConfig);\n\n for (const [key, value] of Object.entries(originalConfig) as [\n keyof RenovateConfig,\n unknown,\n ][]) {\n // @ts-expect-error -- can't be narrowed\n migratedConfig[key] ??= value;\n const migration = MigrationsService.getMigration(migrations, key);\n\n if (migration) {\n migration.run(value, key, parentKey);\n\n if (migration.deprecated) {\n delete migratedConfig[key];\n }\n }\n }\n\n return migratedConfig;\n }\n\n static isMigrated(\n originalConfig: MigratableConfig,\n migratedConfig: RenovateConfig,\n ): boolean {\n return !dequal(originalConfig, migratedConfig);\n }\n\n public static getMigrations(\n originalConfig: MigratableConfig,\n migratedConfig: RenovateConfig,\n ): readonly Migration[] {\n const migrations: Migration[] = [];\n\n for (const propertyName of MigrationsService.removedProperties) {\n migrations.push(\n new RemovePropertyMigration(\n propertyName,\n originalConfig,\n migratedConfig,\n ),\n );\n }\n\n for (const [\n oldPropertyName,\n newPropertyName,\n ] of MigrationsService.renamedProperties.entries()) {\n migrations.push(\n new RenamePropertyMigration(\n oldPropertyName,\n newPropertyName,\n originalConfig,\n migratedConfig,\n ),\n );\n }\n\n for (const CustomMigration of this.customMigrations) {\n migrations.push(new CustomMigration(originalConfig, migratedConfig));\n }\n\n return migrations;\n }\n\n private static getMigration(\n migrations: readonly Migration[],\n key: string,\n ): Migration | undefined {\n return migrations.find((migration) => {\n if (isRegExp(migration.propertyName)) {\n return migration.propertyName.test(key);\n }\n\n return migration.propertyName === key;\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoEA,IAAa,oBAAb,MAAa,kBAAkB;CAC7B,OAAgB,oCAAyC,IAAI,IAAI;EAC/D;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,OAAgB,oCAAiD,IAAI,IAAI;EACvE,CAAC,iBAAiB,cAAc;EAChC,CAAC,8BAA8B,+BAA+B;EAC9D,CAAC,8BAA8B,iBAAiB;EAChD,CAAC,oBAAoB,aAAa;EAClC,CAAC,sBAAsB,cAAc;EACrC,CAAC,aAAa,WAAW;EACzB,CAAC,wBAAwB,qBAAqB;EAC9C,CAAC,aAAa,cAAc;EAC5B,CAAC,aAAa,WAAW;EACzB,CAAC,uBAAuB,wBAAwB;EAChD,CAAC,oBAAoB,uBAAuB;EAC5C,CAAC,yBAAyB,oBAAoB;EAC9C,CAAC,iBAAiB,YAAY;EAC9B,CAAC,sBAAsB,qBAAqB;EAC5C,CAAC,WAAW,iBAAiB;EAC7B,CAAC,eAAe,qBAAqB;EACrC,CAAC,uBAAuB,6BAA6B;EACrD,CAAC,wBAAwB,8BAA8B;EACvD,CAAC,qBAAqB,2BAA2B;EACjD,CAAC,qBAAqB,2BAA2B;EACjD,CAAC,oBAAoB,0BAA0B;EAC/C,CAAC,qBAAqB,2BAA2B;EACjD,CAAC,iBAAiB,gBAAgB;EAClC,CAAC,gBAAgB,oBAAoB;EACrC,CAAC,2BAA2B,iBAAiB;CAC/C,CAAC;CAED,OAAgB,mBAAoD;EAClE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CAEA,OAAO,IACL,gBACA,WACgB;EAChB,MAAM,iBAAiC,CAAC;EACxC,MAAM,aAAa,KAAK,cAAc,gBAAgB,cAAc;EAEpE,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,cAAc,GAGnD;GAEH,eAAe,SAAS;GACxB,MAAM,YAAY,kBAAkB,aAAa,YAAY,GAAG;GAEhE,IAAI,WAAW;IACb,UAAU,IAAI,OAAO,KAAK,SAAS;IAEnC,IAAI,UAAU,YACZ,OAAO,eAAe;GAE1B;EACF;EAEA,OAAO;CACT;CAEA,OAAO,WACL,gBACA,gBACS;EACT,OAAO,CAAC,OAAO,gBAAgB,cAAc;CAC/C;CAEA,OAAc,cACZ,gBACA,gBACsB;EACtB,MAAM,aAA0B,CAAC;EAEjC,KAAK,MAAM,gBAAgB,kBAAkB,mBAC3C,WAAW,KACT,IAAI,wBACF,cACA,gBACA,cACF,CACF;EAGF,KAAK,MAAM,CACT,iBACA,oBACG,kBAAkB,kBAAkB,QAAQ,GAC/C,WAAW,KACT,IAAI,wBACF,iBACA,iBACA,gBACA,cACF,CACF;EAGF,KAAK,MAAM,mBAAmB,KAAK,kBACjC,WAAW,KAAK,IAAI,gBAAgB,gBAAgB,cAAc,CAAC;EAGrE,OAAO;CACT;CAEA,OAAe,aACb,YACA,KACuB;EACvB,OAAO,WAAW,MAAM,cAAc;GACpC,IAAI,SAAS,UAAU,YAAY,GACjC,OAAO,UAAU,aAAa,KAAK,GAAG;GAGxC,OAAO,UAAU,iBAAiB;EACpC,CAAC;CACH;AACF"}
|
|
@@ -87,7 +87,7 @@ async function updateArtifacts({ packageFileName, updatedDeps, newPackageFileCon
|
|
|
87
87
|
docker: {},
|
|
88
88
|
toolConstraints: [{
|
|
89
89
|
toolName: "erlang",
|
|
90
|
-
constraint: await resolveToolConstraint(config, "erlang") ??
|
|
90
|
+
constraint: await resolveToolConstraint(config, "erlang") ?? "26"
|
|
91
91
|
}, {
|
|
92
92
|
toolName: "elixir",
|
|
93
93
|
constraint: await resolveToolConstraint(config, "elixir")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifacts.js","names":["hostRules\n .getAll","hostRules.find"],"sources":["../../../../lib/modules/manager/mix/artifacts.ts"],"sourcesContent":["import { isEmptyArray, isString } from '@sindresorhus/is';\nimport { quote } from 'shlex';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { exec } from '../../../util/exec/index.ts';\nimport type { ExecOptions } from '../../../util/exec/types.ts';\nimport {\n deleteLocalFile,\n ensureCacheDir,\n findLocalSiblingOrParent,\n getSiblingFileName,\n localPathExists,\n readLocalFile,\n writeLocalFile,\n} from '../../../util/fs/index.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { regEx } from '../../../util/regex.ts';\n\nimport type { UpdateArtifact, UpdateArtifactsResult } from '../types.ts';\nimport {\n artifactError,\n artifactErrorResult,\n fileAddition,\n resolveToolConstraint,\n} from '../util.ts';\n\nconst hexRepoUrl = 'https://hex.pm/';\nconst hexRepoOrgUrlRegex = regEx(\n `^https://hex\\\\.pm/api/repos/(?<organization>[a-z0-9_]+)/$`,\n);\n\nexport async function updateArtifacts({\n packageFileName,\n updatedDeps,\n newPackageFileContent,\n config,\n}: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> {\n logger.debug(`mix.getArtifacts(${packageFileName})`);\n const { isLockFileMaintenance } = config;\n\n if (isEmptyArray(updatedDeps) && !isLockFileMaintenance) {\n logger.debug('No updated mix deps');\n return null;\n }\n\n let lockFileName = getSiblingFileName(packageFileName, 'mix.lock');\n let isUmbrella = false;\n\n let existingLockFileContent = await readLocalFile(lockFileName, 'utf8');\n if (!existingLockFileContent) {\n const lockFileError = await checkLockFileReadError(lockFileName);\n if (lockFileError) {\n return lockFileError;\n }\n\n const parentLockFileName = await findLocalSiblingOrParent(\n packageFileName,\n 'mix.lock',\n );\n existingLockFileContent =\n parentLockFileName && (await readLocalFile(parentLockFileName, 'utf8'));\n\n if (parentLockFileName && existingLockFileContent) {\n lockFileName = parentLockFileName;\n isUmbrella = true;\n } else if (parentLockFileName) {\n const lockFileError = await checkLockFileReadError(parentLockFileName);\n // v8 ignore else -- needs an umbrella parent lock file that reads cleanly\n if (lockFileError) {\n return lockFileError;\n }\n }\n }\n\n if (isLockFileMaintenance && isUmbrella) {\n logger.debug(\n `Cannot use lockFileMaintenance in an umbrella project, see ${GlobalConfig.get('productLinks').documentation}modules/manager/mix/#lockFileMaintenance`,\n );\n return null;\n }\n\n if (isLockFileMaintenance && !existingLockFileContent) {\n logger.debug(\n 'Cannot use lockFileMaintenance when no mix.lock file is present',\n );\n return null;\n }\n\n try {\n await writeLocalFile(packageFileName, newPackageFileContent);\n if (isLockFileMaintenance) {\n await deleteLocalFile(lockFileName);\n }\n } catch (err) {\n logger.warn({ err }, 'mix.exs could not be written');\n return artifactErrorResult(lockFileName, err);\n }\n\n if (!existingLockFileContent) {\n logger.debug('No mix.lock found');\n return null;\n }\n\n const organizations = new Set<string>();\n\n const hexHostRulesWithMatchHost = hostRules\n .getAll()\n .filter(\n (hostRule) =>\n !!hostRule.matchHost && hexRepoOrgUrlRegex.test(hostRule.matchHost),\n );\n\n for (const { matchHost } of hexHostRulesWithMatchHost) {\n // v8 ignore else -- the filter above already required a match host\n if (matchHost) {\n const result = hexRepoOrgUrlRegex.exec(matchHost);\n\n // v8 ignore else -- the same regex already matched in that filter\n if (result?.groups) {\n const { organization } = result.groups;\n organizations.add(organization);\n }\n }\n }\n\n for (const { packageName } of updatedDeps) {\n if (packageName) {\n const [, organization] = packageName.split(':');\n\n // v8 ignore else -- needs an updated dep whose name carries no organization\n if (organization) {\n organizations.add(organization);\n }\n }\n }\n\n const preCommands = Array.from(organizations).reduce((acc, organization) => {\n const url = `${hexRepoUrl}api/repos/${organization}/`;\n const { token } = hostRules.find({ url });\n\n if (token) {\n logger.debug(`Authenticating to hex organization ${organization}`);\n const authCommand = `mix hex.organization auth ${quote(organization)} --key ${quote(token)}`;\n return [...acc, authCommand];\n }\n\n return acc;\n }, [] as string[]);\n\n // renovate: will update this\n const erlangVersion = '26';\n\n const execOptions: ExecOptions = {\n extraEnv: {\n // https://hexdocs.pm/mix/1.15.0/Mix.Tasks.Archive.html\n // TODO: should include a version constraint\n MIX_ARCHIVES: await ensureCacheDir('mix_archives'),\n },\n cwdFile: lockFileName,\n docker: {},\n toolConstraints: [\n {\n toolName: 'erlang',\n // https://hexdocs.pm/elixir/1.14.5/compatibility-and-deprecations.html#compatibility-between-elixir-and-erlang-otp\n constraint:\n (await resolveToolConstraint(config, 'erlang'))
|
|
1
|
+
{"version":3,"file":"artifacts.js","names":["hostRules\n .getAll","hostRules.find"],"sources":["../../../../lib/modules/manager/mix/artifacts.ts"],"sourcesContent":["import { isEmptyArray, isString } from '@sindresorhus/is';\nimport { quote } from 'shlex';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { exec } from '../../../util/exec/index.ts';\nimport type { ExecOptions } from '../../../util/exec/types.ts';\nimport {\n deleteLocalFile,\n ensureCacheDir,\n findLocalSiblingOrParent,\n getSiblingFileName,\n localPathExists,\n readLocalFile,\n writeLocalFile,\n} from '../../../util/fs/index.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { regEx } from '../../../util/regex.ts';\n\nimport type { UpdateArtifact, UpdateArtifactsResult } from '../types.ts';\nimport {\n artifactError,\n artifactErrorResult,\n fileAddition,\n resolveToolConstraint,\n} from '../util.ts';\n\nconst hexRepoUrl = 'https://hex.pm/';\nconst hexRepoOrgUrlRegex = regEx(\n `^https://hex\\\\.pm/api/repos/(?<organization>[a-z0-9_]+)/$`,\n);\n\nexport async function updateArtifacts({\n packageFileName,\n updatedDeps,\n newPackageFileContent,\n config,\n}: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> {\n logger.debug(`mix.getArtifacts(${packageFileName})`);\n const { isLockFileMaintenance } = config;\n\n if (isEmptyArray(updatedDeps) && !isLockFileMaintenance) {\n logger.debug('No updated mix deps');\n return null;\n }\n\n let lockFileName = getSiblingFileName(packageFileName, 'mix.lock');\n let isUmbrella = false;\n\n let existingLockFileContent = await readLocalFile(lockFileName, 'utf8');\n if (!existingLockFileContent) {\n const lockFileError = await checkLockFileReadError(lockFileName);\n if (lockFileError) {\n return lockFileError;\n }\n\n const parentLockFileName = await findLocalSiblingOrParent(\n packageFileName,\n 'mix.lock',\n );\n existingLockFileContent =\n parentLockFileName && (await readLocalFile(parentLockFileName, 'utf8'));\n\n if (parentLockFileName && existingLockFileContent) {\n lockFileName = parentLockFileName;\n isUmbrella = true;\n } else if (parentLockFileName) {\n const lockFileError = await checkLockFileReadError(parentLockFileName);\n // v8 ignore else -- needs an umbrella parent lock file that reads cleanly\n if (lockFileError) {\n return lockFileError;\n }\n }\n }\n\n if (isLockFileMaintenance && isUmbrella) {\n logger.debug(\n `Cannot use lockFileMaintenance in an umbrella project, see ${GlobalConfig.get('productLinks').documentation}modules/manager/mix/#lockFileMaintenance`,\n );\n return null;\n }\n\n if (isLockFileMaintenance && !existingLockFileContent) {\n logger.debug(\n 'Cannot use lockFileMaintenance when no mix.lock file is present',\n );\n return null;\n }\n\n try {\n await writeLocalFile(packageFileName, newPackageFileContent);\n if (isLockFileMaintenance) {\n await deleteLocalFile(lockFileName);\n }\n } catch (err) {\n logger.warn({ err }, 'mix.exs could not be written');\n return artifactErrorResult(lockFileName, err);\n }\n\n if (!existingLockFileContent) {\n logger.debug('No mix.lock found');\n return null;\n }\n\n const organizations = new Set<string>();\n\n const hexHostRulesWithMatchHost = hostRules\n .getAll()\n .filter(\n (hostRule) =>\n !!hostRule.matchHost && hexRepoOrgUrlRegex.test(hostRule.matchHost),\n );\n\n for (const { matchHost } of hexHostRulesWithMatchHost) {\n // v8 ignore else -- the filter above already required a match host\n if (matchHost) {\n const result = hexRepoOrgUrlRegex.exec(matchHost);\n\n // v8 ignore else -- the same regex already matched in that filter\n if (result?.groups) {\n const { organization } = result.groups;\n organizations.add(organization);\n }\n }\n }\n\n for (const { packageName } of updatedDeps) {\n if (packageName) {\n const [, organization] = packageName.split(':');\n\n // v8 ignore else -- needs an updated dep whose name carries no organization\n if (organization) {\n organizations.add(organization);\n }\n }\n }\n\n const preCommands = Array.from(organizations).reduce((acc, organization) => {\n const url = `${hexRepoUrl}api/repos/${organization}/`;\n const { token } = hostRules.find({ url });\n\n if (token) {\n logger.debug(`Authenticating to hex organization ${organization}`);\n const authCommand = `mix hex.organization auth ${quote(organization)} --key ${quote(token)}`;\n return [...acc, authCommand];\n }\n\n return acc;\n }, [] as string[]);\n\n // renovate: will update this\n const erlangVersion = '26';\n\n const execOptions: ExecOptions = {\n extraEnv: {\n // https://hexdocs.pm/mix/1.15.0/Mix.Tasks.Archive.html\n // TODO: should include a version constraint\n MIX_ARCHIVES: await ensureCacheDir('mix_archives'),\n },\n cwdFile: lockFileName,\n docker: {},\n toolConstraints: [\n {\n toolName: 'erlang',\n // https://hexdocs.pm/elixir/1.14.5/compatibility-and-deprecations.html#compatibility-between-elixir-and-erlang-otp\n constraint:\n (await resolveToolConstraint(config, 'erlang')) ?? erlangVersion,\n },\n {\n toolName: 'elixir',\n constraint: await resolveToolConstraint(config, 'elixir'),\n },\n ],\n preCommands,\n };\n\n let command: string;\n if (isLockFileMaintenance) {\n command = 'mix deps.get';\n } else {\n command = [\n 'mix',\n 'deps.update',\n ...updatedDeps\n .map((dep) => dep.depName)\n .filter(isString)\n .map((dep) => quote(dep)),\n ].join(' ');\n }\n\n try {\n await exec(command, execOptions);\n } catch (err) {\n /* v8 ignore if -- defensive rethrow of TEMPORARY_ERROR from exec, not reproduced in mix specs */\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n\n logger.debug(\n { err, message: err.message, command },\n 'Failed to update Mix lock file',\n );\n\n return artifactErrorResult(lockFileName, err);\n }\n\n const newMixLockContent = await readLocalFile(lockFileName, 'utf8');\n if (existingLockFileContent === newMixLockContent) {\n logger.debug('mix.lock is unchanged');\n return null;\n }\n logger.debug('Returning updated mix.lock');\n return [fileAddition(lockFileName, newMixLockContent)];\n}\n\nasync function checkLockFileReadError(\n lockFileName: string,\n): Promise<UpdateArtifactsResult[] | null> {\n if (await localPathExists(lockFileName)) {\n return [artifactError(lockFileName, `Error reading ${lockFileName}`)];\n }\n return null;\n}\n"],"mappings":"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"}
|
|
@@ -78,7 +78,7 @@ const allToolConfig = {
|
|
|
78
78
|
erlang: {
|
|
79
79
|
datasource: "github-releases",
|
|
80
80
|
packageName: "containerbase/erlang-prebuild",
|
|
81
|
-
versioning: "semver-
|
|
81
|
+
versioning: "semver-extended"
|
|
82
82
|
},
|
|
83
83
|
elixir: {
|
|
84
84
|
datasource: "github-releases",
|
|
@@ -133,7 +133,7 @@ const allToolConfig = {
|
|
|
133
133
|
jb: {
|
|
134
134
|
datasource: "github-releases",
|
|
135
135
|
packageName: "containerbase/jb-prebuild",
|
|
136
|
-
versioning: "
|
|
136
|
+
versioning: "semver-extended"
|
|
137
137
|
},
|
|
138
138
|
kustomize: {
|
|
139
139
|
datasource: "github-releases",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"containerbase.js","names":["memCache.get"],"sources":["../../../lib/util/exec/containerbase.ts"],"sourcesContent":["import {\n type ToolMetadata,\n isContainerbase,\n tools,\n} from '@renovatebot/base-image';\nimport { isString } from '@sindresorhus/is';\nimport { quote } from 'shlex';\nimport { GlobalConfig } from '../../config/global.ts';\nimport { logger } from '../../logger/index.ts';\nimport type { ReleaseResult } from '../../modules/datasource/index.ts';\nimport type { VersioningApi } from '../../modules/versioning/types.ts';\nimport { coerceArray } from '../array.ts';\nimport * as memCache from '../cache/memory/index.ts';\nimport { buildCacheKey } from '../cache/package/key.ts';\nimport { regEx } from '../regex.ts';\nimport {\n type ConstraintName,\n type Opt,\n type ToolConfig,\n type ToolConstraint,\n type ToolName,\n isToolName,\n} from './types.ts';\n\n/**\n * A subset of Containerbase tools that are supported by Renovate to look up version numbers for.\n */\nexport const allToolConfig: Partial<Record<ToolName, ToolConfig>> = {\n apm: {\n datasource: 'github-releases',\n packageName: 'microsoft/apm',\n versioning: 'semver',\n extractVersion: '^v(?<version>.*)$',\n },\n bazelisk: {\n datasource: 'github-releases',\n packageName: 'bazelbuild/bazelisk',\n versioning: 'semver',\n },\n bun: {\n datasource: 'github-releases',\n packageName: 'oven-sh/bun',\n extractVersion: '^bun-v(?<version>.*)$',\n versioning: 'npm',\n },\n bundler: {\n datasource: 'rubygems',\n packageName: 'bundler',\n versioning: 'ruby',\n },\n cocoapods: {\n datasource: 'rubygems',\n packageName: 'cocoapods',\n versioning: 'ruby',\n },\n composer: {\n datasource: 'github-releases',\n packageName: 'containerbase/composer-prebuild',\n versioning: 'composer',\n },\n conan: {\n datasource: 'pypi',\n packageName: 'conan',\n versioning: 'pep440',\n },\n copier: {\n datasource: 'pypi',\n packageName: 'copier',\n versioning: 'pep440',\n },\n corepack: {\n datasource: 'npm',\n packageName: 'corepack',\n versioning: 'npm',\n },\n deno: {\n datasource: 'github-releases',\n packageName: 'denoland/deno',\n versioning: 'deno',\n },\n devbox: {\n datasource: 'github-releases',\n packageName: 'jetify-com/devbox',\n versioning: 'semver',\n },\n dotnet: {\n datasource: 'dotnet-version',\n packageName: 'dotnet-sdk',\n versioning: 'semver',\n },\n erlang: {\n datasource: 'github-releases',\n packageName: 'containerbase/erlang-prebuild',\n versioning: 'semver-coerced',\n },\n elixir: {\n datasource: 'github-releases',\n packageName: 'elixir-lang/elixir',\n versioning: 'semver',\n },\n flux: {\n datasource: 'github-releases',\n packageName: 'fluxcd/flux2',\n versioning: 'semver',\n },\n gh: {\n datasource: 'github-releases',\n packageName: 'cli/cli',\n versioning: 'semver',\n },\n gleam: {\n datasource: 'github-releases',\n packageName: 'gleam-lang/gleam',\n versioning: 'semver',\n },\n golang: {\n datasource: 'github-releases',\n packageName: 'containerbase/golang-prebuild',\n versioning: 'npm',\n },\n gradle: {\n datasource: 'gradle-version',\n packageName: 'gradle',\n versioning: 'gradle',\n },\n hashin: {\n datasource: 'pypi',\n packageName: 'hashin',\n versioning: 'pep440',\n },\n helm: {\n datasource: 'github-releases',\n packageName: 'helm/helm',\n versioning: 'semver',\n },\n helmfile: {\n datasource: 'github-releases',\n packageName: 'helmfile/helmfile',\n versioning: 'semver',\n },\n java: {\n datasource: 'java-version',\n packageName: 'java?system=true',\n versioning: 'npm',\n },\n jb: {\n datasource: 'github-releases',\n packageName: 'containerbase/jb-prebuild',\n versioning: 'loose',\n },\n kustomize: {\n datasource: 'github-releases',\n packageName: 'kubernetes-sigs/kustomize',\n extractVersion: '^kustomize/v(?<version>.*)$',\n versioning: 'semver',\n },\n maven: {\n datasource: 'github-releases',\n packageName: 'containerbase/maven-prebuild',\n versioning: 'maven',\n },\n mise: {\n datasource: 'github-releases',\n packageName: 'jdx/mise',\n versioning: 'npm',\n },\n nix: {\n datasource: 'github-releases',\n packageName: 'containerbase/nix-prebuild',\n versioning: 'semver',\n },\n node: {\n datasource: 'github-releases',\n packageName: 'containerbase/node-prebuild',\n versioning: 'node',\n },\n npm: {\n datasource: 'npm',\n packageName: 'npm',\n versioning: 'npm',\n },\n paket: {\n datasource: 'nuget',\n packageName: 'paket',\n versioning: 'paket',\n },\n pdm: {\n datasource: 'github-releases',\n packageName: 'pdm-project/pdm',\n versioning: 'semver',\n },\n php: {\n datasource: 'github-releases',\n packageName: 'containerbase/php-prebuild',\n versioning: 'composer',\n },\n 'pip-tools': {\n datasource: 'pypi',\n packageName: 'pip-tools',\n versioning: 'pep440',\n },\n pipenv: {\n datasource: 'pypi',\n packageName: 'pipenv',\n versioning: 'pep440',\n },\n pnpm: {\n datasource: 'npm',\n packageName: 'pnpm',\n versioning: 'npm',\n },\n pixi: {\n datasource: 'github-releases',\n packageName: 'prefix-dev/pixi',\n versioning: 'conda',\n extractVersion: '^v(?<version>.*)$',\n },\n poetry: {\n datasource: 'pypi',\n packageName: 'poetry',\n versioning: 'pep440',\n },\n python: {\n datasource: 'github-releases',\n packageName: 'containerbase/python-prebuild',\n versioning: 'python',\n },\n ruby: {\n datasource: 'github-releases',\n packageName: 'containerbase/ruby-prebuild',\n versioning: 'ruby',\n },\n rust: {\n datasource: 'rust-version',\n packageName: 'rust',\n versioning: 'rust-release-channel',\n },\n uv: {\n datasource: 'pypi',\n packageName: 'uv',\n versioning: 'pep440',\n },\n yarn: {\n datasource: 'npm',\n packageName: 'yarn',\n versioning: 'npm',\n },\n 'yarn-slim': {\n datasource: 'npm',\n packageName: 'yarn',\n versioning: 'npm',\n },\n dart: {\n datasource: 'dart-version',\n packageName: 'dart',\n versioning: 'npm',\n },\n flutter: {\n datasource: 'github-releases',\n packageName: 'containerbase/flutter-prebuild',\n versioning: 'npm',\n },\n vendir: {\n datasource: 'github-releases',\n packageName: 'carvel-dev/vendir',\n versioning: 'semver',\n },\n} as const;\n\n/**\n * All Containerbase `tool`s that Renovate supports configuring the version of.\n */\nexport function getSupportedToolNames(): readonly ToolName[] {\n return Object.keys(allToolConfig) as readonly ToolName[];\n}\n\nlet _getPkgReleases: Promise<\n typeof import('../../modules/datasource/index.ts')\n> | null = null;\n\nasync function getPkgReleases(\n toolConfig: ToolConfig,\n resolvedTools: Partial<Record<ConstraintName, string>> = {},\n): Promise<ReleaseResult | null> {\n _getPkgReleases ??= import('../../modules/datasource/index.ts');\n const { getPkgReleases } = await _getPkgReleases;\n if (Object.keys(resolvedTools).length) {\n // drop releases whose runtime constraints (e.g. `engines.node`) exclude the runtime versions we install\n const compatible = await getPkgReleases({\n ...toolConfig,\n constraintsFiltering: 'strict',\n constraints: { ...resolvedTools },\n });\n if (compatible?.releases.length) {\n return compatible;\n }\n logger.debug(\n { toolConfig, resolvedTools },\n 'No tool releases compatible with resolved tools - ignoring their constraints',\n );\n }\n return getPkgReleases(toolConfig);\n}\n\nexport function getToolConfig(toolName: ToolName): ToolConfig | undefined {\n return allToolConfig[toolName];\n}\n\nexport function supportsDynamicInstall(toolName: ToolName): boolean {\n return !!allToolConfig[toolName];\n}\n\nexport function isDynamicInstall(\n toolConstraints?: Opt<ToolConstraint[]>,\n): boolean {\n if (GlobalConfig.get('binarySource') !== 'install') {\n return false;\n }\n if (!isContainerbase()) {\n logger.debug('Falling back to binarySource=global');\n return false;\n }\n return (\n !toolConstraints ||\n toolConstraints.every((toolConstraint) =>\n supportsDynamicInstall(toolConstraint.toolName),\n )\n );\n}\n\nfunction isStable(\n version: string,\n versioningApi: VersioningApi,\n latest?: string,\n): boolean {\n if (!versioningApi.isStable(version)) {\n return false;\n }\n if (isString(latest) && versioningApi.isGreaterThan(version, latest)) {\n return false;\n }\n return true;\n}\n\nexport async function resolveConstraint(\n toolConstraint: ToolConstraint,\n resolvedTools: Partial<Record<ConstraintName, string>> = {},\n): Promise<string> {\n const { toolName } = toolConstraint;\n const toolConfig = allToolConfig[toolName];\n if (!toolConfig) {\n throw new Error(`Invalid tool to install: ${toolName}`);\n }\n\n const { get: getVersioning } =\n await import('../../modules/versioning/index.ts');\n const versioning = getVersioning(toolConfig.versioning);\n let constraint = toolConstraint.constraint;\n if (constraint) {\n if (versioning.isValid(constraint)) {\n if (versioning.isSingleVersion(constraint)) {\n return constraint.replace(regEx(/^=+/), '').trim();\n }\n } else {\n logger.warn(\n { toolName, constraint, versioning: toolConfig.versioning },\n 'Invalid tool constraint',\n );\n constraint = undefined;\n }\n }\n\n const pkgReleases = await getPkgReleases(toolConfig, resolvedTools);\n const releases = coerceArray(pkgReleases?.releases);\n\n if (!releases?.length) {\n logger.warn({ toolConfig }, 'No tool releases found.');\n throw new Error('No tool releases found.');\n }\n\n const matchingReleases = releases.filter(\n (r) => !constraint || versioning.matches(r.version, constraint),\n );\n\n const stableMatchingVersion = matchingReleases\n .filter((r) => isStable(r.version, versioning, pkgReleases?.tags?.latest))\n .pop()?.version;\n if (stableMatchingVersion) {\n logger.debug(\n { toolName, constraint, resolvedVersion: stableMatchingVersion },\n 'Resolved stable matching version',\n );\n return stableMatchingVersion;\n }\n\n const unstableMatchingVersion = matchingReleases.pop()?.version;\n if (unstableMatchingVersion) {\n logger.debug(\n { toolName, constraint, resolvedVersion: unstableMatchingVersion },\n 'Resolved unstable matching version',\n );\n return unstableMatchingVersion;\n }\n\n const stableVersion = releases\n .filter((r) => isStable(r.version, versioning, pkgReleases?.tags?.latest))\n .pop()?.version;\n if (stableVersion) {\n logger.warn(\n { toolName, constraint, stableVersion },\n 'No matching tool versions found for constraint - using latest stable version',\n );\n }\n\n const highestVersion = releases.pop()!.version;\n logger.warn(\n { toolName, constraint, highestVersion },\n 'No matching or stable tool versions found - using an unstable version',\n );\n return highestVersion;\n}\n\n// Docker execs run in a fresh `--rm` container each time, so `memoize` must\n// stay false there - only the persistent-host (binarySource=install) path\n// can safely skip a tool whose requested version is already active.\n// `install-tool` also activates the version it installs, so the memo tracks\n// the active version per tool, not every installed version.\nexport async function generateInstallCommands(\n toolConstraints: Opt<ToolConstraint[]>,\n memoize = false,\n): Promise<string[]> {\n const installCommands: string[] = [];\n if (toolConstraints?.length) {\n // Parents are listed before their tools (e.g. node before npm),\n // so a tool is matched against its parent's already resolved version.\n const resolvedTools: Partial<Record<ToolName, string>> = {};\n for (const toolConstraint of toolConstraints) {\n const { toolName } = toolConstraint;\n const { parent }: ToolMetadata = tools[toolName];\n const parentConstraint: Partial<Record<ConstraintName, string>> = {};\n if (isToolName(parent) && resolvedTools[parent]) {\n parentConstraint[parent] = resolvedTools[parent];\n }\n const toolVersion = await resolveConstraint(\n toolConstraint,\n parentConstraint,\n );\n resolvedTools[toolName] = toolVersion;\n if (memoize) {\n const cacheKey = buildCacheKey('containerbase-active', toolName);\n // a tool with a parent is installed per active parent version (e.g. one virtualenv per python version)\n const parentActive = isToolName(parent)\n ? memCache.get<string | undefined>(\n buildCacheKey('containerbase-active', parent),\n )\n : undefined;\n const active = parentActive\n ? `${toolVersion}@${parent}:${parentActive}`\n : toolVersion;\n if (memCache.get<string | undefined>(cacheKey) === active) {\n continue;\n }\n memCache.set(cacheKey, active);\n }\n const installCommand = `install-tool ${toolName} ${quote(toolVersion)}`;\n installCommands.push(installCommand);\n }\n }\n return installCommands;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"containerbase.js","names":["memCache.get"],"sources":["../../../lib/util/exec/containerbase.ts"],"sourcesContent":["import {\n type ToolMetadata,\n isContainerbase,\n tools,\n} from '@renovatebot/base-image';\nimport { isString } from '@sindresorhus/is';\nimport { quote } from 'shlex';\nimport { GlobalConfig } from '../../config/global.ts';\nimport { logger } from '../../logger/index.ts';\nimport type { ReleaseResult } from '../../modules/datasource/index.ts';\nimport type { VersioningApi } from '../../modules/versioning/types.ts';\nimport { coerceArray } from '../array.ts';\nimport * as memCache from '../cache/memory/index.ts';\nimport { buildCacheKey } from '../cache/package/key.ts';\nimport { regEx } from '../regex.ts';\nimport {\n type ConstraintName,\n type Opt,\n type ToolConfig,\n type ToolConstraint,\n type ToolName,\n isToolName,\n} from './types.ts';\n\n/**\n * A subset of Containerbase tools that are supported by Renovate to look up version numbers for.\n */\nexport const allToolConfig: Partial<Record<ToolName, ToolConfig>> = {\n apm: {\n datasource: 'github-releases',\n packageName: 'microsoft/apm',\n versioning: 'semver',\n extractVersion: '^v(?<version>.*)$',\n },\n bazelisk: {\n datasource: 'github-releases',\n packageName: 'bazelbuild/bazelisk',\n versioning: 'semver',\n },\n bun: {\n datasource: 'github-releases',\n packageName: 'oven-sh/bun',\n extractVersion: '^bun-v(?<version>.*)$',\n versioning: 'npm',\n },\n bundler: {\n datasource: 'rubygems',\n packageName: 'bundler',\n versioning: 'ruby',\n },\n cocoapods: {\n datasource: 'rubygems',\n packageName: 'cocoapods',\n versioning: 'ruby',\n },\n composer: {\n datasource: 'github-releases',\n packageName: 'containerbase/composer-prebuild',\n versioning: 'composer',\n },\n conan: {\n datasource: 'pypi',\n packageName: 'conan',\n versioning: 'pep440',\n },\n copier: {\n datasource: 'pypi',\n packageName: 'copier',\n versioning: 'pep440',\n },\n corepack: {\n datasource: 'npm',\n packageName: 'corepack',\n versioning: 'npm',\n },\n deno: {\n datasource: 'github-releases',\n packageName: 'denoland/deno',\n versioning: 'deno',\n },\n devbox: {\n datasource: 'github-releases',\n packageName: 'jetify-com/devbox',\n versioning: 'semver',\n },\n dotnet: {\n datasource: 'dotnet-version',\n packageName: 'dotnet-sdk',\n versioning: 'semver',\n },\n erlang: {\n datasource: 'github-releases',\n packageName: 'containerbase/erlang-prebuild',\n versioning: 'semver-extended',\n },\n elixir: {\n datasource: 'github-releases',\n packageName: 'elixir-lang/elixir',\n versioning: 'semver',\n },\n flux: {\n datasource: 'github-releases',\n packageName: 'fluxcd/flux2',\n versioning: 'semver',\n },\n gh: {\n datasource: 'github-releases',\n packageName: 'cli/cli',\n versioning: 'semver',\n },\n gleam: {\n datasource: 'github-releases',\n packageName: 'gleam-lang/gleam',\n versioning: 'semver',\n },\n golang: {\n datasource: 'github-releases',\n packageName: 'containerbase/golang-prebuild',\n versioning: 'npm',\n },\n gradle: {\n datasource: 'gradle-version',\n packageName: 'gradle',\n versioning: 'gradle',\n },\n hashin: {\n datasource: 'pypi',\n packageName: 'hashin',\n versioning: 'pep440',\n },\n helm: {\n datasource: 'github-releases',\n packageName: 'helm/helm',\n versioning: 'semver',\n },\n helmfile: {\n datasource: 'github-releases',\n packageName: 'helmfile/helmfile',\n versioning: 'semver',\n },\n java: {\n datasource: 'java-version',\n packageName: 'java?system=true',\n versioning: 'npm',\n },\n jb: {\n datasource: 'github-releases',\n packageName: 'containerbase/jb-prebuild',\n versioning: 'semver-extended',\n },\n kustomize: {\n datasource: 'github-releases',\n packageName: 'kubernetes-sigs/kustomize',\n extractVersion: '^kustomize/v(?<version>.*)$',\n versioning: 'semver',\n },\n maven: {\n datasource: 'github-releases',\n packageName: 'containerbase/maven-prebuild',\n versioning: 'maven',\n },\n mise: {\n datasource: 'github-releases',\n packageName: 'jdx/mise',\n versioning: 'npm',\n },\n nix: {\n datasource: 'github-releases',\n packageName: 'containerbase/nix-prebuild',\n versioning: 'semver',\n },\n node: {\n datasource: 'github-releases',\n packageName: 'containerbase/node-prebuild',\n versioning: 'node',\n },\n npm: {\n datasource: 'npm',\n packageName: 'npm',\n versioning: 'npm',\n },\n paket: {\n datasource: 'nuget',\n packageName: 'paket',\n versioning: 'paket',\n },\n pdm: {\n datasource: 'github-releases',\n packageName: 'pdm-project/pdm',\n versioning: 'semver',\n },\n php: {\n datasource: 'github-releases',\n packageName: 'containerbase/php-prebuild',\n versioning: 'composer',\n },\n 'pip-tools': {\n datasource: 'pypi',\n packageName: 'pip-tools',\n versioning: 'pep440',\n },\n pipenv: {\n datasource: 'pypi',\n packageName: 'pipenv',\n versioning: 'pep440',\n },\n pnpm: {\n datasource: 'npm',\n packageName: 'pnpm',\n versioning: 'npm',\n },\n pixi: {\n datasource: 'github-releases',\n packageName: 'prefix-dev/pixi',\n versioning: 'conda',\n extractVersion: '^v(?<version>.*)$',\n },\n poetry: {\n datasource: 'pypi',\n packageName: 'poetry',\n versioning: 'pep440',\n },\n python: {\n datasource: 'github-releases',\n packageName: 'containerbase/python-prebuild',\n versioning: 'python',\n },\n ruby: {\n datasource: 'github-releases',\n packageName: 'containerbase/ruby-prebuild',\n versioning: 'ruby',\n },\n rust: {\n datasource: 'rust-version',\n packageName: 'rust',\n versioning: 'rust-release-channel',\n },\n uv: {\n datasource: 'pypi',\n packageName: 'uv',\n versioning: 'pep440',\n },\n yarn: {\n datasource: 'npm',\n packageName: 'yarn',\n versioning: 'npm',\n },\n 'yarn-slim': {\n datasource: 'npm',\n packageName: 'yarn',\n versioning: 'npm',\n },\n dart: {\n datasource: 'dart-version',\n packageName: 'dart',\n versioning: 'npm',\n },\n flutter: {\n datasource: 'github-releases',\n packageName: 'containerbase/flutter-prebuild',\n versioning: 'npm',\n },\n vendir: {\n datasource: 'github-releases',\n packageName: 'carvel-dev/vendir',\n versioning: 'semver',\n },\n} as const;\n\n/**\n * All Containerbase `tool`s that Renovate supports configuring the version of.\n */\nexport function getSupportedToolNames(): readonly ToolName[] {\n return Object.keys(allToolConfig) as readonly ToolName[];\n}\n\nlet _getPkgReleases: Promise<\n typeof import('../../modules/datasource/index.ts')\n> | null = null;\n\nasync function getPkgReleases(\n toolConfig: ToolConfig,\n resolvedTools: Partial<Record<ConstraintName, string>> = {},\n): Promise<ReleaseResult | null> {\n _getPkgReleases ??= import('../../modules/datasource/index.ts');\n const { getPkgReleases } = await _getPkgReleases;\n if (Object.keys(resolvedTools).length) {\n // drop releases whose runtime constraints (e.g. `engines.node`) exclude the runtime versions we install\n const compatible = await getPkgReleases({\n ...toolConfig,\n constraintsFiltering: 'strict',\n constraints: { ...resolvedTools },\n });\n if (compatible?.releases.length) {\n return compatible;\n }\n logger.debug(\n { toolConfig, resolvedTools },\n 'No tool releases compatible with resolved tools - ignoring their constraints',\n );\n }\n return getPkgReleases(toolConfig);\n}\n\nexport function getToolConfig(toolName: ToolName): ToolConfig | undefined {\n return allToolConfig[toolName];\n}\n\nexport function supportsDynamicInstall(toolName: ToolName): boolean {\n return !!allToolConfig[toolName];\n}\n\nexport function isDynamicInstall(\n toolConstraints?: Opt<ToolConstraint[]>,\n): boolean {\n if (GlobalConfig.get('binarySource') !== 'install') {\n return false;\n }\n if (!isContainerbase()) {\n logger.debug('Falling back to binarySource=global');\n return false;\n }\n return (\n !toolConstraints ||\n toolConstraints.every((toolConstraint) =>\n supportsDynamicInstall(toolConstraint.toolName),\n )\n );\n}\n\nfunction isStable(\n version: string,\n versioningApi: VersioningApi,\n latest?: string,\n): boolean {\n if (!versioningApi.isStable(version)) {\n return false;\n }\n if (isString(latest) && versioningApi.isGreaterThan(version, latest)) {\n return false;\n }\n return true;\n}\n\nexport async function resolveConstraint(\n toolConstraint: ToolConstraint,\n resolvedTools: Partial<Record<ConstraintName, string>> = {},\n): Promise<string> {\n const { toolName } = toolConstraint;\n const toolConfig = allToolConfig[toolName];\n if (!toolConfig) {\n throw new Error(`Invalid tool to install: ${toolName}`);\n }\n\n const { get: getVersioning } =\n await import('../../modules/versioning/index.ts');\n const versioning = getVersioning(toolConfig.versioning);\n let constraint = toolConstraint.constraint;\n if (constraint) {\n if (versioning.isValid(constraint)) {\n if (versioning.isSingleVersion(constraint)) {\n return constraint.replace(regEx(/^=+/), '').trim();\n }\n } else {\n logger.warn(\n { toolName, constraint, versioning: toolConfig.versioning },\n 'Invalid tool constraint',\n );\n constraint = undefined;\n }\n }\n\n const pkgReleases = await getPkgReleases(toolConfig, resolvedTools);\n const releases = coerceArray(pkgReleases?.releases);\n\n if (!releases?.length) {\n logger.warn({ toolConfig }, 'No tool releases found.');\n throw new Error('No tool releases found.');\n }\n\n const matchingReleases = releases.filter(\n (r) => !constraint || versioning.matches(r.version, constraint),\n );\n\n const stableMatchingVersion = matchingReleases\n .filter((r) => isStable(r.version, versioning, pkgReleases?.tags?.latest))\n .pop()?.version;\n if (stableMatchingVersion) {\n logger.debug(\n { toolName, constraint, resolvedVersion: stableMatchingVersion },\n 'Resolved stable matching version',\n );\n return stableMatchingVersion;\n }\n\n const unstableMatchingVersion = matchingReleases.pop()?.version;\n if (unstableMatchingVersion) {\n logger.debug(\n { toolName, constraint, resolvedVersion: unstableMatchingVersion },\n 'Resolved unstable matching version',\n );\n return unstableMatchingVersion;\n }\n\n const stableVersion = releases\n .filter((r) => isStable(r.version, versioning, pkgReleases?.tags?.latest))\n .pop()?.version;\n if (stableVersion) {\n logger.warn(\n { toolName, constraint, stableVersion },\n 'No matching tool versions found for constraint - using latest stable version',\n );\n }\n\n const highestVersion = releases.pop()!.version;\n logger.warn(\n { toolName, constraint, highestVersion },\n 'No matching or stable tool versions found - using an unstable version',\n );\n return highestVersion;\n}\n\n// Docker execs run in a fresh `--rm` container each time, so `memoize` must\n// stay false there - only the persistent-host (binarySource=install) path\n// can safely skip a tool whose requested version is already active.\n// `install-tool` also activates the version it installs, so the memo tracks\n// the active version per tool, not every installed version.\nexport async function generateInstallCommands(\n toolConstraints: Opt<ToolConstraint[]>,\n memoize = false,\n): Promise<string[]> {\n const installCommands: string[] = [];\n if (toolConstraints?.length) {\n // Parents are listed before their tools (e.g. node before npm),\n // so a tool is matched against its parent's already resolved version.\n const resolvedTools: Partial<Record<ToolName, string>> = {};\n for (const toolConstraint of toolConstraints) {\n const { toolName } = toolConstraint;\n const { parent }: ToolMetadata = tools[toolName];\n const parentConstraint: Partial<Record<ConstraintName, string>> = {};\n if (isToolName(parent) && resolvedTools[parent]) {\n parentConstraint[parent] = resolvedTools[parent];\n }\n const toolVersion = await resolveConstraint(\n toolConstraint,\n parentConstraint,\n );\n resolvedTools[toolName] = toolVersion;\n if (memoize) {\n const cacheKey = buildCacheKey('containerbase-active', toolName);\n // a tool with a parent is installed per active parent version (e.g. one virtualenv per python version)\n const parentActive = isToolName(parent)\n ? memCache.get<string | undefined>(\n buildCacheKey('containerbase-active', parent),\n )\n : undefined;\n const active = parentActive\n ? `${toolVersion}@${parent}:${parentActive}`\n : toolVersion;\n if (memCache.get<string | undefined>(cacheKey) === active) {\n continue;\n }\n memCache.set(cacheKey, active);\n }\n const installCommand = `install-tool ${toolName} ${quote(toolVersion)}`;\n installCommands.push(installCommand);\n }\n }\n return installCommands;\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
package/renovate-schema.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$id": "https://docs.renovatebot.com/renovate-schema.json",
|
|
3
|
-
"title": "JSON schema for Renovate 44.
|
|
3
|
+
"title": "JSON schema for Renovate 44.215.0 config files (https://renovatebot.com/)",
|
|
4
4
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
5
|
-
"x-renovate-version": "44.
|
|
5
|
+
"x-renovate-version": "44.215.0",
|
|
6
6
|
"allowComments": true,
|
|
7
7
|
"type": "object",
|
|
8
8
|
"definitions": {
|