renovate 39.254.1 → 39.254.3

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.
@@ -1,4 +1,3 @@
1
1
  import type { Http } from '../../../util/http';
2
2
  import type { ReleaseResult } from '../types';
3
- export declare const CACHE_REVISION = 1;
4
3
  export declare function getDependency(http: Http, registryUrl: string, packageName: string): Promise<ReleaseResult | null>;
@@ -1,23 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CACHE_REVISION = void 0;
4
3
  exports.getDependency = getDependency;
5
4
  const tslib_1 = require("tslib");
6
- const node_url_1 = tslib_1.__importDefault(require("node:url"));
7
5
  const is_1 = tslib_1.__importDefault(require("@sindresorhus/is"));
8
- const luxon_1 = require("luxon");
9
6
  const zod_1 = require("zod");
10
- const global_1 = require("../../../config/global");
11
7
  const error_messages_1 = require("../../../constants/error-messages");
12
8
  const logger_1 = require("../../../logger");
13
9
  const external_host_error_1 = require("../../../types/errors/external-host-error");
14
- const packageCache = tslib_1.__importStar(require("../../../util/cache/package"));
15
10
  const hostRules = tslib_1.__importStar(require("../../../util/host-rules"));
11
+ const package_http_cache_provider_1 = require("../../../util/http/cache/package-http-cache-provider");
16
12
  const regex_1 = require("../../../util/regex");
17
- const stats_1 = require("../../../util/stats");
18
13
  const timestamp_1 = require("../../../util/timestamp");
19
14
  const url_1 = require("../../../util/url");
20
- exports.CACHE_REVISION = 1;
21
15
  const SHORT_REPO_REGEX = (0, regex_1.regEx)(/^((?<platform>bitbucket|github|gitlab):)?(?<shortRepo>[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+)$/);
22
16
  const platformMapping = {
23
17
  bitbucket: 'https://bitbucket.org/',
@@ -62,40 +56,12 @@ const PackageSource = zod_1.z
62
56
  async function getDependency(http, registryUrl, packageName) {
63
57
  logger_1.logger.trace(`npm.getDependency(${packageName})`);
64
58
  const packageUrl = (0, url_1.joinUrlParts)(registryUrl, packageName.replace('/', '%2F'));
65
- // Now check the persistent cache
66
- const cacheNamespace = 'datasource-npm:data';
67
- const cachedResult = await packageCache.get(cacheNamespace, packageUrl);
68
- if (cachedResult?.cacheData) {
69
- if (cachedResult.cacheData.revision === exports.CACHE_REVISION) {
70
- const softExpireAt = luxon_1.DateTime.fromISO(cachedResult.cacheData.softExpireAt);
71
- if (softExpireAt.isValid && softExpireAt > luxon_1.DateTime.local()) {
72
- logger_1.logger.trace('Cached result is not expired - reusing');
73
- stats_1.HttpCacheStats.incLocalHits(packageUrl);
74
- delete cachedResult.cacheData;
75
- return cachedResult;
76
- }
77
- logger_1.logger.trace('Cached result is soft expired');
78
- stats_1.HttpCacheStats.incLocalMisses(packageUrl);
79
- }
80
- else {
81
- logger_1.logger.trace(`Package cache for npm package "${packageName}" is from an old revision - discarding`);
82
- delete cachedResult.cacheData;
83
- }
84
- }
85
- const cacheMinutes = 15;
86
- const softExpireAt = luxon_1.DateTime.local().plus({ minutes: cacheMinutes }).toISO();
87
- let cacheHardTtlMinutes = global_1.GlobalConfig.get('cacheHardTtlMinutes');
88
- if (!(is_1.default.number(cacheHardTtlMinutes) &&
89
- /* istanbul ignore next: needs test */ cacheHardTtlMinutes > cacheMinutes)) {
90
- cacheHardTtlMinutes = cacheMinutes;
91
- }
92
- const uri = node_url_1.default.parse(packageUrl);
93
59
  try {
94
- const options = {};
95
- if (cachedResult?.cacheData?.etag) {
96
- logger_1.logger.trace({ packageName }, 'Using cached etag');
97
- options.headers = { 'If-None-Match': cachedResult.cacheData.etag };
98
- }
60
+ const cacheProvider = new package_http_cache_provider_1.PackageHttpCacheProvider({
61
+ namespace: 'datasource-npm:cache-provider',
62
+ checkAuthorizationHeader: false,
63
+ });
64
+ const options = { cacheProvider };
99
65
  // set abortOnError for registry.npmjs.org if no hostRule with explicit abortOnError exists
100
66
  if (registryUrl === 'https://registry.npmjs.org' &&
101
67
  hostRules.find({ url: 'https://registry.npmjs.org' })?.abortOnError ===
@@ -106,18 +72,8 @@ async function getDependency(http, registryUrl, packageName) {
106
72
  abortOnError: true,
107
73
  });
108
74
  }
109
- const raw = await http.getJsonUnchecked(packageUrl, options);
110
- if (cachedResult?.cacheData && raw.statusCode === 304) {
111
- logger_1.logger.trace(`Cached npm result for ${packageName} is revalidated`);
112
- stats_1.HttpCacheStats.incRemoteHits(packageUrl);
113
- cachedResult.cacheData.softExpireAt = softExpireAt;
114
- await packageCache.set(cacheNamespace, packageUrl, cachedResult, cacheHardTtlMinutes);
115
- delete cachedResult.cacheData;
116
- return cachedResult;
117
- }
118
- stats_1.HttpCacheStats.incRemoteMisses(packageUrl);
119
- const etag = raw.headers.etag;
120
- const res = raw.body;
75
+ const resp = await http.getJsonUnchecked(packageUrl, options);
76
+ const { body: res } = resp;
121
77
  if (!res.versions || !Object.keys(res.versions).length) {
122
78
  // Registry returned a 200 OK but with no versions
123
79
  logger_1.logger.debug(`No versions returned for npm dependency ${packageName}`);
@@ -174,19 +130,14 @@ async function getDependency(http, registryUrl, packageName) {
174
130
  }
175
131
  return release;
176
132
  });
177
- logger_1.logger.trace({ dep }, 'dep');
178
- const cacheControl = raw.headers?.['cache-control'];
179
- if (is_1.default.nonEmptyString(cacheControl) &&
180
- (0, regex_1.regEx)(/(^|,)\s*public\s*(,|$)/).test(cacheControl)) {
181
- dep.isPrivate = false;
182
- const cacheData = { revision: exports.CACHE_REVISION, softExpireAt, etag };
183
- await packageCache.set(cacheNamespace, packageUrl, { ...dep, cacheData }, etag
184
- ? /* istanbul ignore next: needs test */ cacheHardTtlMinutes
185
- : cacheMinutes);
186
- }
187
- else {
133
+ const isPublic = resp.headers?.['cache-control']
134
+ ?.toLocaleLowerCase()
135
+ ?.split((0, regex_1.regEx)(/\s*,\s*/))
136
+ ?.includes('public');
137
+ if (!isPublic) {
188
138
  dep.isPrivate = true;
189
139
  }
140
+ logger_1.logger.trace({ dep }, 'dep');
190
141
  return dep;
191
142
  }
192
143
  catch (err) {
@@ -199,11 +150,6 @@ async function getDependency(http, registryUrl, packageName) {
199
150
  return null;
200
151
  }
201
152
  if (err instanceof external_host_error_1.ExternalHostError) {
202
- if (cachedResult) {
203
- logger_1.logger.warn({ err, host: uri.host }, `npm host error, reusing expired cached result instead`);
204
- delete cachedResult.cacheData;
205
- return cachedResult;
206
- }
207
153
  if (actualError.name === 'ParseError' && actualError.body) {
208
154
  actualError.body = 'err.body deleted by Renovate';
209
155
  err.err = actualError;
@@ -1 +1 @@
1
- {"version":3,"file":"get.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/npm/get.ts"],"names":[],"mappings":"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","sourcesContent":["import url from 'node:url';\nimport is from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport { z } from 'zod';\nimport { GlobalConfig } from '../../../config/global';\nimport { HOST_DISABLED } from '../../../constants/error-messages';\nimport { logger } from '../../../logger';\nimport { ExternalHostError } from '../../../types/errors/external-host-error';\nimport * as packageCache from '../../../util/cache/package';\nimport * as hostRules from '../../../util/host-rules';\nimport type { Http } from '../../../util/http';\nimport type { HttpOptions } from '../../../util/http/types';\nimport { regEx } from '../../../util/regex';\nimport { HttpCacheStats } from '../../../util/stats';\nimport { asTimestamp } from '../../../util/timestamp';\nimport { joinUrlParts } from '../../../util/url';\nimport type { Release, ReleaseResult } from '../types';\nimport type { CachedReleaseResult, NpmResponse } from './types';\n\nexport const CACHE_REVISION = 1;\n\nconst SHORT_REPO_REGEX = regEx(\n /^((?<platform>bitbucket|github|gitlab):)?(?<shortRepo>[A-Za-z0-9_.-]+\\/[A-Za-z0-9_.-]+)$/,\n);\n\nconst platformMapping: Record<string, string> = {\n bitbucket: 'https://bitbucket.org/',\n github: 'https://github.com/',\n gitlab: 'https://gitlab.com/',\n};\n\ninterface PackageSource {\n sourceUrl: string | null;\n sourceDirectory: string | null;\n}\n\nconst PackageSource = z\n .union([\n z\n .string()\n .nonempty()\n .transform((repository): PackageSource => {\n let sourceUrl: string | null = null;\n const sourceDirectory = null;\n const shortMatch = repository.match(SHORT_REPO_REGEX);\n if (shortMatch?.groups) {\n const { platform = 'github', shortRepo } = shortMatch.groups;\n sourceUrl = platformMapping[platform] + shortRepo;\n } else {\n sourceUrl = repository;\n }\n return { sourceUrl, sourceDirectory };\n }),\n z\n .object({\n url: z.string().nonempty().nullish(),\n directory: z.string().nonempty().nullish(),\n })\n .transform(({ url, directory }) => {\n const res: PackageSource = { sourceUrl: null, sourceDirectory: null };\n\n if (url) {\n res.sourceUrl = url;\n }\n\n if (directory) {\n res.sourceDirectory = directory;\n }\n\n return res;\n }),\n ])\n .catch({ sourceUrl: null, sourceDirectory: null });\n\nexport async function getDependency(\n http: Http,\n registryUrl: string,\n packageName: string,\n): Promise<ReleaseResult | null> {\n logger.trace(`npm.getDependency(${packageName})`);\n\n const packageUrl = joinUrlParts(registryUrl, packageName.replace('/', '%2F'));\n\n // Now check the persistent cache\n const cacheNamespace = 'datasource-npm:data';\n const cachedResult = await packageCache.get<CachedReleaseResult>(\n cacheNamespace,\n packageUrl,\n );\n if (cachedResult?.cacheData) {\n if (cachedResult.cacheData.revision === CACHE_REVISION) {\n const softExpireAt = DateTime.fromISO(\n cachedResult.cacheData.softExpireAt,\n );\n if (softExpireAt.isValid && softExpireAt > DateTime.local()) {\n logger.trace('Cached result is not expired - reusing');\n HttpCacheStats.incLocalHits(packageUrl);\n delete cachedResult.cacheData;\n return cachedResult;\n }\n\n logger.trace('Cached result is soft expired');\n HttpCacheStats.incLocalMisses(packageUrl);\n } else {\n logger.trace(\n `Package cache for npm package \"${packageName}\" is from an old revision - discarding`,\n );\n delete cachedResult.cacheData;\n }\n }\n const cacheMinutes = 15;\n const softExpireAt = DateTime.local().plus({ minutes: cacheMinutes }).toISO();\n let cacheHardTtlMinutes = GlobalConfig.get('cacheHardTtlMinutes');\n if (\n !(\n is.number(cacheHardTtlMinutes) &&\n /* istanbul ignore next: needs test */ cacheHardTtlMinutes > cacheMinutes\n )\n ) {\n cacheHardTtlMinutes = cacheMinutes;\n }\n\n const uri = url.parse(packageUrl);\n\n try {\n const options: HttpOptions = {};\n if (cachedResult?.cacheData?.etag) {\n logger.trace({ packageName }, 'Using cached etag');\n options.headers = { 'If-None-Match': cachedResult.cacheData.etag };\n }\n\n // set abortOnError for registry.npmjs.org if no hostRule with explicit abortOnError exists\n if (\n registryUrl === 'https://registry.npmjs.org' &&\n hostRules.find({ url: 'https://registry.npmjs.org' })?.abortOnError ===\n undefined\n ) {\n logger.trace(\n { packageName, registry: 'https://registry.npmjs.org' },\n 'setting abortOnError hostRule for well known host',\n );\n hostRules.add({\n matchHost: 'https://registry.npmjs.org',\n abortOnError: true,\n });\n }\n\n const raw = await http.getJsonUnchecked<NpmResponse>(packageUrl, options);\n if (cachedResult?.cacheData && raw.statusCode === 304) {\n logger.trace(`Cached npm result for ${packageName} is revalidated`);\n HttpCacheStats.incRemoteHits(packageUrl);\n cachedResult.cacheData.softExpireAt = softExpireAt;\n await packageCache.set(\n cacheNamespace,\n packageUrl,\n cachedResult,\n cacheHardTtlMinutes,\n );\n delete cachedResult.cacheData;\n return cachedResult;\n }\n HttpCacheStats.incRemoteMisses(packageUrl);\n const etag = raw.headers.etag;\n const res = raw.body;\n if (!res.versions || !Object.keys(res.versions).length) {\n // Registry returned a 200 OK but with no versions\n logger.debug(`No versions returned for npm dependency ${packageName}`);\n return null;\n }\n\n const latestVersion = res.versions[res['dist-tags']?.latest ?? ''];\n res.repository ??= latestVersion?.repository;\n res.homepage ??= latestVersion?.homepage;\n\n const { sourceUrl, sourceDirectory } = PackageSource.parse(res.repository);\n\n // Simplify response before caching and returning\n const dep: ReleaseResult = {\n homepage: res.homepage,\n releases: [],\n tags: res['dist-tags'],\n registryUrl,\n };\n\n if (sourceUrl) {\n dep.sourceUrl = sourceUrl;\n }\n\n if (sourceDirectory) {\n dep.sourceDirectory = sourceDirectory;\n }\n\n if (latestVersion?.deprecated) {\n dep.deprecationMessage = `On registry \\`${registryUrl}\\`, the \"latest\" version of dependency \\`${packageName}\\` has the following deprecation notice:\\n\\n\\`${latestVersion.deprecated}\\`\\n\\nMarking the latest version of an npm package as deprecated results in the entire package being considered deprecated, so contact the package author you think this is a mistake.`;\n }\n dep.releases = Object.keys(res.versions).map((version) => {\n const release: Release = {\n version,\n gitRef: res.versions?.[version].gitHead,\n dependencies: res.versions?.[version].dependencies,\n devDependencies: res.versions?.[version].devDependencies,\n };\n const releaseTimestamp = asTimestamp(res.time?.[version]);\n if (releaseTimestamp) {\n release.releaseTimestamp = releaseTimestamp;\n }\n if (res.versions?.[version].deprecated) {\n release.isDeprecated = true;\n }\n const nodeConstraint = res.versions?.[version].engines?.node;\n if (is.nonEmptyString(nodeConstraint)) {\n release.constraints = { node: [nodeConstraint] };\n }\n const source = PackageSource.parse(res.versions?.[version].repository);\n if (source.sourceUrl && source.sourceUrl !== dep.sourceUrl) {\n release.sourceUrl = source.sourceUrl;\n }\n if (\n source.sourceDirectory &&\n source.sourceDirectory !== dep.sourceDirectory\n ) {\n release.sourceDirectory = source.sourceDirectory;\n }\n if (dep.deprecationMessage) {\n release.isDeprecated = true;\n }\n return release;\n });\n logger.trace({ dep }, 'dep');\n const cacheControl = raw.headers?.['cache-control'];\n if (\n is.nonEmptyString(cacheControl) &&\n regEx(/(^|,)\\s*public\\s*(,|$)/).test(cacheControl)\n ) {\n dep.isPrivate = false;\n const cacheData = { revision: CACHE_REVISION, softExpireAt, etag };\n await packageCache.set(\n cacheNamespace,\n packageUrl,\n { ...dep, cacheData },\n etag\n ? /* istanbul ignore next: needs test */ cacheHardTtlMinutes\n : cacheMinutes,\n );\n } else {\n dep.isPrivate = true;\n }\n return dep;\n } catch (err) {\n const actualError = err instanceof ExternalHostError ? err.err : err;\n const ignoredStatusCodes = [401, 402, 403, 404];\n const ignoredResponseCodes = ['ENOTFOUND'];\n if (\n actualError.message === HOST_DISABLED ||\n ignoredStatusCodes.includes(actualError.statusCode) ||\n ignoredResponseCodes.includes(actualError.code)\n ) {\n return null;\n }\n\n if (err instanceof ExternalHostError) {\n if (cachedResult) {\n logger.warn(\n { err, host: uri.host },\n `npm host error, reusing expired cached result instead`,\n );\n delete cachedResult.cacheData;\n return cachedResult;\n }\n\n if (actualError.name === 'ParseError' && actualError.body) {\n actualError.body = 'err.body deleted by Renovate';\n err.err = actualError;\n }\n throw err;\n }\n logger.debug({ err }, 'Unknown npm lookup error');\n return null;\n }\n}\n"]}
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/npm/get.ts"],"names":[],"mappings":"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","sourcesContent":["import is from '@sindresorhus/is';\nimport { z } from 'zod';\nimport { HOST_DISABLED } from '../../../constants/error-messages';\nimport { logger } from '../../../logger';\nimport { ExternalHostError } from '../../../types/errors/external-host-error';\nimport * as hostRules from '../../../util/host-rules';\nimport type { Http } from '../../../util/http';\nimport { PackageHttpCacheProvider } from '../../../util/http/cache/package-http-cache-provider';\nimport type { HttpOptions } from '../../../util/http/types';\nimport { regEx } from '../../../util/regex';\nimport { asTimestamp } from '../../../util/timestamp';\nimport { joinUrlParts } from '../../../util/url';\nimport type { Release, ReleaseResult } from '../types';\nimport type { NpmResponse } from './types';\n\nconst SHORT_REPO_REGEX = regEx(\n /^((?<platform>bitbucket|github|gitlab):)?(?<shortRepo>[A-Za-z0-9_.-]+\\/[A-Za-z0-9_.-]+)$/,\n);\n\nconst platformMapping: Record<string, string> = {\n bitbucket: 'https://bitbucket.org/',\n github: 'https://github.com/',\n gitlab: 'https://gitlab.com/',\n};\n\ninterface PackageSource {\n sourceUrl: string | null;\n sourceDirectory: string | null;\n}\n\nconst PackageSource = z\n .union([\n z\n .string()\n .nonempty()\n .transform((repository): PackageSource => {\n let sourceUrl: string | null = null;\n const sourceDirectory = null;\n const shortMatch = repository.match(SHORT_REPO_REGEX);\n if (shortMatch?.groups) {\n const { platform = 'github', shortRepo } = shortMatch.groups;\n sourceUrl = platformMapping[platform] + shortRepo;\n } else {\n sourceUrl = repository;\n }\n return { sourceUrl, sourceDirectory };\n }),\n z\n .object({\n url: z.string().nonempty().nullish(),\n directory: z.string().nonempty().nullish(),\n })\n .transform(({ url, directory }) => {\n const res: PackageSource = { sourceUrl: null, sourceDirectory: null };\n\n if (url) {\n res.sourceUrl = url;\n }\n\n if (directory) {\n res.sourceDirectory = directory;\n }\n\n return res;\n }),\n ])\n .catch({ sourceUrl: null, sourceDirectory: null });\n\nexport async function getDependency(\n http: Http,\n registryUrl: string,\n packageName: string,\n): Promise<ReleaseResult | null> {\n logger.trace(`npm.getDependency(${packageName})`);\n\n const packageUrl = joinUrlParts(registryUrl, packageName.replace('/', '%2F'));\n\n try {\n const cacheProvider = new PackageHttpCacheProvider({\n namespace: 'datasource-npm:cache-provider',\n checkAuthorizationHeader: false,\n });\n const options: HttpOptions = { cacheProvider };\n\n // set abortOnError for registry.npmjs.org if no hostRule with explicit abortOnError exists\n if (\n registryUrl === 'https://registry.npmjs.org' &&\n hostRules.find({ url: 'https://registry.npmjs.org' })?.abortOnError ===\n undefined\n ) {\n logger.trace(\n { packageName, registry: 'https://registry.npmjs.org' },\n 'setting abortOnError hostRule for well known host',\n );\n hostRules.add({\n matchHost: 'https://registry.npmjs.org',\n abortOnError: true,\n });\n }\n\n const resp = await http.getJsonUnchecked<NpmResponse>(packageUrl, options);\n const { body: res } = resp;\n if (!res.versions || !Object.keys(res.versions).length) {\n // Registry returned a 200 OK but with no versions\n logger.debug(`No versions returned for npm dependency ${packageName}`);\n return null;\n }\n\n const latestVersion = res.versions[res['dist-tags']?.latest ?? ''];\n res.repository ??= latestVersion?.repository;\n res.homepage ??= latestVersion?.homepage;\n\n const { sourceUrl, sourceDirectory } = PackageSource.parse(res.repository);\n\n // Simplify response before caching and returning\n const dep: ReleaseResult = {\n homepage: res.homepage,\n releases: [],\n tags: res['dist-tags'],\n registryUrl,\n };\n\n if (sourceUrl) {\n dep.sourceUrl = sourceUrl;\n }\n\n if (sourceDirectory) {\n dep.sourceDirectory = sourceDirectory;\n }\n\n if (latestVersion?.deprecated) {\n dep.deprecationMessage = `On registry \\`${registryUrl}\\`, the \"latest\" version of dependency \\`${packageName}\\` has the following deprecation notice:\\n\\n\\`${latestVersion.deprecated}\\`\\n\\nMarking the latest version of an npm package as deprecated results in the entire package being considered deprecated, so contact the package author you think this is a mistake.`;\n }\n dep.releases = Object.keys(res.versions).map((version) => {\n const release: Release = {\n version,\n gitRef: res.versions?.[version].gitHead,\n dependencies: res.versions?.[version].dependencies,\n devDependencies: res.versions?.[version].devDependencies,\n };\n const releaseTimestamp = asTimestamp(res.time?.[version]);\n if (releaseTimestamp) {\n release.releaseTimestamp = releaseTimestamp;\n }\n if (res.versions?.[version].deprecated) {\n release.isDeprecated = true;\n }\n const nodeConstraint = res.versions?.[version].engines?.node;\n if (is.nonEmptyString(nodeConstraint)) {\n release.constraints = { node: [nodeConstraint] };\n }\n const source = PackageSource.parse(res.versions?.[version].repository);\n if (source.sourceUrl && source.sourceUrl !== dep.sourceUrl) {\n release.sourceUrl = source.sourceUrl;\n }\n if (\n source.sourceDirectory &&\n source.sourceDirectory !== dep.sourceDirectory\n ) {\n release.sourceDirectory = source.sourceDirectory;\n }\n if (dep.deprecationMessage) {\n release.isDeprecated = true;\n }\n return release;\n });\n\n const isPublic = resp.headers?.['cache-control']\n ?.toLocaleLowerCase()\n ?.split(regEx(/\\s*,\\s*/))\n ?.includes('public');\n if (!isPublic) {\n dep.isPrivate = true;\n }\n\n logger.trace({ dep }, 'dep');\n return dep;\n } catch (err) {\n const actualError = err instanceof ExternalHostError ? err.err : err;\n const ignoredStatusCodes = [401, 402, 403, 404];\n const ignoredResponseCodes = ['ENOTFOUND'];\n if (\n actualError.message === HOST_DISABLED ||\n ignoredStatusCodes.includes(actualError.statusCode) ||\n ignoredResponseCodes.includes(actualError.code)\n ) {\n return null;\n }\n\n if (err instanceof ExternalHostError) {\n if (actualError.name === 'ParseError' && actualError.body) {\n actualError.body = 'err.body deleted by Renovate';\n err.err = actualError;\n }\n throw err;\n }\n logger.debug({ err }, 'Unknown npm lookup error');\n return null;\n }\n}\n"]}
@@ -1,6 +1,5 @@
1
1
  import type { PackageRule } from '../../../config/types';
2
2
  import type { HostRule } from '../../../types';
3
- import type { ReleaseResult } from '../types';
4
3
  export interface NpmrcRules {
5
4
  hostRules: HostRule[];
6
5
  packageRules: PackageRule[];
@@ -29,11 +28,4 @@ export interface NpmResponse {
29
28
  time?: Record<string, string>;
30
29
  'dist-tags'?: Record<string, string>;
31
30
  }
32
- export interface CachedReleaseResult extends ReleaseResult {
33
- cacheData?: {
34
- revision?: number;
35
- etag: string | undefined;
36
- softExpireAt: string;
37
- };
38
- }
39
31
  export type Npmrc = Record<string, any>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/npm/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { PackageRule } from '../../../config/types';\nimport type { HostRule } from '../../../types';\nimport type { ReleaseResult } from '../types';\n\nexport interface NpmrcRules {\n hostRules: HostRule[];\n packageRules: PackageRule[];\n}\n\nexport interface NpmResponseVersion {\n repository?: {\n url: string;\n directory: string;\n };\n homepage?: string;\n deprecated?: boolean;\n gitHead?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n engines?: Record<string, string>;\n}\n\nexport interface NpmResponse {\n _id: string;\n name: string;\n versions?: Record<string, NpmResponseVersion>;\n repository?: {\n url?: string;\n directory?: string;\n };\n homepage?: string;\n time?: Record<string, string>;\n 'dist-tags'?: Record<string, string>;\n}\n\nexport interface CachedReleaseResult extends ReleaseResult {\n cacheData?: {\n revision?: number;\n etag: string | undefined;\n softExpireAt: string;\n };\n}\n\nexport type Npmrc = Record<string, any>;\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/npm/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { PackageRule } from '../../../config/types';\nimport type { HostRule } from '../../../types';\n\nexport interface NpmrcRules {\n hostRules: HostRule[];\n packageRules: PackageRule[];\n}\n\nexport interface NpmResponseVersion {\n repository?: {\n url: string;\n directory: string;\n };\n homepage?: string;\n deprecated?: boolean;\n gitHead?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n engines?: Record<string, string>;\n}\n\nexport interface NpmResponse {\n _id: string;\n name: string;\n versions?: Record<string, NpmResponseVersion>;\n repository?: {\n url?: string;\n directory?: string;\n };\n homepage?: string;\n time?: Record<string, string>;\n 'dist-tags'?: Record<string, string>;\n}\n\nexport type Npmrc = Record<string, any>;\n"]}
@@ -7,5 +7,5 @@ export interface DecoratorCachedRecord {
7
7
  value: unknown;
8
8
  cachedAt: string;
9
9
  }
10
- export type PackageCacheNamespace = '_test-namespace' | 'changelog-bitbucket-notes@v2' | 'changelog-bitbucket-release' | 'changelog-bitbucket-server-notes@v2' | 'changelog-bitbucket-server-release' | 'changelog-gitea-notes@v2' | 'changelog-gitea-release' | 'changelog-github-notes@v2' | 'changelog-github-release' | 'changelog-gitlab-notes@v2' | 'changelog-gitlab-release' | 'datasource-artifactory' | 'datasource-aws-machine-image' | 'datasource-aws-rds' | 'datasource-aws-eks-addon' | 'datasource-azure-bicep-resource' | 'datasource-azure-pipelines-tasks' | 'datasource-bazel' | 'datasource-bitbucket-tags' | 'datasource-bitbucket-server-tags' | 'datasource-bitrise' | 'datasource-buildpacks-registry' | 'datasource-cdnjs' | 'datasource-conan' | 'datasource-conda' | 'datasource-cpan' | 'datasource-crate-metadata' | 'datasource-crate' | 'datasource-deb' | 'datasource-deno' | 'datasource-docker-architecture' | 'datasource-docker-hub-cache' | 'datasource-docker-digest' | 'datasource-docker-hub-tags' | 'datasource-docker-imageconfig' | 'datasource-docker-labels' | 'datasource-docker-releases-v2' | 'datasource-docker-tags' | 'datasource-dotnet-version' | 'datasource-endoflife-date' | 'datasource-galaxy-collection' | 'datasource-galaxy' | 'datasource-git-refs' | 'datasource-git-tags' | 'datasource-git' | 'datasource-gitea-releases' | 'datasource-gitea-tags' | 'datasource-github-release-attachments' | 'datasource-gitlab-packages' | 'datasource-gitlab-releases' | 'datasource-gitlab-tags' | 'datasource-glasskube-packages' | 'datasource-go-direct' | 'datasource-go-proxy' | 'datasource-go' | 'datasource-golang-version' | 'datasource-gradle-version' | 'datasource-helm' | 'datasource-hermit' | 'datasource-hex' | 'datasource-hexpm-bob' | 'datasource-java-version' | 'datasource-jenkins-plugins' | 'datasource-maven' | 'datasource-maven:head-requests-timeout' | 'datasource-maven:head-requests' | 'datasource-maven:metadata-xml' | 'datasource-node-version' | 'datasource-npm:data' | 'datasource-nuget-v3' | 'datasource-orb' | 'datasource-packagist' | 'datasource-pod' | 'datasource-python-version' | 'datasource-releases' | 'datasource-repology' | 'datasource-ruby-version' | 'datasource-rubygems' | 'datasource-sbt-package' | 'datasource-terraform-module' | 'datasource-terraform-provider' | 'datasource-terraform' | 'datasource-unity3d' | 'github-releases-datasource-v2' | 'github-tags-datasource-v2' | 'merge-confidence' | 'preset' | 'terraform-provider-hash' | 'url-sha256';
10
+ export type PackageCacheNamespace = '_test-namespace' | 'changelog-bitbucket-notes@v2' | 'changelog-bitbucket-release' | 'changelog-bitbucket-server-notes@v2' | 'changelog-bitbucket-server-release' | 'changelog-gitea-notes@v2' | 'changelog-gitea-release' | 'changelog-github-notes@v2' | 'changelog-github-release' | 'changelog-gitlab-notes@v2' | 'changelog-gitlab-release' | 'datasource-artifactory' | 'datasource-aws-machine-image' | 'datasource-aws-rds' | 'datasource-aws-eks-addon' | 'datasource-azure-bicep-resource' | 'datasource-azure-pipelines-tasks' | 'datasource-bazel' | 'datasource-bitbucket-tags' | 'datasource-bitbucket-server-tags' | 'datasource-bitrise' | 'datasource-buildpacks-registry' | 'datasource-cdnjs' | 'datasource-conan' | 'datasource-conda' | 'datasource-cpan' | 'datasource-crate-metadata' | 'datasource-crate' | 'datasource-deb' | 'datasource-deno' | 'datasource-docker-architecture' | 'datasource-docker-hub-cache' | 'datasource-docker-digest' | 'datasource-docker-hub-tags' | 'datasource-docker-imageconfig' | 'datasource-docker-labels' | 'datasource-docker-releases-v2' | 'datasource-docker-tags' | 'datasource-dotnet-version' | 'datasource-endoflife-date' | 'datasource-galaxy-collection' | 'datasource-galaxy' | 'datasource-git-refs' | 'datasource-git-tags' | 'datasource-git' | 'datasource-gitea-releases' | 'datasource-gitea-tags' | 'datasource-github-release-attachments' | 'datasource-gitlab-packages' | 'datasource-gitlab-releases' | 'datasource-gitlab-tags' | 'datasource-glasskube-packages' | 'datasource-go-direct' | 'datasource-go-proxy' | 'datasource-go' | 'datasource-golang-version' | 'datasource-gradle-version' | 'datasource-helm' | 'datasource-hermit' | 'datasource-hex' | 'datasource-hexpm-bob' | 'datasource-java-version' | 'datasource-jenkins-plugins' | 'datasource-maven' | 'datasource-maven:head-requests-timeout' | 'datasource-maven:head-requests' | 'datasource-maven:metadata-xml' | 'datasource-node-version' | 'datasource-npm:cache-provider' | 'datasource-nuget-v3' | 'datasource-orb' | 'datasource-packagist' | 'datasource-pod' | 'datasource-python-version' | 'datasource-releases' | 'datasource-repology' | 'datasource-ruby-version' | 'datasource-rubygems' | 'datasource-sbt-package' | 'datasource-terraform-module' | 'datasource-terraform-provider' | 'datasource-terraform' | 'datasource-unity3d' | 'github-releases-datasource-v2' | 'github-tags-datasource-v2' | 'merge-confidence' | 'preset' | 'terraform-provider-hash' | 'url-sha256';
11
11
  export type CombinedKey = `global%%${PackageCacheNamespace}%%${string}`;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../lib/util/cache/package/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface PackageCache {\n get<T = any>(namespace: string, key: string): Promise<T | undefined>;\n\n set<T = any>(\n namespace: string,\n key: string,\n value: T,\n ttlMinutes?: number,\n ): Promise<void>;\n\n cleanup?(): Promise<void>;\n}\n\nexport interface DecoratorCachedRecord {\n value: unknown;\n cachedAt: string;\n}\n\nexport type PackageCacheNamespace =\n | '_test-namespace'\n | 'changelog-bitbucket-notes@v2'\n | 'changelog-bitbucket-release'\n | 'changelog-bitbucket-server-notes@v2'\n | 'changelog-bitbucket-server-release'\n | 'changelog-gitea-notes@v2'\n | 'changelog-gitea-release'\n | 'changelog-github-notes@v2'\n | 'changelog-github-release'\n | 'changelog-gitlab-notes@v2'\n | 'changelog-gitlab-release'\n | 'datasource-artifactory'\n | 'datasource-aws-machine-image'\n | 'datasource-aws-rds'\n | 'datasource-aws-eks-addon'\n | 'datasource-azure-bicep-resource'\n | 'datasource-azure-pipelines-tasks'\n | 'datasource-bazel'\n | 'datasource-bitbucket-tags'\n | 'datasource-bitbucket-server-tags'\n | 'datasource-bitrise'\n | 'datasource-buildpacks-registry'\n | 'datasource-cdnjs'\n | 'datasource-conan'\n | 'datasource-conda'\n | 'datasource-cpan'\n | 'datasource-crate-metadata'\n | 'datasource-crate'\n | 'datasource-deb'\n | 'datasource-deno'\n | 'datasource-docker-architecture'\n | 'datasource-docker-hub-cache'\n | 'datasource-docker-digest'\n | 'datasource-docker-hub-tags'\n | 'datasource-docker-imageconfig'\n | 'datasource-docker-labels'\n | 'datasource-docker-releases-v2'\n | 'datasource-docker-tags'\n | 'datasource-dotnet-version'\n | 'datasource-endoflife-date'\n | 'datasource-galaxy-collection'\n | 'datasource-galaxy'\n | 'datasource-git-refs'\n | 'datasource-git-tags'\n | 'datasource-git'\n | 'datasource-gitea-releases'\n | 'datasource-gitea-tags'\n | 'datasource-github-release-attachments'\n | 'datasource-gitlab-packages'\n | 'datasource-gitlab-releases'\n | 'datasource-gitlab-tags'\n | 'datasource-glasskube-packages'\n | 'datasource-go-direct'\n | 'datasource-go-proxy'\n | 'datasource-go'\n | 'datasource-golang-version'\n | 'datasource-gradle-version'\n | 'datasource-helm'\n | 'datasource-hermit'\n | 'datasource-hex'\n | 'datasource-hexpm-bob'\n | 'datasource-java-version'\n | 'datasource-jenkins-plugins'\n | 'datasource-maven'\n | 'datasource-maven:head-requests-timeout'\n | 'datasource-maven:head-requests'\n | 'datasource-maven:metadata-xml'\n | 'datasource-node-version'\n | 'datasource-npm:data'\n | 'datasource-nuget-v3'\n | 'datasource-orb'\n | 'datasource-packagist'\n | 'datasource-pod'\n | 'datasource-python-version'\n | 'datasource-releases'\n | 'datasource-repology'\n | 'datasource-ruby-version'\n | 'datasource-rubygems'\n | 'datasource-sbt-package'\n | 'datasource-terraform-module'\n | 'datasource-terraform-provider'\n | 'datasource-terraform'\n | 'datasource-unity3d'\n | 'github-releases-datasource-v2'\n | 'github-tags-datasource-v2'\n | 'merge-confidence'\n | 'preset'\n | 'terraform-provider-hash'\n | 'url-sha256';\n\nexport type CombinedKey = `global%%${PackageCacheNamespace}%%${string}`;\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../lib/util/cache/package/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface PackageCache {\n get<T = any>(namespace: string, key: string): Promise<T | undefined>;\n\n set<T = any>(\n namespace: string,\n key: string,\n value: T,\n ttlMinutes?: number,\n ): Promise<void>;\n\n cleanup?(): Promise<void>;\n}\n\nexport interface DecoratorCachedRecord {\n value: unknown;\n cachedAt: string;\n}\n\nexport type PackageCacheNamespace =\n | '_test-namespace'\n | 'changelog-bitbucket-notes@v2'\n | 'changelog-bitbucket-release'\n | 'changelog-bitbucket-server-notes@v2'\n | 'changelog-bitbucket-server-release'\n | 'changelog-gitea-notes@v2'\n | 'changelog-gitea-release'\n | 'changelog-github-notes@v2'\n | 'changelog-github-release'\n | 'changelog-gitlab-notes@v2'\n | 'changelog-gitlab-release'\n | 'datasource-artifactory'\n | 'datasource-aws-machine-image'\n | 'datasource-aws-rds'\n | 'datasource-aws-eks-addon'\n | 'datasource-azure-bicep-resource'\n | 'datasource-azure-pipelines-tasks'\n | 'datasource-bazel'\n | 'datasource-bitbucket-tags'\n | 'datasource-bitbucket-server-tags'\n | 'datasource-bitrise'\n | 'datasource-buildpacks-registry'\n | 'datasource-cdnjs'\n | 'datasource-conan'\n | 'datasource-conda'\n | 'datasource-cpan'\n | 'datasource-crate-metadata'\n | 'datasource-crate'\n | 'datasource-deb'\n | 'datasource-deno'\n | 'datasource-docker-architecture'\n | 'datasource-docker-hub-cache'\n | 'datasource-docker-digest'\n | 'datasource-docker-hub-tags'\n | 'datasource-docker-imageconfig'\n | 'datasource-docker-labels'\n | 'datasource-docker-releases-v2'\n | 'datasource-docker-tags'\n | 'datasource-dotnet-version'\n | 'datasource-endoflife-date'\n | 'datasource-galaxy-collection'\n | 'datasource-galaxy'\n | 'datasource-git-refs'\n | 'datasource-git-tags'\n | 'datasource-git'\n | 'datasource-gitea-releases'\n | 'datasource-gitea-tags'\n | 'datasource-github-release-attachments'\n | 'datasource-gitlab-packages'\n | 'datasource-gitlab-releases'\n | 'datasource-gitlab-tags'\n | 'datasource-glasskube-packages'\n | 'datasource-go-direct'\n | 'datasource-go-proxy'\n | 'datasource-go'\n | 'datasource-golang-version'\n | 'datasource-gradle-version'\n | 'datasource-helm'\n | 'datasource-hermit'\n | 'datasource-hex'\n | 'datasource-hexpm-bob'\n | 'datasource-java-version'\n | 'datasource-jenkins-plugins'\n | 'datasource-maven'\n | 'datasource-maven:head-requests-timeout'\n | 'datasource-maven:head-requests'\n | 'datasource-maven:metadata-xml'\n | 'datasource-node-version'\n | 'datasource-npm:cache-provider'\n | 'datasource-nuget-v3'\n | 'datasource-orb'\n | 'datasource-packagist'\n | 'datasource-pod'\n | 'datasource-python-version'\n | 'datasource-releases'\n | 'datasource-repology'\n | 'datasource-ruby-version'\n | 'datasource-rubygems'\n | 'datasource-sbt-package'\n | 'datasource-terraform-module'\n | 'datasource-terraform-provider'\n | 'datasource-terraform'\n | 'datasource-unity3d'\n | 'github-releases-datasource-v2'\n | 'github-tags-datasource-v2'\n | 'merge-confidence'\n | 'preset'\n | 'terraform-provider-hash'\n | 'url-sha256';\n\nexport type CombinedKey = `global%%${PackageCacheNamespace}%%${string}`;\n"]}
@@ -0,0 +1,23 @@
1
+ import type { PackageCacheNamespace } from '../../cache/package/types';
2
+ import type { HttpResponse } from '../types';
3
+ import { AbstractHttpCacheProvider } from './abstract-http-cache-provider';
4
+ import type { HttpCache } from './schema';
5
+ export interface PackageHttpCacheProviderOptions {
6
+ namespace: PackageCacheNamespace;
7
+ ttlMinutes?: number;
8
+ checkCacheControlHeader?: boolean;
9
+ checkAuthorizationHeader?: boolean;
10
+ }
11
+ export declare class PackageHttpCacheProvider extends AbstractHttpCacheProvider {
12
+ private namespace;
13
+ private softTtlMinutes;
14
+ private hardTtlMinutes;
15
+ checkCacheControlHeader: boolean;
16
+ checkAuthorizationHeader: boolean;
17
+ constructor({ namespace, ttlMinutes, checkCacheControlHeader, checkAuthorizationHeader, }: PackageHttpCacheProviderOptions);
18
+ load(url: string): Promise<unknown>;
19
+ persist(url: string, data: HttpCache): Promise<void>;
20
+ bypassServer<T>(url: string, ignoreSoftTtl?: boolean): Promise<HttpResponse<T> | null>;
21
+ cacheAllowed<T>(resp: HttpResponse<T>): boolean;
22
+ wrapServerResponse<T>(url: string, resp: HttpResponse<T>): Promise<HttpResponse<T>>;
23
+ }
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PackageHttpCacheProvider = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const is_1 = tslib_1.__importDefault(require("@sindresorhus/is"));
6
+ const luxon_1 = require("luxon");
7
+ const global_1 = require("../../../config/global");
8
+ const package_1 = require("../../cache/package"); // Import the package cache functions
9
+ const ttl_1 = require("../../cache/package/ttl");
10
+ const regex_1 = require("../../regex");
11
+ const stats_1 = require("../../stats");
12
+ const abstract_http_cache_provider_1 = require("./abstract-http-cache-provider");
13
+ class PackageHttpCacheProvider extends abstract_http_cache_provider_1.AbstractHttpCacheProvider {
14
+ namespace;
15
+ softTtlMinutes;
16
+ hardTtlMinutes;
17
+ checkCacheControlHeader;
18
+ checkAuthorizationHeader;
19
+ constructor({ namespace, ttlMinutes = 15, checkCacheControlHeader = true, checkAuthorizationHeader = true, }) {
20
+ super();
21
+ this.namespace = namespace;
22
+ const { softTtlMinutes, hardTtlMinutes } = (0, ttl_1.resolveTtlValues)(this.namespace, ttlMinutes);
23
+ this.softTtlMinutes = softTtlMinutes;
24
+ this.hardTtlMinutes = hardTtlMinutes;
25
+ this.checkCacheControlHeader = checkCacheControlHeader;
26
+ this.checkAuthorizationHeader = checkAuthorizationHeader;
27
+ }
28
+ async load(url) {
29
+ return await (0, package_1.get)(this.namespace, url);
30
+ }
31
+ async persist(url, data) {
32
+ await (0, package_1.set)(this.namespace, url, data, this.hardTtlMinutes);
33
+ }
34
+ async bypassServer(url, ignoreSoftTtl = false) {
35
+ const cached = await this.get(url);
36
+ if (!cached) {
37
+ return null;
38
+ }
39
+ if (ignoreSoftTtl) {
40
+ return cached.httpResponse;
41
+ }
42
+ const cachedAt = luxon_1.DateTime.fromISO(cached.timestamp);
43
+ const deadline = cachedAt.plus({ minutes: this.softTtlMinutes });
44
+ const now = luxon_1.DateTime.now();
45
+ if (now >= deadline) {
46
+ stats_1.HttpCacheStats.incLocalMisses(url);
47
+ return null;
48
+ }
49
+ stats_1.HttpCacheStats.incLocalHits(url);
50
+ return cached.httpResponse;
51
+ }
52
+ cacheAllowed(resp) {
53
+ const allowedViaGlobalConfig = global_1.GlobalConfig.get('cachePrivatePackages', false);
54
+ if (allowedViaGlobalConfig) {
55
+ return true;
56
+ }
57
+ if (this.checkCacheControlHeader &&
58
+ is_1.default.string(resp.headers['cache-control'])) {
59
+ const isPublic = resp.headers['cache-control']
60
+ .toLocaleLowerCase()
61
+ .split((0, regex_1.regEx)(/\s*,\s*/))
62
+ .includes('public');
63
+ if (!isPublic) {
64
+ return false;
65
+ }
66
+ }
67
+ if (this.checkAuthorizationHeader && resp.authorization) {
68
+ return false;
69
+ }
70
+ return true;
71
+ }
72
+ async wrapServerResponse(url, resp) {
73
+ if (resp.statusCode === 200 && !this.cacheAllowed(resp)) {
74
+ return resp;
75
+ }
76
+ return await super.wrapServerResponse(url, resp);
77
+ }
78
+ }
79
+ exports.PackageHttpCacheProvider = PackageHttpCacheProvider;
80
+ //# sourceMappingURL=package-http-cache-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-http-cache-provider.js","sourceRoot":"","sources":["../../../../lib/util/http/cache/package-http-cache-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import is from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport { GlobalConfig } from '../../../config/global';\nimport { get, set } from '../../cache/package'; // Import the package cache functions\nimport { resolveTtlValues } from '../../cache/package/ttl';\nimport type { PackageCacheNamespace } from '../../cache/package/types';\nimport { regEx } from '../../regex';\nimport { HttpCacheStats } from '../../stats';\nimport type { HttpResponse } from '../types';\nimport { AbstractHttpCacheProvider } from './abstract-http-cache-provider';\nimport type { HttpCache } from './schema';\n\nexport interface PackageHttpCacheProviderOptions {\n namespace: PackageCacheNamespace;\n ttlMinutes?: number;\n checkCacheControlHeader?: boolean;\n checkAuthorizationHeader?: boolean;\n}\n\nexport class PackageHttpCacheProvider extends AbstractHttpCacheProvider {\n private namespace: PackageCacheNamespace;\n\n private softTtlMinutes: number;\n private hardTtlMinutes: number;\n\n checkCacheControlHeader: boolean;\n checkAuthorizationHeader: boolean;\n\n constructor({\n namespace,\n ttlMinutes = 15,\n checkCacheControlHeader = true,\n checkAuthorizationHeader = true,\n }: PackageHttpCacheProviderOptions) {\n super();\n this.namespace = namespace;\n const { softTtlMinutes, hardTtlMinutes } = resolveTtlValues(\n this.namespace,\n ttlMinutes,\n );\n this.softTtlMinutes = softTtlMinutes;\n this.hardTtlMinutes = hardTtlMinutes;\n this.checkCacheControlHeader = checkCacheControlHeader;\n this.checkAuthorizationHeader = checkAuthorizationHeader;\n }\n\n async load(url: string): Promise<unknown> {\n return await get(this.namespace, url);\n }\n\n async persist(url: string, data: HttpCache): Promise<void> {\n await set(this.namespace, url, data, this.hardTtlMinutes);\n }\n\n override async bypassServer<T>(\n url: string,\n ignoreSoftTtl = false,\n ): Promise<HttpResponse<T> | null> {\n const cached = await this.get(url);\n if (!cached) {\n return null;\n }\n\n if (ignoreSoftTtl) {\n return cached.httpResponse as HttpResponse<T>;\n }\n\n const cachedAt = DateTime.fromISO(cached.timestamp);\n const deadline = cachedAt.plus({ minutes: this.softTtlMinutes });\n const now = DateTime.now();\n if (now >= deadline) {\n HttpCacheStats.incLocalMisses(url);\n return null;\n }\n\n HttpCacheStats.incLocalHits(url);\n return cached.httpResponse as HttpResponse<T>;\n }\n\n cacheAllowed<T>(resp: HttpResponse<T>): boolean {\n const allowedViaGlobalConfig = GlobalConfig.get(\n 'cachePrivatePackages',\n false,\n );\n if (allowedViaGlobalConfig) {\n return true;\n }\n\n if (\n this.checkCacheControlHeader &&\n is.string(resp.headers['cache-control'])\n ) {\n const isPublic = resp.headers['cache-control']\n .toLocaleLowerCase()\n .split(regEx(/\\s*,\\s*/))\n .includes('public');\n\n if (!isPublic) {\n return false;\n }\n }\n\n if (this.checkAuthorizationHeader && resp.authorization) {\n return false;\n }\n\n return true;\n }\n\n override async wrapServerResponse<T>(\n url: string,\n resp: HttpResponse<T>,\n ): Promise<HttpResponse<T>> {\n if (resp.statusCode === 200 && !this.cacheAllowed(resp)) {\n return resp;\n }\n\n return await super.wrapServerResponse(url, resp);\n }\n}\n"]}
@@ -1 +1,3 @@
1
+ import type { BranchStatus } from '../../../types';
1
2
  export declare function getReconfigureBranchName(prefix: string): string;
3
+ export declare function setBranchStatus(branchName: string, description: string, state: BranchStatus, context?: string | null): Promise<void>;
@@ -1,7 +1,23 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getReconfigureBranchName = getReconfigureBranchName;
4
+ exports.setBranchStatus = setBranchStatus;
5
+ const tslib_1 = require("tslib");
6
+ const is_1 = tslib_1.__importDefault(require("@sindresorhus/is"));
7
+ const platform_1 = require("../../../modules/platform");
4
8
  function getReconfigureBranchName(prefix) {
5
9
  return `${prefix}reconfigure`;
6
10
  }
11
+ async function setBranchStatus(branchName, description, state, context) {
12
+ if (!is_1.default.nonEmptyString(context)) {
13
+ // already logged this case when validating the status check
14
+ return;
15
+ }
16
+ await platform_1.platform.setBranchStatus({
17
+ branchName,
18
+ context,
19
+ description,
20
+ state,
21
+ });
22
+ }
7
23
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../lib/workers/repository/reconfigure/utils.ts"],"names":[],"mappings":";;AAAA,4DAEC;AAFD,SAAgB,wBAAwB,CAAC,MAAc;IACrD,OAAO,GAAG,MAAM,aAAa,CAAC;AAChC,CAAC","sourcesContent":["export function getReconfigureBranchName(prefix: string): string {\n return `${prefix}reconfigure`;\n}\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../lib/workers/repository/reconfigure/utils.ts"],"names":[],"mappings":";;AAIA,4DAEC;AAED,0CAiBC;;AAzBD,kEAAkC;AAClC,wDAAqD;AAGrD,SAAgB,wBAAwB,CAAC,MAAc;IACrD,OAAO,GAAG,MAAM,aAAa,CAAC;AAChC,CAAC;AAEM,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,WAAmB,EACnB,KAAmB,EACnB,OAAuB;IAEvB,IAAI,CAAC,YAAE,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,4DAA4D;QAC5D,OAAO;IACT,CAAC;IAED,MAAM,mBAAQ,CAAC,eAAe,CAAC;QAC7B,UAAU;QACV,OAAO;QACP,WAAW;QACX,KAAK;KACN,CAAC,CAAC;AACL,CAAC","sourcesContent":["import is from '@sindresorhus/is';\nimport { platform } from '../../../modules/platform';\nimport type { BranchStatus } from '../../../types';\n\nexport function getReconfigureBranchName(prefix: string): string {\n return `${prefix}reconfigure`;\n}\n\nexport async function setBranchStatus(\n branchName: string,\n description: string,\n state: BranchStatus,\n context?: string | null,\n): Promise<void> {\n if (!is.nonEmptyString(context)) {\n // already logged this case when validating the status check\n return;\n }\n\n await platform.setBranchStatus({\n branchName,\n context,\n description,\n state,\n });\n}\n"]}
@@ -17,18 +17,6 @@ const regex_1 = require("../../../util/regex");
17
17
  const merge_1 = require("../init/merge");
18
18
  const reconfigure_cache_1 = require("./reconfigure-cache");
19
19
  const utils_1 = require("./utils");
20
- async function setBranchStatus(branchName, description, state, context) {
21
- if (!is_1.default.nonEmptyString(context)) {
22
- // already logged this case when validating the status check
23
- return;
24
- }
25
- await platform_1.platform.setBranchStatus({
26
- branchName,
27
- context,
28
- description,
29
- state,
30
- });
31
- }
32
20
  async function validateReconfigureBranch(config) {
33
21
  logger_1.logger.debug('validateReconfigureBranch()');
34
22
  const context = config.statusCheckNames?.configValidation;
@@ -65,7 +53,7 @@ async function validateReconfigureBranch(config) {
65
53
  }
66
54
  if (!is_1.default.nonEmptyString(configFileName)) {
67
55
  logger_1.logger.warn('No config file found in reconfigure branch');
68
- await setBranchStatus(branchName, 'Validation Failed - No config file found', 'red', context);
56
+ await (0, utils_1.setBranchStatus)(branchName, 'Validation Failed - No config file found', 'red', context);
69
57
  (0, reconfigure_cache_1.setReconfigureBranchCache)(branchSha, false);
70
58
  await scm_1.scm.checkoutBranch(config.defaultBranch);
71
59
  return;
@@ -79,7 +67,7 @@ async function validateReconfigureBranch(config) {
79
67
  }
80
68
  if (!is_1.default.nonEmptyString(configFileRaw)) {
81
69
  logger_1.logger.warn('Empty or invalid config file');
82
- await setBranchStatus(branchName, 'Validation Failed - Empty/Invalid config file', 'red', context);
70
+ await (0, utils_1.setBranchStatus)(branchName, 'Validation Failed - Empty/Invalid config file', 'red', context);
83
71
  (0, reconfigure_cache_1.setReconfigureBranchCache)(branchSha, false);
84
72
  await scm_1.scm.checkoutBranch(config.baseBranch);
85
73
  return;
@@ -94,7 +82,7 @@ async function validateReconfigureBranch(config) {
94
82
  }
95
83
  catch (err) {
96
84
  logger_1.logger.error({ err }, 'Error while parsing config file');
97
- await setBranchStatus(branchName, 'Validation Failed - Unparsable config file', 'red', context);
85
+ await (0, utils_1.setBranchStatus)(branchName, 'Validation Failed - Unparsable config file', 'red', context);
98
86
  (0, reconfigure_cache_1.setReconfigureBranchCache)(branchSha, false);
99
87
  await scm_1.scm.checkoutBranch(config.baseBranch);
100
88
  return;
@@ -125,13 +113,13 @@ async function validateReconfigureBranch(config) {
125
113
  content: body,
126
114
  });
127
115
  }
128
- await setBranchStatus(branchName, 'Validation Failed', 'red', context);
116
+ await (0, utils_1.setBranchStatus)(branchName, 'Validation Failed', 'red', context);
129
117
  (0, reconfigure_cache_1.setReconfigureBranchCache)(branchSha, false);
130
118
  await scm_1.scm.checkoutBranch(config.baseBranch);
131
119
  return;
132
120
  }
133
121
  // passing check
134
- await setBranchStatus(branchName, 'Validation Successful', 'green', context);
122
+ await (0, utils_1.setBranchStatus)(branchName, 'Validation Successful', 'green', context);
135
123
  (0, reconfigure_cache_1.setReconfigureBranchCache)(branchSha, true);
136
124
  await scm_1.scm.checkoutBranch(config.baseBranch);
137
125
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../../lib/workers/repository/reconfigure/validate.ts"],"names":[],"mappings":"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","sourcesContent":["import is from '@sindresorhus/is';\nimport JSON5 from 'json5';\nimport { massageConfig } from '../../../config/massage';\nimport type { RenovateConfig } from '../../../config/types';\nimport { validateConfig } from '../../../config/validation';\nimport { logger } from '../../../logger';\nimport { platform } from '../../../modules/platform';\nimport { ensureComment } from '../../../modules/platform/comment';\nimport { scm } from '../../../modules/platform/scm';\nimport type { BranchStatus } from '../../../types';\nimport { getCache } from '../../../util/cache/repository';\nimport { readLocalFile } from '../../../util/fs';\nimport { getBranchCommit } from '../../../util/git';\nimport { regEx } from '../../../util/regex';\nimport { detectConfigFile } from '../init/merge';\nimport { setReconfigureBranchCache } from './reconfigure-cache';\nimport { getReconfigureBranchName } from './utils';\n\nasync function setBranchStatus(\n branchName: string,\n description: string,\n state: BranchStatus,\n context?: string | null,\n): Promise<void> {\n if (!is.nonEmptyString(context)) {\n // already logged this case when validating the status check\n return;\n }\n\n await platform.setBranchStatus({\n branchName,\n context,\n description,\n state,\n });\n}\n\nexport async function validateReconfigureBranch(\n config: RenovateConfig,\n): Promise<void> {\n logger.debug('validateReconfigureBranch()');\n\n const context = config.statusCheckNames?.configValidation;\n const branchName = getReconfigureBranchName(config.branchPrefix!);\n\n // look for config file\n // 1. check reconfigure branch cache and use the configFileName if it exists\n // 2. checkout reconfigure branch and look for the config file, don't assume default configFileName\n const branchSha = getBranchCommit(branchName)!;\n const cache = getCache();\n let configFileName: string | null = null;\n const reconfigureCache = cache.reconfigureBranchCache;\n // only use valid cached information\n if (reconfigureCache?.reconfigureBranchSha === branchSha) {\n logger.debug('Skipping validation check as branch sha is unchanged');\n return;\n }\n\n if (context) {\n const validationStatus = await platform.getBranchStatusCheck(\n branchName,\n context,\n );\n\n // if old status check is present skip validation\n if (is.nonEmptyString(validationStatus)) {\n logger.debug(\n 'Skipping validation check because status check already exists.',\n );\n return;\n }\n } else {\n logger.debug(\n 'Status check is null or an empty string, skipping status check addition.',\n );\n }\n\n try {\n await scm.checkoutBranch(branchName);\n configFileName = await detectConfigFile();\n } catch (err) {\n logger.error(\n { err },\n 'Error while searching for config file in reconfigure branch',\n );\n }\n\n if (!is.nonEmptyString(configFileName)) {\n logger.warn('No config file found in reconfigure branch');\n await setBranchStatus(\n branchName,\n 'Validation Failed - No config file found',\n 'red',\n context,\n );\n setReconfigureBranchCache(branchSha, false);\n await scm.checkoutBranch(config.defaultBranch!);\n return;\n }\n\n let configFileRaw: string | null = null;\n try {\n configFileRaw = await readLocalFile(configFileName, 'utf8');\n } catch (err) {\n logger.error({ err }, 'Error while reading config file');\n }\n\n if (!is.nonEmptyString(configFileRaw)) {\n logger.warn('Empty or invalid config file');\n await setBranchStatus(\n branchName,\n 'Validation Failed - Empty/Invalid config file',\n 'red',\n context,\n );\n setReconfigureBranchCache(branchSha, false);\n await scm.checkoutBranch(config.baseBranch!);\n return;\n }\n\n let configFileParsed: any;\n try {\n configFileParsed = JSON5.parse(configFileRaw);\n // no need to confirm renovate field in package.json we already do it in `detectConfigFile()`\n if (configFileName === 'package.json') {\n configFileParsed = configFileParsed.renovate;\n }\n } catch (err) {\n logger.error({ err }, 'Error while parsing config file');\n await setBranchStatus(\n branchName,\n 'Validation Failed - Unparsable config file',\n 'red',\n context,\n );\n setReconfigureBranchCache(branchSha, false);\n await scm.checkoutBranch(config.baseBranch!);\n return;\n }\n\n // perform validation and provide a passing or failing check based on result\n const massagedConfig = massageConfig(configFileParsed);\n const validationResult = await validateConfig('repo', massagedConfig);\n\n // failing check\n if (validationResult.errors.length > 0) {\n logger.debug(\n { errors: validationResult.errors.map((err) => err.message).join(', ') },\n 'Validation Errors',\n );\n\n const reconfigurePr = await platform.findPr({\n branchName,\n state: 'open',\n includeOtherAuthors: true,\n targetBranch: config.defaultBranch,\n });\n\n // add comment to reconfigure PR if it exists\n if (reconfigurePr) {\n let body = `There is an error with this repository's Renovate configuration that needs to be fixed.\\n\\n`;\n body += `Location: \\`${configFileName}\\`\\n`;\n body += `Message: \\`${validationResult.errors\n .map((e) => e.message)\n .join(', ')\n .replace(regEx(/`/g), \"'\")}\\`\\n`;\n\n await ensureComment({\n number: reconfigurePr.number,\n topic: 'Action Required: Fix Renovate Configuration',\n content: body,\n });\n }\n\n await setBranchStatus(branchName, 'Validation Failed', 'red', context);\n setReconfigureBranchCache(branchSha, false);\n await scm.checkoutBranch(config.baseBranch!);\n return;\n }\n\n // passing check\n await setBranchStatus(branchName, 'Validation Successful', 'green', context);\n\n setReconfigureBranchCache(branchSha, true);\n await scm.checkoutBranch(config.baseBranch!);\n return;\n}\n"]}
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../../lib/workers/repository/reconfigure/validate.ts"],"names":[],"mappings":"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","sourcesContent":["import is from '@sindresorhus/is';\nimport JSON5 from 'json5';\nimport { massageConfig } from '../../../config/massage';\nimport type { RenovateConfig } from '../../../config/types';\nimport { validateConfig } from '../../../config/validation';\nimport { logger } from '../../../logger';\nimport { platform } from '../../../modules/platform';\nimport { ensureComment } from '../../../modules/platform/comment';\nimport { scm } from '../../../modules/platform/scm';\nimport { getCache } from '../../../util/cache/repository';\nimport { readLocalFile } from '../../../util/fs';\nimport { getBranchCommit } from '../../../util/git';\nimport { regEx } from '../../../util/regex';\nimport { detectConfigFile } from '../init/merge';\nimport { setReconfigureBranchCache } from './reconfigure-cache';\nimport { getReconfigureBranchName, setBranchStatus } from './utils';\n\nexport async function validateReconfigureBranch(\n config: RenovateConfig,\n): Promise<void> {\n logger.debug('validateReconfigureBranch()');\n\n const context = config.statusCheckNames?.configValidation;\n const branchName = getReconfigureBranchName(config.branchPrefix!);\n\n // look for config file\n // 1. check reconfigure branch cache and use the configFileName if it exists\n // 2. checkout reconfigure branch and look for the config file, don't assume default configFileName\n const branchSha = getBranchCommit(branchName)!;\n const cache = getCache();\n let configFileName: string | null = null;\n const reconfigureCache = cache.reconfigureBranchCache;\n // only use valid cached information\n if (reconfigureCache?.reconfigureBranchSha === branchSha) {\n logger.debug('Skipping validation check as branch sha is unchanged');\n return;\n }\n\n if (context) {\n const validationStatus = await platform.getBranchStatusCheck(\n branchName,\n context,\n );\n\n // if old status check is present skip validation\n if (is.nonEmptyString(validationStatus)) {\n logger.debug(\n 'Skipping validation check because status check already exists.',\n );\n return;\n }\n } else {\n logger.debug(\n 'Status check is null or an empty string, skipping status check addition.',\n );\n }\n\n try {\n await scm.checkoutBranch(branchName);\n configFileName = await detectConfigFile();\n } catch (err) {\n logger.error(\n { err },\n 'Error while searching for config file in reconfigure branch',\n );\n }\n\n if (!is.nonEmptyString(configFileName)) {\n logger.warn('No config file found in reconfigure branch');\n await setBranchStatus(\n branchName,\n 'Validation Failed - No config file found',\n 'red',\n context,\n );\n setReconfigureBranchCache(branchSha, false);\n await scm.checkoutBranch(config.defaultBranch!);\n return;\n }\n\n let configFileRaw: string | null = null;\n try {\n configFileRaw = await readLocalFile(configFileName, 'utf8');\n } catch (err) {\n logger.error({ err }, 'Error while reading config file');\n }\n\n if (!is.nonEmptyString(configFileRaw)) {\n logger.warn('Empty or invalid config file');\n await setBranchStatus(\n branchName,\n 'Validation Failed - Empty/Invalid config file',\n 'red',\n context,\n );\n setReconfigureBranchCache(branchSha, false);\n await scm.checkoutBranch(config.baseBranch!);\n return;\n }\n\n let configFileParsed: any;\n try {\n configFileParsed = JSON5.parse(configFileRaw);\n // no need to confirm renovate field in package.json we already do it in `detectConfigFile()`\n if (configFileName === 'package.json') {\n configFileParsed = configFileParsed.renovate;\n }\n } catch (err) {\n logger.error({ err }, 'Error while parsing config file');\n await setBranchStatus(\n branchName,\n 'Validation Failed - Unparsable config file',\n 'red',\n context,\n );\n setReconfigureBranchCache(branchSha, false);\n await scm.checkoutBranch(config.baseBranch!);\n return;\n }\n\n // perform validation and provide a passing or failing check based on result\n const massagedConfig = massageConfig(configFileParsed);\n const validationResult = await validateConfig('repo', massagedConfig);\n\n // failing check\n if (validationResult.errors.length > 0) {\n logger.debug(\n { errors: validationResult.errors.map((err) => err.message).join(', ') },\n 'Validation Errors',\n );\n\n const reconfigurePr = await platform.findPr({\n branchName,\n state: 'open',\n includeOtherAuthors: true,\n targetBranch: config.defaultBranch,\n });\n\n // add comment to reconfigure PR if it exists\n if (reconfigurePr) {\n let body = `There is an error with this repository's Renovate configuration that needs to be fixed.\\n\\n`;\n body += `Location: \\`${configFileName}\\`\\n`;\n body += `Message: \\`${validationResult.errors\n .map((e) => e.message)\n .join(', ')\n .replace(regEx(/`/g), \"'\")}\\`\\n`;\n\n await ensureComment({\n number: reconfigurePr.number,\n topic: 'Action Required: Fix Renovate Configuration',\n content: body,\n });\n }\n\n await setBranchStatus(branchName, 'Validation Failed', 'red', context);\n setReconfigureBranchCache(branchSha, false);\n await scm.checkoutBranch(config.baseBranch!);\n return;\n }\n\n // passing check\n await setBranchStatus(branchName, 'Validation Successful', 'green', context);\n\n setReconfigureBranchCache(branchSha, true);\n await scm.checkoutBranch(config.baseBranch!);\n return;\n}\n"]}
@@ -375,6 +375,8 @@ function generateBranchConfig(upgrades) {
375
375
  config.constraints = { ...config.constraints, ...upgrade.constraints };
376
376
  }
377
377
  }
378
+ // Set skipInstalls to false if any upgrade in the branch has it false
379
+ config.skipInstalls = config.upgrades.every((upgrade) => upgrade.skipInstalls !== false);
378
380
  const tableRows = config.upgrades
379
381
  .map(getTableValues)
380
382
  .filter((x) => is_1.default.array(x, is_1.default.string));
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../../lib/workers/repository/updates/generate.ts"],"names":[],"mappings":"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","sourcesContent":["import is from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport mdTable from 'markdown-table';\nimport semver from 'semver';\nimport { mergeChildConfig } from '../../../config';\nimport { CONFIG_SECRETS_EXPOSED } from '../../../constants/error-messages';\nimport { logger } from '../../../logger';\nimport { newlineRegex, regEx } from '../../../util/regex';\nimport { sanitize } from '../../../util/sanitize';\nimport { safeStringify } from '../../../util/stringify';\nimport * as template from '../../../util/template';\nimport type { Timestamp } from '../../../util/timestamp';\nimport { uniq } from '../../../util/uniq';\nimport type { BranchConfig, BranchUpgradeConfig } from '../../types';\nimport { CommitMessage } from '../model/commit-message';\n\nfunction prettifyVersion(version: string): string {\n if (regEx(/^\\d/).test(version)) {\n return `v${version}`;\n }\n\n return version;\n}\n\nfunction isTypesGroup(branchUpgrades: BranchUpgradeConfig[]): boolean {\n return (\n branchUpgrades.some(({ depName }) => depName?.startsWith('@types/')) &&\n new Set(\n branchUpgrades.map(({ depName }) => depName?.replace(/^@types\\//, '')),\n ).size === 1\n );\n}\n\nfunction sortTypesGroup(upgrades: BranchUpgradeConfig[]): void {\n const isTypesUpgrade = ({ depName }: BranchUpgradeConfig): boolean =>\n !!depName?.startsWith('@types/');\n const regularUpgrades = upgrades.filter(\n (upgrade) => !isTypesUpgrade(upgrade),\n );\n const typesUpgrades = upgrades.filter(isTypesUpgrade);\n upgrades.splice(0, upgrades.length);\n upgrades.push(...regularUpgrades, ...typesUpgrades);\n}\n\nfunction getTableValues(upgrade: BranchUpgradeConfig): string[] | null {\n if (!upgrade.commitBodyTable) {\n return null;\n }\n const { datasource, packageName, depName, currentVersion, newVersion } =\n upgrade;\n const name = packageName ?? depName;\n if (datasource && name && currentVersion && newVersion) {\n return [datasource, name, currentVersion, newVersion];\n }\n logger.trace(\n {\n datasource,\n packageName,\n depName,\n currentVersion,\n newVersion,\n },\n 'Cannot determine table values',\n );\n return null;\n}\n\nfunction compileCommitMessage(upgrade: BranchUpgradeConfig): string {\n if (upgrade.semanticCommits === 'enabled' && !upgrade.commitMessagePrefix) {\n logger.trace('Upgrade has semantic commits enabled');\n let semanticPrefix = upgrade.semanticCommitType;\n if (upgrade.semanticCommitScope) {\n semanticPrefix += `(${template.compile(\n upgrade.semanticCommitScope,\n upgrade,\n )})`;\n }\n upgrade.commitMessagePrefix = CommitMessage.formatPrefix(semanticPrefix!);\n upgrade.toLowerCase =\n regEx(/[A-Z]/).exec(upgrade.semanticCommitType!) === null &&\n !upgrade.semanticCommitType!.startsWith(':');\n }\n\n // Compile a few times in case there are nested templates\n upgrade.commitMessage = template.compile(\n upgrade.commitMessage ?? '',\n upgrade,\n );\n upgrade.commitMessage = template.compile(upgrade.commitMessage, upgrade);\n upgrade.commitMessage = template.compile(upgrade.commitMessage, upgrade);\n // istanbul ignore if\n if (upgrade.commitMessage !== sanitize(upgrade.commitMessage)) {\n logger.debug(\n { branchName: upgrade.branchName },\n 'Secrets exposed in commit message',\n );\n throw new Error(CONFIG_SECRETS_EXPOSED);\n }\n upgrade.commitMessage = upgrade.commitMessage.trim(); // Trim exterior whitespace\n upgrade.commitMessage = upgrade.commitMessage.replace(regEx(/\\s+/g), ' '); // Trim extra whitespace inside string\n upgrade.commitMessage = upgrade.commitMessage.replace(\n regEx(/to vv(\\d)/),\n 'to v$1',\n );\n if (upgrade.toLowerCase && upgrade.commitMessageLowerCase !== 'never') {\n // We only need to lowercase the first line\n const splitMessage = upgrade.commitMessage.split(newlineRegex);\n splitMessage[0] = splitMessage[0].toLowerCase();\n upgrade.commitMessage = splitMessage.join('\\n');\n }\n\n logger.trace(`commitMessage: ` + JSON.stringify(upgrade.commitMessage));\n return upgrade.commitMessage;\n}\n\nfunction compilePrTitle(\n upgrade: BranchUpgradeConfig,\n commitMessage: string,\n): void {\n if (upgrade.prTitle) {\n upgrade.prTitle = template.compile(upgrade.prTitle, upgrade);\n upgrade.prTitle = template.compile(upgrade.prTitle, upgrade);\n upgrade.prTitle = template\n .compile(upgrade.prTitle, upgrade)\n .trim()\n .replace(regEx(/\\s+/g), ' ');\n // istanbul ignore if\n if (upgrade.prTitle !== sanitize(upgrade.prTitle)) {\n logger.debug(\n { branchName: upgrade.branchName },\n 'Secrets were exposed in PR title',\n );\n throw new Error(CONFIG_SECRETS_EXPOSED);\n }\n if (upgrade.toLowerCase && upgrade.commitMessageLowerCase !== 'never') {\n upgrade.prTitle = upgrade.prTitle.toLowerCase();\n }\n } else {\n [upgrade.prTitle] = commitMessage.split(newlineRegex);\n }\n if (!upgrade.prTitleStrict) {\n upgrade.prTitle += upgrade.hasBaseBranches ? ' ({{baseBranch}})' : '';\n if (upgrade.isGroup) {\n upgrade.prTitle +=\n upgrade.updateType === 'major' && upgrade.separateMajorMinor\n ? ' (major)'\n : '';\n upgrade.prTitle +=\n upgrade.updateType === 'minor' && upgrade.separateMinorPatch\n ? ' (minor)'\n : '';\n upgrade.prTitle +=\n upgrade.updateType === 'patch' && upgrade.separateMinorPatch\n ? ' (patch)'\n : '';\n }\n }\n // Compile again to allow for nested templates\n upgrade.prTitle = template.compile(upgrade.prTitle, upgrade);\n logger.trace(`prTitle: ` + JSON.stringify(upgrade.prTitle));\n}\n\n// Sorted by priority, from low to high\nconst semanticCommitTypeByPriority = ['chore', 'ci', 'build', 'fix', 'feat'];\n\nexport function generateBranchConfig(\n upgrades: BranchUpgradeConfig[],\n): BranchConfig {\n let branchUpgrades = upgrades;\n if (!branchUpgrades.every((upgrade) => upgrade.pendingChecks)) {\n // If the branch isn't pending, then remove any upgrades within which *are*\n branchUpgrades = branchUpgrades.filter((upgrade) => !upgrade.pendingChecks);\n }\n logger.trace({ config: branchUpgrades }, 'generateBranchConfig');\n let config: BranchConfig = {\n upgrades: [],\n } as any;\n const hasGroupName = branchUpgrades[0].groupName !== null;\n logger.trace(`hasGroupName: ${hasGroupName}`);\n // Use group settings only if multiple upgrades or lazy grouping is disabled\n const depNames: string[] = [];\n const newValue: string[] = [];\n const toVersions: string[] = [];\n const toValues = new Set<string>();\n const depTypes = new Set<string>();\n for (const upg of branchUpgrades) {\n upg.recreateClosed = upg.recreateWhen === 'always';\n\n if (upg.currentDigest) {\n upg.currentDigestShort =\n upg.currentDigestShort ??\n upg.currentDigest.replace('sha256:', '').substring(0, 7);\n }\n if (upg.newDigest) {\n upg.newDigestShort =\n upg.newDigestShort ??\n upg.newDigest.replace('sha256:', '').substring(0, 7);\n }\n if (upg.isDigest || upg.isPinDigest) {\n upg.displayFrom = upg.currentDigestShort;\n upg.displayTo = upg.newDigestShort;\n } else if (upg.isLockfileUpdate) {\n upg.displayFrom = upg.currentVersion;\n upg.displayTo = upg.newVersion;\n } else if (!upg.isLockFileMaintenance) {\n upg.displayFrom = upg.currentValue;\n upg.displayTo = upg.newValue;\n }\n\n if (upg.isLockFileMaintenance) {\n upg.recreateClosed = upg.recreateWhen !== 'never';\n }\n upg.displayFrom ??= '';\n upg.displayTo ??= '';\n if (!depNames.includes(upg.depName!)) {\n depNames.push(upg.depName!);\n }\n if (!toVersions.includes(upg.newVersion!)) {\n toVersions.push(upg.newVersion!);\n }\n toValues.add(upg.newValue!);\n if (upg.depType) {\n depTypes.add(upg.depType);\n }\n // prettify newVersion and newMajor for printing\n if (upg.newVersion) {\n upg.prettyNewVersion = prettifyVersion(upg.newVersion);\n }\n if (upg.newMajor) {\n upg.prettyNewMajor = `v${upg.newMajor}`;\n }\n if (upg.commitMessageExtra) {\n const extra = template.compile(upg.commitMessageExtra, upg);\n if (!newValue.includes(extra)) {\n newValue.push(extra);\n }\n }\n }\n const groupEligible =\n depNames.length > 1 ||\n toVersions.length > 1 ||\n (!toVersions[0] && newValue.length > 1);\n\n const typesGroup =\n depNames.length > 1 && !hasGroupName && isTypesGroup(branchUpgrades);\n logger.trace(`groupEligible: ${groupEligible}`);\n const useGroupSettings = hasGroupName && groupEligible;\n logger.trace(`useGroupSettings: ${useGroupSettings}`);\n let releaseTimestamp: Timestamp;\n\n if (depTypes.size) {\n config.depTypes = Array.from(depTypes).sort();\n }\n\n for (const branchUpgrade of branchUpgrades) {\n let upgrade: BranchUpgradeConfig = { ...branchUpgrade };\n\n upgrade.depTypes = config.depTypes;\n\n // needs to be done for each upgrade, as we reorder them below\n if (newValue.length > 1 && !groupEligible) {\n upgrade.commitMessageExtra = `to v${toVersions[0]}`;\n }\n\n const pendingVersionsLength = upgrade.pendingVersions?.length;\n if (pendingVersionsLength) {\n upgrade.displayPending = `\\`${upgrade\n .pendingVersions!.slice(-1)\n .pop()!}\\``;\n if (pendingVersionsLength > 1) {\n upgrade.displayPending += ` (+${pendingVersionsLength - 1})`;\n }\n } else {\n upgrade.displayPending = '';\n }\n upgrade.prettyDepType =\n upgrade.prettyDepType ?? upgrade.depType ?? 'dependency';\n if (useGroupSettings) {\n // Now overwrite original config with group config\n upgrade = mergeChildConfig(upgrade, upgrade.group);\n upgrade.isGroup = true;\n } else {\n delete upgrade.groupName;\n }\n // Delete group config regardless of whether it was applied\n delete upgrade.group;\n\n if (\n toVersions.length > 1 &&\n toValues.size > 1 &&\n newValue.length > 1 &&\n !typesGroup\n ) {\n logger.trace({ toVersions });\n logger.trace({ toValues });\n delete upgrade.commitMessageExtra;\n upgrade.recreateClosed = upgrade.recreateWhen !== 'never';\n } else if (\n newValue.length > 1 &&\n (upgrade.isDigest || upgrade.isPinDigest)\n ) {\n logger.trace({ newValue });\n delete upgrade.commitMessageExtra;\n upgrade.recreateClosed = upgrade.recreateWhen !== 'never';\n } else if (semver.valid(toVersions[0])) {\n upgrade.isRange = false;\n }\n config.upgrades.push(upgrade);\n if (upgrade.releaseTimestamp) {\n if (releaseTimestamp!) {\n const existingStamp = DateTime.fromISO(releaseTimestamp);\n const upgradeStamp = DateTime.fromISO(upgrade.releaseTimestamp);\n if (upgradeStamp > existingStamp) {\n releaseTimestamp = upgrade.releaseTimestamp;\n }\n } else {\n releaseTimestamp = upgrade.releaseTimestamp;\n }\n }\n }\n\n if (typesGroup) {\n if (config.upgrades[0].depName?.startsWith('@types/')) {\n logger.debug('Found @types - reversing upgrades to use depName in PR');\n sortTypesGroup(config.upgrades);\n config.upgrades[0].recreateClosed = false;\n config.hasTypes = true;\n }\n } else {\n config.upgrades.sort((a, b) => {\n if (a.fileReplacePosition && b.fileReplacePosition) {\n // This is because we need to replace from the bottom of the file up\n return a.fileReplacePosition > b.fileReplacePosition ? -1 : 1;\n }\n\n // make sure that ordering is consistent :\n // items without position will be first in the list.\n if (a.fileReplacePosition) {\n return 1;\n }\n if (b.fileReplacePosition) {\n return -1;\n }\n\n if (a.depName! < b.depName!) {\n return -1;\n }\n if (a.depName! > b.depName!) {\n return 1;\n }\n return 0;\n });\n }\n // Now assign first upgrade's config as branch config\n config = {\n ...config,\n ...config.upgrades[0],\n releaseTimestamp: releaseTimestamp!,\n }; // TODO: fixme (#9666)\n\n // Enable `semanticCommits` if one of the branches has it enabled\n if (\n config.upgrades.some((upgrade) => upgrade.semanticCommits === 'enabled')\n ) {\n config.semanticCommits = 'enabled';\n // Calculate the highest priority `semanticCommitType`\n let highestIndex = -1;\n for (const upgrade of config.upgrades) {\n if (upgrade.semanticCommits === 'enabled' && upgrade.semanticCommitType) {\n const priorityIndex = semanticCommitTypeByPriority.indexOf(\n upgrade.semanticCommitType,\n );\n\n if (priorityIndex > highestIndex) {\n highestIndex = priorityIndex;\n }\n }\n }\n\n if (highestIndex > -1) {\n config.semanticCommitType = semanticCommitTypeByPriority[highestIndex];\n }\n }\n\n // Use templates to generate strings\n const commitMessage = compileCommitMessage(config);\n compilePrTitle(config, commitMessage);\n\n config.dependencyDashboardApproval = config.upgrades.some(\n (upgrade) => upgrade.dependencyDashboardApproval,\n );\n config.dependencyDashboardPrApproval = config.upgrades.some(\n (upgrade) => upgrade.prCreation === 'approval',\n );\n config.prBodyColumns = [\n ...new Set(\n config.upgrades.reduce(\n (existing: string[], upgrade) =>\n existing.concat(upgrade.prBodyColumns!),\n [],\n ),\n ),\n ].filter(is.nonEmptyString);\n // combine excludeCommitPaths for multiple manager experience\n const hasExcludeCommitPaths = config.upgrades.some(\n (u) => u.excludeCommitPaths && u.excludeCommitPaths.length > 0,\n );\n if (hasExcludeCommitPaths) {\n config.excludeCommitPaths = Object.keys(\n config.upgrades.reduce((acc: Record<string, boolean>, upgrade) => {\n if (upgrade.excludeCommitPaths) {\n upgrade.excludeCommitPaths.forEach((p) => {\n acc[p] = true;\n });\n }\n\n return acc;\n }, {}),\n );\n }\n\n config.automerge = config.upgrades.every((upgrade) => upgrade.automerge);\n // combine all labels\n config.labels = [\n ...new Set(\n config.upgrades\n .map((upgrade) => upgrade.labels ?? [])\n .reduce((a, b) => a.concat(b), []),\n ),\n ];\n config.addLabels = [\n ...new Set(\n config.upgrades\n .map((upgrade) => upgrade.addLabels ?? [])\n .reduce((a, b) => a.concat(b), []),\n ),\n ];\n\n if (config.upgrades.some((upgrade) => upgrade.updateType === 'major')) {\n config.updateType = 'major';\n }\n\n // explicit set `isLockFileMaintenance` for the branch for groups\n if (config.upgrades.some((upgrade) => upgrade.isLockFileMaintenance)) {\n config.isLockFileMaintenance = true;\n // istanbul ignore if: not worth testing\n if (config.upgrades.some((upgrade) => !upgrade.isLockFileMaintenance)) {\n // TODO: warn?\n logger.debug(\n 'Grouping lockfile maintenance with other update types is not supported',\n );\n }\n }\n\n config.constraints = {};\n for (const upgrade of config.upgrades) {\n if (upgrade.constraints) {\n config.constraints = { ...config.constraints, ...upgrade.constraints };\n }\n }\n\n const tableRows = config.upgrades\n .map(getTableValues)\n .filter((x): x is string[] => is.array(x, is.string));\n\n if (tableRows.length) {\n const table: string[][] = [];\n table.push(['datasource', 'package', 'from', 'to']);\n\n const seenRows = new Set<string>();\n\n for (const row of tableRows) {\n const key = safeStringify(row);\n if (seenRows.has(key)) {\n continue;\n }\n seenRows.add(key);\n table.push(row);\n }\n config.commitMessage += '\\n\\n' + mdTable(table) + '\\n';\n }\n const additionalReviewers = uniq(\n config.upgrades\n .map((upgrade) => upgrade.additionalReviewers)\n .flat()\n .filter(is.nonEmptyString),\n );\n if (additionalReviewers.length > 0) {\n config.additionalReviewers = additionalReviewers;\n }\n return config;\n}\n"]}
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../../lib/workers/repository/updates/generate.ts"],"names":[],"mappings":"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","sourcesContent":["import is from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport mdTable from 'markdown-table';\nimport semver from 'semver';\nimport { mergeChildConfig } from '../../../config';\nimport { CONFIG_SECRETS_EXPOSED } from '../../../constants/error-messages';\nimport { logger } from '../../../logger';\nimport { newlineRegex, regEx } from '../../../util/regex';\nimport { sanitize } from '../../../util/sanitize';\nimport { safeStringify } from '../../../util/stringify';\nimport * as template from '../../../util/template';\nimport type { Timestamp } from '../../../util/timestamp';\nimport { uniq } from '../../../util/uniq';\nimport type { BranchConfig, BranchUpgradeConfig } from '../../types';\nimport { CommitMessage } from '../model/commit-message';\n\nfunction prettifyVersion(version: string): string {\n if (regEx(/^\\d/).test(version)) {\n return `v${version}`;\n }\n\n return version;\n}\n\nfunction isTypesGroup(branchUpgrades: BranchUpgradeConfig[]): boolean {\n return (\n branchUpgrades.some(({ depName }) => depName?.startsWith('@types/')) &&\n new Set(\n branchUpgrades.map(({ depName }) => depName?.replace(/^@types\\//, '')),\n ).size === 1\n );\n}\n\nfunction sortTypesGroup(upgrades: BranchUpgradeConfig[]): void {\n const isTypesUpgrade = ({ depName }: BranchUpgradeConfig): boolean =>\n !!depName?.startsWith('@types/');\n const regularUpgrades = upgrades.filter(\n (upgrade) => !isTypesUpgrade(upgrade),\n );\n const typesUpgrades = upgrades.filter(isTypesUpgrade);\n upgrades.splice(0, upgrades.length);\n upgrades.push(...regularUpgrades, ...typesUpgrades);\n}\n\nfunction getTableValues(upgrade: BranchUpgradeConfig): string[] | null {\n if (!upgrade.commitBodyTable) {\n return null;\n }\n const { datasource, packageName, depName, currentVersion, newVersion } =\n upgrade;\n const name = packageName ?? depName;\n if (datasource && name && currentVersion && newVersion) {\n return [datasource, name, currentVersion, newVersion];\n }\n logger.trace(\n {\n datasource,\n packageName,\n depName,\n currentVersion,\n newVersion,\n },\n 'Cannot determine table values',\n );\n return null;\n}\n\nfunction compileCommitMessage(upgrade: BranchUpgradeConfig): string {\n if (upgrade.semanticCommits === 'enabled' && !upgrade.commitMessagePrefix) {\n logger.trace('Upgrade has semantic commits enabled');\n let semanticPrefix = upgrade.semanticCommitType;\n if (upgrade.semanticCommitScope) {\n semanticPrefix += `(${template.compile(\n upgrade.semanticCommitScope,\n upgrade,\n )})`;\n }\n upgrade.commitMessagePrefix = CommitMessage.formatPrefix(semanticPrefix!);\n upgrade.toLowerCase =\n regEx(/[A-Z]/).exec(upgrade.semanticCommitType!) === null &&\n !upgrade.semanticCommitType!.startsWith(':');\n }\n\n // Compile a few times in case there are nested templates\n upgrade.commitMessage = template.compile(\n upgrade.commitMessage ?? '',\n upgrade,\n );\n upgrade.commitMessage = template.compile(upgrade.commitMessage, upgrade);\n upgrade.commitMessage = template.compile(upgrade.commitMessage, upgrade);\n // istanbul ignore if\n if (upgrade.commitMessage !== sanitize(upgrade.commitMessage)) {\n logger.debug(\n { branchName: upgrade.branchName },\n 'Secrets exposed in commit message',\n );\n throw new Error(CONFIG_SECRETS_EXPOSED);\n }\n upgrade.commitMessage = upgrade.commitMessage.trim(); // Trim exterior whitespace\n upgrade.commitMessage = upgrade.commitMessage.replace(regEx(/\\s+/g), ' '); // Trim extra whitespace inside string\n upgrade.commitMessage = upgrade.commitMessage.replace(\n regEx(/to vv(\\d)/),\n 'to v$1',\n );\n if (upgrade.toLowerCase && upgrade.commitMessageLowerCase !== 'never') {\n // We only need to lowercase the first line\n const splitMessage = upgrade.commitMessage.split(newlineRegex);\n splitMessage[0] = splitMessage[0].toLowerCase();\n upgrade.commitMessage = splitMessage.join('\\n');\n }\n\n logger.trace(`commitMessage: ` + JSON.stringify(upgrade.commitMessage));\n return upgrade.commitMessage;\n}\n\nfunction compilePrTitle(\n upgrade: BranchUpgradeConfig,\n commitMessage: string,\n): void {\n if (upgrade.prTitle) {\n upgrade.prTitle = template.compile(upgrade.prTitle, upgrade);\n upgrade.prTitle = template.compile(upgrade.prTitle, upgrade);\n upgrade.prTitle = template\n .compile(upgrade.prTitle, upgrade)\n .trim()\n .replace(regEx(/\\s+/g), ' ');\n // istanbul ignore if\n if (upgrade.prTitle !== sanitize(upgrade.prTitle)) {\n logger.debug(\n { branchName: upgrade.branchName },\n 'Secrets were exposed in PR title',\n );\n throw new Error(CONFIG_SECRETS_EXPOSED);\n }\n if (upgrade.toLowerCase && upgrade.commitMessageLowerCase !== 'never') {\n upgrade.prTitle = upgrade.prTitle.toLowerCase();\n }\n } else {\n [upgrade.prTitle] = commitMessage.split(newlineRegex);\n }\n if (!upgrade.prTitleStrict) {\n upgrade.prTitle += upgrade.hasBaseBranches ? ' ({{baseBranch}})' : '';\n if (upgrade.isGroup) {\n upgrade.prTitle +=\n upgrade.updateType === 'major' && upgrade.separateMajorMinor\n ? ' (major)'\n : '';\n upgrade.prTitle +=\n upgrade.updateType === 'minor' && upgrade.separateMinorPatch\n ? ' (minor)'\n : '';\n upgrade.prTitle +=\n upgrade.updateType === 'patch' && upgrade.separateMinorPatch\n ? ' (patch)'\n : '';\n }\n }\n // Compile again to allow for nested templates\n upgrade.prTitle = template.compile(upgrade.prTitle, upgrade);\n logger.trace(`prTitle: ` + JSON.stringify(upgrade.prTitle));\n}\n\n// Sorted by priority, from low to high\nconst semanticCommitTypeByPriority = ['chore', 'ci', 'build', 'fix', 'feat'];\n\nexport function generateBranchConfig(\n upgrades: BranchUpgradeConfig[],\n): BranchConfig {\n let branchUpgrades = upgrades;\n if (!branchUpgrades.every((upgrade) => upgrade.pendingChecks)) {\n // If the branch isn't pending, then remove any upgrades within which *are*\n branchUpgrades = branchUpgrades.filter((upgrade) => !upgrade.pendingChecks);\n }\n logger.trace({ config: branchUpgrades }, 'generateBranchConfig');\n let config: BranchConfig = {\n upgrades: [],\n } as any;\n const hasGroupName = branchUpgrades[0].groupName !== null;\n logger.trace(`hasGroupName: ${hasGroupName}`);\n // Use group settings only if multiple upgrades or lazy grouping is disabled\n const depNames: string[] = [];\n const newValue: string[] = [];\n const toVersions: string[] = [];\n const toValues = new Set<string>();\n const depTypes = new Set<string>();\n for (const upg of branchUpgrades) {\n upg.recreateClosed = upg.recreateWhen === 'always';\n\n if (upg.currentDigest) {\n upg.currentDigestShort =\n upg.currentDigestShort ??\n upg.currentDigest.replace('sha256:', '').substring(0, 7);\n }\n if (upg.newDigest) {\n upg.newDigestShort =\n upg.newDigestShort ??\n upg.newDigest.replace('sha256:', '').substring(0, 7);\n }\n if (upg.isDigest || upg.isPinDigest) {\n upg.displayFrom = upg.currentDigestShort;\n upg.displayTo = upg.newDigestShort;\n } else if (upg.isLockfileUpdate) {\n upg.displayFrom = upg.currentVersion;\n upg.displayTo = upg.newVersion;\n } else if (!upg.isLockFileMaintenance) {\n upg.displayFrom = upg.currentValue;\n upg.displayTo = upg.newValue;\n }\n\n if (upg.isLockFileMaintenance) {\n upg.recreateClosed = upg.recreateWhen !== 'never';\n }\n upg.displayFrom ??= '';\n upg.displayTo ??= '';\n if (!depNames.includes(upg.depName!)) {\n depNames.push(upg.depName!);\n }\n if (!toVersions.includes(upg.newVersion!)) {\n toVersions.push(upg.newVersion!);\n }\n toValues.add(upg.newValue!);\n if (upg.depType) {\n depTypes.add(upg.depType);\n }\n // prettify newVersion and newMajor for printing\n if (upg.newVersion) {\n upg.prettyNewVersion = prettifyVersion(upg.newVersion);\n }\n if (upg.newMajor) {\n upg.prettyNewMajor = `v${upg.newMajor}`;\n }\n if (upg.commitMessageExtra) {\n const extra = template.compile(upg.commitMessageExtra, upg);\n if (!newValue.includes(extra)) {\n newValue.push(extra);\n }\n }\n }\n const groupEligible =\n depNames.length > 1 ||\n toVersions.length > 1 ||\n (!toVersions[0] && newValue.length > 1);\n\n const typesGroup =\n depNames.length > 1 && !hasGroupName && isTypesGroup(branchUpgrades);\n logger.trace(`groupEligible: ${groupEligible}`);\n const useGroupSettings = hasGroupName && groupEligible;\n logger.trace(`useGroupSettings: ${useGroupSettings}`);\n let releaseTimestamp: Timestamp;\n\n if (depTypes.size) {\n config.depTypes = Array.from(depTypes).sort();\n }\n\n for (const branchUpgrade of branchUpgrades) {\n let upgrade: BranchUpgradeConfig = { ...branchUpgrade };\n\n upgrade.depTypes = config.depTypes;\n\n // needs to be done for each upgrade, as we reorder them below\n if (newValue.length > 1 && !groupEligible) {\n upgrade.commitMessageExtra = `to v${toVersions[0]}`;\n }\n\n const pendingVersionsLength = upgrade.pendingVersions?.length;\n if (pendingVersionsLength) {\n upgrade.displayPending = `\\`${upgrade\n .pendingVersions!.slice(-1)\n .pop()!}\\``;\n if (pendingVersionsLength > 1) {\n upgrade.displayPending += ` (+${pendingVersionsLength - 1})`;\n }\n } else {\n upgrade.displayPending = '';\n }\n upgrade.prettyDepType =\n upgrade.prettyDepType ?? upgrade.depType ?? 'dependency';\n if (useGroupSettings) {\n // Now overwrite original config with group config\n upgrade = mergeChildConfig(upgrade, upgrade.group);\n upgrade.isGroup = true;\n } else {\n delete upgrade.groupName;\n }\n // Delete group config regardless of whether it was applied\n delete upgrade.group;\n\n if (\n toVersions.length > 1 &&\n toValues.size > 1 &&\n newValue.length > 1 &&\n !typesGroup\n ) {\n logger.trace({ toVersions });\n logger.trace({ toValues });\n delete upgrade.commitMessageExtra;\n upgrade.recreateClosed = upgrade.recreateWhen !== 'never';\n } else if (\n newValue.length > 1 &&\n (upgrade.isDigest || upgrade.isPinDigest)\n ) {\n logger.trace({ newValue });\n delete upgrade.commitMessageExtra;\n upgrade.recreateClosed = upgrade.recreateWhen !== 'never';\n } else if (semver.valid(toVersions[0])) {\n upgrade.isRange = false;\n }\n config.upgrades.push(upgrade);\n if (upgrade.releaseTimestamp) {\n if (releaseTimestamp!) {\n const existingStamp = DateTime.fromISO(releaseTimestamp);\n const upgradeStamp = DateTime.fromISO(upgrade.releaseTimestamp);\n if (upgradeStamp > existingStamp) {\n releaseTimestamp = upgrade.releaseTimestamp;\n }\n } else {\n releaseTimestamp = upgrade.releaseTimestamp;\n }\n }\n }\n\n if (typesGroup) {\n if (config.upgrades[0].depName?.startsWith('@types/')) {\n logger.debug('Found @types - reversing upgrades to use depName in PR');\n sortTypesGroup(config.upgrades);\n config.upgrades[0].recreateClosed = false;\n config.hasTypes = true;\n }\n } else {\n config.upgrades.sort((a, b) => {\n if (a.fileReplacePosition && b.fileReplacePosition) {\n // This is because we need to replace from the bottom of the file up\n return a.fileReplacePosition > b.fileReplacePosition ? -1 : 1;\n }\n\n // make sure that ordering is consistent :\n // items without position will be first in the list.\n if (a.fileReplacePosition) {\n return 1;\n }\n if (b.fileReplacePosition) {\n return -1;\n }\n\n if (a.depName! < b.depName!) {\n return -1;\n }\n if (a.depName! > b.depName!) {\n return 1;\n }\n return 0;\n });\n }\n // Now assign first upgrade's config as branch config\n config = {\n ...config,\n ...config.upgrades[0],\n releaseTimestamp: releaseTimestamp!,\n }; // TODO: fixme (#9666)\n\n // Enable `semanticCommits` if one of the branches has it enabled\n if (\n config.upgrades.some((upgrade) => upgrade.semanticCommits === 'enabled')\n ) {\n config.semanticCommits = 'enabled';\n // Calculate the highest priority `semanticCommitType`\n let highestIndex = -1;\n for (const upgrade of config.upgrades) {\n if (upgrade.semanticCommits === 'enabled' && upgrade.semanticCommitType) {\n const priorityIndex = semanticCommitTypeByPriority.indexOf(\n upgrade.semanticCommitType,\n );\n\n if (priorityIndex > highestIndex) {\n highestIndex = priorityIndex;\n }\n }\n }\n\n if (highestIndex > -1) {\n config.semanticCommitType = semanticCommitTypeByPriority[highestIndex];\n }\n }\n\n // Use templates to generate strings\n const commitMessage = compileCommitMessage(config);\n compilePrTitle(config, commitMessage);\n\n config.dependencyDashboardApproval = config.upgrades.some(\n (upgrade) => upgrade.dependencyDashboardApproval,\n );\n config.dependencyDashboardPrApproval = config.upgrades.some(\n (upgrade) => upgrade.prCreation === 'approval',\n );\n config.prBodyColumns = [\n ...new Set(\n config.upgrades.reduce(\n (existing: string[], upgrade) =>\n existing.concat(upgrade.prBodyColumns!),\n [],\n ),\n ),\n ].filter(is.nonEmptyString);\n // combine excludeCommitPaths for multiple manager experience\n const hasExcludeCommitPaths = config.upgrades.some(\n (u) => u.excludeCommitPaths && u.excludeCommitPaths.length > 0,\n );\n if (hasExcludeCommitPaths) {\n config.excludeCommitPaths = Object.keys(\n config.upgrades.reduce((acc: Record<string, boolean>, upgrade) => {\n if (upgrade.excludeCommitPaths) {\n upgrade.excludeCommitPaths.forEach((p) => {\n acc[p] = true;\n });\n }\n\n return acc;\n }, {}),\n );\n }\n\n config.automerge = config.upgrades.every((upgrade) => upgrade.automerge);\n // combine all labels\n config.labels = [\n ...new Set(\n config.upgrades\n .map((upgrade) => upgrade.labels ?? [])\n .reduce((a, b) => a.concat(b), []),\n ),\n ];\n config.addLabels = [\n ...new Set(\n config.upgrades\n .map((upgrade) => upgrade.addLabels ?? [])\n .reduce((a, b) => a.concat(b), []),\n ),\n ];\n\n if (config.upgrades.some((upgrade) => upgrade.updateType === 'major')) {\n config.updateType = 'major';\n }\n\n // explicit set `isLockFileMaintenance` for the branch for groups\n if (config.upgrades.some((upgrade) => upgrade.isLockFileMaintenance)) {\n config.isLockFileMaintenance = true;\n // istanbul ignore if: not worth testing\n if (config.upgrades.some((upgrade) => !upgrade.isLockFileMaintenance)) {\n // TODO: warn?\n logger.debug(\n 'Grouping lockfile maintenance with other update types is not supported',\n );\n }\n }\n\n config.constraints = {};\n for (const upgrade of config.upgrades) {\n if (upgrade.constraints) {\n config.constraints = { ...config.constraints, ...upgrade.constraints };\n }\n }\n\n // Set skipInstalls to false if any upgrade in the branch has it false\n config.skipInstalls = config.upgrades.every(\n (upgrade) => upgrade.skipInstalls !== false,\n );\n\n const tableRows = config.upgrades\n .map(getTableValues)\n .filter((x): x is string[] => is.array(x, is.string));\n\n if (tableRows.length) {\n const table: string[][] = [];\n table.push(['datasource', 'package', 'from', 'to']);\n\n const seenRows = new Set<string>();\n\n for (const row of tableRows) {\n const key = safeStringify(row);\n if (seenRows.has(key)) {\n continue;\n }\n seenRows.add(key);\n table.push(row);\n }\n config.commitMessage += '\\n\\n' + mdTable(table) + '\\n';\n }\n const additionalReviewers = uniq(\n config.upgrades\n .map((upgrade) => upgrade.additionalReviewers)\n .flat()\n .filter(is.nonEmptyString),\n );\n if (additionalReviewers.length > 0) {\n config.additionalReviewers = additionalReviewers;\n }\n return config;\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "renovate",
3
3
  "description": "Automated dependency updates. Flexible so you don't need to be.",
4
- "version": "39.254.1",
4
+ "version": "39.254.3",
5
5
  "type": "commonjs",
6
6
  "bin": {
7
7
  "renovate": "dist/renovate.js",
@@ -141,7 +141,7 @@
141
141
  "pnpm": "^10.0.0"
142
142
  },
143
143
  "volta": {
144
- "node": "22.14.0",
144
+ "node": "22.15.0",
145
145
  "pnpm": "10.8.1"
146
146
  },
147
147
  "dependencies": {
@@ -239,7 +239,7 @@
239
239
  "p-throttle": "4.1.1",
240
240
  "parse-link-header": "2.0.0",
241
241
  "prettier": "3.5.3",
242
- "protobufjs": "7.4.0",
242
+ "protobufjs": "7.5.0",
243
243
  "punycode": "2.3.1",
244
244
  "redis": "4.7.0",
245
245
  "remark": "13.0.0",
@@ -344,11 +344,11 @@
344
344
  "tar": "7.4.3",
345
345
  "tmp-promise": "3.0.3",
346
346
  "tsx": "4.19.3",
347
- "type-fest": "4.39.1",
347
+ "type-fest": "4.40.0",
348
348
  "typescript": "5.8.3",
349
349
  "typescript-eslint": "8.30.1",
350
350
  "unified": "9.2.2",
351
- "vite": "6.2.6",
351
+ "vite": "6.3.0",
352
352
  "vite-tsconfig-paths": "5.1.4",
353
353
  "vitest": "3.1.1",
354
354
  "vitest-mock-extended": "3.1.0"