renovate 44.164.7 → 44.164.9
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/validation.js +1 -1
- package/dist/modules/manager/renovate-config/extract.js +1 -1
- package/dist/modules/platform/scm-manager/utils.js +1 -1
- package/dist/modules/platform/scm-manager/utils.js.map +1 -1
- package/dist/util/exec/containerbase.js +33 -12
- package/dist/util/exec/containerbase.js.map +1 -1
- package/package.json +1 -1
- package/renovate-schema.json +2 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { PLATFORM_HOST_TYPES } from "../../constants/platforms.js";
|
|
2
2
|
import { managerDefaultConfigs } from "../../manager-default-configs.generated.js";
|
|
3
|
-
import { getSupportedToolNames } from "../../util/exec/containerbase.js";
|
|
4
3
|
import { additionalConstraintDefinitions, toolDefinitionDocumentation } from "../../util/exec/types.js";
|
|
4
|
+
import { getSupportedToolNames } from "../../util/exec/containerbase.js";
|
|
5
5
|
import { AllVersioningsListLiteral } from "../../versioning-list.generated.js";
|
|
6
6
|
import { supportedDatasources } from "../presets/internal/merge-confidence.preset.js";
|
|
7
7
|
import { allowedStatusCheckStrings, allowedStatusCheckWhenValues } from "../types.js";
|
|
@@ -5,8 +5,8 @@ import { coerceArray } from "../util/array.js";
|
|
|
5
5
|
import { anyMatchRegexOrGlobList, getRegexPredicate, isRegexMatch, matchRegexOrGlobList } from "../util/string-match.js";
|
|
6
6
|
import { logger } from "../logger/index.js";
|
|
7
7
|
import { clone } from "../util/clone.js";
|
|
8
|
-
import { getToolConfig } from "../util/exec/containerbase.js";
|
|
9
8
|
import { isConstraintName, isToolName } from "../util/exec/types.js";
|
|
9
|
+
import { getToolConfig } from "../util/exec/containerbase.js";
|
|
10
10
|
import { AllVersioningsListLiteral } from "../versioning-list.generated.js";
|
|
11
11
|
import { supportedDatasources } from "./presets/internal/merge-confidence.preset.js";
|
|
12
12
|
import { allowedStatusCheckStrings, allowedStatusCheckWhenValues } from "./types.js";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { coerceObject } from "../../../util/object.js";
|
|
2
2
|
import { coerceArray } from "../../../util/array.js";
|
|
3
3
|
import { logger } from "../../../logger/index.js";
|
|
4
|
-
import { getToolConfig } from "../../../util/exec/containerbase.js";
|
|
5
4
|
import { isToolName } from "../../../util/exec/types.js";
|
|
5
|
+
import { getToolConfig } from "../../../util/exec/containerbase.js";
|
|
6
6
|
import { parsePreset } from "../../../config/presets/parse.js";
|
|
7
7
|
import { GiteaTagsDatasource } from "../../datasource/gitea-tags/index.js";
|
|
8
8
|
import { ForgejoTagsDatasource } from "../../datasource/forgejo-tags/index.js";
|
|
@@ -37,7 +37,7 @@ function getRepoUrl(repo, gitUrl, endpoint) {
|
|
|
37
37
|
hostType: "scm-manager",
|
|
38
38
|
url: endpoint
|
|
39
39
|
});
|
|
40
|
-
repoUrl.username = hostOptions.username ?? "";
|
|
40
|
+
repoUrl.username = hostOptions.username ?? "x-access-token";
|
|
41
41
|
repoUrl.password = hostOptions.token ?? "";
|
|
42
42
|
return repoUrl.toString();
|
|
43
43
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":["hostRules.find"],"sources":["../../../../lib/modules/platform/scm-manager/utils.ts"],"sourcesContent":["import type { MergeStrategy } from '../../../config/types.ts';\nimport { logger } from '../../../logger/index.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { parseUrl } from '../../../util/url.ts';\nimport type { GitUrlOption, Pr } from '../types.ts';\nimport type { PrMergeMethod, Repo } from './schema.ts';\nimport type { PrFilterByState } from './types.ts';\n\nexport function mapPrState(\n state: 'open' | 'closed' | undefined,\n): 'OPEN' | 'REJECTED' | undefined {\n switch (state) {\n case 'open':\n return 'OPEN';\n case 'closed':\n return 'REJECTED';\n default:\n return undefined;\n }\n}\n\nexport function matchPrState(pr: Pr, state: PrFilterByState): boolean {\n if (state === 'all') {\n return true;\n }\n\n if (state === '!open' && (pr.state === 'closed' || pr.state === 'merged')) {\n return true;\n }\n\n return state === pr.state;\n}\n\nexport function smartLinks(body: string): string {\n return body.replace(regEx(/]\\(\\.\\.\\/pull\\//g), '](pulls/');\n}\n\nexport function getRepoUrl(\n repo: Repo,\n gitUrl: GitUrlOption | undefined,\n endpoint: string,\n): string {\n const protocolLinks = repo._links.protocol;\n\n if (!protocolLinks) {\n throw new Error('Missing protocol links.');\n }\n\n if (!Array.isArray(protocolLinks)) {\n throw new Error('Expected protocol links to be an array of links.');\n }\n\n if (gitUrl === 'ssh') {\n const sshUrl = protocolLinks.find((l) => l.name === 'ssh')?.href;\n if (!sshUrl) {\n throw new Error('MISSING_SSH_LINKS');\n }\n\n logger.debug(`Using SSH URL: ${sshUrl}`);\n return sshUrl;\n }\n\n const httpUrl = protocolLinks.find((l) => l.name === 'http')?.href;\n if (!httpUrl) {\n throw new Error('MISSING_HTTP_LINK');\n }\n\n logger.debug(`Using HTTP URL: ${httpUrl}`);\n\n const repoUrl = parseUrl(httpUrl);\n if (!repoUrl) {\n throw new Error('MALFORMED_HTTP_LINK');\n }\n\n const hostOptions = hostRules.find({\n hostType: 'scm-manager',\n url: endpoint,\n });\n\n repoUrl.username = hostOptions.username ?? '';\n repoUrl.password = hostOptions.token ?? '';\n\n return repoUrl.toString();\n}\n\nexport function getMergeMethod(\n strategy: MergeStrategy | undefined,\n): PrMergeMethod | null {\n switch (strategy) {\n case 'fast-forward':\n return 'FAST_FORWARD_ONLY';\n case 'merge-commit':\n return 'MERGE_COMMIT';\n case 'rebase':\n return 'REBASE';\n case 'squash':\n return 'SQUASH';\n default:\n return null;\n }\n}\n"],"mappings":";;;;;AASA,SAAgB,WACd,OACiC;CACjC,QAAQ,OAAR;EACE,KAAK,QACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,SACE;CACJ;AACF;AAEA,SAAgB,aAAa,IAAQ,OAAiC;CACpE,IAAI,UAAU,OACZ,OAAO;CAGT,IAAI,UAAU,YAAY,GAAG,UAAU,YAAY,GAAG,UAAU,WAC9D,OAAO;CAGT,OAAO,UAAU,GAAG;AACtB;AAEA,SAAgB,WAAW,MAAsB;CAC/C,OAAO,KAAK,QAAQ,MAAM,kBAAkB,GAAG,UAAU;AAC3D;AAEA,SAAgB,WACd,MACA,QACA,UACQ;CACR,MAAM,gBAAgB,KAAK,OAAO;CAElC,IAAI,CAAC,eACH,MAAM,IAAI,MAAM,yBAAyB;CAG3C,IAAI,CAAC,MAAM,QAAQ,aAAa,GAC9B,MAAM,IAAI,MAAM,kDAAkD;CAGpE,IAAI,WAAW,OAAO;EACpB,MAAM,SAAS,cAAc,MAAM,MAAM,EAAE,SAAS,KAAK,CAAC,EAAE;EAC5D,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,mBAAmB;EAGrC,OAAO,MAAM,kBAAkB,QAAQ;EACvC,OAAO;CACT;CAEA,MAAM,UAAU,cAAc,MAAM,MAAM,EAAE,SAAS,MAAM,CAAC,EAAE;CAC9D,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,mBAAmB;CAGrC,OAAO,MAAM,mBAAmB,SAAS;CAEzC,MAAM,UAAU,SAAS,OAAO;CAChC,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,qBAAqB;CAGvC,MAAM,cAAcA,KAAe;EACjC,UAAU;EACV,KAAK;CACP,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.js","names":["hostRules.find"],"sources":["../../../../lib/modules/platform/scm-manager/utils.ts"],"sourcesContent":["import type { MergeStrategy } from '../../../config/types.ts';\nimport { logger } from '../../../logger/index.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { parseUrl } from '../../../util/url.ts';\nimport type { GitUrlOption, Pr } from '../types.ts';\nimport type { PrMergeMethod, Repo } from './schema.ts';\nimport type { PrFilterByState } from './types.ts';\n\nexport function mapPrState(\n state: 'open' | 'closed' | undefined,\n): 'OPEN' | 'REJECTED' | undefined {\n switch (state) {\n case 'open':\n return 'OPEN';\n case 'closed':\n return 'REJECTED';\n default:\n return undefined;\n }\n}\n\nexport function matchPrState(pr: Pr, state: PrFilterByState): boolean {\n if (state === 'all') {\n return true;\n }\n\n if (state === '!open' && (pr.state === 'closed' || pr.state === 'merged')) {\n return true;\n }\n\n return state === pr.state;\n}\n\nexport function smartLinks(body: string): string {\n return body.replace(regEx(/]\\(\\.\\.\\/pull\\//g), '](pulls/');\n}\n\nexport function getRepoUrl(\n repo: Repo,\n gitUrl: GitUrlOption | undefined,\n endpoint: string,\n): string {\n const protocolLinks = repo._links.protocol;\n\n if (!protocolLinks) {\n throw new Error('Missing protocol links.');\n }\n\n if (!Array.isArray(protocolLinks)) {\n throw new Error('Expected protocol links to be an array of links.');\n }\n\n if (gitUrl === 'ssh') {\n const sshUrl = protocolLinks.find((l) => l.name === 'ssh')?.href;\n if (!sshUrl) {\n throw new Error('MISSING_SSH_LINKS');\n }\n\n logger.debug(`Using SSH URL: ${sshUrl}`);\n return sshUrl;\n }\n\n const httpUrl = protocolLinks.find((l) => l.name === 'http')?.href;\n if (!httpUrl) {\n throw new Error('MISSING_HTTP_LINK');\n }\n\n logger.debug(`Using HTTP URL: ${httpUrl}`);\n\n const repoUrl = parseUrl(httpUrl);\n if (!repoUrl) {\n throw new Error('MALFORMED_HTTP_LINK');\n }\n\n const hostOptions = hostRules.find({\n hostType: 'scm-manager',\n url: endpoint,\n });\n\n // SCM-Manager ignores the username for API keys, `x-access-token` is our own choice and not documented by SCM-Manager\n repoUrl.username = hostOptions.username ?? 'x-access-token';\n repoUrl.password = hostOptions.token ?? '';\n\n return repoUrl.toString();\n}\n\nexport function getMergeMethod(\n strategy: MergeStrategy | undefined,\n): PrMergeMethod | null {\n switch (strategy) {\n case 'fast-forward':\n return 'FAST_FORWARD_ONLY';\n case 'merge-commit':\n return 'MERGE_COMMIT';\n case 'rebase':\n return 'REBASE';\n case 'squash':\n return 'SQUASH';\n default:\n return null;\n }\n}\n"],"mappings":";;;;;AASA,SAAgB,WACd,OACiC;CACjC,QAAQ,OAAR;EACE,KAAK,QACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,SACE;CACJ;AACF;AAEA,SAAgB,aAAa,IAAQ,OAAiC;CACpE,IAAI,UAAU,OACZ,OAAO;CAGT,IAAI,UAAU,YAAY,GAAG,UAAU,YAAY,GAAG,UAAU,WAC9D,OAAO;CAGT,OAAO,UAAU,GAAG;AACtB;AAEA,SAAgB,WAAW,MAAsB;CAC/C,OAAO,KAAK,QAAQ,MAAM,kBAAkB,GAAG,UAAU;AAC3D;AAEA,SAAgB,WACd,MACA,QACA,UACQ;CACR,MAAM,gBAAgB,KAAK,OAAO;CAElC,IAAI,CAAC,eACH,MAAM,IAAI,MAAM,yBAAyB;CAG3C,IAAI,CAAC,MAAM,QAAQ,aAAa,GAC9B,MAAM,IAAI,MAAM,kDAAkD;CAGpE,IAAI,WAAW,OAAO;EACpB,MAAM,SAAS,cAAc,MAAM,MAAM,EAAE,SAAS,KAAK,CAAC,EAAE;EAC5D,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,mBAAmB;EAGrC,OAAO,MAAM,kBAAkB,QAAQ;EACvC,OAAO;CACT;CAEA,MAAM,UAAU,cAAc,MAAM,MAAM,EAAE,SAAS,MAAM,CAAC,EAAE;CAC9D,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,mBAAmB;CAGrC,OAAO,MAAM,mBAAmB,SAAS;CAEzC,MAAM,UAAU,SAAS,OAAO;CAChC,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,qBAAqB;CAGvC,MAAM,cAAcA,KAAe;EACjC,UAAU;EACV,KAAK;CACP,CAAC;CAGD,QAAQ,WAAW,YAAY,YAAY;CAC3C,QAAQ,WAAW,YAAY,SAAS;CAExC,OAAO,QAAQ,SAAS;AAC1B"}
|
|
@@ -5,7 +5,9 @@ import { GlobalConfig } from "../../config/global.js";
|
|
|
5
5
|
import { coerceArray } from "../array.js";
|
|
6
6
|
import { logger } from "../../logger/index.js";
|
|
7
7
|
import { buildCacheKey } from "../cache/package/key.js";
|
|
8
|
+
import { isToolName } from "./types.js";
|
|
8
9
|
import { isString } from "@sindresorhus/is";
|
|
10
|
+
import { tools } from "@renovatebot/base-image";
|
|
9
11
|
import { quote } from "shlex";
|
|
10
12
|
//#region lib/util/exec/containerbase.ts
|
|
11
13
|
/**
|
|
@@ -254,9 +256,21 @@ function getSupportedToolNames() {
|
|
|
254
256
|
return Object.keys(allToolConfig);
|
|
255
257
|
}
|
|
256
258
|
let _getPkgReleases = null;
|
|
257
|
-
async function getPkgReleases(toolConfig) {
|
|
259
|
+
async function getPkgReleases(toolConfig, resolvedTools = {}) {
|
|
258
260
|
_getPkgReleases ??= import("../../modules/datasource/index.js");
|
|
259
261
|
const { getPkgReleases } = await _getPkgReleases;
|
|
262
|
+
if (Object.keys(resolvedTools).length) {
|
|
263
|
+
const compatible = await getPkgReleases({
|
|
264
|
+
...toolConfig,
|
|
265
|
+
constraintsFiltering: "strict",
|
|
266
|
+
constraints: { ...resolvedTools }
|
|
267
|
+
});
|
|
268
|
+
if (compatible?.releases.length) return compatible;
|
|
269
|
+
logger.debug({
|
|
270
|
+
toolConfig,
|
|
271
|
+
resolvedTools
|
|
272
|
+
}, "No tool releases compatible with resolved tools - ignoring their constraints");
|
|
273
|
+
}
|
|
260
274
|
return getPkgReleases(toolConfig);
|
|
261
275
|
}
|
|
262
276
|
function getToolConfig(toolName) {
|
|
@@ -281,7 +295,7 @@ function isStable(version, versioningApi, latest) {
|
|
|
281
295
|
if (isString(latest) && versioningApi.isGreaterThan(version, latest)) return false;
|
|
282
296
|
return true;
|
|
283
297
|
}
|
|
284
|
-
async function resolveConstraint(toolConstraint) {
|
|
298
|
+
async function resolveConstraint(toolConstraint, resolvedTools = {}) {
|
|
285
299
|
const { toolName } = toolConstraint;
|
|
286
300
|
const toolConfig = allToolConfig[toolName];
|
|
287
301
|
if (!toolConfig) throw new Error(`Invalid tool to install: ${toolName}`);
|
|
@@ -300,7 +314,7 @@ async function resolveConstraint(toolConstraint) {
|
|
|
300
314
|
constraint = void 0;
|
|
301
315
|
}
|
|
302
316
|
}
|
|
303
|
-
const pkgReleases = await getPkgReleases(toolConfig);
|
|
317
|
+
const pkgReleases = await getPkgReleases(toolConfig, resolvedTools);
|
|
304
318
|
const releases = coerceArray(pkgReleases?.releases);
|
|
305
319
|
if (!releases?.length) {
|
|
306
320
|
logger.warn({ toolConfig }, "No tool releases found.");
|
|
@@ -341,16 +355,23 @@ async function resolveConstraint(toolConstraint) {
|
|
|
341
355
|
}
|
|
342
356
|
async function generateInstallCommands(toolConstraints, memoize = false) {
|
|
343
357
|
const installCommands = [];
|
|
344
|
-
if (toolConstraints?.length)
|
|
345
|
-
const
|
|
346
|
-
const
|
|
347
|
-
|
|
348
|
-
const
|
|
349
|
-
|
|
350
|
-
|
|
358
|
+
if (toolConstraints?.length) {
|
|
359
|
+
const resolvedTools = {};
|
|
360
|
+
for (const toolConstraint of toolConstraints) {
|
|
361
|
+
const { toolName } = toolConstraint;
|
|
362
|
+
const { parent } = tools[toolName];
|
|
363
|
+
const parentConstraint = {};
|
|
364
|
+
if (isToolName(parent) && resolvedTools[parent]) parentConstraint[parent] = resolvedTools[parent];
|
|
365
|
+
const toolVersion = await resolveConstraint(toolConstraint, parentConstraint);
|
|
366
|
+
resolvedTools[toolName] = toolVersion;
|
|
367
|
+
if (memoize) {
|
|
368
|
+
const cacheKey = buildCacheKey("containerbase-active", toolName);
|
|
369
|
+
if (get(cacheKey) === toolVersion) continue;
|
|
370
|
+
set(cacheKey, toolVersion);
|
|
371
|
+
}
|
|
372
|
+
const installCommand = `install-tool ${toolName} ${quote(toolVersion)}`;
|
|
373
|
+
installCommands.push(installCommand);
|
|
351
374
|
}
|
|
352
|
-
const installCommand = `install-tool ${toolName} ${quote(toolVersion)}`;
|
|
353
|
-
installCommands.push(installCommand);
|
|
354
375
|
}
|
|
355
376
|
return installCommands;
|
|
356
377
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"containerbase.js","names":["memCache.get"],"sources":["../../../lib/util/exec/containerbase.ts"],"sourcesContent":["import { 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 { getEnv } from '../env.ts';\nimport { regEx } from '../regex.ts';\nimport type { Opt, ToolConfig, ToolConstraint, ToolName } 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: 'jsonnet-bundler/jsonnet-bundler',\n versioning: 'semver',\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 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 * A Containerbase `tool` that Renovate supports configuring the version of.\n */\nexport type SupportedToolNames = keyof typeof allToolConfig;\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): Promise<ReleaseResult | null> {\n _getPkgReleases ??= import('../../modules/datasource/index.ts');\n const { getPkgReleases } = await _getPkgReleases;\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 isContainerbase(): boolean {\n return !!getEnv().CONTAINERBASE;\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): 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);\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 for (const toolConstraint of toolConstraints) {\n const toolVersion = await resolveConstraint(toolConstraint);\n const { toolName } = toolConstraint;\n if (memoize) {\n const cacheKey = buildCacheKey('containerbase-active', toolName);\n if (memCache.get<string | undefined>(cacheKey) === toolVersion) {\n continue;\n }\n memCache.set(cacheKey, toolVersion);\n }\n const installCommand = `install-tool ${toolName} ${quote(toolVersion)}`;\n installCommands.push(installCommand);\n }\n }\n return installCommands;\n}\n"],"mappings":";;;;;;;;;;;;;AAgBA,MAAa,gBAAuD;CAClE,KAAK;EACH,YAAY;EACZ,aAAa;EACb,YAAY;EACZ,gBAAgB;CAClB;CACA,UAAU;EACR,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,KAAK;EACH,YAAY;EACZ,aAAa;EACb,gBAAgB;EAChB,YAAY;CACd;CACA,SAAS;EACP,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,WAAW;EACT,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,UAAU;EACR,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,OAAO;EACL,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,QAAQ;EACN,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,UAAU;EACR,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,MAAM;EACJ,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,QAAQ;EACN,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,QAAQ;EACN,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,QAAQ;EACN,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,QAAQ;EACN,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,MAAM;EACJ,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,IAAI;EACF,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,OAAO;EACL,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,QAAQ;EACN,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,QAAQ;EACN,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,QAAQ;EACN,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,MAAM;EACJ,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,UAAU;EACR,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,MAAM;EACJ,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,IAAI;EACF,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,WAAW;EACT,YAAY;EACZ,aAAa;EACb,gBAAgB;EAChB,YAAY;CACd;CACA,OAAO;EACL,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,MAAM;EACJ,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,KAAK;EACH,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,MAAM;EACJ,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,KAAK;EACH,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,KAAK;EACH,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,KAAK;EACH,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,aAAa;EACX,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,QAAQ;EACN,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,MAAM;EACJ,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,MAAM;EACJ,YAAY;EACZ,aAAa;EACb,YAAY;EACZ,gBAAgB;CAClB;CACA,QAAQ;EACN,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,QAAQ;EACN,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,MAAM;EACJ,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,MAAM;EACJ,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,IAAI;EACF,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,MAAM;EACJ,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,aAAa;EACX,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,MAAM;EACJ,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,SAAS;EACP,YAAY;EACZ,aAAa;EACb,YAAY;CACd;CACA,QAAQ;EACN,YAAY;EACZ,aAAa;EACb,YAAY;CACd;AACF;;;;AAUA,SAAgB,wBAA6C;CAC3D,OAAO,OAAO,KAAK,aAAa;AAClC;AAEA,IAAI,kBAEO;AAEX,eAAe,eACb,YAC+B;CAC/B,oBAAoB,OAAO;CAC3B,MAAM,EAAE,mBAAmB,MAAM;CACjC,OAAO,eAAe,UAAU;AAClC;AAEA,SAAgB,cAAc,UAA4C;CACxE,OAAO,cAAc;AACvB;AAEA,SAAgB,uBAAuB,UAA6B;CAClE,OAAO,CAAC,CAAC,cAAc;AACzB;AAEA,SAAgB,kBAA2B;CACzC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;AACpB;AAEA,SAAgB,iBACd,iBACS;CACT,IAAI,aAAa,IAAI,cAAc,MAAM,WACvC,OAAO;CAET,IAAI,CAAC,gBAAgB,GAAG;EACtB,OAAO,MAAM,qCAAqC;EAClD,OAAO;CACT;CACA,OACE,CAAC,mBACD,gBAAgB,OAAO,mBACrB,uBAAuB,eAAe,QAAQ,CAChD;AAEJ;AAEA,SAAS,SACP,SACA,eACA,QACS;CACT,IAAI,CAAC,cAAc,SAAS,OAAO,GACjC,OAAO;CAET,IAAI,SAAS,MAAM,KAAK,cAAc,cAAc,SAAS,MAAM,GACjE,OAAO;CAET,OAAO;AACT;AAEA,eAAsB,kBACpB,gBACiB;CACjB,MAAM,EAAE,aAAa;CACrB,MAAM,aAAa,cAAc;CACjC,IAAI,CAAC,YACH,MAAM,IAAI,MAAM,4BAA4B,UAAU;CAGxD,MAAM,EAAE,KAAK,kBACX,MAAM,OAAO;CACf,MAAM,aAAa,cAAc,WAAW,UAAU;CACtD,IAAI,aAAa,eAAe;CAChC,IAAI,YAAY;EACd,IAAI,WAAW,QAAQ,UAAU,GAC3B;OAAA,WAAW,gBAAgB,UAAU,GACvC,OAAO,WAAW,QAAQ,MAAM,KAAK,GAAG,EAAE,CAAC,CAAC,KAAK;EAAA,OAE9C;GACL,OAAO,KACL;IAAE;IAAU;IAAY,YAAY,WAAW;GAAW,GAC1D,yBACF;GACA,aAAa,KAAA;EACf;CACF;CAEA,MAAM,cAAc,MAAM,eAAe,UAAU;CACnD,MAAM,WAAW,YAAY,aAAa,QAAQ;CAElD,IAAI,CAAC,UAAU,QAAQ;EACrB,OAAO,KAAK,EAAE,WAAW,GAAG,yBAAyB;EACrD,MAAM,IAAI,MAAM,yBAAyB;CAC3C;CAEA,MAAM,mBAAmB,SAAS,QAC/B,MAAM,CAAC,cAAc,WAAW,QAAQ,EAAE,SAAS,UAAU,CAChE;CAEA,MAAM,wBAAwB,iBAC3B,QAAQ,MAAM,SAAS,EAAE,SAAS,YAAY,aAAa,MAAM,MAAM,CAAC,CAAC,CACzE,IAAI,CAAC,EAAE;CACV,IAAI,uBAAuB;EACzB,OAAO,MACL;GAAE;GAAU;GAAY,iBAAiB;EAAsB,GAC/D,kCACF;EACA,OAAO;CACT;CAEA,MAAM,0BAA0B,iBAAiB,IAAI,CAAC,EAAE;CACxD,IAAI,yBAAyB;EAC3B,OAAO,MACL;GAAE;GAAU;GAAY,iBAAiB;EAAwB,GACjE,oCACF;EACA,OAAO;CACT;CAEA,MAAM,gBAAgB,SACnB,QAAQ,MAAM,SAAS,EAAE,SAAS,YAAY,aAAa,MAAM,MAAM,CAAC,CAAC,CACzE,IAAI,CAAC,EAAE;CACV,IAAI,eACF,OAAO,KACL;EAAE;EAAU;EAAY;CAAc,GACtC,8EACF;CAGF,MAAM,iBAAiB,SAAS,IAAI,CAAC,CAAE;CACvC,OAAO,KACL;EAAE;EAAU;EAAY;CAAe,GACvC,uEACF;CACA,OAAO;AACT;AAOA,eAAsB,wBACpB,iBACA,UAAU,OACS;CACnB,MAAM,kBAA4B,CAAC;CACnC,IAAI,iBAAiB,QACnB,KAAK,MAAM,kBAAkB,iBAAiB;EAC5C,MAAM,cAAc,MAAM,kBAAkB,cAAc;EAC1D,MAAM,EAAE,aAAa;EACrB,IAAI,SAAS;GACX,MAAM,WAAW,cAAc,wBAAwB,QAAQ;GAC/D,IAAIA,IAAiC,QAAQ,MAAM,aACjD;GAEF,IAAa,UAAU,WAAW;EACpC;EACA,MAAM,iBAAiB,gBAAgB,SAAS,GAAG,MAAM,WAAW;EACpE,gBAAgB,KAAK,cAAc;CACrC;CAEF,OAAO;AACT"}
|
|
1
|
+
{"version":3,"file":"containerbase.js","names":["memCache.get"],"sources":["../../../lib/util/exec/containerbase.ts"],"sourcesContent":["import { type ToolMetadata, tools } 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 { getEnv } from '../env.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: 'jsonnet-bundler/jsonnet-bundler',\n versioning: 'semver',\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 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 * A Containerbase `tool` that Renovate supports configuring the version of.\n */\nexport type SupportedToolNames = keyof typeof allToolConfig;\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 isContainerbase(): boolean {\n return !!getEnv().CONTAINERBASE;\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 if (memCache.get<string | undefined>(cacheKey) === toolVersion) {\n continue;\n }\n memCache.set(cacheKey, toolVersion);\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.164.
|
|
3
|
+
"title": "JSON schema for Renovate 44.164.9 config files (https://renovatebot.com/)",
|
|
4
4
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
5
|
-
"x-renovate-version": "44.164.
|
|
5
|
+
"x-renovate-version": "44.164.9",
|
|
6
6
|
"allowComments": true,
|
|
7
7
|
"type": "object",
|
|
8
8
|
"definitions": {
|