renovate 44.33.2 → 44.34.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.
- package/dist/config/types.d.ts +2 -1
- package/dist/config/types.js.map +1 -1
- package/dist/config/validation-helpers/match-base-branches.js +2 -1
- package/dist/config/validation-helpers/match-base-branches.js.map +1 -1
- package/dist/config/validation-helpers/regex-glob-matchers.js +4 -3
- package/dist/config/validation-helpers/regex-glob-matchers.js.map +1 -1
- package/dist/config/validation-helpers/types.d.ts +17 -0
- package/dist/config/validation-helpers/types.js +16 -0
- package/dist/config/validation-helpers/types.js.map +1 -0
- package/dist/config/validation-helpers/utils.js +12 -11
- package/dist/config/validation-helpers/utils.js.map +1 -1
- package/dist/config/validation.js +80 -79
- package/dist/config/validation.js.map +1 -1
- package/dist/modules/manager/fingerprint.generated.js +1 -1
- package/dist/modules/manager/fingerprint.generated.js.map +1 -1
- package/dist/modules/manager/poetry/artifacts.js +15 -8
- package/dist/modules/manager/poetry/artifacts.js.map +1 -1
- package/dist/modules/manager/types.d.ts +1 -0
- package/dist/workers/repository/update/pr/changelog/bitbucket/source.js +4 -0
- package/dist/workers/repository/update/pr/changelog/bitbucket/source.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/bitbucket-server/source.js +5 -1
- package/dist/workers/repository/update/pr/changelog/bitbucket-server/source.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/release-notes.js +7 -13
- package/dist/workers/repository/update/pr/changelog/release-notes.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/source.js +17 -3
- package/dist/workers/repository/update/pr/changelog/source.js.map +1 -1
- package/package.json +4 -4
- package/renovate-schema.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.js","names":[],"sources":["../../../../../../../lib/workers/repository/update/pr/changelog/bitbucket/source.ts"],"sourcesContent":["import type { BranchUpgradeConfig } from '../../../../../types.ts';\nimport { ChangeLogSource } from '../source.ts';\n\nexport class BitbucketChangeLogSource extends ChangeLogSource {\n constructor() {\n super('bitbucket', 'bitbucket-tags');\n }\n\n getAPIBaseUrl(_config: BranchUpgradeConfig): string {\n return 'https://api.bitbucket.org/';\n }\n\n getCompareURL(\n baseUrl: string,\n repository: string,\n prevHead: string,\n nextHead: string,\n ): string {\n return `${baseUrl}${repository}/branches/compare/${nextHead}%0D${prevHead}`;\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"source.js","names":[],"sources":["../../../../../../../lib/workers/repository/update/pr/changelog/bitbucket/source.ts"],"sourcesContent":["import { joinUrlParts } from '../../../../../../util/url.ts';\nimport type { BranchUpgradeConfig } from '../../../../../types.ts';\nimport { ChangeLogSource } from '../source.ts';\n\nexport class BitbucketChangeLogSource extends ChangeLogSource {\n constructor() {\n super('bitbucket', 'bitbucket-tags');\n }\n\n getAPIBaseUrl(_config: BranchUpgradeConfig): string {\n return 'https://api.bitbucket.org/';\n }\n\n getCompareURL(\n baseUrl: string,\n repository: string,\n prevHead: string,\n nextHead: string,\n ): string {\n return `${baseUrl}${repository}/branches/compare/${nextHead}%0D${prevHead}`;\n }\n\n override getNotesSourceUrl(\n baseUrl: string,\n repository: string,\n changelogFile: string,\n ): string {\n return joinUrlParts(baseUrl, repository, 'src', 'HEAD', changelogFile);\n }\n}\n"],"mappings":";;;AAIA,IAAa,2BAAb,cAA8C,gBAAgB;CAC5D,cAAc;EACZ,MAAM,aAAa,gBAAgB;CACrC;CAEA,cAAc,SAAsC;EAClD,OAAO;CACT;CAEA,cACE,SACA,YACA,UACA,UACQ;EACR,OAAO,GAAG,UAAU,WAAW,oBAAoB,SAAS,KAAK;CACnE;CAEA,kBACE,SACA,YACA,eACQ;EACR,OAAO,aAAa,SAAS,YAAY,OAAO,QAAQ,aAAa;CACvE;AACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { regEx } from "../../../../../../util/regex.js";
|
|
2
|
-
import { parseUrl } from "../../../../../../util/url.js";
|
|
2
|
+
import { joinUrlParts, parseUrl } from "../../../../../../util/url.js";
|
|
3
3
|
import { ChangeLogSource } from "../source.js";
|
|
4
4
|
//#region lib/workers/repository/update/pr/changelog/bitbucket-server/source.ts
|
|
5
5
|
const subfolderRegex = regEx("(?<subfolder>.+/)(?:projects|scm)/");
|
|
@@ -33,6 +33,10 @@ var BitbucketServerChangeLogSource = class extends ChangeLogSource {
|
|
|
33
33
|
}
|
|
34
34
|
return "";
|
|
35
35
|
}
|
|
36
|
+
getNotesSourceUrl(baseUrl, repository, changelogFile) {
|
|
37
|
+
const [projectKey, repositorySlug] = repository.split("/");
|
|
38
|
+
return joinUrlParts(baseUrl, "projects", projectKey, "repos", repositorySlug, "browse", changelogFile, "?at=HEAD");
|
|
39
|
+
}
|
|
36
40
|
};
|
|
37
41
|
//#endregion
|
|
38
42
|
export { BitbucketServerChangeLogSource };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.js","names":[],"sources":["../../../../../../../lib/workers/repository/update/pr/changelog/bitbucket-server/source.ts"],"sourcesContent":["import { regEx } from '../../../../../../util/regex.ts';\nimport { parseUrl } from '../../../../../../util/url.ts';\nimport type { BranchUpgradeConfig } from '../../../../../types.ts';\nimport { ChangeLogSource } from '../source.ts';\n\nconst subfolderRegex = regEx('(?<subfolder>.+/)(?:projects|scm)/');\nconst gitUrlRegex = regEx('/(?<project>[^/]+)/(?<repo>[^/]+)\\\\.git$');\nconst webUrlRegex = regEx('/projects/(?<project>[^/]+)/repos/(?<repo>[^/]+)');\n\nexport class BitbucketServerChangeLogSource extends ChangeLogSource {\n constructor() {\n super('bitbucket-server', 'bitbucket-server-tags');\n }\n\n override getBaseUrl(config: BranchUpgradeConfig): string {\n const parsedUrl = parseUrl(config.sourceUrl);\n if (parsedUrl?.host) {\n const protocol = parsedUrl.protocol.replace(regEx(/^git\\+/), '');\n const match = subfolderRegex.exec(parsedUrl.pathname);\n const subfolder = match?.groups?.subfolder ?? '/';\n\n return `${protocol}//${parsedUrl.host}${subfolder}`;\n }\n\n return '';\n }\n\n getAPIBaseUrl(config: BranchUpgradeConfig): string {\n return `${this.getBaseUrl(config)}rest/api/1.0/`;\n }\n\n getCompareURL(\n baseUrl: string,\n repository: string,\n prevHead: string,\n nextHead: string,\n ): string {\n const [projectKey, repositorySlug] = repository.split('/');\n return `${baseUrl}projects/${projectKey}/repos/${repositorySlug}/compare/commits?sourceBranch=${nextHead}&targetBranch=${prevHead}`;\n }\n\n override getRepositoryFromUrl(config: BranchUpgradeConfig): string {\n const parsedUrl = parseUrl(config.sourceUrl);\n if (parsedUrl) {\n const repositoryRegex = parsedUrl.pathname.endsWith('.git')\n ? gitUrlRegex\n : webUrlRegex;\n const match = repositoryRegex.exec(parsedUrl.pathname);\n if (match?.groups) {\n return `${match.groups.project}/${match.groups.repo}`;\n }\n }\n\n return '';\n }\n}\n"],"mappings":";;;;AAKA,MAAM,iBAAiB,MAAM,oCAAoC;AACjE,MAAM,cAAc,MAAM,0CAA0C;AACpE,MAAM,cAAc,MAAM,kDAAkD;AAE5E,IAAa,iCAAb,cAAoD,gBAAgB;CAClE,cAAc;EACZ,MAAM,oBAAoB,uBAAuB;CACnD;CAEA,WAAoB,QAAqC;EACvD,MAAM,YAAY,SAAS,OAAO,SAAS;EAC3C,IAAI,WAAW,MAAM;GACnB,MAAM,WAAW,UAAU,SAAS,QAAQ,MAAM,QAAQ,GAAG,EAAE;GAE/D,MAAM,YADQ,eAAe,KAAK,UAAU,QACtB,CAAC,EAAE,QAAQ,aAAa;GAE9C,OAAO,GAAG,SAAS,IAAI,UAAU,OAAO;EAC1C;EAEA,OAAO;CACT;CAEA,cAAc,QAAqC;EACjD,OAAO,GAAG,KAAK,WAAW,MAAM,EAAE;CACpC;CAEA,cACE,SACA,YACA,UACA,UACQ;EACR,MAAM,CAAC,YAAY,kBAAkB,WAAW,MAAM,GAAG;EACzD,OAAO,GAAG,QAAQ,WAAW,WAAW,SAAS,eAAe,gCAAgC,SAAS,gBAAgB;CAC3H;CAEA,qBAA8B,QAAqC;EACjE,MAAM,YAAY,SAAS,OAAO,SAAS;EAC3C,IAAI,WAAW;GAIb,MAAM,SAHkB,UAAU,SAAS,SAAS,MAAM,IACtD,cACA,YAAA,CAC0B,KAAK,UAAU,QAAQ;GACrD,IAAI,OAAO,QACT,OAAO,GAAG,MAAM,OAAO,QAAQ,GAAG,MAAM,OAAO;EAEnD;EAEA,OAAO;CACT;AACF"}
|
|
1
|
+
{"version":3,"file":"source.js","names":[],"sources":["../../../../../../../lib/workers/repository/update/pr/changelog/bitbucket-server/source.ts"],"sourcesContent":["import { regEx } from '../../../../../../util/regex.ts';\nimport { joinUrlParts, parseUrl } from '../../../../../../util/url.ts';\nimport type { BranchUpgradeConfig } from '../../../../../types.ts';\nimport { ChangeLogSource } from '../source.ts';\n\nconst subfolderRegex = regEx('(?<subfolder>.+/)(?:projects|scm)/');\nconst gitUrlRegex = regEx('/(?<project>[^/]+)/(?<repo>[^/]+)\\\\.git$');\nconst webUrlRegex = regEx('/projects/(?<project>[^/]+)/repos/(?<repo>[^/]+)');\n\nexport class BitbucketServerChangeLogSource extends ChangeLogSource {\n constructor() {\n super('bitbucket-server', 'bitbucket-server-tags');\n }\n\n override getBaseUrl(config: BranchUpgradeConfig): string {\n const parsedUrl = parseUrl(config.sourceUrl);\n if (parsedUrl?.host) {\n const protocol = parsedUrl.protocol.replace(regEx(/^git\\+/), '');\n const match = subfolderRegex.exec(parsedUrl.pathname);\n const subfolder = match?.groups?.subfolder ?? '/';\n\n return `${protocol}//${parsedUrl.host}${subfolder}`;\n }\n\n return '';\n }\n\n getAPIBaseUrl(config: BranchUpgradeConfig): string {\n return `${this.getBaseUrl(config)}rest/api/1.0/`;\n }\n\n getCompareURL(\n baseUrl: string,\n repository: string,\n prevHead: string,\n nextHead: string,\n ): string {\n const [projectKey, repositorySlug] = repository.split('/');\n return `${baseUrl}projects/${projectKey}/repos/${repositorySlug}/compare/commits?sourceBranch=${nextHead}&targetBranch=${prevHead}`;\n }\n\n override getRepositoryFromUrl(config: BranchUpgradeConfig): string {\n const parsedUrl = parseUrl(config.sourceUrl);\n if (parsedUrl) {\n const repositoryRegex = parsedUrl.pathname.endsWith('.git')\n ? gitUrlRegex\n : webUrlRegex;\n const match = repositoryRegex.exec(parsedUrl.pathname);\n if (match?.groups) {\n return `${match.groups.project}/${match.groups.repo}`;\n }\n }\n\n return '';\n }\n\n override getNotesSourceUrl(\n baseUrl: string,\n repository: string,\n changelogFile: string,\n ): string {\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"],"mappings":";;;;AAKA,MAAM,iBAAiB,MAAM,oCAAoC;AACjE,MAAM,cAAc,MAAM,0CAA0C;AACpE,MAAM,cAAc,MAAM,kDAAkD;AAE5E,IAAa,iCAAb,cAAoD,gBAAgB;CAClE,cAAc;EACZ,MAAM,oBAAoB,uBAAuB;CACnD;CAEA,WAAoB,QAAqC;EACvD,MAAM,YAAY,SAAS,OAAO,SAAS;EAC3C,IAAI,WAAW,MAAM;GACnB,MAAM,WAAW,UAAU,SAAS,QAAQ,MAAM,QAAQ,GAAG,EAAE;GAE/D,MAAM,YADQ,eAAe,KAAK,UAAU,QACtB,CAAC,EAAE,QAAQ,aAAa;GAE9C,OAAO,GAAG,SAAS,IAAI,UAAU,OAAO;EAC1C;EAEA,OAAO;CACT;CAEA,cAAc,QAAqC;EACjD,OAAO,GAAG,KAAK,WAAW,MAAM,EAAE;CACpC;CAEA,cACE,SACA,YACA,UACA,UACQ;EACR,MAAM,CAAC,YAAY,kBAAkB,WAAW,MAAM,GAAG;EACzD,OAAO,GAAG,QAAQ,WAAW,WAAW,SAAS,eAAe,gCAAgC,SAAS,gBAAgB;CAC3H;CAEA,qBAA8B,QAAqC;EACjE,MAAM,YAAY,SAAS,OAAO,SAAS;EAC3C,IAAI,WAAW;GAIb,MAAM,SAHkB,UAAU,SAAS,SAAS,MAAM,IACtD,cACA,YAAA,CAC0B,KAAK,UAAU,QAAQ;GACrD,IAAI,OAAO,QACT,OAAO,GAAG,MAAM,OAAO,QAAQ,GAAG,MAAM,OAAO;EAEnD;EAEA,OAAO;CACT;CAEA,kBACE,SACA,YACA,eACQ;EACR,MAAM,CAAC,YAAY,kBAAkB,WAAW,MAAM,GAAG;EACzD,OAAO,aACL,SACA,YACA,YACA,SACA,gBACA,UACA,eACA,UACF;CACF;AACF"}
|
|
@@ -2,7 +2,7 @@ import { get, set } from "../../../../../util/cache/memory/index.js";
|
|
|
2
2
|
import { newlineRegex, regEx } from "../../../../../util/regex.js";
|
|
3
3
|
import { coerceString } from "../../../../../util/string.js";
|
|
4
4
|
import { logger } from "../../../../../logger/index.js";
|
|
5
|
-
import { isHttpUrl
|
|
5
|
+
import { isHttpUrl } from "../../../../../util/url.js";
|
|
6
6
|
import { detectPlatform } from "../../../../../util/common.js";
|
|
7
7
|
import { get as get$1, set as set$1 } from "../../../../../util/cache/package/index.js";
|
|
8
8
|
import { linkify } from "../../../../../util/markdown.js";
|
|
@@ -192,7 +192,7 @@ function getReleaseNotesMdFile(project) {
|
|
|
192
192
|
set(cacheKey, promisedRes);
|
|
193
193
|
return promisedRes;
|
|
194
194
|
}
|
|
195
|
-
async function getReleaseNotesMd(project, release) {
|
|
195
|
+
async function getReleaseNotesMd(project, release, source) {
|
|
196
196
|
const { baseUrl, repository, packageName } = project;
|
|
197
197
|
const version = release.version;
|
|
198
198
|
logger.trace(`getReleaseNotesMd(${repository}, ${version})`);
|
|
@@ -213,10 +213,11 @@ async function getReleaseNotesMd(project, release) {
|
|
|
213
213
|
const changelogParsed = sectionize(changelogMd, level);
|
|
214
214
|
if (changelogParsed.length >= 2) for (const section of changelogParsed) try {
|
|
215
215
|
const [heading] = section.replace(regEx(/[[\]()]/g), " ").split(newlineRegex);
|
|
216
|
+
const [parenthesizedHeading] = section.split(newlineRegex);
|
|
216
217
|
const title = heading.replace(regEx(/^\s*#*\s*/), "").split(" ").filter(isTruthy);
|
|
217
218
|
const body = section.replace(regEx(/.*?\n(-{3,}\n)?/), "").trim();
|
|
218
|
-
const notesSourceUrl = getNotesSourceUrl(baseUrl, repository,
|
|
219
|
-
const url =
|
|
219
|
+
const notesSourceUrl = source.getNotesSourceUrl(baseUrl, repository, changelogFile);
|
|
220
|
+
const url = source.getReleaseNotesMdAnchorUrl(notesSourceUrl, parenthesizedHeading);
|
|
220
221
|
for (const word of title) if (word.includes(version) && !isHttpUrl(word)) {
|
|
221
222
|
logger.trace({ body }, `Found release notes for v${version}`);
|
|
222
223
|
return {
|
|
@@ -265,7 +266,7 @@ function releaseNotesCacheMinutes(releaseDate) {
|
|
|
265
266
|
if (now.diff(dt, "months").months < 6) return 1435;
|
|
266
267
|
return 14495;
|
|
267
268
|
}
|
|
268
|
-
async function addReleaseNotes(input, config) {
|
|
269
|
+
async function addReleaseNotes(input, config, source) {
|
|
269
270
|
if (!input?.versions || !input.project?.type) {
|
|
270
271
|
logger.debug("Missing project or versions");
|
|
271
272
|
return input ?? null;
|
|
@@ -283,7 +284,7 @@ async function addReleaseNotes(input, config) {
|
|
|
283
284
|
const gitRefCachePart = v.gitRef ? `:${v.gitRef}` : "";
|
|
284
285
|
const cacheKey = `${cacheKeyPrefix}:${v.version}${gitRefCachePart}`;
|
|
285
286
|
releaseNotes = await get$1(cacheNamespace, cacheKey);
|
|
286
|
-
releaseNotes ??= await getReleaseNotesMd(input.project, v);
|
|
287
|
+
releaseNotes ??= await getReleaseNotesMd(input.project, v, source);
|
|
287
288
|
releaseNotes ??= await getReleaseNotes(input.project, v, config);
|
|
288
289
|
if (!releaseNotes && v.compare.url) releaseNotes = {
|
|
289
290
|
url: v.compare.url,
|
|
@@ -306,13 +307,6 @@ async function addReleaseNotes(input, config) {
|
|
|
306
307
|
function shouldSkipChangelogMd(repository) {
|
|
307
308
|
return repositoriesToSkipMdFetching.includes(repository);
|
|
308
309
|
}
|
|
309
|
-
function getNotesSourceUrl(baseUrl, repository, project, changelogFile) {
|
|
310
|
-
if (project.type === "bitbucket-server") {
|
|
311
|
-
const [projectKey, repositorySlug] = repository.split("/");
|
|
312
|
-
return joinUrlParts(baseUrl, "projects", projectKey, "repos", repositorySlug, "browse", changelogFile, "?at=HEAD");
|
|
313
|
-
}
|
|
314
|
-
return joinUrlParts(baseUrl, repository, project.type === "bitbucket" ? "src" : "blob", "HEAD", changelogFile);
|
|
315
|
-
}
|
|
316
310
|
async function linkifyBody({ baseUrl, repository }, bodyStr) {
|
|
317
311
|
const body = massageBody(bodyStr, baseUrl);
|
|
318
312
|
if (body?.length) try {
|
|
@@ -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, isTruthy, 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 = [\n 'facebook/react-native',\n 'react/react-native',\n];\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(isTruthy);\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 gitRefCachePart = v.gitRef ? `:${v.gitRef}` : '';\n const cacheKey = `${cacheKeyPrefix}:${v.version}${gitRefCachePart}`;\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, isTruthy, 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 } 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 { ChangeLogSource } from './source.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 = [\n 'facebook/react-native',\n 'react/react-native',\n];\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 source: ChangeLogSource,\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 [parenthesizedHeading] = section.split(newlineRegex);\n const title = heading\n .replace(regEx(/^\\s*#*\\s*/), '')\n .split(' ')\n .filter(isTruthy);\n const body = section.replace(regEx(/.*?\\n(-{3,}\\n)?/), '').trim();\n const notesSourceUrl = source.getNotesSourceUrl(\n baseUrl,\n repository,\n changelogFile,\n );\n const url = source.getReleaseNotesMdAnchorUrl(\n notesSourceUrl,\n parenthesizedHeading,\n );\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 source: ChangeLogSource,\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 gitRefCachePart = v.gitRef ? `:${v.gitRef}` : '';\n const cacheKey = `${cacheKeyPrefix}:${v.version}${gitRefCachePart}`;\n releaseNotes = await packageCache.get(cacheNamespace, cacheKey);\n releaseNotes ??= await getReleaseNotesMd(input.project, v, source);\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\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,6 +1,6 @@
|
|
|
1
1
|
import { regEx } from "../../../../../util/regex.js";
|
|
2
2
|
import { logger } from "../../../../../logger/index.js";
|
|
3
|
-
import { parseUrl, trimSlashes } from "../../../../../util/url.js";
|
|
3
|
+
import { isHttpUrl, joinUrlParts, parseUrl, trimSlashes } from "../../../../../util/url.js";
|
|
4
4
|
import { get } from "../../../../../modules/versioning/index.js";
|
|
5
5
|
import { get as get$1, set } from "../../../../../util/cache/package/index.js";
|
|
6
6
|
import { getPkgReleases } from "../../../../../modules/datasource/index.js";
|
|
@@ -8,7 +8,7 @@ import { memoize } from "../../../../../util/memoize.js";
|
|
|
8
8
|
import { slugifyUrl } from "./common.js";
|
|
9
9
|
import { addReleaseNotes } from "./release-notes.js";
|
|
10
10
|
import { getInRangeReleases } from "./releases.js";
|
|
11
|
-
import { isEmptyArray, isFalsy, isNonEmptyString, isNullOrUndefined } from "@sindresorhus/is";
|
|
11
|
+
import { isEmptyArray, isFalsy, isNonEmptyString, isNullOrUndefined, isTruthy } from "@sindresorhus/is";
|
|
12
12
|
//#region lib/workers/repository/update/pr/changelog/source.ts
|
|
13
13
|
var ChangeLogSource = class {
|
|
14
14
|
cacheNamespace;
|
|
@@ -104,7 +104,7 @@ var ChangeLogSource = class {
|
|
|
104
104
|
},
|
|
105
105
|
versions: changelogReleases
|
|
106
106
|
};
|
|
107
|
-
res = await addReleaseNotes(res, config);
|
|
107
|
+
res = await addReleaseNotes(res, config, this);
|
|
108
108
|
return res;
|
|
109
109
|
}
|
|
110
110
|
findTagOfRelease(versioningApi, packageName, depName, depNewVersion, tags) {
|
|
@@ -145,6 +145,20 @@ var ChangeLogSource = class {
|
|
|
145
145
|
hasValidRepository(repository) {
|
|
146
146
|
return repository.split("/").length === 2;
|
|
147
147
|
}
|
|
148
|
+
/**
|
|
149
|
+
* Build the URL to the changelog markdown file for the release notes.
|
|
150
|
+
* Platform sources can override this to match their web UI conventions.
|
|
151
|
+
*/
|
|
152
|
+
getNotesSourceUrl(baseUrl, repository, changelogFile) {
|
|
153
|
+
return joinUrlParts(baseUrl, repository, "blob", "HEAD", changelogFile);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Build the URL pointing to a specific heading within the changelog markdown
|
|
157
|
+
* file. Platform sources can override this to match their anchor conventions.
|
|
158
|
+
*/
|
|
159
|
+
getReleaseNotesMdAnchorUrl(notesSourceUrl, heading) {
|
|
160
|
+
return `${notesSourceUrl}#${heading.replace(regEx(/[[\]()]/g), " ").replace(regEx(/^\s*#*\s*/), "").split(" ").filter(isTruthy).filter((word) => !isHttpUrl(word)).join("-").replace(regEx(/[^A-Za-z0-9-]/g), "")}`;
|
|
161
|
+
}
|
|
148
162
|
};
|
|
149
163
|
//#endregion
|
|
150
164
|
export { ChangeLogSource };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.js","names":["allVersioning.get","packageCache.get","packageCache.set"],"sources":["../../../../../../lib/workers/repository/update/pr/changelog/source.ts"],"sourcesContent":["import {\n isEmptyArray,\n isFalsy,\n isNonEmptyString,\n isNullOrUndefined,\n} from '@sindresorhus/is';\nimport { logger } from '../../../../../logger/index.ts';\nimport { getPkgReleases } from '../../../../../modules/datasource/index.ts';\nimport type { Release } from '../../../../../modules/datasource/types.ts';\nimport * as allVersioning from '../../../../../modules/versioning/index.ts';\nimport * as packageCache from '../../../../../util/cache/package/index.ts';\nimport type { PackageCacheNamespace } from '../../../../../util/cache/package/types.ts';\nimport { memoize } from '../../../../../util/memoize.ts';\nimport { regEx } from '../../../../../util/regex.ts';\nimport { parseUrl, trimSlashes } from '../../../../../util/url.ts';\nimport type { BranchUpgradeConfig } from '../../../../types.ts';\nimport { slugifyUrl } from './common.ts';\nimport { addReleaseNotes } from './release-notes.ts';\nimport { getInRangeReleases } from './releases.ts';\nimport type {\n ChangeLogError,\n ChangeLogPlatform,\n ChangeLogRelease,\n ChangeLogResult,\n} from './types.ts';\n\nexport abstract class ChangeLogSource {\n private readonly cacheNamespace: PackageCacheNamespace;\n private readonly platform: ChangeLogPlatform;\n private readonly datasource:\n | 'bitbucket-tags'\n | 'bitbucket-server-tags'\n | 'forgejo-tags'\n | 'gitea-tags'\n | 'github-tags'\n | 'gitlab-tags';\n\n constructor(\n platform: ChangeLogPlatform,\n datasource:\n | 'bitbucket-tags'\n | 'bitbucket-server-tags'\n | 'forgejo-tags'\n | 'gitea-tags'\n | 'github-tags'\n | 'gitlab-tags',\n ) {\n this.platform = platform;\n this.datasource = datasource;\n this.cacheNamespace = `changelog-${platform}-release`;\n }\n\n abstract getCompareURL(\n baseUrl: string,\n repository: string,\n prevHead: string,\n nextHead: string,\n ): string;\n\n abstract getAPIBaseUrl(config: BranchUpgradeConfig): string;\n\n async getAllTags(endpoint: string, repository: string): Promise<string[]> {\n const tags = (\n await getPkgReleases({\n registryUrls: [endpoint],\n datasource: this.datasource,\n packageName: repository,\n versioning:\n 'regex:(?<major>\\\\d+)(\\\\.(?<minor>\\\\d+))?(\\\\.(?<patch>\\\\d+))?',\n })\n )?.releases;\n\n if (isNullOrUndefined(tags) || isEmptyArray(tags)) {\n logger.debug(\n `No ${this.datasource} tags found for repository: ${repository}`,\n );\n\n return [];\n }\n\n return tags.map(({ version }) => version);\n }\n\n public async getChangeLogJSON(\n config: BranchUpgradeConfig,\n ): Promise<ChangeLogResult | null> {\n logger.trace(`getChangeLogJSON for ${this.platform}`);\n\n const versioning = config.versioning!;\n const currentVersion = config.currentVersion!;\n const newVersion = config.newVersion!;\n const sourceUrl = config.sourceUrl!;\n const packageName = config.packageName!;\n const depName = config.depName!;\n const sourceDirectory = config.sourceDirectory;\n const versioningApi = allVersioning.get(versioning);\n\n if (this.shouldSkipPackage(config)) {\n return null;\n }\n\n const baseUrl = this.getBaseUrl(config);\n const apiBaseUrl = this.getAPIBaseUrl(config);\n const repository = this.getRepositoryFromUrl(config);\n\n const tokenResponse = this.hasValidToken(config);\n if (!tokenResponse.isValid) {\n if (tokenResponse.error) {\n return {\n error: tokenResponse.error,\n };\n }\n return null;\n }\n\n if (isFalsy(this.hasValidRepository(repository))) {\n logger.debug(`Invalid ${this.platform} URL found: ${sourceUrl}`);\n return null;\n }\n\n const releases = config.releases ?? (await getInRangeReleases(config));\n if (!releases?.length) {\n logger.debug('No releases');\n return null;\n }\n // This extra filter/sort should not be necessary, but better safe than sorry\n const validReleases = [...releases]\n .filter((release) => versioningApi.isVersion(release.version))\n .sort((a, b) => versioningApi.sortVersions(a.version, b.version));\n\n if (validReleases.length < 2) {\n logger.debug(\n `Not enough valid releases for dep ${depName} (${packageName})`,\n );\n return null;\n }\n\n const changelogReleases: ChangeLogRelease[] = [];\n\n // Check if `v` belongs to the range (currentVersion, newVersion]\n function inRange(v: string): boolean {\n return (\n versioningApi.isGreaterThan(v, currentVersion) &&\n !versioningApi.isGreaterThan(v, newVersion)\n );\n }\n\n const getTags = memoize(() => this.getAllTags(apiBaseUrl, repository));\n for (let i = 1; i < validReleases.length; i += 1) {\n const prev = validReleases[i - 1];\n const next = validReleases[i];\n if (!inRange(next.version)) {\n continue;\n }\n let release = await packageCache.get(\n this.cacheNamespace,\n this.getCacheKey(sourceUrl, packageName, prev.version, next.version),\n );\n if (!release) {\n release = {\n version: next.version,\n date: next.releaseTimestamp,\n gitRef: next.gitRef,\n // put empty changes so that existing templates won't break\n changes: [],\n compare: {},\n };\n const tags = await getTags();\n const prevHead = this.getRef(\n versioningApi,\n packageName,\n depName,\n prev,\n tags,\n );\n const nextHead = this.getRef(\n versioningApi,\n packageName,\n depName,\n next,\n tags,\n );\n if (isNonEmptyString(prevHead) && isNonEmptyString(nextHead)) {\n release.compare.url = this.getCompareURL(\n baseUrl,\n repository,\n prevHead,\n nextHead,\n );\n }\n const cacheMinutes = 55;\n await packageCache.set(\n this.cacheNamespace,\n this.getCacheKey(sourceUrl, packageName, prev.version, next.version),\n release,\n cacheMinutes,\n );\n }\n changelogReleases.unshift(release);\n }\n\n let res: ChangeLogResult | null = {\n project: {\n apiBaseUrl,\n baseUrl,\n type: this.platform,\n repository,\n sourceUrl,\n sourceDirectory,\n packageName,\n depName,\n },\n versions: changelogReleases,\n };\n\n res = await addReleaseNotes(res, config);\n\n return res;\n }\n\n private findTagOfRelease(\n versioningApi: allVersioning.VersioningApi,\n packageName: string,\n depName: string,\n depNewVersion: string,\n tags: string[],\n ): string | undefined {\n const releaseRegexPrefix = `^(?:${packageName}|${depName}|release)[@_-]v?`;\n const regex = regEx(releaseRegexPrefix, undefined, false);\n const exactReleaseRegex = regEx(`${releaseRegexPrefix}${depNewVersion}`);\n const exactTagsList = tags.filter((tag) => {\n return exactReleaseRegex.test(tag);\n });\n const tagList = exactTagsList.length ? exactTagsList : tags;\n return tagList\n .filter((tag) => versioningApi.isVersion(tag.replace(regex, '')))\n .find((tag) =>\n versioningApi.equals(tag.replace(regex, ''), depNewVersion),\n );\n }\n\n private getRef(\n versioningApi: allVersioning.VersioningApi,\n packageName: string,\n depName: string,\n release: Release,\n tags: string[],\n ): string | null {\n const tagName = this.findTagOfRelease(\n versioningApi,\n packageName,\n depName,\n release.version,\n tags,\n );\n if (isNonEmptyString(tagName)) {\n return tagName;\n }\n if (isNonEmptyString(release.gitRef)) {\n return release.gitRef;\n }\n return null;\n }\n\n private getCacheKey(\n sourceUrl: string,\n packageName: string,\n prev: string,\n next: string,\n ): string {\n return `${slugifyUrl(sourceUrl)}:${packageName}:${prev}:${next}`;\n }\n\n getBaseUrl(config: BranchUpgradeConfig): string {\n const parsedUrl = parseUrl(config.sourceUrl);\n if (isNullOrUndefined(parsedUrl)) {\n return '';\n }\n const protocol = parsedUrl.protocol.replace(regEx(/^git\\+/), '');\n const host = parsedUrl.host;\n return `${protocol}//${host}/`;\n }\n\n getRepositoryFromUrl(config: BranchUpgradeConfig): string {\n const parsedUrl = parseUrl(config.sourceUrl);\n if (isNullOrUndefined(parsedUrl)) {\n return '';\n }\n const pathname = parsedUrl.pathname;\n return trimSlashes(pathname).replace(regEx(/\\.git$/), '');\n }\n\n protected hasValidToken(_config: BranchUpgradeConfig): {\n isValid: boolean;\n error?: ChangeLogError;\n } {\n return { isValid: true };\n }\n\n protected shouldSkipPackage(_config: BranchUpgradeConfig): boolean {\n return false;\n }\n\n hasValidRepository(repository: string): boolean {\n return repository.split('/').length === 2;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"source.js","names":["allVersioning.get","packageCache.get","packageCache.set"],"sources":["../../../../../../lib/workers/repository/update/pr/changelog/source.ts"],"sourcesContent":["import {\n isEmptyArray,\n isFalsy,\n isNonEmptyString,\n isNullOrUndefined,\n isTruthy,\n} from '@sindresorhus/is';\nimport { logger } from '../../../../../logger/index.ts';\nimport { getPkgReleases } from '../../../../../modules/datasource/index.ts';\nimport type { Release } from '../../../../../modules/datasource/types.ts';\nimport * as allVersioning from '../../../../../modules/versioning/index.ts';\nimport * as packageCache from '../../../../../util/cache/package/index.ts';\nimport type { PackageCacheNamespace } from '../../../../../util/cache/package/types.ts';\nimport { memoize } from '../../../../../util/memoize.ts';\nimport { regEx } from '../../../../../util/regex.ts';\nimport {\n isHttpUrl,\n joinUrlParts,\n parseUrl,\n trimSlashes,\n} from '../../../../../util/url.ts';\nimport type { BranchUpgradeConfig } from '../../../../types.ts';\nimport { slugifyUrl } from './common.ts';\nimport { addReleaseNotes } from './release-notes.ts';\nimport { getInRangeReleases } from './releases.ts';\nimport type {\n ChangeLogError,\n ChangeLogPlatform,\n ChangeLogRelease,\n ChangeLogResult,\n} from './types.ts';\n\nexport abstract class ChangeLogSource {\n private readonly cacheNamespace: PackageCacheNamespace;\n private readonly platform: ChangeLogPlatform;\n private readonly datasource:\n | 'bitbucket-tags'\n | 'bitbucket-server-tags'\n | 'forgejo-tags'\n | 'gitea-tags'\n | 'github-tags'\n | 'gitlab-tags';\n\n constructor(\n platform: ChangeLogPlatform,\n datasource:\n | 'bitbucket-tags'\n | 'bitbucket-server-tags'\n | 'forgejo-tags'\n | 'gitea-tags'\n | 'github-tags'\n | 'gitlab-tags',\n ) {\n this.platform = platform;\n this.datasource = datasource;\n this.cacheNamespace = `changelog-${platform}-release`;\n }\n\n abstract getCompareURL(\n baseUrl: string,\n repository: string,\n prevHead: string,\n nextHead: string,\n ): string;\n\n abstract getAPIBaseUrl(config: BranchUpgradeConfig): string;\n\n async getAllTags(endpoint: string, repository: string): Promise<string[]> {\n const tags = (\n await getPkgReleases({\n registryUrls: [endpoint],\n datasource: this.datasource,\n packageName: repository,\n versioning:\n 'regex:(?<major>\\\\d+)(\\\\.(?<minor>\\\\d+))?(\\\\.(?<patch>\\\\d+))?',\n })\n )?.releases;\n\n if (isNullOrUndefined(tags) || isEmptyArray(tags)) {\n logger.debug(\n `No ${this.datasource} tags found for repository: ${repository}`,\n );\n\n return [];\n }\n\n return tags.map(({ version }) => version);\n }\n\n public async getChangeLogJSON(\n config: BranchUpgradeConfig,\n ): Promise<ChangeLogResult | null> {\n logger.trace(`getChangeLogJSON for ${this.platform}`);\n\n const versioning = config.versioning!;\n const currentVersion = config.currentVersion!;\n const newVersion = config.newVersion!;\n const sourceUrl = config.sourceUrl!;\n const packageName = config.packageName!;\n const depName = config.depName!;\n const sourceDirectory = config.sourceDirectory;\n const versioningApi = allVersioning.get(versioning);\n\n if (this.shouldSkipPackage(config)) {\n return null;\n }\n\n const baseUrl = this.getBaseUrl(config);\n const apiBaseUrl = this.getAPIBaseUrl(config);\n const repository = this.getRepositoryFromUrl(config);\n\n const tokenResponse = this.hasValidToken(config);\n if (!tokenResponse.isValid) {\n if (tokenResponse.error) {\n return {\n error: tokenResponse.error,\n };\n }\n return null;\n }\n\n if (isFalsy(this.hasValidRepository(repository))) {\n logger.debug(`Invalid ${this.platform} URL found: ${sourceUrl}`);\n return null;\n }\n\n const releases = config.releases ?? (await getInRangeReleases(config));\n if (!releases?.length) {\n logger.debug('No releases');\n return null;\n }\n // This extra filter/sort should not be necessary, but better safe than sorry\n const validReleases = [...releases]\n .filter((release) => versioningApi.isVersion(release.version))\n .sort((a, b) => versioningApi.sortVersions(a.version, b.version));\n\n if (validReleases.length < 2) {\n logger.debug(\n `Not enough valid releases for dep ${depName} (${packageName})`,\n );\n return null;\n }\n\n const changelogReleases: ChangeLogRelease[] = [];\n\n // Check if `v` belongs to the range (currentVersion, newVersion]\n function inRange(v: string): boolean {\n return (\n versioningApi.isGreaterThan(v, currentVersion) &&\n !versioningApi.isGreaterThan(v, newVersion)\n );\n }\n\n const getTags = memoize(() => this.getAllTags(apiBaseUrl, repository));\n for (let i = 1; i < validReleases.length; i += 1) {\n const prev = validReleases[i - 1];\n const next = validReleases[i];\n if (!inRange(next.version)) {\n continue;\n }\n let release = await packageCache.get(\n this.cacheNamespace,\n this.getCacheKey(sourceUrl, packageName, prev.version, next.version),\n );\n if (!release) {\n release = {\n version: next.version,\n date: next.releaseTimestamp,\n gitRef: next.gitRef,\n // put empty changes so that existing templates won't break\n changes: [],\n compare: {},\n };\n const tags = await getTags();\n const prevHead = this.getRef(\n versioningApi,\n packageName,\n depName,\n prev,\n tags,\n );\n const nextHead = this.getRef(\n versioningApi,\n packageName,\n depName,\n next,\n tags,\n );\n if (isNonEmptyString(prevHead) && isNonEmptyString(nextHead)) {\n release.compare.url = this.getCompareURL(\n baseUrl,\n repository,\n prevHead,\n nextHead,\n );\n }\n const cacheMinutes = 55;\n await packageCache.set(\n this.cacheNamespace,\n this.getCacheKey(sourceUrl, packageName, prev.version, next.version),\n release,\n cacheMinutes,\n );\n }\n changelogReleases.unshift(release);\n }\n\n let res: ChangeLogResult | null = {\n project: {\n apiBaseUrl,\n baseUrl,\n type: this.platform,\n repository,\n sourceUrl,\n sourceDirectory,\n packageName,\n depName,\n },\n versions: changelogReleases,\n };\n\n res = await addReleaseNotes(res, config, this);\n\n return res;\n }\n\n private findTagOfRelease(\n versioningApi: allVersioning.VersioningApi,\n packageName: string,\n depName: string,\n depNewVersion: string,\n tags: string[],\n ): string | undefined {\n const releaseRegexPrefix = `^(?:${packageName}|${depName}|release)[@_-]v?`;\n const regex = regEx(releaseRegexPrefix, undefined, false);\n const exactReleaseRegex = regEx(`${releaseRegexPrefix}${depNewVersion}`);\n const exactTagsList = tags.filter((tag) => {\n return exactReleaseRegex.test(tag);\n });\n const tagList = exactTagsList.length ? exactTagsList : tags;\n return tagList\n .filter((tag) => versioningApi.isVersion(tag.replace(regex, '')))\n .find((tag) =>\n versioningApi.equals(tag.replace(regex, ''), depNewVersion),\n );\n }\n\n private getRef(\n versioningApi: allVersioning.VersioningApi,\n packageName: string,\n depName: string,\n release: Release,\n tags: string[],\n ): string | null {\n const tagName = this.findTagOfRelease(\n versioningApi,\n packageName,\n depName,\n release.version,\n tags,\n );\n if (isNonEmptyString(tagName)) {\n return tagName;\n }\n if (isNonEmptyString(release.gitRef)) {\n return release.gitRef;\n }\n return null;\n }\n\n private getCacheKey(\n sourceUrl: string,\n packageName: string,\n prev: string,\n next: string,\n ): string {\n return `${slugifyUrl(sourceUrl)}:${packageName}:${prev}:${next}`;\n }\n\n getBaseUrl(config: BranchUpgradeConfig): string {\n const parsedUrl = parseUrl(config.sourceUrl);\n if (isNullOrUndefined(parsedUrl)) {\n return '';\n }\n const protocol = parsedUrl.protocol.replace(regEx(/^git\\+/), '');\n const host = parsedUrl.host;\n return `${protocol}//${host}/`;\n }\n\n getRepositoryFromUrl(config: BranchUpgradeConfig): string {\n const parsedUrl = parseUrl(config.sourceUrl);\n if (isNullOrUndefined(parsedUrl)) {\n return '';\n }\n const pathname = parsedUrl.pathname;\n return trimSlashes(pathname).replace(regEx(/\\.git$/), '');\n }\n\n protected hasValidToken(_config: BranchUpgradeConfig): {\n isValid: boolean;\n error?: ChangeLogError;\n } {\n return { isValid: true };\n }\n\n protected shouldSkipPackage(_config: BranchUpgradeConfig): boolean {\n return false;\n }\n\n hasValidRepository(repository: string): boolean {\n return repository.split('/').length === 2;\n }\n\n /**\n * Build the URL to the changelog markdown file for the release notes.\n * Platform sources can override this to match their web UI conventions.\n */\n getNotesSourceUrl(\n baseUrl: string,\n repository: string,\n changelogFile: string,\n ): string {\n return joinUrlParts(baseUrl, repository, 'blob', 'HEAD', changelogFile);\n }\n\n /**\n * Build the URL pointing to a specific heading within the changelog markdown\n * file. Platform sources can override this to match their anchor conventions.\n */\n getReleaseNotesMdAnchorUrl(notesSourceUrl: string, heading: string): string {\n const mdHeadingLink = heading\n .replace(regEx(/[[\\]()]/g), ' ')\n .replace(regEx(/^\\s*#*\\s*/), '')\n .split(' ')\n .filter(isTruthy)\n .filter((word) => !isHttpUrl(word))\n .join('-')\n .replace(regEx(/[^A-Za-z0-9-]/g), '');\n return `${notesSourceUrl}#${mdHeadingLink}`;\n }\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": "44.
|
|
4
|
+
"version": "44.34.1",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"renovate": "dist/renovate.js",
|
|
@@ -130,7 +130,7 @@
|
|
|
130
130
|
"agentkeepalive": "4.6.0",
|
|
131
131
|
"async-mutex": "0.5.0",
|
|
132
132
|
"aws4": "1.13.2",
|
|
133
|
-
"azure-devops-node-api": "15.1.
|
|
133
|
+
"azure-devops-node-api": "15.1.3",
|
|
134
134
|
"bunyan": "1.8.15",
|
|
135
135
|
"cacache": "20.0.4",
|
|
136
136
|
"changelog-filename-regex": "2.0.1",
|
|
@@ -216,9 +216,10 @@
|
|
|
216
216
|
"@commander-js/extra-typings": "14.0.0",
|
|
217
217
|
"@containerbase/istanbul-reports-html": "2.0.16",
|
|
218
218
|
"@containerbase/semantic-release-pnpm": "1.4.3",
|
|
219
|
-
"@hyrious/marshal": "0.3.
|
|
219
|
+
"@hyrious/marshal": "0.3.4",
|
|
220
220
|
"@ls-lint/ls-lint": "2.3.1",
|
|
221
221
|
"@openpgp/web-stream-tools": "0.3.1",
|
|
222
|
+
"@oxlint/plugins": "1.72.0",
|
|
222
223
|
"@semantic-release/exec": "7.1.0",
|
|
223
224
|
"@smithy/util-stream": "4.7.16",
|
|
224
225
|
"@types/adm-zip": "0.5.8",
|
|
@@ -230,7 +231,6 @@
|
|
|
230
231
|
"@types/changelog-filename-regex": "2.0.2",
|
|
231
232
|
"@types/clean-git-ref": "2.0.2",
|
|
232
233
|
"@types/common-tags": "1.8.4",
|
|
233
|
-
"@types/eslint": "9.6.1",
|
|
234
234
|
"@types/estree": "1.0.9",
|
|
235
235
|
"@types/fs-extra": "11.0.4",
|
|
236
236
|
"@types/github-url-from-git": "1.5.3",
|
package/renovate-schema.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$id": "https://docs.renovatebot.com/renovate-schema.json",
|
|
3
|
-
"title": "JSON schema for Renovate 44.
|
|
3
|
+
"title": "JSON schema for Renovate 44.34.1 config files (https://renovatebot.com/)",
|
|
4
4
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
5
|
-
"x-renovate-version": "44.
|
|
5
|
+
"x-renovate-version": "44.34.1",
|
|
6
6
|
"allowComments": true,
|
|
7
7
|
"type": "object",
|
|
8
8
|
"definitions": {
|