renovate 43.259.0 → 43.259.1

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.
@@ -6,7 +6,8 @@ function makeTimingReport(data) {
6
6
  const count = data.length;
7
7
  const totalMs = data.reduce((a, c) => a + c, 0);
8
8
  const avgMs = count ? Math.round(totalMs / count) : 0;
9
- const maxMs = Math.max(0, ...data);
9
+ let maxMs = 0;
10
+ for (const duration of data) maxMs = Math.max(maxMs, duration);
10
11
  const sorted = data.sort((a, b) => a - b);
11
12
  return {
12
13
  count,
@@ -1 +1 @@
1
- {"version":3,"file":"stats.js","names":["memCache.get"],"sources":["../../lib/util/stats.ts"],"sourcesContent":["import { logger } from '../logger/index.ts';\nimport * as memCache from './cache/memory/index.ts';\nimport type { GitOperationType } from './git/types.ts';\nimport { parseUrl } from './url.ts';\n\ntype LookupStatsData = Record<string, number[]>;\n\ninterface TimingStatsReport {\n count: number;\n avgMs: number;\n medianMs: number;\n maxMs: number;\n totalMs: number;\n}\n\nexport function makeTimingReport(data: number[]): TimingStatsReport {\n const count = data.length;\n const totalMs = data.reduce((a, c) => a + c, 0);\n const avgMs = count ? Math.round(totalMs / count) : 0;\n const maxMs = Math.max(0, ...data);\n const sorted = data.sort((a, b) => a - b);\n const medianMs = count ? sorted[Math.floor(count / 2)] : 0;\n return { count, avgMs, medianMs, maxMs, totalMs };\n}\n\nexport class LookupStats {\n static write(datasource: string, duration: number): void {\n const data = memCache.get<LookupStatsData>('lookup-stats') ?? {};\n data[datasource] ??= [];\n data[datasource].push(duration);\n memCache.set('lookup-stats', data);\n }\n\n static async wrap<T>(\n datasource: string,\n callback: () => Promise<T>,\n ): Promise<T> {\n const start = Date.now();\n const result = await callback();\n const duration = Date.now() - start;\n LookupStats.write(datasource, duration);\n return result;\n }\n\n static getReport(): Record<string, TimingStatsReport> {\n const report: Record<string, TimingStatsReport> = {};\n const data = memCache.get<LookupStatsData>('lookup-stats') ?? {};\n for (const [datasource, durations] of Object.entries(data)) {\n report[datasource] = makeTimingReport(durations);\n }\n return report;\n }\n\n static report(): void {\n const report = LookupStats.getReport();\n logger.debug(report, 'Lookup statistics');\n }\n}\n\ninterface GetReleasesDataPoint {\n datasource: string;\n registryUrl: string;\n packageName: string;\n duration: number;\n}\n\ninterface getReleaseStatsInternalPackages<T> {\n stats: T;\n packages: Record<string, T>;\n}\n\n/**\n * Internal structure that represents the hierarchical structure of the data. We use this\n * to handle the duration datapoints, and then convert to the final report structure.\n */\ninterface getReleaseStatsInternal<T, P = T> {\n // Overall stats\n stats: T;\n datasources: Record<\n string,\n {\n // Datasource stats.\n stats: T;\n registryUrls: Record<\n string,\n [P] extends [never]\n ? Omit<getReleaseStatsInternalPackages<T>, 'packages'>\n : getReleaseStatsInternalPackages<T>\n >;\n }\n >;\n}\n\nexport type GetReleaseStatsReport = getReleaseStatsInternal<TimingStatsReport>;\n\n// Short report does not include package stats.\nexport type GetReleaseStatsReportShort = getReleaseStatsInternal<\n TimingStatsReport,\n never\n>;\n\nexport class GetDatasourceReleasesStats {\n static write(\n datasource: string,\n registryUrl: string,\n packageName: string,\n duration: number,\n ): void {\n const data =\n memCache.get<GetReleasesDataPoint[]>('get-releases-stats') ?? [];\n data.push({ datasource, registryUrl, packageName, duration });\n memCache.set('get-releases-stats', data);\n }\n\n static async wrap<T>(\n datasource: string,\n registryUrl: string,\n packageName: string,\n callback: () => Promise<T>,\n ): Promise<T> {\n const start = Date.now();\n const result = await callback();\n const duration = Date.now() - start;\n this.write(datasource, registryUrl, packageName, duration);\n return result;\n }\n\n static getReport(): GetReleaseStatsReport {\n const data =\n memCache.get<GetReleasesDataPoint[]>('get-releases-stats') ?? [];\n\n // Process all datapoints into a hierarchical structure of datasource, registry url, and package name.\n const durationData: getReleaseStatsInternal<number[]> = {\n stats: [],\n datasources: {},\n };\n for (const { datasource, registryUrl, packageName, duration } of data) {\n durationData.stats.push(duration);\n\n durationData.datasources[datasource] ??= { stats: [], registryUrls: {} };\n durationData.datasources[datasource].stats.push(duration);\n\n durationData.datasources[datasource].registryUrls[registryUrl] ??= {\n stats: [],\n packages: {},\n };\n durationData.datasources[datasource].registryUrls[registryUrl].stats.push(\n duration,\n );\n\n durationData.datasources[datasource].registryUrls[registryUrl].packages[\n packageName\n ] ??= [];\n durationData.datasources[datasource].registryUrls[registryUrl].packages[\n packageName\n ].push(duration);\n }\n\n const report: GetReleaseStatsReport = {\n stats: makeTimingReport(durationData.stats),\n datasources: {},\n };\n\n for (const [datasource, datasourceData] of Object.entries(\n durationData.datasources,\n )) {\n report.datasources[datasource] = {\n stats: makeTimingReport(datasourceData.stats),\n registryUrls: {},\n };\n\n for (const [registryUrl, registryUrlData] of Object.entries(\n datasourceData.registryUrls,\n )) {\n report.datasources[datasource].registryUrls[registryUrl] = {\n stats: makeTimingReport(registryUrlData.stats),\n packages: {},\n };\n\n for (const [packageName, packageNameData] of Object.entries(\n registryUrlData.packages,\n )) {\n report.datasources[datasource].registryUrls[registryUrl].packages[\n packageName\n ] = makeTimingReport(packageNameData);\n }\n }\n }\n\n return report;\n }\n\n static report(): void {\n const report = this.getReport();\n\n const shortReport: GetReleaseStatsReportShort = {\n stats: report.stats,\n datasources: {},\n };\n\n for (const [datasource, datasourceData] of Object.entries(\n report.datasources,\n )) {\n shortReport.datasources[datasource] = {\n stats: datasourceData.stats,\n registryUrls: {},\n };\n for (const [registryUrl, registryUrlData] of Object.entries(\n datasourceData.registryUrls,\n )) {\n shortReport.datasources[datasource].registryUrls[registryUrl] = {\n stats: registryUrlData.stats,\n };\n }\n }\n\n logger.trace(report, 'getReleases statistics with packages');\n logger.debug(shortReport, 'getReleases statistics summary');\n }\n}\n\ntype PackageCacheData = number[];\n\nexport class PackageCacheStats {\n static writeSet(duration: number): void {\n const data = memCache.get<PackageCacheData>('package-cache-sets') ?? [];\n data.push(duration);\n memCache.set('package-cache-sets', data);\n }\n\n static async wrapSet<T>(callback: () => Promise<T>): Promise<T> {\n const start = Date.now();\n const result = await callback();\n const duration = Date.now() - start;\n PackageCacheStats.writeSet(duration);\n return result;\n }\n\n static writeGet(duration: number): void {\n const data = memCache.get<PackageCacheData>('package-cache-gets') ?? [];\n data.push(duration);\n memCache.set('package-cache-gets', data);\n }\n\n static async wrapGet<T>(callback: () => Promise<T>): Promise<T> {\n const start = Date.now();\n const result = await callback();\n const duration = Date.now() - start;\n PackageCacheStats.writeGet(duration);\n return result;\n }\n\n static getReport(): { get: TimingStatsReport; set: TimingStatsReport } {\n const packageCacheGets =\n memCache.get<PackageCacheData>('package-cache-gets') ?? [];\n const get = makeTimingReport(packageCacheGets);\n\n const packageCacheSets =\n memCache.get<PackageCacheData>('package-cache-sets') ?? [];\n const set = makeTimingReport(packageCacheSets);\n\n return { get, set };\n }\n\n static report(): void {\n const report = PackageCacheStats.getReport();\n logger.debug(report, 'Package cache statistics');\n }\n}\n\ninterface DatasourceCacheDataPoint {\n datasource: string;\n registryUrl: string;\n packageName: string;\n action: 'hit' | 'miss' | 'set' | 'skip';\n}\n\ninterface DatasourceCacheLongEntry {\n read?: 'hit' | 'miss';\n write?: 'set' | 'skip';\n}\n\ninterface DatasourceCacheShortEntry {\n hit: number;\n miss: number;\n set: number;\n skip: number;\n}\n\ntype DatasourceCacheLong = Record<\n string,\n Record<string, Record<string, DatasourceCacheLongEntry>>\n>;\n\ntype DatasourceCacheShort = Record<\n string,\n Record<string, DatasourceCacheShortEntry>\n>;\n\nexport interface DatasourceCacheReport {\n long: DatasourceCacheLong;\n short: DatasourceCacheShort;\n}\n\nexport class DatasourceCacheStats {\n private static getData(): DatasourceCacheDataPoint[] {\n return (\n memCache.get<DatasourceCacheDataPoint[]>('datasource-cache-stats') ?? []\n );\n }\n\n private static setData(data: DatasourceCacheDataPoint[]): void {\n memCache.set('datasource-cache-stats', data);\n }\n\n static hit(\n datasource: string,\n registryUrl: string,\n packageName: string,\n ): void {\n const data = this.getData();\n data.push({ datasource, registryUrl, packageName, action: 'hit' });\n this.setData(data);\n }\n\n static miss(\n datasource: string,\n registryUrl: string,\n packageName: string,\n ): void {\n const data = this.getData();\n data.push({ datasource, registryUrl, packageName, action: 'miss' });\n this.setData(data);\n }\n\n static set(\n datasource: string,\n registryUrl: string,\n packageName: string,\n ): void {\n const data = this.getData();\n data.push({ datasource, registryUrl, packageName, action: 'set' });\n this.setData(data);\n }\n\n static skip(\n datasource: string,\n registryUrl: string,\n packageName: string,\n ): void {\n const data = this.getData();\n data.push({ datasource, registryUrl, packageName, action: 'skip' });\n this.setData(data);\n }\n\n static getReport(): DatasourceCacheReport {\n const data = this.getData();\n const result: DatasourceCacheReport = { long: {}, short: {} };\n for (const { datasource, registryUrl, packageName, action } of data) {\n result.long[datasource] ??= {};\n result.long[datasource][registryUrl] ??= {};\n result.long[datasource][registryUrl] ??= {};\n result.long[datasource][registryUrl][packageName] ??= {};\n\n result.short[datasource] ??= {};\n result.short[datasource][registryUrl] ??= {\n hit: 0,\n miss: 0,\n set: 0,\n skip: 0,\n };\n\n if (action === 'hit') {\n result.long[datasource][registryUrl][packageName].read = 'hit';\n result.short[datasource][registryUrl].hit += 1;\n continue;\n }\n\n if (action === 'miss') {\n result.long[datasource][registryUrl][packageName].read = 'miss';\n result.short[datasource][registryUrl].miss += 1;\n continue;\n }\n\n if (action === 'set') {\n result.long[datasource][registryUrl][packageName].write = 'set';\n result.short[datasource][registryUrl].set += 1;\n continue;\n }\n\n /* v8 ignore else -- TODO: add tests #40625 */\n if (action === 'skip') {\n result.long[datasource][registryUrl][packageName].write = 'skip';\n result.short[datasource][registryUrl].skip += 1;\n continue;\n }\n }\n\n return result;\n }\n\n static report(): void {\n const { long, short } = this.getReport();\n\n if (Object.keys(short).length > 0) {\n logger.debug(short, 'Datasource cache statistics');\n }\n\n if (Object.keys(long).length > 0) {\n logger.trace(long, 'Datasource cache detailed statistics');\n }\n }\n}\n\nexport interface HttpRequestStatsDataPoint {\n method: string;\n url: string;\n reqMs: number;\n queueMs: number;\n status: number;\n}\n\ninterface HostStatsData {\n count: number;\n reqAvgMs: number;\n reqMedianMs: number;\n reqMaxMs: number;\n queueAvgMs: number;\n queueMedianMs: number;\n queueMaxMs: number;\n}\n\n// url -> method -> status -> count\ntype UrlHttpStat = Record<string, Record<string, Record<string, number>>>;\n\ninterface HttpStatsCollection {\n // debug data\n urls: UrlHttpStat;\n hosts: Record<string, HostStatsData>;\n requests: number;\n\n // trace data\n rawRequests: string[];\n hostRequests: Record<string, HttpRequestStatsDataPoint[]>;\n}\n\nexport class HttpStats {\n static write(data: HttpRequestStatsDataPoint): void {\n const httpRequests =\n memCache.get<HttpRequestStatsDataPoint[]>('http-requests') ?? [];\n httpRequests.push(data);\n memCache.set('http-requests', httpRequests);\n }\n\n static getDataPoints(): HttpRequestStatsDataPoint[] {\n const httpRequests =\n memCache.get<HttpRequestStatsDataPoint[]>('http-requests') ?? [];\n\n // istanbul ignore next: sorting is hard and not worth testing\n httpRequests.sort((a, b) => {\n if (a.url < b.url) {\n return -1;\n }\n\n if (a.url > b.url) {\n return 1;\n }\n\n return 0;\n });\n\n return httpRequests;\n }\n\n static getReport(): HttpStatsCollection {\n const dataPoints = HttpStats.getDataPoints();\n\n const requests = dataPoints.length;\n\n const urls: UrlHttpStat = {};\n const rawRequests: string[] = [];\n const hostRequests: Record<string, HttpRequestStatsDataPoint[]> = {};\n\n for (const dataPoint of dataPoints) {\n const { url, reqMs, queueMs, status } = dataPoint;\n const method = dataPoint.method.toUpperCase();\n\n const parsedUrl = parseUrl(url);\n if (!parsedUrl) {\n logger.debug({ url }, 'Failed to parse URL during stats reporting');\n continue;\n }\n const { hostname, origin, pathname } = parsedUrl;\n const baseUrl = `${origin}${pathname}`;\n\n urls[baseUrl] ??= {};\n urls[baseUrl][method] ??= {};\n urls[baseUrl][method][status] ??= 0;\n urls[baseUrl][method][status] += 1;\n\n rawRequests.push(`${method} ${url} ${status} ${reqMs} ${queueMs}`);\n\n hostRequests[hostname] ??= [];\n hostRequests[hostname].push(dataPoint);\n }\n\n const hosts: Record<string, HostStatsData> = {};\n\n for (const [hostname, dataPoints] of Object.entries(hostRequests)) {\n const count = dataPoints.length;\n\n const reqTimes = dataPoints.map((r) => r.reqMs);\n const queueTimes = dataPoints.map((r) => r.queueMs);\n\n const reqReport = makeTimingReport(reqTimes);\n const queueReport = makeTimingReport(queueTimes);\n\n hosts[hostname] = {\n count,\n reqAvgMs: reqReport.avgMs,\n reqMedianMs: reqReport.medianMs,\n reqMaxMs: reqReport.maxMs,\n queueAvgMs: queueReport.avgMs,\n queueMedianMs: queueReport.medianMs,\n queueMaxMs: queueReport.maxMs,\n };\n }\n\n return {\n urls,\n rawRequests,\n hostRequests,\n hosts,\n requests,\n };\n }\n\n static report(): void {\n const { urls, rawRequests, hostRequests, hosts, requests } =\n HttpStats.getReport();\n logger.trace({ rawRequests, hostRequests }, 'HTTP full statistics');\n logger.debug({ hosts, requests }, 'HTTP statistics');\n logger.trace({ urls }, 'HTTP URL statistics');\n }\n}\n\ninterface HttpCacheHostStatsData {\n hit: number;\n miss: number;\n localHit?: number;\n localMiss?: number;\n}\n\ntype HttpCacheStatsData = Record<string, HttpCacheHostStatsData>;\n\nfunction sortObject<T>(obj: Record<string, T>): Record<string, T> {\n const result: Record<string, T> = {};\n for (const key of Object.keys(obj).sort()) {\n result[key] = obj[key];\n }\n return result;\n}\n\nexport class HttpCacheStats {\n static getData(): HttpCacheStatsData {\n return memCache.get<HttpCacheStatsData>('http-cache-stats') ?? {};\n }\n\n static read(key: string): HttpCacheHostStatsData {\n return (\n this.getData()?.[key] ?? {\n hit: 0,\n miss: 0,\n }\n );\n }\n\n static write(key: string, data: HttpCacheHostStatsData): void {\n const stats = memCache.get<HttpCacheStatsData>('http-cache-stats') ?? {};\n stats[key] = data;\n memCache.set('http-cache-stats', stats);\n }\n\n static getBaseUrl(url: string): string | null {\n const parsedUrl = parseUrl(url);\n if (!parsedUrl) {\n logger.debug({ url }, 'Failed to parse URL during cache stats');\n return null;\n }\n const { origin, pathname } = parsedUrl;\n const baseUrl = `${origin}${pathname}`;\n return baseUrl;\n }\n\n static incLocalHits(url: string): void {\n const baseUrl = HttpCacheStats.getBaseUrl(url);\n /* v8 ignore else -- TODO: add tests #40625 */\n if (baseUrl) {\n const host = baseUrl;\n const stats = HttpCacheStats.read(host);\n stats.localHit ??= 0;\n stats.localHit += 1;\n HttpCacheStats.write(host, stats);\n }\n }\n\n static incLocalMisses(url: string): void {\n const baseUrl = HttpCacheStats.getBaseUrl(url);\n /* v8 ignore else -- TODO: add tests #40625 */\n if (baseUrl) {\n const host = baseUrl;\n const stats = HttpCacheStats.read(host);\n stats.localMiss ??= 0;\n stats.localMiss += 1;\n HttpCacheStats.write(host, stats);\n }\n }\n\n static incRemoteHits(url: string): void {\n const baseUrl = HttpCacheStats.getBaseUrl(url);\n /* v8 ignore else -- TODO: add tests #40625 */\n if (baseUrl) {\n const host = baseUrl;\n const stats = HttpCacheStats.read(host);\n stats.hit += 1;\n HttpCacheStats.write(host, stats);\n }\n }\n\n static incRemoteMisses(url: string): void {\n const baseUrl = HttpCacheStats.getBaseUrl(url);\n /* v8 ignore else -- TODO: add tests #40625 */\n if (baseUrl) {\n const host = baseUrl;\n const stats = HttpCacheStats.read(host);\n stats.miss += 1;\n HttpCacheStats.write(host, stats);\n }\n }\n\n static report(): void {\n const data = HttpCacheStats.getData();\n let report: Record<string, Record<string, HttpCacheHostStatsData>> = {};\n for (const [url, stats] of Object.entries(data)) {\n const parsedUrl = parseUrl(url);\n /* v8 ignore else -- TODO: add tests #40625 */\n if (parsedUrl) {\n const { origin, pathname } = parsedUrl;\n report[origin] ??= {};\n report[origin][pathname] = stats;\n }\n }\n\n for (const [host, hostStats] of Object.entries(report)) {\n report[host] = sortObject(hostStats);\n }\n report = sortObject(report);\n\n logger.debug(report, 'HTTP cache statistics');\n }\n}\n\ntype ObsoleteCacheStats = Record<\n string,\n {\n count: number;\n }\n>;\n\n/* v8 ignore next: temporary code */\nexport class ObsoleteCacheHitLogger {\n static getData(): ObsoleteCacheStats {\n return memCache.get<ObsoleteCacheStats>('obsolete-cache-stats') ?? {};\n }\n\n static write(url: string): void {\n const data = this.getData();\n if (!data[url]) {\n data[url] = { count: 0 };\n }\n data[url].count++;\n memCache.set('obsolete-cache-stats', data);\n }\n\n static report(): void {\n const hits = this.getData();\n logger.debug(\n { count: Object.keys(hits).length, hits },\n 'Cache fallback URLs',\n );\n }\n}\n/* v8 ignore stop: temporary code */\n\ninterface AbandonedPackage {\n datasource: string;\n packageName: string;\n mostRecentTimestamp: string;\n}\n\ntype AbandonedPackageReport = Record<string, Record<string, string>>;\n\nexport class AbandonedPackageStats {\n static getData(): AbandonedPackage[] {\n return memCache.get<AbandonedPackage[]>('abandonment-stats') ?? [];\n }\n\n private static setData(data: AbandonedPackage[]): void {\n memCache.set('abandonment-stats', data);\n }\n\n static write(\n datasource: string,\n packageName: string,\n mostRecentTimestamp: string,\n ): void {\n const data = this.getData();\n data.push({ datasource, packageName, mostRecentTimestamp });\n this.setData(data);\n }\n\n static getReport(): AbandonedPackageReport {\n const data = this.getData();\n const result: AbandonedPackageReport = {};\n\n for (const { datasource, packageName, mostRecentTimestamp } of data) {\n result[datasource] ??= {};\n result[datasource][packageName] = mostRecentTimestamp;\n }\n\n const sortedResult: AbandonedPackageReport = {};\n for (const datasource of Object.keys(result).sort()) {\n sortedResult[datasource] = {};\n for (const packageName of Object.keys(result[datasource]).sort()) {\n sortedResult[datasource][packageName] = result[datasource][packageName];\n }\n }\n\n return sortedResult;\n }\n\n static report(): void {\n const report = this.getReport();\n if (Object.keys(report).length > 0) {\n logger.debug(report, 'Abandoned package statistics');\n }\n }\n}\n\ntype GitOperationStatsData = Record<GitOperationType, number[]>;\n\nexport class GitOperationStats {\n static write(operationType: GitOperationType, duration: number): void {\n const data =\n memCache.get<GitOperationStatsData>('git-operations-stats') ?? {};\n data[operationType] ??= [];\n data[operationType].push(duration);\n memCache.set('git-operations-stats', data);\n }\n\n static getReport(): Record<string, TimingStatsReport> {\n const report: Record<string, TimingStatsReport> = {};\n const data = memCache.get<LookupStatsData>('git-operations-stats') ?? {};\n for (const [operationType, durations] of Object.entries(data)) {\n report[operationType] = makeTimingReport(durations);\n report[operationType].totalMs = Math.ceil(report[operationType].totalMs);\n }\n\n return report;\n }\n\n static report(): void {\n const report = GitOperationStats.getReport();\n logger.debug(report, 'Git operations statistics');\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"stats.js","names":["memCache.get"],"sources":["../../lib/util/stats.ts"],"sourcesContent":["import { logger } from '../logger/index.ts';\nimport * as memCache from './cache/memory/index.ts';\nimport type { GitOperationType } from './git/types.ts';\nimport { parseUrl } from './url.ts';\n\ntype LookupStatsData = Record<string, number[]>;\n\ninterface TimingStatsReport {\n count: number;\n avgMs: number;\n medianMs: number;\n maxMs: number;\n totalMs: number;\n}\n\nexport function makeTimingReport(data: number[]): TimingStatsReport {\n const count = data.length;\n const totalMs = data.reduce((a, c) => a + c, 0);\n const avgMs = count ? Math.round(totalMs / count) : 0;\n let maxMs = 0;\n for (const duration of data) {\n maxMs = Math.max(maxMs, duration);\n }\n const sorted = data.sort((a, b) => a - b);\n const medianMs = count ? sorted[Math.floor(count / 2)] : 0;\n return { count, avgMs, medianMs, maxMs, totalMs };\n}\n\nexport class LookupStats {\n static write(datasource: string, duration: number): void {\n const data = memCache.get<LookupStatsData>('lookup-stats') ?? {};\n data[datasource] ??= [];\n data[datasource].push(duration);\n memCache.set('lookup-stats', data);\n }\n\n static async wrap<T>(\n datasource: string,\n callback: () => Promise<T>,\n ): Promise<T> {\n const start = Date.now();\n const result = await callback();\n const duration = Date.now() - start;\n LookupStats.write(datasource, duration);\n return result;\n }\n\n static getReport(): Record<string, TimingStatsReport> {\n const report: Record<string, TimingStatsReport> = {};\n const data = memCache.get<LookupStatsData>('lookup-stats') ?? {};\n for (const [datasource, durations] of Object.entries(data)) {\n report[datasource] = makeTimingReport(durations);\n }\n return report;\n }\n\n static report(): void {\n const report = LookupStats.getReport();\n logger.debug(report, 'Lookup statistics');\n }\n}\n\ninterface GetReleasesDataPoint {\n datasource: string;\n registryUrl: string;\n packageName: string;\n duration: number;\n}\n\ninterface getReleaseStatsInternalPackages<T> {\n stats: T;\n packages: Record<string, T>;\n}\n\n/**\n * Internal structure that represents the hierarchical structure of the data. We use this\n * to handle the duration datapoints, and then convert to the final report structure.\n */\ninterface getReleaseStatsInternal<T, P = T> {\n // Overall stats\n stats: T;\n datasources: Record<\n string,\n {\n // Datasource stats.\n stats: T;\n registryUrls: Record<\n string,\n [P] extends [never]\n ? Omit<getReleaseStatsInternalPackages<T>, 'packages'>\n : getReleaseStatsInternalPackages<T>\n >;\n }\n >;\n}\n\nexport type GetReleaseStatsReport = getReleaseStatsInternal<TimingStatsReport>;\n\n// Short report does not include package stats.\nexport type GetReleaseStatsReportShort = getReleaseStatsInternal<\n TimingStatsReport,\n never\n>;\n\nexport class GetDatasourceReleasesStats {\n static write(\n datasource: string,\n registryUrl: string,\n packageName: string,\n duration: number,\n ): void {\n const data =\n memCache.get<GetReleasesDataPoint[]>('get-releases-stats') ?? [];\n data.push({ datasource, registryUrl, packageName, duration });\n memCache.set('get-releases-stats', data);\n }\n\n static async wrap<T>(\n datasource: string,\n registryUrl: string,\n packageName: string,\n callback: () => Promise<T>,\n ): Promise<T> {\n const start = Date.now();\n const result = await callback();\n const duration = Date.now() - start;\n this.write(datasource, registryUrl, packageName, duration);\n return result;\n }\n\n static getReport(): GetReleaseStatsReport {\n const data =\n memCache.get<GetReleasesDataPoint[]>('get-releases-stats') ?? [];\n\n // Process all datapoints into a hierarchical structure of datasource, registry url, and package name.\n const durationData: getReleaseStatsInternal<number[]> = {\n stats: [],\n datasources: {},\n };\n for (const { datasource, registryUrl, packageName, duration } of data) {\n durationData.stats.push(duration);\n\n durationData.datasources[datasource] ??= { stats: [], registryUrls: {} };\n durationData.datasources[datasource].stats.push(duration);\n\n durationData.datasources[datasource].registryUrls[registryUrl] ??= {\n stats: [],\n packages: {},\n };\n durationData.datasources[datasource].registryUrls[registryUrl].stats.push(\n duration,\n );\n\n durationData.datasources[datasource].registryUrls[registryUrl].packages[\n packageName\n ] ??= [];\n durationData.datasources[datasource].registryUrls[registryUrl].packages[\n packageName\n ].push(duration);\n }\n\n const report: GetReleaseStatsReport = {\n stats: makeTimingReport(durationData.stats),\n datasources: {},\n };\n\n for (const [datasource, datasourceData] of Object.entries(\n durationData.datasources,\n )) {\n report.datasources[datasource] = {\n stats: makeTimingReport(datasourceData.stats),\n registryUrls: {},\n };\n\n for (const [registryUrl, registryUrlData] of Object.entries(\n datasourceData.registryUrls,\n )) {\n report.datasources[datasource].registryUrls[registryUrl] = {\n stats: makeTimingReport(registryUrlData.stats),\n packages: {},\n };\n\n for (const [packageName, packageNameData] of Object.entries(\n registryUrlData.packages,\n )) {\n report.datasources[datasource].registryUrls[registryUrl].packages[\n packageName\n ] = makeTimingReport(packageNameData);\n }\n }\n }\n\n return report;\n }\n\n static report(): void {\n const report = this.getReport();\n\n const shortReport: GetReleaseStatsReportShort = {\n stats: report.stats,\n datasources: {},\n };\n\n for (const [datasource, datasourceData] of Object.entries(\n report.datasources,\n )) {\n shortReport.datasources[datasource] = {\n stats: datasourceData.stats,\n registryUrls: {},\n };\n for (const [registryUrl, registryUrlData] of Object.entries(\n datasourceData.registryUrls,\n )) {\n shortReport.datasources[datasource].registryUrls[registryUrl] = {\n stats: registryUrlData.stats,\n };\n }\n }\n\n logger.trace(report, 'getReleases statistics with packages');\n logger.debug(shortReport, 'getReleases statistics summary');\n }\n}\n\ntype PackageCacheData = number[];\n\nexport class PackageCacheStats {\n static writeSet(duration: number): void {\n const data = memCache.get<PackageCacheData>('package-cache-sets') ?? [];\n data.push(duration);\n memCache.set('package-cache-sets', data);\n }\n\n static async wrapSet<T>(callback: () => Promise<T>): Promise<T> {\n const start = Date.now();\n const result = await callback();\n const duration = Date.now() - start;\n PackageCacheStats.writeSet(duration);\n return result;\n }\n\n static writeGet(duration: number): void {\n const data = memCache.get<PackageCacheData>('package-cache-gets') ?? [];\n data.push(duration);\n memCache.set('package-cache-gets', data);\n }\n\n static async wrapGet<T>(callback: () => Promise<T>): Promise<T> {\n const start = Date.now();\n const result = await callback();\n const duration = Date.now() - start;\n PackageCacheStats.writeGet(duration);\n return result;\n }\n\n static getReport(): { get: TimingStatsReport; set: TimingStatsReport } {\n const packageCacheGets =\n memCache.get<PackageCacheData>('package-cache-gets') ?? [];\n const get = makeTimingReport(packageCacheGets);\n\n const packageCacheSets =\n memCache.get<PackageCacheData>('package-cache-sets') ?? [];\n const set = makeTimingReport(packageCacheSets);\n\n return { get, set };\n }\n\n static report(): void {\n const report = PackageCacheStats.getReport();\n logger.debug(report, 'Package cache statistics');\n }\n}\n\ninterface DatasourceCacheDataPoint {\n datasource: string;\n registryUrl: string;\n packageName: string;\n action: 'hit' | 'miss' | 'set' | 'skip';\n}\n\ninterface DatasourceCacheLongEntry {\n read?: 'hit' | 'miss';\n write?: 'set' | 'skip';\n}\n\ninterface DatasourceCacheShortEntry {\n hit: number;\n miss: number;\n set: number;\n skip: number;\n}\n\ntype DatasourceCacheLong = Record<\n string,\n Record<string, Record<string, DatasourceCacheLongEntry>>\n>;\n\ntype DatasourceCacheShort = Record<\n string,\n Record<string, DatasourceCacheShortEntry>\n>;\n\nexport interface DatasourceCacheReport {\n long: DatasourceCacheLong;\n short: DatasourceCacheShort;\n}\n\nexport class DatasourceCacheStats {\n private static getData(): DatasourceCacheDataPoint[] {\n return (\n memCache.get<DatasourceCacheDataPoint[]>('datasource-cache-stats') ?? []\n );\n }\n\n private static setData(data: DatasourceCacheDataPoint[]): void {\n memCache.set('datasource-cache-stats', data);\n }\n\n static hit(\n datasource: string,\n registryUrl: string,\n packageName: string,\n ): void {\n const data = this.getData();\n data.push({ datasource, registryUrl, packageName, action: 'hit' });\n this.setData(data);\n }\n\n static miss(\n datasource: string,\n registryUrl: string,\n packageName: string,\n ): void {\n const data = this.getData();\n data.push({ datasource, registryUrl, packageName, action: 'miss' });\n this.setData(data);\n }\n\n static set(\n datasource: string,\n registryUrl: string,\n packageName: string,\n ): void {\n const data = this.getData();\n data.push({ datasource, registryUrl, packageName, action: 'set' });\n this.setData(data);\n }\n\n static skip(\n datasource: string,\n registryUrl: string,\n packageName: string,\n ): void {\n const data = this.getData();\n data.push({ datasource, registryUrl, packageName, action: 'skip' });\n this.setData(data);\n }\n\n static getReport(): DatasourceCacheReport {\n const data = this.getData();\n const result: DatasourceCacheReport = { long: {}, short: {} };\n for (const { datasource, registryUrl, packageName, action } of data) {\n result.long[datasource] ??= {};\n result.long[datasource][registryUrl] ??= {};\n result.long[datasource][registryUrl] ??= {};\n result.long[datasource][registryUrl][packageName] ??= {};\n\n result.short[datasource] ??= {};\n result.short[datasource][registryUrl] ??= {\n hit: 0,\n miss: 0,\n set: 0,\n skip: 0,\n };\n\n if (action === 'hit') {\n result.long[datasource][registryUrl][packageName].read = 'hit';\n result.short[datasource][registryUrl].hit += 1;\n continue;\n }\n\n if (action === 'miss') {\n result.long[datasource][registryUrl][packageName].read = 'miss';\n result.short[datasource][registryUrl].miss += 1;\n continue;\n }\n\n if (action === 'set') {\n result.long[datasource][registryUrl][packageName].write = 'set';\n result.short[datasource][registryUrl].set += 1;\n continue;\n }\n\n /* v8 ignore else -- TODO: add tests #40625 */\n if (action === 'skip') {\n result.long[datasource][registryUrl][packageName].write = 'skip';\n result.short[datasource][registryUrl].skip += 1;\n continue;\n }\n }\n\n return result;\n }\n\n static report(): void {\n const { long, short } = this.getReport();\n\n if (Object.keys(short).length > 0) {\n logger.debug(short, 'Datasource cache statistics');\n }\n\n if (Object.keys(long).length > 0) {\n logger.trace(long, 'Datasource cache detailed statistics');\n }\n }\n}\n\nexport interface HttpRequestStatsDataPoint {\n method: string;\n url: string;\n reqMs: number;\n queueMs: number;\n status: number;\n}\n\ninterface HostStatsData {\n count: number;\n reqAvgMs: number;\n reqMedianMs: number;\n reqMaxMs: number;\n queueAvgMs: number;\n queueMedianMs: number;\n queueMaxMs: number;\n}\n\n// url -> method -> status -> count\ntype UrlHttpStat = Record<string, Record<string, Record<string, number>>>;\n\ninterface HttpStatsCollection {\n // debug data\n urls: UrlHttpStat;\n hosts: Record<string, HostStatsData>;\n requests: number;\n\n // trace data\n rawRequests: string[];\n hostRequests: Record<string, HttpRequestStatsDataPoint[]>;\n}\n\nexport class HttpStats {\n static write(data: HttpRequestStatsDataPoint): void {\n const httpRequests =\n memCache.get<HttpRequestStatsDataPoint[]>('http-requests') ?? [];\n httpRequests.push(data);\n memCache.set('http-requests', httpRequests);\n }\n\n static getDataPoints(): HttpRequestStatsDataPoint[] {\n const httpRequests =\n memCache.get<HttpRequestStatsDataPoint[]>('http-requests') ?? [];\n\n // istanbul ignore next: sorting is hard and not worth testing\n httpRequests.sort((a, b) => {\n if (a.url < b.url) {\n return -1;\n }\n\n if (a.url > b.url) {\n return 1;\n }\n\n return 0;\n });\n\n return httpRequests;\n }\n\n static getReport(): HttpStatsCollection {\n const dataPoints = HttpStats.getDataPoints();\n\n const requests = dataPoints.length;\n\n const urls: UrlHttpStat = {};\n const rawRequests: string[] = [];\n const hostRequests: Record<string, HttpRequestStatsDataPoint[]> = {};\n\n for (const dataPoint of dataPoints) {\n const { url, reqMs, queueMs, status } = dataPoint;\n const method = dataPoint.method.toUpperCase();\n\n const parsedUrl = parseUrl(url);\n if (!parsedUrl) {\n logger.debug({ url }, 'Failed to parse URL during stats reporting');\n continue;\n }\n const { hostname, origin, pathname } = parsedUrl;\n const baseUrl = `${origin}${pathname}`;\n\n urls[baseUrl] ??= {};\n urls[baseUrl][method] ??= {};\n urls[baseUrl][method][status] ??= 0;\n urls[baseUrl][method][status] += 1;\n\n rawRequests.push(`${method} ${url} ${status} ${reqMs} ${queueMs}`);\n\n hostRequests[hostname] ??= [];\n hostRequests[hostname].push(dataPoint);\n }\n\n const hosts: Record<string, HostStatsData> = {};\n\n for (const [hostname, dataPoints] of Object.entries(hostRequests)) {\n const count = dataPoints.length;\n\n const reqTimes = dataPoints.map((r) => r.reqMs);\n const queueTimes = dataPoints.map((r) => r.queueMs);\n\n const reqReport = makeTimingReport(reqTimes);\n const queueReport = makeTimingReport(queueTimes);\n\n hosts[hostname] = {\n count,\n reqAvgMs: reqReport.avgMs,\n reqMedianMs: reqReport.medianMs,\n reqMaxMs: reqReport.maxMs,\n queueAvgMs: queueReport.avgMs,\n queueMedianMs: queueReport.medianMs,\n queueMaxMs: queueReport.maxMs,\n };\n }\n\n return {\n urls,\n rawRequests,\n hostRequests,\n hosts,\n requests,\n };\n }\n\n static report(): void {\n const { urls, rawRequests, hostRequests, hosts, requests } =\n HttpStats.getReport();\n logger.trace({ rawRequests, hostRequests }, 'HTTP full statistics');\n logger.debug({ hosts, requests }, 'HTTP statistics');\n logger.trace({ urls }, 'HTTP URL statistics');\n }\n}\n\ninterface HttpCacheHostStatsData {\n hit: number;\n miss: number;\n localHit?: number;\n localMiss?: number;\n}\n\ntype HttpCacheStatsData = Record<string, HttpCacheHostStatsData>;\n\nfunction sortObject<T>(obj: Record<string, T>): Record<string, T> {\n const result: Record<string, T> = {};\n for (const key of Object.keys(obj).sort()) {\n result[key] = obj[key];\n }\n return result;\n}\n\nexport class HttpCacheStats {\n static getData(): HttpCacheStatsData {\n return memCache.get<HttpCacheStatsData>('http-cache-stats') ?? {};\n }\n\n static read(key: string): HttpCacheHostStatsData {\n return (\n this.getData()?.[key] ?? {\n hit: 0,\n miss: 0,\n }\n );\n }\n\n static write(key: string, data: HttpCacheHostStatsData): void {\n const stats = memCache.get<HttpCacheStatsData>('http-cache-stats') ?? {};\n stats[key] = data;\n memCache.set('http-cache-stats', stats);\n }\n\n static getBaseUrl(url: string): string | null {\n const parsedUrl = parseUrl(url);\n if (!parsedUrl) {\n logger.debug({ url }, 'Failed to parse URL during cache stats');\n return null;\n }\n const { origin, pathname } = parsedUrl;\n const baseUrl = `${origin}${pathname}`;\n return baseUrl;\n }\n\n static incLocalHits(url: string): void {\n const baseUrl = HttpCacheStats.getBaseUrl(url);\n /* v8 ignore else -- TODO: add tests #40625 */\n if (baseUrl) {\n const host = baseUrl;\n const stats = HttpCacheStats.read(host);\n stats.localHit ??= 0;\n stats.localHit += 1;\n HttpCacheStats.write(host, stats);\n }\n }\n\n static incLocalMisses(url: string): void {\n const baseUrl = HttpCacheStats.getBaseUrl(url);\n /* v8 ignore else -- TODO: add tests #40625 */\n if (baseUrl) {\n const host = baseUrl;\n const stats = HttpCacheStats.read(host);\n stats.localMiss ??= 0;\n stats.localMiss += 1;\n HttpCacheStats.write(host, stats);\n }\n }\n\n static incRemoteHits(url: string): void {\n const baseUrl = HttpCacheStats.getBaseUrl(url);\n /* v8 ignore else -- TODO: add tests #40625 */\n if (baseUrl) {\n const host = baseUrl;\n const stats = HttpCacheStats.read(host);\n stats.hit += 1;\n HttpCacheStats.write(host, stats);\n }\n }\n\n static incRemoteMisses(url: string): void {\n const baseUrl = HttpCacheStats.getBaseUrl(url);\n /* v8 ignore else -- TODO: add tests #40625 */\n if (baseUrl) {\n const host = baseUrl;\n const stats = HttpCacheStats.read(host);\n stats.miss += 1;\n HttpCacheStats.write(host, stats);\n }\n }\n\n static report(): void {\n const data = HttpCacheStats.getData();\n let report: Record<string, Record<string, HttpCacheHostStatsData>> = {};\n for (const [url, stats] of Object.entries(data)) {\n const parsedUrl = parseUrl(url);\n /* v8 ignore else -- TODO: add tests #40625 */\n if (parsedUrl) {\n const { origin, pathname } = parsedUrl;\n report[origin] ??= {};\n report[origin][pathname] = stats;\n }\n }\n\n for (const [host, hostStats] of Object.entries(report)) {\n report[host] = sortObject(hostStats);\n }\n report = sortObject(report);\n\n logger.debug(report, 'HTTP cache statistics');\n }\n}\n\ntype ObsoleteCacheStats = Record<\n string,\n {\n count: number;\n }\n>;\n\n/* v8 ignore next: temporary code */\nexport class ObsoleteCacheHitLogger {\n static getData(): ObsoleteCacheStats {\n return memCache.get<ObsoleteCacheStats>('obsolete-cache-stats') ?? {};\n }\n\n static write(url: string): void {\n const data = this.getData();\n if (!data[url]) {\n data[url] = { count: 0 };\n }\n data[url].count++;\n memCache.set('obsolete-cache-stats', data);\n }\n\n static report(): void {\n const hits = this.getData();\n logger.debug(\n { count: Object.keys(hits).length, hits },\n 'Cache fallback URLs',\n );\n }\n}\n/* v8 ignore stop: temporary code */\n\ninterface AbandonedPackage {\n datasource: string;\n packageName: string;\n mostRecentTimestamp: string;\n}\n\ntype AbandonedPackageReport = Record<string, Record<string, string>>;\n\nexport class AbandonedPackageStats {\n static getData(): AbandonedPackage[] {\n return memCache.get<AbandonedPackage[]>('abandonment-stats') ?? [];\n }\n\n private static setData(data: AbandonedPackage[]): void {\n memCache.set('abandonment-stats', data);\n }\n\n static write(\n datasource: string,\n packageName: string,\n mostRecentTimestamp: string,\n ): void {\n const data = this.getData();\n data.push({ datasource, packageName, mostRecentTimestamp });\n this.setData(data);\n }\n\n static getReport(): AbandonedPackageReport {\n const data = this.getData();\n const result: AbandonedPackageReport = {};\n\n for (const { datasource, packageName, mostRecentTimestamp } of data) {\n result[datasource] ??= {};\n result[datasource][packageName] = mostRecentTimestamp;\n }\n\n const sortedResult: AbandonedPackageReport = {};\n for (const datasource of Object.keys(result).sort()) {\n sortedResult[datasource] = {};\n for (const packageName of Object.keys(result[datasource]).sort()) {\n sortedResult[datasource][packageName] = result[datasource][packageName];\n }\n }\n\n return sortedResult;\n }\n\n static report(): void {\n const report = this.getReport();\n if (Object.keys(report).length > 0) {\n logger.debug(report, 'Abandoned package statistics');\n }\n }\n}\n\ntype GitOperationStatsData = Record<GitOperationType, number[]>;\n\nexport class GitOperationStats {\n static write(operationType: GitOperationType, duration: number): void {\n const data =\n memCache.get<GitOperationStatsData>('git-operations-stats') ?? {};\n data[operationType] ??= [];\n data[operationType].push(duration);\n memCache.set('git-operations-stats', data);\n }\n\n static getReport(): Record<string, TimingStatsReport> {\n const report: Record<string, TimingStatsReport> = {};\n const data = memCache.get<LookupStatsData>('git-operations-stats') ?? {};\n for (const [operationType, durations] of Object.entries(data)) {\n report[operationType] = makeTimingReport(durations);\n report[operationType].totalMs = Math.ceil(report[operationType].totalMs);\n }\n\n return report;\n }\n\n static report(): void {\n const report = GitOperationStats.getReport();\n logger.debug(report, 'Git operations statistics');\n }\n}\n"],"mappings":";;;;AAeA,SAAgB,iBAAiB,MAAmC;CAClE,MAAM,QAAQ,KAAK;CACnB,MAAM,UAAU,KAAK,QAAQ,GAAG,MAAM,IAAI,GAAG,CAAC;CAC9C,MAAM,QAAQ,QAAQ,KAAK,MAAM,UAAU,KAAK,IAAI;CACpD,IAAI,QAAQ;CACZ,KAAK,MAAM,YAAY,MACrB,QAAQ,KAAK,IAAI,OAAO,QAAQ;CAElC,MAAM,SAAS,KAAK,MAAM,GAAG,MAAM,IAAI,CAAC;CAExC,OAAO;EAAE;EAAO;EAAO,UADN,QAAQ,OAAO,KAAK,MAAM,QAAQ,CAAC,KAAK;EACxB;EAAO;CAAQ;AAClD;AAEA,IAAa,cAAb,MAAa,YAAY;CACvB,OAAO,MAAM,YAAoB,UAAwB;EACvD,MAAM,OAAOA,IAA8B,cAAc,KAAK,CAAC;EAC/D,KAAK,gBAAgB,CAAC;EACtB,KAAK,WAAW,CAAC,KAAK,QAAQ;EAC9B,IAAa,gBAAgB,IAAI;CACnC;CAEA,aAAa,KACX,YACA,UACY;EACZ,MAAM,QAAQ,KAAK,IAAI;EACvB,MAAM,SAAS,MAAM,SAAS;EAC9B,MAAM,WAAW,KAAK,IAAI,IAAI;EAC9B,YAAY,MAAM,YAAY,QAAQ;EACtC,OAAO;CACT;CAEA,OAAO,YAA+C;EACpD,MAAM,SAA4C,CAAC;EACnD,MAAM,OAAOA,IAA8B,cAAc,KAAK,CAAC;EAC/D,KAAK,MAAM,CAAC,YAAY,cAAc,OAAO,QAAQ,IAAI,GACvD,OAAO,cAAc,iBAAiB,SAAS;EAEjD,OAAO;CACT;CAEA,OAAO,SAAe;EACpB,MAAM,SAAS,YAAY,UAAU;EACrC,OAAO,MAAM,QAAQ,mBAAmB;CAC1C;AACF;AA4CA,IAAa,6BAAb,MAAwC;CACtC,OAAO,MACL,YACA,aACA,aACA,UACM;EACN,MAAM,OACJA,IAAqC,oBAAoB,KAAK,CAAC;EACjE,KAAK,KAAK;GAAE;GAAY;GAAa;GAAa;EAAS,CAAC;EAC5D,IAAa,sBAAsB,IAAI;CACzC;CAEA,aAAa,KACX,YACA,aACA,aACA,UACY;EACZ,MAAM,QAAQ,KAAK,IAAI;EACvB,MAAM,SAAS,MAAM,SAAS;EAC9B,MAAM,WAAW,KAAK,IAAI,IAAI;EAC9B,KAAK,MAAM,YAAY,aAAa,aAAa,QAAQ;EACzD,OAAO;CACT;CAEA,OAAO,YAAmC;EACxC,MAAM,OACJA,IAAqC,oBAAoB,KAAK,CAAC;EAGjE,MAAM,eAAkD;GACtD,OAAO,CAAC;GACR,aAAa,CAAC;EAChB;EACA,KAAK,MAAM,EAAE,YAAY,aAAa,aAAa,cAAc,MAAM;GACrE,aAAa,MAAM,KAAK,QAAQ;GAEhC,aAAa,YAAY,gBAAgB;IAAE,OAAO,CAAC;IAAG,cAAc,CAAC;GAAE;GACvE,aAAa,YAAY,WAAW,CAAC,MAAM,KAAK,QAAQ;GAExD,aAAa,YAAY,WAAW,CAAC,aAAa,iBAAiB;IACjE,OAAO,CAAC;IACR,UAAU,CAAC;GACb;GACA,aAAa,YAAY,WAAW,CAAC,aAAa,YAAY,CAAC,MAAM,KACnE,QACF;GAEA,aAAa,YAAY,WAAW,CAAC,aAAa,YAAY,CAAC,SAC7D,iBACI,CAAC;GACP,aAAa,YAAY,WAAW,CAAC,aAAa,YAAY,CAAC,SAC7D,YACD,CAAC,KAAK,QAAQ;EACjB;EAEA,MAAM,SAAgC;GACpC,OAAO,iBAAiB,aAAa,KAAK;GAC1C,aAAa,CAAC;EAChB;EAEA,KAAK,MAAM,CAAC,YAAY,mBAAmB,OAAO,QAChD,aAAa,WACf,GAAG;GACD,OAAO,YAAY,cAAc;IAC/B,OAAO,iBAAiB,eAAe,KAAK;IAC5C,cAAc,CAAC;GACjB;GAEA,KAAK,MAAM,CAAC,aAAa,oBAAoB,OAAO,QAClD,eAAe,YACjB,GAAG;IACD,OAAO,YAAY,WAAW,CAAC,aAAa,eAAe;KACzD,OAAO,iBAAiB,gBAAgB,KAAK;KAC7C,UAAU,CAAC;IACb;IAEA,KAAK,MAAM,CAAC,aAAa,oBAAoB,OAAO,QAClD,gBAAgB,QAClB,GACE,OAAO,YAAY,WAAW,CAAC,aAAa,YAAY,CAAC,SACvD,eACE,iBAAiB,eAAe;GAExC;EACF;EAEA,OAAO;CACT;CAEA,OAAO,SAAe;EACpB,MAAM,SAAS,KAAK,UAAU;EAE9B,MAAM,cAA0C;GAC9C,OAAO,OAAO;GACd,aAAa,CAAC;EAChB;EAEA,KAAK,MAAM,CAAC,YAAY,mBAAmB,OAAO,QAChD,OAAO,WACT,GAAG;GACD,YAAY,YAAY,cAAc;IACpC,OAAO,eAAe;IACtB,cAAc,CAAC;GACjB;GACA,KAAK,MAAM,CAAC,aAAa,oBAAoB,OAAO,QAClD,eAAe,YACjB,GACE,YAAY,YAAY,WAAW,CAAC,aAAa,eAAe,EAC9D,OAAO,gBAAgB,MACzB;EAEJ;EAEA,OAAO,MAAM,QAAQ,sCAAsC;EAC3D,OAAO,MAAM,aAAa,gCAAgC;CAC5D;AACF;AAIA,IAAa,oBAAb,MAAa,kBAAkB;CAC7B,OAAO,SAAS,UAAwB;EACtC,MAAM,OAAOA,IAA+B,oBAAoB,KAAK,CAAC;EACtE,KAAK,KAAK,QAAQ;EAClB,IAAa,sBAAsB,IAAI;CACzC;CAEA,aAAa,QAAW,UAAwC;EAC9D,MAAM,QAAQ,KAAK,IAAI;EACvB,MAAM,SAAS,MAAM,SAAS;EAC9B,MAAM,WAAW,KAAK,IAAI,IAAI;EAC9B,kBAAkB,SAAS,QAAQ;EACnC,OAAO;CACT;CAEA,OAAO,SAAS,UAAwB;EACtC,MAAM,OAAOA,IAA+B,oBAAoB,KAAK,CAAC;EACtE,KAAK,KAAK,QAAQ;EAClB,IAAa,sBAAsB,IAAI;CACzC;CAEA,aAAa,QAAW,UAAwC;EAC9D,MAAM,QAAQ,KAAK,IAAI;EACvB,MAAM,SAAS,MAAM,SAAS;EAC9B,MAAM,WAAW,KAAK,IAAI,IAAI;EAC9B,kBAAkB,SAAS,QAAQ;EACnC,OAAO;CACT;CAEA,OAAO,YAAgE;EASrE,OAAO;GAAE,KANG,iBADVA,IAA+B,oBAAoB,KAAK,CAAC,CAOhD;GAAG,KAFF,iBADVA,IAA+B,oBAAoB,KAAK,CAAC,CAG3C;EAAE;CACpB;CAEA,OAAO,SAAe;EACpB,MAAM,SAAS,kBAAkB,UAAU;EAC3C,OAAO,MAAM,QAAQ,0BAA0B;CACjD;AACF;AAoCA,IAAa,uBAAb,MAAkC;CAChC,OAAe,UAAsC;EACnD,OACEA,IAAyC,wBAAwB,KAAK,CAAC;CAE3E;CAEA,OAAe,QAAQ,MAAwC;EAC7D,IAAa,0BAA0B,IAAI;CAC7C;CAEA,OAAO,IACL,YACA,aACA,aACM;EACN,MAAM,OAAO,KAAK,QAAQ;EAC1B,KAAK,KAAK;GAAE;GAAY;GAAa;GAAa,QAAQ;EAAM,CAAC;EACjE,KAAK,QAAQ,IAAI;CACnB;CAEA,OAAO,KACL,YACA,aACA,aACM;EACN,MAAM,OAAO,KAAK,QAAQ;EAC1B,KAAK,KAAK;GAAE;GAAY;GAAa;GAAa,QAAQ;EAAO,CAAC;EAClE,KAAK,QAAQ,IAAI;CACnB;CAEA,OAAO,IACL,YACA,aACA,aACM;EACN,MAAM,OAAO,KAAK,QAAQ;EAC1B,KAAK,KAAK;GAAE;GAAY;GAAa;GAAa,QAAQ;EAAM,CAAC;EACjE,KAAK,QAAQ,IAAI;CACnB;CAEA,OAAO,KACL,YACA,aACA,aACM;EACN,MAAM,OAAO,KAAK,QAAQ;EAC1B,KAAK,KAAK;GAAE;GAAY;GAAa;GAAa,QAAQ;EAAO,CAAC;EAClE,KAAK,QAAQ,IAAI;CACnB;CAEA,OAAO,YAAmC;EACxC,MAAM,OAAO,KAAK,QAAQ;EAC1B,MAAM,SAAgC;GAAE,MAAM,CAAC;GAAG,OAAO,CAAC;EAAE;EAC5D,KAAK,MAAM,EAAE,YAAY,aAAa,aAAa,YAAY,MAAM;GACnE,OAAO,KAAK,gBAAgB,CAAC;GAC7B,OAAO,KAAK,WAAW,CAAC,iBAAiB,CAAC;GAC1C,OAAO,KAAK,WAAW,CAAC,iBAAiB,CAAC;GAC1C,OAAO,KAAK,WAAW,CAAC,YAAY,CAAC,iBAAiB,CAAC;GAEvD,OAAO,MAAM,gBAAgB,CAAC;GAC9B,OAAO,MAAM,WAAW,CAAC,iBAAiB;IACxC,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;GACR;GAEA,IAAI,WAAW,OAAO;IACpB,OAAO,KAAK,WAAW,CAAC,YAAY,CAAC,YAAY,CAAC,OAAO;IACzD,OAAO,MAAM,WAAW,CAAC,YAAY,CAAC,OAAO;IAC7C;GACF;GAEA,IAAI,WAAW,QAAQ;IACrB,OAAO,KAAK,WAAW,CAAC,YAAY,CAAC,YAAY,CAAC,OAAO;IACzD,OAAO,MAAM,WAAW,CAAC,YAAY,CAAC,QAAQ;IAC9C;GACF;GAEA,IAAI,WAAW,OAAO;IACpB,OAAO,KAAK,WAAW,CAAC,YAAY,CAAC,YAAY,CAAC,QAAQ;IAC1D,OAAO,MAAM,WAAW,CAAC,YAAY,CAAC,OAAO;IAC7C;GACF;;GAGA,IAAI,WAAW,QAAQ;IACrB,OAAO,KAAK,WAAW,CAAC,YAAY,CAAC,YAAY,CAAC,QAAQ;IAC1D,OAAO,MAAM,WAAW,CAAC,YAAY,CAAC,QAAQ;IAC9C;GACF;EACF;EAEA,OAAO;CACT;CAEA,OAAO,SAAe;EACpB,MAAM,EAAE,MAAM,UAAU,KAAK,UAAU;EAEvC,IAAI,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,GAC9B,OAAO,MAAM,OAAO,6BAA6B;EAGnD,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,SAAS,GAC7B,OAAO,MAAM,MAAM,sCAAsC;CAE7D;AACF;AAkCA,IAAa,YAAb,MAAa,UAAU;CACrB,OAAO,MAAM,MAAuC;EAClD,MAAM,eACJA,IAA0C,eAAe,KAAK,CAAC;EACjE,aAAa,KAAK,IAAI;EACtB,IAAa,iBAAiB,YAAY;CAC5C;CAEA,OAAO,gBAA6C;EAClD,MAAM,eACJA,IAA0C,eAAe,KAAK,CAAC;;EAGjE,aAAa,MAAM,GAAG,MAAM;GAC1B,IAAI,EAAE,MAAM,EAAE,KACZ,OAAO;GAGT,IAAI,EAAE,MAAM,EAAE,KACZ,OAAO;GAGT,OAAO;EACT,CAAC;EAED,OAAO;CACT;CAEA,OAAO,YAAiC;EACtC,MAAM,aAAa,UAAU,cAAc;EAE3C,MAAM,WAAW,WAAW;EAE5B,MAAM,OAAoB,CAAC;EAC3B,MAAM,cAAwB,CAAC;EAC/B,MAAM,eAA4D,CAAC;EAEnE,KAAK,MAAM,aAAa,YAAY;GAClC,MAAM,EAAE,KAAK,OAAO,SAAS,WAAW;GACxC,MAAM,SAAS,UAAU,OAAO,YAAY;GAE5C,MAAM,YAAY,SAAS,GAAG;GAC9B,IAAI,CAAC,WAAW;IACd,OAAO,MAAM,EAAE,IAAI,GAAG,4CAA4C;IAClE;GACF;GACA,MAAM,EAAE,UAAU,QAAQ,aAAa;GACvC,MAAM,UAAU,GAAG,SAAS;GAE5B,KAAK,aAAa,CAAC;GACnB,KAAK,QAAQ,CAAC,YAAY,CAAC;GAC3B,KAAK,QAAQ,CAAC,OAAO,CAAC,YAAY;GAClC,KAAK,QAAQ,CAAC,OAAO,CAAC,WAAW;GAEjC,YAAY,KAAK,GAAG,OAAO,GAAG,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS;GAEjE,aAAa,cAAc,CAAC;GAC5B,aAAa,SAAS,CAAC,KAAK,SAAS;EACvC;EAEA,MAAM,QAAuC,CAAC;EAE9C,KAAK,MAAM,CAAC,UAAU,eAAe,OAAO,QAAQ,YAAY,GAAG;GACjE,MAAM,QAAQ,WAAW;GAEzB,MAAM,WAAW,WAAW,KAAK,MAAM,EAAE,KAAK;GAC9C,MAAM,aAAa,WAAW,KAAK,MAAM,EAAE,OAAO;GAElD,MAAM,YAAY,iBAAiB,QAAQ;GAC3C,MAAM,cAAc,iBAAiB,UAAU;GAE/C,MAAM,YAAY;IAChB;IACA,UAAU,UAAU;IACpB,aAAa,UAAU;IACvB,UAAU,UAAU;IACpB,YAAY,YAAY;IACxB,eAAe,YAAY;IAC3B,YAAY,YAAY;GAC1B;EACF;EAEA,OAAO;GACL;GACA;GACA;GACA;GACA;EACF;CACF;CAEA,OAAO,SAAe;EACpB,MAAM,EAAE,MAAM,aAAa,cAAc,OAAO,aAC9C,UAAU,UAAU;EACtB,OAAO,MAAM;GAAE;GAAa;EAAa,GAAG,sBAAsB;EAClE,OAAO,MAAM;GAAE;GAAO;EAAS,GAAG,iBAAiB;EACnD,OAAO,MAAM,EAAE,KAAK,GAAG,qBAAqB;CAC9C;AACF;AAWA,SAAS,WAAc,KAA2C;CAChE,MAAM,SAA4B,CAAC;CACnC,KAAK,MAAM,OAAO,OAAO,KAAK,GAAG,CAAC,CAAC,KAAK,GACtC,OAAO,OAAO,IAAI;CAEpB,OAAO;AACT;AAEA,IAAa,iBAAb,MAAa,eAAe;CAC1B,OAAO,UAA8B;EACnC,OAAOA,IAAiC,kBAAkB,KAAK,CAAC;CAClE;CAEA,OAAO,KAAK,KAAqC;EAC/C,OACE,KAAK,QAAQ,CAAC,GAAG,QAAQ;GACvB,KAAK;GACL,MAAM;EACR;CAEJ;CAEA,OAAO,MAAM,KAAa,MAAoC;EAC5D,MAAM,QAAQA,IAAiC,kBAAkB,KAAK,CAAC;EACvE,MAAM,OAAO;EACb,IAAa,oBAAoB,KAAK;CACxC;CAEA,OAAO,WAAW,KAA4B;EAC5C,MAAM,YAAY,SAAS,GAAG;EAC9B,IAAI,CAAC,WAAW;GACd,OAAO,MAAM,EAAE,IAAI,GAAG,wCAAwC;GAC9D,OAAO;EACT;EACA,MAAM,EAAE,QAAQ,aAAa;EAE7B,OAAO,GADY,SAAS;CAE9B;CAEA,OAAO,aAAa,KAAmB;EACrC,MAAM,UAAU,eAAe,WAAW,GAAG;;EAE7C,IAAI,SAAS;GACX,MAAM,OAAO;GACb,MAAM,QAAQ,eAAe,KAAK,IAAI;GACtC,MAAM,aAAa;GACnB,MAAM,YAAY;GAClB,eAAe,MAAM,MAAM,KAAK;EAClC;CACF;CAEA,OAAO,eAAe,KAAmB;EACvC,MAAM,UAAU,eAAe,WAAW,GAAG;;EAE7C,IAAI,SAAS;GACX,MAAM,OAAO;GACb,MAAM,QAAQ,eAAe,KAAK,IAAI;GACtC,MAAM,cAAc;GACpB,MAAM,aAAa;GACnB,eAAe,MAAM,MAAM,KAAK;EAClC;CACF;CAEA,OAAO,cAAc,KAAmB;EACtC,MAAM,UAAU,eAAe,WAAW,GAAG;;EAE7C,IAAI,SAAS;GACX,MAAM,OAAO;GACb,MAAM,QAAQ,eAAe,KAAK,IAAI;GACtC,MAAM,OAAO;GACb,eAAe,MAAM,MAAM,KAAK;EAClC;CACF;CAEA,OAAO,gBAAgB,KAAmB;EACxC,MAAM,UAAU,eAAe,WAAW,GAAG;;EAE7C,IAAI,SAAS;GACX,MAAM,OAAO;GACb,MAAM,QAAQ,eAAe,KAAK,IAAI;GACtC,MAAM,QAAQ;GACd,eAAe,MAAM,MAAM,KAAK;EAClC;CACF;CAEA,OAAO,SAAe;EACpB,MAAM,OAAO,eAAe,QAAQ;EACpC,IAAI,SAAiE,CAAC;EACtE,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,IAAI,GAAG;GAC/C,MAAM,YAAY,SAAS,GAAG;;GAE9B,IAAI,WAAW;IACb,MAAM,EAAE,QAAQ,aAAa;IAC7B,OAAO,YAAY,CAAC;IACpB,OAAO,OAAO,CAAC,YAAY;GAC7B;EACF;EAEA,KAAK,MAAM,CAAC,MAAM,cAAc,OAAO,QAAQ,MAAM,GACnD,OAAO,QAAQ,WAAW,SAAS;EAErC,SAAS,WAAW,MAAM;EAE1B,OAAO,MAAM,QAAQ,uBAAuB;CAC9C;AACF;;AAUA,IAAa,yBAAb,MAAoC;CAClC,OAAO,UAA8B;EACnC,OAAOA,IAAiC,sBAAsB,KAAK,CAAC;CACtE;CAEA,OAAO,MAAM,KAAmB;EAC9B,MAAM,OAAO,KAAK,QAAQ;EAC1B,IAAI,CAAC,KAAK,MACR,KAAK,OAAO,EAAE,OAAO,EAAE;EAEzB,KAAK,IAAI,CAAC;EACV,IAAa,wBAAwB,IAAI;CAC3C;CAEA,OAAO,SAAe;EACpB,MAAM,OAAO,KAAK,QAAQ;EAC1B,OAAO,MACL;GAAE,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC;GAAQ;EAAK,GACxC,qBACF;CACF;AACF;AAWA,IAAa,wBAAb,MAAmC;CACjC,OAAO,UAA8B;EACnC,OAAOA,IAAiC,mBAAmB,KAAK,CAAC;CACnE;CAEA,OAAe,QAAQ,MAAgC;EACrD,IAAa,qBAAqB,IAAI;CACxC;CAEA,OAAO,MACL,YACA,aACA,qBACM;EACN,MAAM,OAAO,KAAK,QAAQ;EAC1B,KAAK,KAAK;GAAE;GAAY;GAAa;EAAoB,CAAC;EAC1D,KAAK,QAAQ,IAAI;CACnB;CAEA,OAAO,YAAoC;EACzC,MAAM,OAAO,KAAK,QAAQ;EAC1B,MAAM,SAAiC,CAAC;EAExC,KAAK,MAAM,EAAE,YAAY,aAAa,yBAAyB,MAAM;GACnE,OAAO,gBAAgB,CAAC;GACxB,OAAO,WAAW,CAAC,eAAe;EACpC;EAEA,MAAM,eAAuC,CAAC;EAC9C,KAAK,MAAM,cAAc,OAAO,KAAK,MAAM,CAAC,CAAC,KAAK,GAAG;GACnD,aAAa,cAAc,CAAC;GAC5B,KAAK,MAAM,eAAe,OAAO,KAAK,OAAO,WAAW,CAAC,CAAC,KAAK,GAC7D,aAAa,WAAW,CAAC,eAAe,OAAO,WAAW,CAAC;EAE/D;EAEA,OAAO;CACT;CAEA,OAAO,SAAe;EACpB,MAAM,SAAS,KAAK,UAAU;EAC9B,IAAI,OAAO,KAAK,MAAM,CAAC,CAAC,SAAS,GAC/B,OAAO,MAAM,QAAQ,8BAA8B;CAEvD;AACF;AAIA,IAAa,oBAAb,MAAa,kBAAkB;CAC7B,OAAO,MAAM,eAAiC,UAAwB;EACpE,MAAM,OACJA,IAAoC,sBAAsB,KAAK,CAAC;EAClE,KAAK,mBAAmB,CAAC;EACzB,KAAK,cAAc,CAAC,KAAK,QAAQ;EACjC,IAAa,wBAAwB,IAAI;CAC3C;CAEA,OAAO,YAA+C;EACpD,MAAM,SAA4C,CAAC;EACnD,MAAM,OAAOA,IAA8B,sBAAsB,KAAK,CAAC;EACvE,KAAK,MAAM,CAAC,eAAe,cAAc,OAAO,QAAQ,IAAI,GAAG;GAC7D,OAAO,iBAAiB,iBAAiB,SAAS;GAClD,OAAO,cAAc,CAAC,UAAU,KAAK,KAAK,OAAO,cAAc,CAAC,OAAO;EACzE;EAEA,OAAO;CACT;CAEA,OAAO,SAAe;EACpB,MAAM,SAAS,kBAAkB,UAAU;EAC3C,OAAO,MAAM,QAAQ,2BAA2B;CAClD;AACF"}
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": "43.259.0",
4
+ "version": "43.259.1",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "renovate": "dist/renovate.js",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$id": "https://docs.renovatebot.com/renovate-schema.json",
3
- "title": "JSON schema for Renovate 43.259.0 config files (https://renovatebot.com/)",
3
+ "title": "JSON schema for Renovate 43.259.1 config files (https://renovatebot.com/)",
4
4
  "$schema": "http://json-schema.org/draft-07/schema#",
5
- "x-renovate-version": "43.259.0",
5
+ "x-renovate-version": "43.259.1",
6
6
  "allowComments": true,
7
7
  "type": "object",
8
8
  "definitions": {