renovate 44.33.2 → 44.34.0

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.
Files changed (28) hide show
  1. package/dist/config/types.d.ts +2 -1
  2. package/dist/config/types.js.map +1 -1
  3. package/dist/config/validation-helpers/match-base-branches.js +2 -1
  4. package/dist/config/validation-helpers/match-base-branches.js.map +1 -1
  5. package/dist/config/validation-helpers/regex-glob-matchers.js +4 -3
  6. package/dist/config/validation-helpers/regex-glob-matchers.js.map +1 -1
  7. package/dist/config/validation-helpers/types.d.ts +17 -0
  8. package/dist/config/validation-helpers/types.js +16 -0
  9. package/dist/config/validation-helpers/types.js.map +1 -0
  10. package/dist/config/validation-helpers/utils.js +12 -11
  11. package/dist/config/validation-helpers/utils.js.map +1 -1
  12. package/dist/config/validation.js +80 -79
  13. package/dist/config/validation.js.map +1 -1
  14. package/dist/modules/manager/fingerprint.generated.js +1 -1
  15. package/dist/modules/manager/fingerprint.generated.js.map +1 -1
  16. package/dist/modules/manager/poetry/artifacts.js +15 -8
  17. package/dist/modules/manager/poetry/artifacts.js.map +1 -1
  18. package/dist/modules/manager/types.d.ts +1 -0
  19. package/dist/workers/repository/update/pr/changelog/bitbucket/source.js +4 -0
  20. package/dist/workers/repository/update/pr/changelog/bitbucket/source.js.map +1 -1
  21. package/dist/workers/repository/update/pr/changelog/bitbucket-server/source.js +5 -1
  22. package/dist/workers/repository/update/pr/changelog/bitbucket-server/source.js.map +1 -1
  23. package/dist/workers/repository/update/pr/changelog/release-notes.js +7 -13
  24. package/dist/workers/repository/update/pr/changelog/release-notes.js.map +1 -1
  25. package/dist/workers/repository/update/pr/changelog/source.js +17 -3
  26. package/dist/workers/repository/update/pr/changelog/source.js.map +1 -1
  27. package/package.json +3 -3
  28. 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":";;AAGA,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;AACF"}
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, joinUrlParts } from "../../../../../util/url.js";
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, project, changelogFile);
219
- const url = `${notesSourceUrl}#${title.filter((word) => !isHttpUrl(word)).join("-").replace(regEx(/[^A-Za-z0-9-]/g), "")}`;
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":";;;;;;;;;;;;AAgCA,IAAsB,kBAAtB,MAAsC;CACpC;CACA;CACA;CAQA,YACE,UACA,YAOA;EACA,KAAK,WAAW;EAChB,KAAK,aAAa;EAClB,KAAK,iBAAiB,aAAa,SAAS;CAC9C;CAWA,MAAM,WAAW,UAAkB,YAAuC;EACxE,MAAM,QACJ,MAAM,eAAe;GACnB,cAAc,CAAC,QAAQ;GACvB,YAAY,KAAK;GACjB,aAAa;GACb,YACE;EACJ,CAAC,EAAA,EACA;EAEH,IAAI,kBAAkB,IAAI,KAAK,aAAa,IAAI,GAAG;GACjD,OAAO,MACL,MAAM,KAAK,WAAW,8BAA8B,YACtD;GAEA,OAAO,CAAC;EACV;EAEA,OAAO,KAAK,KAAK,EAAE,cAAc,OAAO;CAC1C;CAEA,MAAa,iBACX,QACiC;EACjC,OAAO,MAAM,wBAAwB,KAAK,UAAU;EAEpD,MAAM,aAAa,OAAO;EAC1B,MAAM,iBAAiB,OAAO;EAC9B,MAAM,aAAa,OAAO;EAC1B,MAAM,YAAY,OAAO;EACzB,MAAM,cAAc,OAAO;EAC3B,MAAM,UAAU,OAAO;EACvB,MAAM,kBAAkB,OAAO;EAC/B,MAAM,gBAAgBA,IAAkB,UAAU;EAElD,IAAI,KAAK,kBAAkB,MAAM,GAC/B,OAAO;EAGT,MAAM,UAAU,KAAK,WAAW,MAAM;EACtC,MAAM,aAAa,KAAK,cAAc,MAAM;EAC5C,MAAM,aAAa,KAAK,qBAAqB,MAAM;EAEnD,MAAM,gBAAgB,KAAK,cAAc,MAAM;EAC/C,IAAI,CAAC,cAAc,SAAS;GAC1B,IAAI,cAAc,OAChB,OAAO,EACL,OAAO,cAAc,MACvB;GAEF,OAAO;EACT;EAEA,IAAI,QAAQ,KAAK,mBAAmB,UAAU,CAAC,GAAG;GAChD,OAAO,MAAM,WAAW,KAAK,SAAS,cAAc,WAAW;GAC/D,OAAO;EACT;EAEA,MAAM,WAAW,OAAO,YAAa,MAAM,mBAAmB,MAAM;EACpE,IAAI,CAAC,UAAU,QAAQ;GACrB,OAAO,MAAM,aAAa;GAC1B,OAAO;EACT;EAEA,MAAM,gBAAgB,CAAC,GAAG,QAAQ,CAAC,CAChC,QAAQ,YAAY,cAAc,UAAU,QAAQ,OAAO,CAAC,CAAC,CAC7D,MAAM,GAAG,MAAM,cAAc,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC;EAElE,IAAI,cAAc,SAAS,GAAG;GAC5B,OAAO,MACL,qCAAqC,QAAQ,IAAI,YAAY,EAC/D;GACA,OAAO;EACT;EAEA,MAAM,oBAAwC,CAAC;EAG/C,SAAS,QAAQ,GAAoB;GACnC,OACE,cAAc,cAAc,GAAG,cAAc,KAC7C,CAAC,cAAc,cAAc,GAAG,UAAU;EAE9C;EAEA,MAAM,UAAU,cAAc,KAAK,WAAW,YAAY,UAAU,CAAC;EACrE,KAAK,IAAI,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK,GAAG;GAChD,MAAM,OAAO,cAAc,IAAI;GAC/B,MAAM,OAAO,cAAc;GAC3B,IAAI,CAAC,QAAQ,KAAK,OAAO,GACvB;GAEF,IAAI,UAAU,MAAMC,MAClB,KAAK,gBACL,KAAK,YAAY,WAAW,aAAa,KAAK,SAAS,KAAK,OAAO,CACrE;GACA,IAAI,CAAC,SAAS;IACZ,UAAU;KACR,SAAS,KAAK;KACd,MAAM,KAAK;KACX,QAAQ,KAAK;KAEb,SAAS,CAAC;KACV,SAAS,CAAC;IACZ;IACA,MAAM,OAAO,MAAM,QAAQ;IAC3B,MAAM,WAAW,KAAK,OACpB,eACA,aACA,SACA,MACA,IACF;IACA,MAAM,WAAW,KAAK,OACpB,eACA,aACA,SACA,MACA,IACF;IACA,IAAI,iBAAiB,QAAQ,KAAK,iBAAiB,QAAQ,GACzD,QAAQ,QAAQ,MAAM,KAAK,cACzB,SACA,YACA,UACA,QACF;IAGF,MAAMC,IACJ,KAAK,gBACL,KAAK,YAAY,WAAW,aAAa,KAAK,SAAS,KAAK,OAAO,GACnE,SACA,EACF;GACF;GACA,kBAAkB,QAAQ,OAAO;EACnC;EAEA,IAAI,MAA8B;GAChC,SAAS;IACP;IACA;IACA,MAAM,KAAK;IACX;IACA;IACA;IACA;IACA;GACF;GACA,UAAU;EACZ;EAEA,MAAM,MAAM,gBAAgB,KAAK,QAAQ,IAAI;EAE7C,OAAO;CACT;CAEA,iBACE,eACA,aACA,SACA,eACA,MACoB;EACpB,MAAM,qBAAqB,OAAO,YAAY,GAAG,QAAQ;EACzD,MAAM,QAAQ,MAAM,oBAAoB,KAAA,GAAW,KAAK;EACxD,MAAM,oBAAoB,MAAM,GAAG,qBAAqB,eAAe;EACvE,MAAM,gBAAgB,KAAK,QAAQ,QAAQ;GACzC,OAAO,kBAAkB,KAAK,GAAG;EACnC,CAAC;EAED,QADgB,cAAc,SAAS,gBAAgB,KAAA,CAEpD,QAAQ,QAAQ,cAAc,UAAU,IAAI,QAAQ,OAAO,EAAE,CAAC,CAAC,CAAC,CAChE,MAAM,QACL,cAAc,OAAO,IAAI,QAAQ,OAAO,EAAE,GAAG,aAAa,CAC5D;CACJ;CAEA,OACE,eACA,aACA,SACA,SACA,MACe;EACf,MAAM,UAAU,KAAK,iBACnB,eACA,aACA,SACA,QAAQ,SACR,IACF;EACA,IAAI,iBAAiB,OAAO,GAC1B,OAAO;EAET,IAAI,iBAAiB,QAAQ,MAAM,GACjC,OAAO,QAAQ;EAEjB,OAAO;CACT;CAEA,YACE,WACA,aACA,MACA,MACQ;EACR,OAAO,GAAG,WAAW,SAAS,EAAE,GAAG,YAAY,GAAG,KAAK,GAAG;CAC5D;CAEA,WAAW,QAAqC;EAC9C,MAAM,YAAY,SAAS,OAAO,SAAS;EAC3C,IAAI,kBAAkB,SAAS,GAC7B,OAAO;EAIT,OAAO,GAFU,UAAU,SAAS,QAAQ,MAAM,QAAQ,GAAG,EAE5C,EAAE,IADN,UAAU,KACK;CAC9B;CAEA,qBAAqB,QAAqC;EACxD,MAAM,YAAY,SAAS,OAAO,SAAS;EAC3C,IAAI,kBAAkB,SAAS,GAC7B,OAAO;EAET,MAAM,WAAW,UAAU;EAC3B,OAAO,YAAY,QAAQ,CAAC,CAAC,QAAQ,MAAM,QAAQ,GAAG,EAAE;CAC1D;CAEA,cAAwB,SAGtB;EACA,OAAO,EAAE,SAAS,KAAK;CACzB;CAEA,kBAA4B,SAAuC;EACjE,OAAO;CACT;CAEA,mBAAmB,YAA6B;EAC9C,OAAO,WAAW,MAAM,GAAG,CAAC,CAAC,WAAW;CAC1C;;;;;CAMA,kBACE,SACA,YACA,eACQ;EACR,OAAO,aAAa,SAAS,YAAY,QAAQ,QAAQ,aAAa;CACxE;;;;;CAMA,2BAA2B,gBAAwB,SAAyB;EAS1E,OAAO,GAAG,eAAe,GARH,QACnB,QAAQ,MAAM,UAAU,GAAG,GAAG,CAAC,CAC/B,QAAQ,MAAM,WAAW,GAAG,EAAE,CAAC,CAC/B,MAAM,GAAG,CAAC,CACV,OAAO,QAAQ,CAAC,CAChB,QAAQ,SAAS,CAAC,UAAU,IAAI,CAAC,CAAC,CAClC,KAAK,GAAG,CAAC,CACT,QAAQ,MAAM,gBAAgB,GAAG,EACI;CAC1C;AACF"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "renovate",
3
3
  "description": "Automated dependency updates. Flexible so you don't need to be.",
4
- "version": "44.33.2",
4
+ "version": "44.34.0",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "renovate": "dist/renovate.js",
@@ -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.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",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$id": "https://docs.renovatebot.com/renovate-schema.json",
3
- "title": "JSON schema for Renovate 44.33.2 config files (https://renovatebot.com/)",
3
+ "title": "JSON schema for Renovate 44.34.0 config files (https://renovatebot.com/)",
4
4
  "$schema": "http://json-schema.org/draft-07/schema#",
5
- "x-renovate-version": "44.33.2",
5
+ "x-renovate-version": "44.34.0",
6
6
  "allowComments": true,
7
7
  "type": "object",
8
8
  "definitions": {