renovate 43.141.0 → 43.141.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/_rolldown/runtime.js +1 -1
- package/dist/modules/platform/github/schema.d.ts +2 -2
- package/dist/util/github/graphql/datasource-fetcher.js +1 -3
- package/dist/util/github/graphql/datasource-fetcher.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/release-notes.js +2 -1
- package/dist/workers/repository/update/pr/changelog/release-notes.js.map +1 -1
- package/package.json +6 -6
- package/renovate-schema.json +2 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire } from "node:module";
|
|
2
2
|
//#region \0rolldown/runtime.js
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
|
-
var __commonJSMin = (cb, mod) => () => (mod ||
|
|
4
|
+
var __commonJSMin = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
5
5
|
var __exportAll = (all, no_symbols) => {
|
|
6
6
|
let target = {};
|
|
7
7
|
for (var name in all) __defProp(target, name, {
|
|
@@ -28,7 +28,7 @@ declare const GithubVulnerabilityAlerts: z.ZodEffects<z.ZodEffects<z.ZodArray<z.
|
|
|
28
28
|
security_vulnerability: {
|
|
29
29
|
severity: "low" | "medium" | "high" | "critical";
|
|
30
30
|
package: {
|
|
31
|
-
ecosystem: "composer" | "maven" | "npm" | "rust" | "go" | "rubygems" | "
|
|
31
|
+
ecosystem: "composer" | "maven" | "npm" | "rust" | "go" | "rubygems" | "actions" | "nuget" | "pip";
|
|
32
32
|
name: string;
|
|
33
33
|
};
|
|
34
34
|
vulnerable_version_range: string;
|
|
@@ -67,7 +67,7 @@ declare const GithubVulnerabilityAlerts: z.ZodEffects<z.ZodEffects<z.ZodArray<z.
|
|
|
67
67
|
security_vulnerability: {
|
|
68
68
|
severity: "low" | "medium" | "high" | "critical";
|
|
69
69
|
package: {
|
|
70
|
-
ecosystem: "composer" | "maven" | "npm" | "rust" | "go" | "rubygems" | "
|
|
70
|
+
ecosystem: "composer" | "maven" | "npm" | "rust" | "go" | "rubygems" | "actions" | "nuget" | "pip";
|
|
71
71
|
name: string;
|
|
72
72
|
};
|
|
73
73
|
vulnerable_version_range: string;
|
|
@@ -175,9 +175,7 @@ var GithubGraphqlDatasourceFetcher = class GithubGraphqlDatasourceFetcher {
|
|
|
175
175
|
return this.cacheStrategy().finalizeAndReturn();
|
|
176
176
|
}
|
|
177
177
|
async loadPersistenceFlag() {
|
|
178
|
-
|
|
179
|
-
const key = `${this.getCacheKey()}:is-persistent`;
|
|
180
|
-
this.isPersistent = await get$1(ns, key);
|
|
178
|
+
this.isPersistent = await get$1(this.getCacheNs(), `${this.getCacheKey()}:is-persistent`);
|
|
181
179
|
}
|
|
182
180
|
async storePersistenceFlag(minutes) {
|
|
183
181
|
await set$1(this.getCacheNs(), `${this.getCacheKey()}:is-persistent`, true, minutes);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datasource-fetcher.js","names":["packageCache.get","packageCache.set","memCache.get"],"sources":["../../../../lib/util/github/graphql/datasource-fetcher.ts"],"sourcesContent":["import is from '@sindresorhus/is';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport * as memCache from '../../cache/memory/index.ts';\nimport * as packageCache from '../../cache/package/index.ts';\nimport type { PackageCacheNamespace } from '../../cache/package/types.ts';\nimport type {\n GithubGraphqlResponse,\n GithubHttp,\n GithubHttpOptions,\n} from '../../http/github.ts';\nimport type { HttpResponse } from '../../http/types.ts';\nimport { getApiBaseUrl } from '../url.ts';\nimport { GithubGraphqlMemoryCacheStrategy } from './cache-strategies/memory-cache-strategy.ts';\nimport { GithubGraphqlPackageCacheStrategy } from './cache-strategies/package-cache-strategy.ts';\nimport type {\n GithubDatasourceItem,\n GithubGraphqlCacheStrategy,\n GithubGraphqlDatasourceAdapter,\n GithubGraphqlPayload,\n GithubGraphqlRepoParams,\n GithubGraphqlRepoResponse,\n GithubPackageConfig,\n RawQueryResponse,\n} from './types.ts';\n\n/**\n * We know empirically that certain type of GraphQL errors\n * can be fixed by shrinking page size.\n *\n * @see https://github.com/renovatebot/renovate/issues/16343\n */\nfunction isUnknownGraphqlError(err: Error): boolean {\n const { message } = err;\n return message.startsWith('Something went wrong while executing your query.');\n}\n\nfunction canBeSolvedByShrinking(err: Error): boolean {\n const errors: Error[] = err instanceof AggregateError ? err.errors : [err];\n return errors.some(\n (e) => err instanceof ExternalHostError || isUnknownGraphqlError(e),\n );\n}\n\nexport class GithubGraphqlDatasourceFetcher<\n GraphqlItem,\n ResultItem extends GithubDatasourceItem,\n> {\n static async query<T, U extends GithubDatasourceItem>(\n config: GithubPackageConfig,\n http: GithubHttp,\n adapter: GithubGraphqlDatasourceAdapter<T, U>,\n ): Promise<U[]> {\n const instance = new GithubGraphqlDatasourceFetcher<T, U>(\n config,\n http,\n adapter,\n );\n const items = await instance.getItems();\n return items;\n }\n\n private readonly baseUrl: string;\n private readonly repoOwner: string;\n private readonly repoName: string;\n\n private itemsPerQuery: 100 | 50 | 25 = 100;\n\n private queryCount = 0;\n\n private cursor: string | null = null;\n\n private isPersistent: boolean | undefined;\n private http: GithubHttp;\n private datasourceAdapter: GithubGraphqlDatasourceAdapter<\n GraphqlItem,\n ResultItem\n >;\n\n constructor(\n packageConfig: GithubPackageConfig,\n http: GithubHttp,\n datasourceAdapter: GithubGraphqlDatasourceAdapter<GraphqlItem, ResultItem>,\n ) {\n this.http = http;\n this.datasourceAdapter = datasourceAdapter;\n const { packageName, registryUrl } = packageConfig;\n [this.repoOwner, this.repoName] = packageName.split('/');\n this.baseUrl = getApiBaseUrl(registryUrl).replace(/\\/v3\\/$/, '/'); // Replace for GHE\n }\n\n private getCacheNs(): PackageCacheNamespace {\n return this.datasourceAdapter.key;\n }\n\n private getCacheKey(): string {\n return [this.baseUrl, this.repoOwner, this.repoName].join(':');\n }\n\n private getRawQueryOptions(): GithubHttpOptions {\n const baseUrl = this.baseUrl;\n const repository = `${this.repoOwner}/${this.repoName}`;\n const query = this.datasourceAdapter.query;\n const variables: GithubGraphqlRepoParams = {\n owner: this.repoOwner,\n name: this.repoName,\n count: this.itemsPerQuery,\n cursor: this.cursor,\n };\n\n return {\n baseUrl,\n repository,\n readOnly: true,\n body: { query, variables },\n };\n }\n\n private async doRawQuery(): Promise<\n RawQueryResponse<GithubGraphqlPayload<GraphqlItem>>\n > {\n const requestOptions = this.getRawQueryOptions();\n\n type GraphqlData = GithubGraphqlRepoResponse<GraphqlItem>;\n type HttpBody = GithubGraphqlResponse<GraphqlData>;\n let httpRes: HttpResponse<HttpBody>;\n try {\n httpRes = await this.http.postJson<HttpBody>('/graphql', requestOptions);\n } catch (err) {\n return [null, err];\n }\n\n const { body } = httpRes;\n const { data, errors } = body;\n\n if (errors?.length) {\n if (errors.length === 1) {\n const { message } = errors[0];\n const err = new Error(message);\n return [null, err];\n } else {\n const errorInstances = errors.map(({ message }) => new Error(message));\n const err = new AggregateError(errorInstances);\n return [null, err];\n }\n }\n\n if (!data) {\n const msg = 'GitHub GraphQL datasource: failed to obtain data';\n const err = new Error(msg);\n return [null, err];\n }\n\n if (!data.repository) {\n const msg = 'GitHub GraphQL datasource: failed to obtain repository data';\n const err = new Error(msg);\n return [null, err];\n }\n\n if (!data.repository.payload) {\n const msg =\n 'GitHub GraphQL datasource: failed to obtain repository payload data';\n const err = new Error(msg);\n return [null, err];\n }\n\n this.queryCount += 1;\n\n // For values other than explicit `false`,\n // we assume that items can not be cached.\n this.isPersistent ??= data.repository.isRepoPrivate === false;\n\n const res = data.repository.payload;\n return [res, null];\n }\n\n private shrinkPageSize(): boolean {\n if (this.itemsPerQuery === 100) {\n this.itemsPerQuery = 50;\n return true;\n }\n\n if (this.itemsPerQuery === 50) {\n this.itemsPerQuery = 25;\n return true;\n }\n\n return false;\n }\n\n private hasReachedQueryLimit(): boolean {\n return this.queryCount >= 100;\n }\n\n private async doShrinkableQuery(): Promise<\n GithubGraphqlPayload<GraphqlItem>\n > {\n let res: GithubGraphqlPayload<GraphqlItem> | null = null;\n let err: Error | null = null;\n\n while (!res) {\n [res, err] = await this.doRawQuery();\n if (err) {\n if (!canBeSolvedByShrinking(err)) {\n throw err;\n }\n\n const shrinkResult = this.shrinkPageSize();\n if (!shrinkResult) {\n throw err;\n }\n const { body: _, ...options } = this.getRawQueryOptions();\n logger.debug(\n { options, newSize: this.itemsPerQuery },\n 'Shrinking GitHub GraphQL page size after error',\n );\n }\n }\n\n return res;\n }\n\n private _cacheStrategy: GithubGraphqlCacheStrategy<ResultItem> | undefined;\n\n private cacheStrategy(): GithubGraphqlCacheStrategy<ResultItem> {\n if (this._cacheStrategy) {\n return this._cacheStrategy;\n }\n const cacheNs = this.getCacheNs();\n const cacheKey = this.getCacheKey();\n const cachePrivatePackages = GlobalConfig.get(\n 'cachePrivatePackages',\n false,\n );\n const skipStabilization = !is.undefined(this.datasourceAdapter.maxItems);\n this._cacheStrategy =\n cachePrivatePackages || this.isPersistent\n ? new GithubGraphqlPackageCacheStrategy<ResultItem>(\n cacheNs,\n cacheKey,\n skipStabilization,\n )\n : new GithubGraphqlMemoryCacheStrategy<ResultItem>(\n cacheNs,\n cacheKey,\n skipStabilization,\n );\n return this._cacheStrategy;\n }\n\n /**\n * This method is responsible for data synchronization.\n * It also detects persistence of the package, based on the first page result.\n */\n private async doPaginatedFetch(): Promise<void> {\n let hasNextPage = true;\n let isPaginationDone = false;\n let nextCursor: string | undefined;\n let itemCount = 0;\n const maxItems = this.datasourceAdapter.maxItems;\n while (hasNextPage && !isPaginationDone && !this.hasReachedQueryLimit()) {\n if (!is.undefined(maxItems) && itemCount >= maxItems) {\n break;\n }\n const queryResult = await this.doShrinkableQuery();\n\n const resultItems: ResultItem[] = [];\n for (const node of queryResult.nodes) {\n const item = this.datasourceAdapter.transform(node);\n if (!item) {\n logger.once.info(\n {\n packageName: `${this.repoOwner}/${this.repoName}`,\n baseUrl: this.baseUrl,\n },\n `GitHub GraphQL datasource: skipping empty item`,\n );\n continue;\n }\n resultItems.push(item);\n }\n itemCount += resultItems.length;\n\n // It's important to call `getCacheStrategy()` after `doShrinkableQuery()`\n // because `doShrinkableQuery()` may change `this.isCacheable`.\n //\n // Otherwise, cache items for public packages will never be persisted\n // in long-term cache.\n isPaginationDone = await this.cacheStrategy().reconcile(resultItems);\n\n hasNextPage = !!queryResult?.pageInfo?.hasNextPage;\n nextCursor = queryResult?.pageInfo?.endCursor;\n if (hasNextPage && nextCursor) {\n this.cursor = nextCursor;\n }\n }\n\n if (this.isPersistent) {\n await this.storePersistenceFlag(30);\n }\n }\n\n private async doCachedQuery(): Promise<ResultItem[]> {\n await this.loadPersistenceFlag();\n if (!this.isPersistent) {\n await this.doPaginatedFetch();\n }\n\n const res = await this.cacheStrategy().finalizeAndReturn();\n if (res.length) {\n return res;\n }\n\n delete this.isPersistent;\n await this.doPaginatedFetch();\n return this.cacheStrategy().finalizeAndReturn();\n }\n\n async loadPersistenceFlag(): Promise<void> {\n const ns = this.getCacheNs();\n const key = `${this.getCacheKey()}:is-persistent`;\n this.isPersistent = await packageCache.get<true>(ns, key);\n }\n\n async storePersistenceFlag(minutes: number): Promise<void> {\n const ns = this.getCacheNs();\n const key = `${this.getCacheKey()}:is-persistent`;\n await packageCache.set(ns, key, true, minutes);\n }\n\n /**\n * This method ensures the only one query is executed\n * to a particular package during single run.\n */\n private doUniqueQuery(): Promise<ResultItem[]> {\n const cacheKey = `github-pending:${this.getCacheNs()}:${this.getCacheKey()}`;\n let resultPromise = memCache.get<Promise<ResultItem[]>>(cacheKey);\n resultPromise ??= this.doCachedQuery();\n memCache.set(cacheKey, resultPromise);\n return resultPromise;\n }\n\n async getItems(): Promise<ResultItem[]> {\n const res = await this.doUniqueQuery();\n return res;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"datasource-fetcher.js","names":["packageCache.get","packageCache.set","memCache.get"],"sources":["../../../../lib/util/github/graphql/datasource-fetcher.ts"],"sourcesContent":["import is from '@sindresorhus/is';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport * as memCache from '../../cache/memory/index.ts';\nimport * as packageCache from '../../cache/package/index.ts';\nimport type { PackageCacheNamespace } from '../../cache/package/types.ts';\nimport type {\n GithubGraphqlResponse,\n GithubHttp,\n GithubHttpOptions,\n} from '../../http/github.ts';\nimport type { HttpResponse } from '../../http/types.ts';\nimport { getApiBaseUrl } from '../url.ts';\nimport { GithubGraphqlMemoryCacheStrategy } from './cache-strategies/memory-cache-strategy.ts';\nimport { GithubGraphqlPackageCacheStrategy } from './cache-strategies/package-cache-strategy.ts';\nimport type {\n GithubDatasourceItem,\n GithubGraphqlCacheStrategy,\n GithubGraphqlDatasourceAdapter,\n GithubGraphqlPayload,\n GithubGraphqlRepoParams,\n GithubGraphqlRepoResponse,\n GithubPackageConfig,\n RawQueryResponse,\n} from './types.ts';\n\n/**\n * We know empirically that certain type of GraphQL errors\n * can be fixed by shrinking page size.\n *\n * @see https://github.com/renovatebot/renovate/issues/16343\n */\nfunction isUnknownGraphqlError(err: Error): boolean {\n const { message } = err;\n return message.startsWith('Something went wrong while executing your query.');\n}\n\nfunction canBeSolvedByShrinking(err: Error): boolean {\n const errors: Error[] = err instanceof AggregateError ? err.errors : [err];\n return errors.some(\n (e) => err instanceof ExternalHostError || isUnknownGraphqlError(e),\n );\n}\n\nexport class GithubGraphqlDatasourceFetcher<\n GraphqlItem,\n ResultItem extends GithubDatasourceItem,\n> {\n static async query<T, U extends GithubDatasourceItem>(\n config: GithubPackageConfig,\n http: GithubHttp,\n adapter: GithubGraphqlDatasourceAdapter<T, U>,\n ): Promise<U[]> {\n const instance = new GithubGraphqlDatasourceFetcher<T, U>(\n config,\n http,\n adapter,\n );\n const items = await instance.getItems();\n return items;\n }\n\n private readonly baseUrl: string;\n private readonly repoOwner: string;\n private readonly repoName: string;\n\n private itemsPerQuery: 100 | 50 | 25 = 100;\n\n private queryCount = 0;\n\n private cursor: string | null = null;\n\n private isPersistent: boolean | undefined;\n private http: GithubHttp;\n private datasourceAdapter: GithubGraphqlDatasourceAdapter<\n GraphqlItem,\n ResultItem\n >;\n\n constructor(\n packageConfig: GithubPackageConfig,\n http: GithubHttp,\n datasourceAdapter: GithubGraphqlDatasourceAdapter<GraphqlItem, ResultItem>,\n ) {\n this.http = http;\n this.datasourceAdapter = datasourceAdapter;\n const { packageName, registryUrl } = packageConfig;\n [this.repoOwner, this.repoName] = packageName.split('/');\n this.baseUrl = getApiBaseUrl(registryUrl).replace(/\\/v3\\/$/, '/'); // Replace for GHE\n }\n\n private getCacheNs(): PackageCacheNamespace {\n return this.datasourceAdapter.key;\n }\n\n private getCacheKey(): string {\n return [this.baseUrl, this.repoOwner, this.repoName].join(':');\n }\n\n private getRawQueryOptions(): GithubHttpOptions {\n const baseUrl = this.baseUrl;\n const repository = `${this.repoOwner}/${this.repoName}`;\n const query = this.datasourceAdapter.query;\n const variables: GithubGraphqlRepoParams = {\n owner: this.repoOwner,\n name: this.repoName,\n count: this.itemsPerQuery,\n cursor: this.cursor,\n };\n\n return {\n baseUrl,\n repository,\n readOnly: true,\n body: { query, variables },\n };\n }\n\n private async doRawQuery(): Promise<\n RawQueryResponse<GithubGraphqlPayload<GraphqlItem>>\n > {\n const requestOptions = this.getRawQueryOptions();\n\n type GraphqlData = GithubGraphqlRepoResponse<GraphqlItem>;\n type HttpBody = GithubGraphqlResponse<GraphqlData>;\n let httpRes: HttpResponse<HttpBody>;\n try {\n httpRes = await this.http.postJson<HttpBody>('/graphql', requestOptions);\n } catch (err) {\n return [null, err];\n }\n\n const { body } = httpRes;\n const { data, errors } = body;\n\n if (errors?.length) {\n if (errors.length === 1) {\n const { message } = errors[0];\n const err = new Error(message);\n return [null, err];\n } else {\n const errorInstances = errors.map(({ message }) => new Error(message));\n const err = new AggregateError(errorInstances);\n return [null, err];\n }\n }\n\n if (!data) {\n const msg = 'GitHub GraphQL datasource: failed to obtain data';\n const err = new Error(msg);\n return [null, err];\n }\n\n if (!data.repository) {\n const msg = 'GitHub GraphQL datasource: failed to obtain repository data';\n const err = new Error(msg);\n return [null, err];\n }\n\n if (!data.repository.payload) {\n const msg =\n 'GitHub GraphQL datasource: failed to obtain repository payload data';\n const err = new Error(msg);\n return [null, err];\n }\n\n this.queryCount += 1;\n\n // For values other than explicit `false`,\n // we assume that items can not be cached.\n this.isPersistent ??= data.repository.isRepoPrivate === false;\n\n const res = data.repository.payload;\n return [res, null];\n }\n\n private shrinkPageSize(): boolean {\n if (this.itemsPerQuery === 100) {\n this.itemsPerQuery = 50;\n return true;\n }\n\n if (this.itemsPerQuery === 50) {\n this.itemsPerQuery = 25;\n return true;\n }\n\n return false;\n }\n\n private hasReachedQueryLimit(): boolean {\n return this.queryCount >= 100;\n }\n\n private async doShrinkableQuery(): Promise<\n GithubGraphqlPayload<GraphqlItem>\n > {\n let res: GithubGraphqlPayload<GraphqlItem> | null = null;\n let err: Error | null = null;\n\n while (!res) {\n [res, err] = await this.doRawQuery();\n if (err) {\n if (!canBeSolvedByShrinking(err)) {\n throw err;\n }\n\n const shrinkResult = this.shrinkPageSize();\n if (!shrinkResult) {\n throw err;\n }\n const { body: _, ...options } = this.getRawQueryOptions();\n logger.debug(\n { options, newSize: this.itemsPerQuery },\n 'Shrinking GitHub GraphQL page size after error',\n );\n }\n }\n\n return res;\n }\n\n private _cacheStrategy: GithubGraphqlCacheStrategy<ResultItem> | undefined;\n\n private cacheStrategy(): GithubGraphqlCacheStrategy<ResultItem> {\n if (this._cacheStrategy) {\n return this._cacheStrategy;\n }\n const cacheNs = this.getCacheNs();\n const cacheKey = this.getCacheKey();\n const cachePrivatePackages = GlobalConfig.get(\n 'cachePrivatePackages',\n false,\n );\n const skipStabilization = !is.undefined(this.datasourceAdapter.maxItems);\n this._cacheStrategy =\n cachePrivatePackages || this.isPersistent\n ? new GithubGraphqlPackageCacheStrategy<ResultItem>(\n cacheNs,\n cacheKey,\n skipStabilization,\n )\n : new GithubGraphqlMemoryCacheStrategy<ResultItem>(\n cacheNs,\n cacheKey,\n skipStabilization,\n );\n return this._cacheStrategy;\n }\n\n /**\n * This method is responsible for data synchronization.\n * It also detects persistence of the package, based on the first page result.\n */\n private async doPaginatedFetch(): Promise<void> {\n let hasNextPage = true;\n let isPaginationDone = false;\n let nextCursor: string | undefined;\n let itemCount = 0;\n const maxItems = this.datasourceAdapter.maxItems;\n while (hasNextPage && !isPaginationDone && !this.hasReachedQueryLimit()) {\n if (!is.undefined(maxItems) && itemCount >= maxItems) {\n break;\n }\n const queryResult = await this.doShrinkableQuery();\n\n const resultItems: ResultItem[] = [];\n for (const node of queryResult.nodes) {\n const item = this.datasourceAdapter.transform(node);\n if (!item) {\n logger.once.info(\n {\n packageName: `${this.repoOwner}/${this.repoName}`,\n baseUrl: this.baseUrl,\n },\n `GitHub GraphQL datasource: skipping empty item`,\n );\n continue;\n }\n resultItems.push(item);\n }\n itemCount += resultItems.length;\n\n // It's important to call `getCacheStrategy()` after `doShrinkableQuery()`\n // because `doShrinkableQuery()` may change `this.isCacheable`.\n //\n // Otherwise, cache items for public packages will never be persisted\n // in long-term cache.\n isPaginationDone = await this.cacheStrategy().reconcile(resultItems);\n\n hasNextPage = !!queryResult?.pageInfo?.hasNextPage;\n nextCursor = queryResult?.pageInfo?.endCursor;\n if (hasNextPage && nextCursor) {\n this.cursor = nextCursor;\n }\n }\n\n if (this.isPersistent) {\n await this.storePersistenceFlag(30);\n }\n }\n\n private async doCachedQuery(): Promise<ResultItem[]> {\n await this.loadPersistenceFlag();\n if (!this.isPersistent) {\n await this.doPaginatedFetch();\n }\n\n const res = await this.cacheStrategy().finalizeAndReturn();\n if (res.length) {\n return res;\n }\n\n delete this.isPersistent;\n await this.doPaginatedFetch();\n return this.cacheStrategy().finalizeAndReturn();\n }\n\n async loadPersistenceFlag(): Promise<void> {\n const ns = this.getCacheNs();\n const key = `${this.getCacheKey()}:is-persistent`;\n this.isPersistent = await packageCache.get<true>(ns, key);\n }\n\n async storePersistenceFlag(minutes: number): Promise<void> {\n const ns = this.getCacheNs();\n const key = `${this.getCacheKey()}:is-persistent`;\n await packageCache.set(ns, key, true, minutes);\n }\n\n /**\n * This method ensures the only one query is executed\n * to a particular package during single run.\n */\n private doUniqueQuery(): Promise<ResultItem[]> {\n const cacheKey = `github-pending:${this.getCacheNs()}:${this.getCacheKey()}`;\n let resultPromise = memCache.get<Promise<ResultItem[]>>(cacheKey);\n resultPromise ??= this.doCachedQuery();\n memCache.set(cacheKey, resultPromise);\n return resultPromise;\n }\n\n async getItems(): Promise<ResultItem[]> {\n const res = await this.doUniqueQuery();\n return res;\n }\n}\n"],"mappings":"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"}
|
|
@@ -226,7 +226,8 @@ async function getReleaseNotesMd(project, release) {
|
|
|
226
226
|
}
|
|
227
227
|
const releasesRegex = regEx(/([0-9]{4}-[0-9]{2}-[0-9]{2})/);
|
|
228
228
|
if (packageName && heading.search(releasesRegex) !== -1) {
|
|
229
|
-
|
|
229
|
+
const linkRefDefRegex = regEx(/^\s*\[[^\]]+\]:\s*\S+/);
|
|
230
|
+
if (body.split("\n").some((line) => line.includes(packageName) && line.includes(version) && !isHttpUrl(line) && !linkRefDefRegex.test(line))) {
|
|
230
231
|
logger.trace({ body }, "Found release notes for v" + version);
|
|
231
232
|
return {
|
|
232
233
|
body: await linkifyBody(project, body),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"release-notes.js","names":["bitbucket.getReleaseList","forgejo.getReleaseList","gitea.getReleaseList","github.getReleaseList","gitlab.getReleaseList","memCache.get","bitbucket.getReleaseNotesMd","bitbucketServer.getReleaseNotesMd","forgejo.getReleaseNotesMd","gitea.getReleaseNotesMd","github.getReleaseNotesMd","gitlab.getReleaseNotesMd","packageCache.get","packageCache.set"],"sources":["../../../../../../lib/workers/repository/update/pr/changelog/release-notes.ts"],"sourcesContent":["import { isDate, isUndefined } from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport MarkdownIt from 'markdown-it';\nimport { logger } from '../../../../../logger/index.ts';\nimport * as memCache from '../../../../../util/cache/memory/index.ts';\nimport * as packageCache from '../../../../../util/cache/package/index.ts';\nimport type { PackageCacheNamespace } from '../../../../../util/cache/package/types.ts';\nimport { detectPlatform } from '../../../../../util/common.ts';\nimport { linkify } from '../../../../../util/markdown.ts';\nimport { newlineRegex, regEx } from '../../../../../util/regex.ts';\nimport { coerceString } from '../../../../../util/string.ts';\nimport { isHttpUrl, joinUrlParts } from '../../../../../util/url.ts';\nimport type { BranchUpgradeConfig } from '../../../../types.ts';\nimport * as bitbucket from './bitbucket/index.ts';\nimport * as bitbucketServer from './bitbucket-server/index.ts';\nimport * as forgejo from './forgejo/index.ts';\nimport * as gitea from './gitea/index.ts';\nimport * as github from './github/index.ts';\nimport * as gitlab from './gitlab/index.ts';\nimport type {\n ChangeLogFile,\n ChangeLogNotes,\n ChangeLogProject,\n ChangeLogRelease,\n ChangeLogResult,\n} from './types.ts';\n\nconst markdown = new MarkdownIt('zero');\nmarkdown.enable(['heading', 'lheading', 'fence']);\n\nconst repositoriesToSkipMdFetching = ['facebook/react-native'];\n\nexport async function getReleaseList(\n project: ChangeLogProject,\n release: ChangeLogRelease,\n): Promise<ChangeLogNotes[]> {\n logger.trace('getReleaseList()');\n const { apiBaseUrl, repository, type } = project;\n try {\n switch (type) {\n case 'bitbucket':\n return bitbucket.getReleaseList(project, release);\n case 'bitbucket-server':\n logger.trace(\n 'Unsupported Bitbucket Server feature. Skipping release fetching.',\n );\n return [];\n case 'forgejo':\n return await forgejo.getReleaseList(project, release);\n case 'gitea':\n return await gitea.getReleaseList(project, release);\n case 'github':\n return await github.getReleaseList(project, release);\n case 'gitlab':\n return await gitlab.getReleaseList(project, release);\n default:\n logger.warn({ apiBaseUrl, repository, type }, 'Invalid project type');\n return [];\n }\n } catch (err) /* istanbul ignore next */ {\n if (err.statusCode === 404) {\n logger.debug({ repository, type, apiBaseUrl }, 'getReleaseList 404');\n } else {\n logger.debug(\n { repository, type, apiBaseUrl, err },\n 'getReleaseList error',\n );\n }\n }\n return [];\n}\n\nexport function getCachedReleaseList(\n project: ChangeLogProject,\n release: ChangeLogRelease,\n): Promise<ChangeLogNotes[]> {\n const { repository, apiBaseUrl } = project;\n // TODO: types (#22198)\n const cacheKey = `getReleaseList-${apiBaseUrl}-${repository}`;\n const cachedResult = memCache.get<Promise<ChangeLogNotes[]>>(cacheKey);\n // istanbul ignore if\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n const promisedRes = getReleaseList(project, release);\n memCache.set(cacheKey, promisedRes);\n return promisedRes;\n}\n\nexport function massageBody(\n input: string | undefined | null,\n baseUrl: string,\n): string {\n let body = coerceString(input);\n // Convert line returns\n body = body.replace(regEx(/\\r\\n/g), '\\n');\n // semantic-release cleanup\n body = body.replace(regEx(/^<a name=\"[^\"]*\"><\\/a>\\n/), '');\n body = body.replace(\n regEx(\n `^##? \\\\[[^\\\\]]*\\\\]\\\\(${baseUrl}[^/]*/[^/]*/compare/.*?\\\\n`,\n undefined,\n false,\n ),\n '',\n );\n // Clean-up unnecessary commits link\n body = `\\n${body}\\n`.replace(\n regEx(`\\\\n${baseUrl}[^/]+/[^/]+/compare/[^\\\\n]+(\\\\n|$)`),\n '\\n',\n );\n // Reduce headings size\n body = body\n .split(regEx(/(```[\\s\\S]*?```)/g))\n .map((part) =>\n part.startsWith('```') // do not modify # inside of codeblocks\n ? part\n : part\n .replace(regEx(/\\n\\s*####? /g), '\\n##### ')\n .replace(regEx(/\\n\\s*## /g), '\\n#### ')\n .replace(regEx(/\\n\\s*# /g), '\\n### '),\n )\n .join('');\n // Trim whitespace\n return body.trim();\n}\n\nexport function massageName(\n input: string | undefined | null,\n version: string | undefined,\n): string | undefined {\n let name = input ?? '';\n\n if (version) {\n name = name.replace(RegExp(`^(Release )?v?${version}`, 'i'), '').trim();\n }\n\n name = name.trim();\n if (!name.length) {\n return undefined;\n }\n\n return name;\n}\n\nexport async function getReleaseNotes(\n project: ChangeLogProject,\n release: ChangeLogRelease,\n config: BranchUpgradeConfig,\n): Promise<ChangeLogNotes | null> {\n const { packageName, depName, repository } = project;\n const { version, gitRef } = release;\n // TODO: types (#22198)\n logger.trace(\n `getReleaseNotes(${repository}, ${version}, ${packageName!}, ${depName!})`,\n );\n const releases = await getCachedReleaseList(project, release);\n logger.trace({ releases }, 'Release list from getReleaseList');\n let releaseNotes: ChangeLogNotes | null = null;\n\n let matchedRelease = getExactReleaseMatch(\n packageName!,\n depName!,\n version,\n releases,\n );\n if (isUndefined(matchedRelease)) {\n // no exact match of a release then check other cases\n matchedRelease = releases.find(\n (r) =>\n r.tag === version ||\n r.tag === `v${version}` ||\n r.tag === gitRef ||\n r.tag === `v${gitRef}`,\n );\n }\n if (isUndefined(matchedRelease) && config.extractVersion) {\n const extractVersionRegEx = regEx(config.extractVersion);\n matchedRelease = releases.find((r) => {\n const extractedVersion = extractVersionRegEx.exec(r.tag!)?.groups\n ?.version;\n return version === extractedVersion;\n });\n }\n releaseNotes = await releaseNotesResult(matchedRelease, project);\n logger.trace({ releaseNotes });\n return releaseNotes;\n}\n\nfunction getExactReleaseMatch(\n packageName: string,\n depName: string,\n version: string,\n releases: ChangeLogNotes[],\n): ChangeLogNotes | undefined {\n const exactReleaseReg = regEx(\n `(?:^|/)(?:${packageName}|${depName})[@_-]v?${version}`,\n );\n const candidateReleases = releases.filter((r) => r.tag?.endsWith(version));\n const matchedRelease = candidateReleases.find((r) =>\n exactReleaseReg.test(r.tag!),\n );\n return matchedRelease;\n}\n\nasync function releaseNotesResult(\n releaseMatch: ChangeLogNotes | undefined,\n project: ChangeLogProject,\n): Promise<ChangeLogNotes | null> {\n if (!releaseMatch) {\n return null;\n }\n const { baseUrl, repository } = project;\n const releaseNotes: ChangeLogNotes = releaseMatch;\n if (detectPlatform(baseUrl) === 'gitlab') {\n releaseNotes.url = `${baseUrl}${repository}/tags/${releaseMatch.tag!}`;\n } else {\n releaseNotes.url = releaseMatch.url\n ? releaseMatch.url\n : /* istanbul ignore next */\n `${baseUrl}${repository}/releases/${releaseMatch.tag!}`;\n }\n // set body for release notes\n releaseNotes.body = massageBody(releaseNotes.body, baseUrl);\n releaseNotes.name = massageName(releaseNotes.name, releaseNotes.tag);\n if (releaseNotes.body.length || releaseNotes.name?.length) {\n try {\n if (baseUrl !== 'https://gitlab.com/') {\n releaseNotes.body = await linkify(releaseNotes.body, {\n repository: `${baseUrl}${repository}`,\n });\n }\n } catch (err) /* istanbul ignore next */ {\n logger.warn({ err, baseUrl, repository }, 'Error linkifying');\n }\n } else {\n return null;\n }\n\n return releaseNotes;\n}\n\nfunction sectionize(text: string, level: number): string[] {\n const sections: [number, number][] = [];\n const lines = text.split(newlineRegex);\n const tokens = markdown.parse(text, undefined);\n tokens.forEach((token) => {\n if (token.type === 'heading_open') {\n const lev = +token.tag.substring(1);\n if (lev <= level) {\n sections.push([lev, token.map![0]]);\n }\n }\n });\n sections.push([-1, lines.length]);\n const result: string[] = [];\n for (let i = 1; i < sections.length; i += 1) {\n const [lev, start] = sections[i - 1];\n const [, end] = sections[i];\n if (lev === level) {\n result.push(lines.slice(start, end).join('\\n'));\n }\n }\n return result;\n}\n\nexport async function getReleaseNotesMdFileInner(\n project: ChangeLogProject,\n): Promise<ChangeLogFile | null> {\n const { repository, type } = project;\n const apiBaseUrl = project.apiBaseUrl;\n const sourceDirectory = project.sourceDirectory!;\n try {\n switch (type) {\n case 'bitbucket':\n return await bitbucket.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n case 'bitbucket-server':\n return await bitbucketServer.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n case 'forgejo':\n return await forgejo.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n case 'gitea':\n return await gitea.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n case 'github':\n return await github.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n case 'gitlab':\n return await gitlab.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n default:\n logger.warn({ apiBaseUrl, repository, type }, 'Invalid project type');\n return null;\n }\n } catch (err) /* istanbul ignore next */ {\n if (err.statusCode === 404) {\n logger.debug(\n { repository, type, apiBaseUrl },\n 'Error 404 getting changelog md',\n );\n } else {\n logger.debug(\n { err, repository, type, apiBaseUrl },\n 'Error getting changelog md',\n );\n }\n }\n return null;\n}\n\nexport function getReleaseNotesMdFile(\n project: ChangeLogProject,\n): Promise<ChangeLogFile | null> {\n const { sourceDirectory, repository, apiBaseUrl } = project;\n // TODO: types (#22198)\n const cacheKey = sourceDirectory\n ? `getReleaseNotesMdFile@v2-${repository}-${sourceDirectory}-${apiBaseUrl}`\n : `getReleaseNotesMdFile@v2-${repository}-${apiBaseUrl}`;\n const cachedResult = memCache.get<Promise<ChangeLogFile | null>>(cacheKey);\n // istanbul ignore if\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n const promisedRes = getReleaseNotesMdFileInner(project);\n memCache.set(cacheKey, promisedRes);\n return promisedRes;\n}\n\nexport async function getReleaseNotesMd(\n project: ChangeLogProject,\n release: ChangeLogRelease,\n): Promise<ChangeLogNotes | null> {\n const { baseUrl, repository, packageName } = project;\n const version = release.version;\n logger.trace(`getReleaseNotesMd(${repository}, ${version})`);\n\n if (shouldSkipChangelogMd(repository)) {\n return null;\n }\n\n const changelog = await getReleaseNotesMdFile(project);\n if (!changelog) {\n return null;\n }\n const { changelogFile } = changelog;\n const changelogMd = changelog.changelogMd.replace(\n regEx(/\\n\\s*<a name=\"[^\"]*\">.*?<\\/a>\\n/g),\n '\\n',\n );\n for (const level of [1, 2, 3, 4, 5, 6, 7]) {\n const changelogParsed = sectionize(changelogMd, level);\n if (changelogParsed.length >= 2) {\n for (const section of changelogParsed) {\n try {\n // replace brackets and parenthesis with space\n const deParenthesizedSection = section.replace(\n regEx(/[[\\]()]/g),\n ' ',\n );\n const [heading] = deParenthesizedSection.split(newlineRegex);\n const title = heading\n .replace(regEx(/^\\s*#*\\s*/), '')\n .split(' ')\n .filter(Boolean);\n const body = section.replace(regEx(/.*?\\n(-{3,}\\n)?/), '').trim();\n const notesSourceUrl = getNotesSourceUrl(\n baseUrl,\n repository,\n project,\n changelogFile,\n );\n const mdHeadingLink = title\n .filter((word) => !isHttpUrl(word))\n .join('-')\n .replace(regEx(/[^A-Za-z0-9-]/g), '');\n const url = `${notesSourceUrl}#${mdHeadingLink}`;\n // Look for version in title\n for (const word of title) {\n if (word.includes(version) && !isHttpUrl(word)) {\n logger.trace({ body }, 'Found release notes for v' + version);\n return {\n body: await linkifyBody(project, body),\n url,\n notesSourceUrl,\n };\n }\n }\n // Look for version in body - useful for monorepos. First check for heading with \"(yyyy-mm-dd)\"\n const releasesRegex = regEx(/([0-9]{4}-[0-9]{2}-[0-9]{2})/);\n if (packageName && heading.search(releasesRegex) !== -1) {\n // Now check if any line contains both the package name and the version\n const bodyLines = body.split('\\n');\n if (\n bodyLines.some(\n (line) =>\n line.includes(packageName) &&\n line.includes(version) &&\n !isHttpUrl(line),\n )\n ) {\n logger.trace({ body }, 'Found release notes for v' + version);\n return {\n body: await linkifyBody(project, body),\n url,\n notesSourceUrl,\n };\n }\n }\n } catch (err) /* istanbul ignore next */ {\n logger.warn(\n { file: changelogFile, err },\n `Error parsing changelog file`,\n );\n }\n }\n }\n logger.trace({ repository }, `No level ${level} changelogs headings found`);\n }\n logger.trace({ repository, version }, `No entry found in ${changelogFile}`);\n return null;\n}\n\n/**\n * Determine how long to cache release notes based on when the version was released.\n *\n * It's not uncommon for release notes to be updated shortly after the release itself,\n * so only cache for about an hour when the release is less than a week old. Otherwise,\n * cache for days.\n */\nexport function releaseNotesCacheMinutes(releaseDate?: string | Date): number {\n const dt = isDate(releaseDate)\n ? DateTime.fromJSDate(releaseDate)\n : DateTime.fromISO(releaseDate!);\n\n const now = DateTime.local();\n\n if (!dt.isValid || now.diff(dt, 'days').days < 7) {\n return 55;\n }\n\n if (now.diff(dt, 'months').months < 6) {\n return 1435; // 5 minutes shy of one day\n }\n\n return 14495; // 5 minutes shy of 10 days\n}\n\nexport async function addReleaseNotes(\n input: ChangeLogResult | null | undefined,\n config: BranchUpgradeConfig,\n): Promise<ChangeLogResult | null> {\n if (!input?.versions || !input.project?.type) {\n logger.debug('Missing project or versions');\n return input ?? null;\n }\n const output: ChangeLogResult = {\n ...input,\n versions: [],\n hasReleaseNotes: false,\n };\n\n const { repository, sourceDirectory, type: projectType } = input.project;\n const cacheNamespace: PackageCacheNamespace = `changelog-${projectType}-notes@v2`;\n const cacheKeyPrefix = sourceDirectory\n ? `${repository}:${sourceDirectory}`\n : `${repository}`;\n\n for (const v of input.versions) {\n let releaseNotes: ChangeLogNotes | null | undefined;\n const cacheKey = `${cacheKeyPrefix}:${v.version}`;\n releaseNotes = await packageCache.get(cacheNamespace, cacheKey);\n releaseNotes ??= await getReleaseNotesMd(input.project, v);\n releaseNotes ??= await getReleaseNotes(input.project, v, config);\n\n // If there is no release notes, at least try to show the compare URL\n if (!releaseNotes && v.compare.url) {\n releaseNotes = { url: v.compare.url, notesSourceUrl: '' };\n }\n\n const cacheMinutes = releaseNotesCacheMinutes(v.date);\n await packageCache.set(\n cacheNamespace,\n cacheKey,\n releaseNotes,\n cacheMinutes,\n );\n output.versions!.push({\n ...v,\n releaseNotes: releaseNotes!,\n });\n\n if (releaseNotes) {\n output.hasReleaseNotes = true;\n }\n }\n return output;\n}\n\n/**\n * Skip fetching changelog/release-notes markdown files.\n * Will force a fallback to using GitHub release notes\n */\nexport function shouldSkipChangelogMd(repository: string): boolean {\n return repositoriesToSkipMdFetching.includes(repository);\n}\n\nfunction getNotesSourceUrl(\n baseUrl: string,\n repository: string,\n project: ChangeLogProject,\n changelogFile: string,\n): string {\n if (project.type === 'bitbucket-server') {\n const [projectKey, repositorySlug] = repository.split('/');\n return joinUrlParts(\n baseUrl,\n 'projects',\n projectKey,\n 'repos',\n repositorySlug,\n 'browse',\n changelogFile,\n '?at=HEAD',\n );\n }\n\n return joinUrlParts(\n baseUrl,\n repository,\n project.type === 'bitbucket' ? 'src' : 'blob',\n 'HEAD',\n changelogFile,\n );\n}\n\nasync function linkifyBody(\n { baseUrl, repository }: ChangeLogProject,\n bodyStr: string,\n): Promise<string> {\n const body = massageBody(bodyStr, baseUrl);\n if (body?.length) {\n try {\n return await linkify(body, {\n repository: `${baseUrl}${repository}`,\n });\n } catch (err) /* istanbul ignore next */ {\n logger.warn({ body, err }, 'linkify error');\n }\n }\n return body;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"release-notes.js","names":["bitbucket.getReleaseList","forgejo.getReleaseList","gitea.getReleaseList","github.getReleaseList","gitlab.getReleaseList","memCache.get","bitbucket.getReleaseNotesMd","bitbucketServer.getReleaseNotesMd","forgejo.getReleaseNotesMd","gitea.getReleaseNotesMd","github.getReleaseNotesMd","gitlab.getReleaseNotesMd","packageCache.get","packageCache.set"],"sources":["../../../../../../lib/workers/repository/update/pr/changelog/release-notes.ts"],"sourcesContent":["import { isDate, isUndefined } from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport MarkdownIt from 'markdown-it';\nimport { logger } from '../../../../../logger/index.ts';\nimport * as memCache from '../../../../../util/cache/memory/index.ts';\nimport * as packageCache from '../../../../../util/cache/package/index.ts';\nimport type { PackageCacheNamespace } from '../../../../../util/cache/package/types.ts';\nimport { detectPlatform } from '../../../../../util/common.ts';\nimport { linkify } from '../../../../../util/markdown.ts';\nimport { newlineRegex, regEx } from '../../../../../util/regex.ts';\nimport { coerceString } from '../../../../../util/string.ts';\nimport { isHttpUrl, joinUrlParts } from '../../../../../util/url.ts';\nimport type { BranchUpgradeConfig } from '../../../../types.ts';\nimport * as bitbucket from './bitbucket/index.ts';\nimport * as bitbucketServer from './bitbucket-server/index.ts';\nimport * as forgejo from './forgejo/index.ts';\nimport * as gitea from './gitea/index.ts';\nimport * as github from './github/index.ts';\nimport * as gitlab from './gitlab/index.ts';\nimport type {\n ChangeLogFile,\n ChangeLogNotes,\n ChangeLogProject,\n ChangeLogRelease,\n ChangeLogResult,\n} from './types.ts';\n\nconst markdown = new MarkdownIt('zero');\nmarkdown.enable(['heading', 'lheading', 'fence']);\n\nconst repositoriesToSkipMdFetching = ['facebook/react-native'];\n\nexport async function getReleaseList(\n project: ChangeLogProject,\n release: ChangeLogRelease,\n): Promise<ChangeLogNotes[]> {\n logger.trace('getReleaseList()');\n const { apiBaseUrl, repository, type } = project;\n try {\n switch (type) {\n case 'bitbucket':\n return bitbucket.getReleaseList(project, release);\n case 'bitbucket-server':\n logger.trace(\n 'Unsupported Bitbucket Server feature. Skipping release fetching.',\n );\n return [];\n case 'forgejo':\n return await forgejo.getReleaseList(project, release);\n case 'gitea':\n return await gitea.getReleaseList(project, release);\n case 'github':\n return await github.getReleaseList(project, release);\n case 'gitlab':\n return await gitlab.getReleaseList(project, release);\n default:\n logger.warn({ apiBaseUrl, repository, type }, 'Invalid project type');\n return [];\n }\n } catch (err) /* istanbul ignore next */ {\n if (err.statusCode === 404) {\n logger.debug({ repository, type, apiBaseUrl }, 'getReleaseList 404');\n } else {\n logger.debug(\n { repository, type, apiBaseUrl, err },\n 'getReleaseList error',\n );\n }\n }\n return [];\n}\n\nexport function getCachedReleaseList(\n project: ChangeLogProject,\n release: ChangeLogRelease,\n): Promise<ChangeLogNotes[]> {\n const { repository, apiBaseUrl } = project;\n // TODO: types (#22198)\n const cacheKey = `getReleaseList-${apiBaseUrl}-${repository}`;\n const cachedResult = memCache.get<Promise<ChangeLogNotes[]>>(cacheKey);\n // istanbul ignore if\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n const promisedRes = getReleaseList(project, release);\n memCache.set(cacheKey, promisedRes);\n return promisedRes;\n}\n\nexport function massageBody(\n input: string | undefined | null,\n baseUrl: string,\n): string {\n let body = coerceString(input);\n // Convert line returns\n body = body.replace(regEx(/\\r\\n/g), '\\n');\n // semantic-release cleanup\n body = body.replace(regEx(/^<a name=\"[^\"]*\"><\\/a>\\n/), '');\n body = body.replace(\n regEx(\n `^##? \\\\[[^\\\\]]*\\\\]\\\\(${baseUrl}[^/]*/[^/]*/compare/.*?\\\\n`,\n undefined,\n false,\n ),\n '',\n );\n // Clean-up unnecessary commits link\n body = `\\n${body}\\n`.replace(\n regEx(`\\\\n${baseUrl}[^/]+/[^/]+/compare/[^\\\\n]+(\\\\n|$)`),\n '\\n',\n );\n // Reduce headings size\n body = body\n .split(regEx(/(```[\\s\\S]*?```)/g))\n .map((part) =>\n part.startsWith('```') // do not modify # inside of codeblocks\n ? part\n : part\n .replace(regEx(/\\n\\s*####? /g), '\\n##### ')\n .replace(regEx(/\\n\\s*## /g), '\\n#### ')\n .replace(regEx(/\\n\\s*# /g), '\\n### '),\n )\n .join('');\n // Trim whitespace\n return body.trim();\n}\n\nexport function massageName(\n input: string | undefined | null,\n version: string | undefined,\n): string | undefined {\n let name = input ?? '';\n\n if (version) {\n name = name.replace(RegExp(`^(Release )?v?${version}`, 'i'), '').trim();\n }\n\n name = name.trim();\n if (!name.length) {\n return undefined;\n }\n\n return name;\n}\n\nexport async function getReleaseNotes(\n project: ChangeLogProject,\n release: ChangeLogRelease,\n config: BranchUpgradeConfig,\n): Promise<ChangeLogNotes | null> {\n const { packageName, depName, repository } = project;\n const { version, gitRef } = release;\n // TODO: types (#22198)\n logger.trace(\n `getReleaseNotes(${repository}, ${version}, ${packageName!}, ${depName!})`,\n );\n const releases = await getCachedReleaseList(project, release);\n logger.trace({ releases }, 'Release list from getReleaseList');\n let releaseNotes: ChangeLogNotes | null = null;\n\n let matchedRelease = getExactReleaseMatch(\n packageName!,\n depName!,\n version,\n releases,\n );\n if (isUndefined(matchedRelease)) {\n // no exact match of a release then check other cases\n matchedRelease = releases.find(\n (r) =>\n r.tag === version ||\n r.tag === `v${version}` ||\n r.tag === gitRef ||\n r.tag === `v${gitRef}`,\n );\n }\n if (isUndefined(matchedRelease) && config.extractVersion) {\n const extractVersionRegEx = regEx(config.extractVersion);\n matchedRelease = releases.find((r) => {\n const extractedVersion = extractVersionRegEx.exec(r.tag!)?.groups\n ?.version;\n return version === extractedVersion;\n });\n }\n releaseNotes = await releaseNotesResult(matchedRelease, project);\n logger.trace({ releaseNotes });\n return releaseNotes;\n}\n\nfunction getExactReleaseMatch(\n packageName: string,\n depName: string,\n version: string,\n releases: ChangeLogNotes[],\n): ChangeLogNotes | undefined {\n const exactReleaseReg = regEx(\n `(?:^|/)(?:${packageName}|${depName})[@_-]v?${version}`,\n );\n const candidateReleases = releases.filter((r) => r.tag?.endsWith(version));\n const matchedRelease = candidateReleases.find((r) =>\n exactReleaseReg.test(r.tag!),\n );\n return matchedRelease;\n}\n\nasync function releaseNotesResult(\n releaseMatch: ChangeLogNotes | undefined,\n project: ChangeLogProject,\n): Promise<ChangeLogNotes | null> {\n if (!releaseMatch) {\n return null;\n }\n const { baseUrl, repository } = project;\n const releaseNotes: ChangeLogNotes = releaseMatch;\n if (detectPlatform(baseUrl) === 'gitlab') {\n releaseNotes.url = `${baseUrl}${repository}/tags/${releaseMatch.tag!}`;\n } else {\n releaseNotes.url = releaseMatch.url\n ? releaseMatch.url\n : /* istanbul ignore next */\n `${baseUrl}${repository}/releases/${releaseMatch.tag!}`;\n }\n // set body for release notes\n releaseNotes.body = massageBody(releaseNotes.body, baseUrl);\n releaseNotes.name = massageName(releaseNotes.name, releaseNotes.tag);\n if (releaseNotes.body.length || releaseNotes.name?.length) {\n try {\n if (baseUrl !== 'https://gitlab.com/') {\n releaseNotes.body = await linkify(releaseNotes.body, {\n repository: `${baseUrl}${repository}`,\n });\n }\n } catch (err) /* istanbul ignore next */ {\n logger.warn({ err, baseUrl, repository }, 'Error linkifying');\n }\n } else {\n return null;\n }\n\n return releaseNotes;\n}\n\nfunction sectionize(text: string, level: number): string[] {\n const sections: [number, number][] = [];\n const lines = text.split(newlineRegex);\n const tokens = markdown.parse(text, undefined);\n tokens.forEach((token) => {\n if (token.type === 'heading_open') {\n const lev = +token.tag.substring(1);\n if (lev <= level) {\n sections.push([lev, token.map![0]]);\n }\n }\n });\n sections.push([-1, lines.length]);\n const result: string[] = [];\n for (let i = 1; i < sections.length; i += 1) {\n const [lev, start] = sections[i - 1];\n const [, end] = sections[i];\n if (lev === level) {\n result.push(lines.slice(start, end).join('\\n'));\n }\n }\n return result;\n}\n\nexport async function getReleaseNotesMdFileInner(\n project: ChangeLogProject,\n): Promise<ChangeLogFile | null> {\n const { repository, type } = project;\n const apiBaseUrl = project.apiBaseUrl;\n const sourceDirectory = project.sourceDirectory!;\n try {\n switch (type) {\n case 'bitbucket':\n return await bitbucket.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n case 'bitbucket-server':\n return await bitbucketServer.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n case 'forgejo':\n return await forgejo.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n case 'gitea':\n return await gitea.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n case 'github':\n return await github.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n case 'gitlab':\n return await gitlab.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n default:\n logger.warn({ apiBaseUrl, repository, type }, 'Invalid project type');\n return null;\n }\n } catch (err) /* istanbul ignore next */ {\n if (err.statusCode === 404) {\n logger.debug(\n { repository, type, apiBaseUrl },\n 'Error 404 getting changelog md',\n );\n } else {\n logger.debug(\n { err, repository, type, apiBaseUrl },\n 'Error getting changelog md',\n );\n }\n }\n return null;\n}\n\nexport function getReleaseNotesMdFile(\n project: ChangeLogProject,\n): Promise<ChangeLogFile | null> {\n const { sourceDirectory, repository, apiBaseUrl } = project;\n // TODO: types (#22198)\n const cacheKey = sourceDirectory\n ? `getReleaseNotesMdFile@v2-${repository}-${sourceDirectory}-${apiBaseUrl}`\n : `getReleaseNotesMdFile@v2-${repository}-${apiBaseUrl}`;\n const cachedResult = memCache.get<Promise<ChangeLogFile | null>>(cacheKey);\n // istanbul ignore if\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n const promisedRes = getReleaseNotesMdFileInner(project);\n memCache.set(cacheKey, promisedRes);\n return promisedRes;\n}\n\nexport async function getReleaseNotesMd(\n project: ChangeLogProject,\n release: ChangeLogRelease,\n): Promise<ChangeLogNotes | null> {\n const { baseUrl, repository, packageName } = project;\n const version = release.version;\n logger.trace(`getReleaseNotesMd(${repository}, ${version})`);\n\n if (shouldSkipChangelogMd(repository)) {\n return null;\n }\n\n const changelog = await getReleaseNotesMdFile(project);\n if (!changelog) {\n return null;\n }\n const { changelogFile } = changelog;\n const changelogMd = changelog.changelogMd.replace(\n regEx(/\\n\\s*<a name=\"[^\"]*\">.*?<\\/a>\\n/g),\n '\\n',\n );\n for (const level of [1, 2, 3, 4, 5, 6, 7]) {\n const changelogParsed = sectionize(changelogMd, level);\n if (changelogParsed.length >= 2) {\n for (const section of changelogParsed) {\n try {\n // replace brackets and parenthesis with space\n const deParenthesizedSection = section.replace(\n regEx(/[[\\]()]/g),\n ' ',\n );\n const [heading] = deParenthesizedSection.split(newlineRegex);\n const title = heading\n .replace(regEx(/^\\s*#*\\s*/), '')\n .split(' ')\n .filter(Boolean);\n const body = section.replace(regEx(/.*?\\n(-{3,}\\n)?/), '').trim();\n const notesSourceUrl = getNotesSourceUrl(\n baseUrl,\n repository,\n project,\n changelogFile,\n );\n const mdHeadingLink = title\n .filter((word) => !isHttpUrl(word))\n .join('-')\n .replace(regEx(/[^A-Za-z0-9-]/g), '');\n const url = `${notesSourceUrl}#${mdHeadingLink}`;\n // Look for version in title\n for (const word of title) {\n if (word.includes(version) && !isHttpUrl(word)) {\n logger.trace({ body }, 'Found release notes for v' + version);\n return {\n body: await linkifyBody(project, body),\n url,\n notesSourceUrl,\n };\n }\n }\n // Look for version in body - useful for monorepos. First check for heading with \"(yyyy-mm-dd)\"\n const releasesRegex = regEx(/([0-9]{4}-[0-9]{2}-[0-9]{2})/);\n if (packageName && heading.search(releasesRegex) !== -1) {\n // Now check if any line contains both the package name and the version\n // Skip Markdown link reference definitions (e.g. `[1.2.3]: https://…/compare/...`)\n // which Keep-a-Changelog files list at the bottom and would otherwise match every version.\n const linkRefDefRegex = regEx(/^\\s*\\[[^\\]]+\\]:\\s*\\S+/);\n const bodyLines = body.split('\\n');\n if (\n bodyLines.some(\n (line) =>\n line.includes(packageName) &&\n line.includes(version) &&\n !isHttpUrl(line) &&\n !linkRefDefRegex.test(line),\n )\n ) {\n logger.trace({ body }, 'Found release notes for v' + version);\n return {\n body: await linkifyBody(project, body),\n url,\n notesSourceUrl,\n };\n }\n }\n } catch (err) /* istanbul ignore next */ {\n logger.warn(\n { file: changelogFile, err },\n `Error parsing changelog file`,\n );\n }\n }\n }\n logger.trace({ repository }, `No level ${level} changelogs headings found`);\n }\n logger.trace({ repository, version }, `No entry found in ${changelogFile}`);\n return null;\n}\n\n/**\n * Determine how long to cache release notes based on when the version was released.\n *\n * It's not uncommon for release notes to be updated shortly after the release itself,\n * so only cache for about an hour when the release is less than a week old. Otherwise,\n * cache for days.\n */\nexport function releaseNotesCacheMinutes(releaseDate?: string | Date): number {\n const dt = isDate(releaseDate)\n ? DateTime.fromJSDate(releaseDate)\n : DateTime.fromISO(releaseDate!);\n\n const now = DateTime.local();\n\n if (!dt.isValid || now.diff(dt, 'days').days < 7) {\n return 55;\n }\n\n if (now.diff(dt, 'months').months < 6) {\n return 1435; // 5 minutes shy of one day\n }\n\n return 14495; // 5 minutes shy of 10 days\n}\n\nexport async function addReleaseNotes(\n input: ChangeLogResult | null | undefined,\n config: BranchUpgradeConfig,\n): Promise<ChangeLogResult | null> {\n if (!input?.versions || !input.project?.type) {\n logger.debug('Missing project or versions');\n return input ?? null;\n }\n const output: ChangeLogResult = {\n ...input,\n versions: [],\n hasReleaseNotes: false,\n };\n\n const { repository, sourceDirectory, type: projectType } = input.project;\n const cacheNamespace: PackageCacheNamespace = `changelog-${projectType}-notes@v2`;\n const cacheKeyPrefix = sourceDirectory\n ? `${repository}:${sourceDirectory}`\n : `${repository}`;\n\n for (const v of input.versions) {\n let releaseNotes: ChangeLogNotes | null | undefined;\n const cacheKey = `${cacheKeyPrefix}:${v.version}`;\n releaseNotes = await packageCache.get(cacheNamespace, cacheKey);\n releaseNotes ??= await getReleaseNotesMd(input.project, v);\n releaseNotes ??= await getReleaseNotes(input.project, v, config);\n\n // If there is no release notes, at least try to show the compare URL\n if (!releaseNotes && v.compare.url) {\n releaseNotes = { url: v.compare.url, notesSourceUrl: '' };\n }\n\n const cacheMinutes = releaseNotesCacheMinutes(v.date);\n await packageCache.set(\n cacheNamespace,\n cacheKey,\n releaseNotes,\n cacheMinutes,\n );\n output.versions!.push({\n ...v,\n releaseNotes: releaseNotes!,\n });\n\n if (releaseNotes) {\n output.hasReleaseNotes = true;\n }\n }\n return output;\n}\n\n/**\n * Skip fetching changelog/release-notes markdown files.\n * Will force a fallback to using GitHub release notes\n */\nexport function shouldSkipChangelogMd(repository: string): boolean {\n return repositoriesToSkipMdFetching.includes(repository);\n}\n\nfunction getNotesSourceUrl(\n baseUrl: string,\n repository: string,\n project: ChangeLogProject,\n changelogFile: string,\n): string {\n if (project.type === 'bitbucket-server') {\n const [projectKey, repositorySlug] = repository.split('/');\n return joinUrlParts(\n baseUrl,\n 'projects',\n projectKey,\n 'repos',\n repositorySlug,\n 'browse',\n changelogFile,\n '?at=HEAD',\n );\n }\n\n return joinUrlParts(\n baseUrl,\n repository,\n project.type === 'bitbucket' ? 'src' : 'blob',\n 'HEAD',\n changelogFile,\n );\n}\n\nasync function linkifyBody(\n { baseUrl, repository }: ChangeLogProject,\n bodyStr: string,\n): Promise<string> {\n const body = massageBody(bodyStr, baseUrl);\n if (body?.length) {\n try {\n return await linkify(body, {\n repository: `${baseUrl}${repository}`,\n });\n } catch (err) /* istanbul ignore next */ {\n logger.warn({ body, err }, 'linkify error');\n }\n }\n return body;\n}\n"],"mappings":"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"}
|
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.141.
|
|
4
|
+
"version": "43.141.2",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"renovate": "dist/renovate.js",
|
|
@@ -122,7 +122,7 @@
|
|
|
122
122
|
"@renovatebot/pgp": "1.3.7",
|
|
123
123
|
"@renovatebot/ruby-semver": "4.1.2",
|
|
124
124
|
"@sindresorhus/is": "7.2.0",
|
|
125
|
-
"@yarnpkg/core": "4.
|
|
125
|
+
"@yarnpkg/core": "4.7.0",
|
|
126
126
|
"@yarnpkg/parsers": "3.0.3",
|
|
127
127
|
"ae-cvss-calculator": "1.0.12",
|
|
128
128
|
"agentkeepalive": "4.6.0",
|
|
@@ -270,7 +270,7 @@
|
|
|
270
270
|
"lint-staged": "16.4.0",
|
|
271
271
|
"markdownlint-cli2": "0.22.0",
|
|
272
272
|
"markdownlint-cli2-formatter-template": "0.0.4",
|
|
273
|
-
"memfs": "4.57.
|
|
273
|
+
"memfs": "4.57.2",
|
|
274
274
|
"nock": "14.0.12",
|
|
275
275
|
"npm-run-all2": "8.0.4",
|
|
276
276
|
"nyc": "18.0.0",
|
|
@@ -280,9 +280,9 @@
|
|
|
280
280
|
"semantic-release": "25.0.3",
|
|
281
281
|
"tar": "7.5.13",
|
|
282
282
|
"tmp-promise": "3.0.3",
|
|
283
|
-
"tsdown": "0.21.
|
|
284
|
-
"type-fest": "5.
|
|
285
|
-
"typescript": "6.0.
|
|
283
|
+
"tsdown": "0.21.8",
|
|
284
|
+
"type-fest": "5.6.0",
|
|
285
|
+
"typescript": "6.0.3",
|
|
286
286
|
"unified": "11.0.5",
|
|
287
287
|
"vite": "8.0.5",
|
|
288
288
|
"vitest": "4.1.4",
|
package/renovate-schema.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$id": "https://docs.renovatebot.com/renovate-schema.json",
|
|
3
|
-
"title": "JSON schema for Renovate 43.141.
|
|
3
|
+
"title": "JSON schema for Renovate 43.141.2 config files (https://renovatebot.com/)",
|
|
4
4
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
5
|
-
"x-renovate-version": "43.141.
|
|
5
|
+
"x-renovate-version": "43.141.2",
|
|
6
6
|
"allowComments": true,
|
|
7
7
|
"type": "object",
|
|
8
8
|
"properties": {
|