renovate 44.48.3 → 44.49.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.
- package/dist/workers/repository/update/pr/changelog/index.js +30 -27
- package/dist/workers/repository/update/pr/changelog/index.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/release-notes.js +72 -49
- package/dist/workers/repository/update/pr/changelog/release-notes.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/releases.js +34 -31
- package/dist/workers/repository/update/pr/changelog/releases.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/source.js +75 -72
- package/dist/workers/repository/update/pr/changelog/source.js.map +1 -1
- package/package.json +1 -1
- package/renovate-schema.json +2 -2
|
@@ -1,39 +1,42 @@
|
|
|
1
1
|
import { logger } from "../../../../../logger/index.js";
|
|
2
|
+
import { instrument } from "../../../../../instrumentation/index.js";
|
|
2
3
|
import { detectPlatform } from "../../../../../util/common.js";
|
|
3
4
|
import { get } from "../../../../../modules/versioning/index.js";
|
|
4
5
|
import api from "./api.js";
|
|
5
6
|
import { isNullOrUndefined } from "@sindresorhus/is";
|
|
6
7
|
//#region lib/workers/repository/update/pr/changelog/index.ts
|
|
7
8
|
async function getChangeLogJSON(config) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
9
|
+
return await instrument("getChangeLogJSON()", async () => {
|
|
10
|
+
const { sourceUrl, versioning, currentVersion, newVersion } = config;
|
|
11
|
+
try {
|
|
12
|
+
if (!(sourceUrl && currentVersion && newVersion)) return null;
|
|
13
|
+
if (get(versioning).equals(currentVersion, newVersion)) return null;
|
|
14
|
+
logger.debug(`Fetching changelog: ${sourceUrl} (${currentVersion} -> ${newVersion})`);
|
|
15
|
+
const platform = detectPlatform(sourceUrl);
|
|
16
|
+
if (isNullOrUndefined(platform)) {
|
|
17
|
+
logger.info({
|
|
18
|
+
sourceUrl,
|
|
19
|
+
hostType: platform
|
|
20
|
+
}, "Unknown platform, skipping changelog fetching.");
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
const changeLogSource = getChangeLogSourceFor(platform);
|
|
24
|
+
if (isNullOrUndefined(changeLogSource)) {
|
|
25
|
+
logger.info({
|
|
26
|
+
sourceUrl,
|
|
27
|
+
hostType: platform
|
|
28
|
+
}, "Unknown changelog source, skipping changelog fetching.");
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
return await changeLogSource.getChangeLogJSON(config);
|
|
32
|
+
} catch (err) /* istanbul ignore next */ {
|
|
33
|
+
logger.error({
|
|
34
|
+
config,
|
|
35
|
+
err
|
|
36
|
+
}, "getChangeLogJSON error");
|
|
19
37
|
return null;
|
|
20
38
|
}
|
|
21
|
-
|
|
22
|
-
if (isNullOrUndefined(changeLogSource)) {
|
|
23
|
-
logger.info({
|
|
24
|
-
sourceUrl,
|
|
25
|
-
hostType: platform
|
|
26
|
-
}, "Unknown changelog source, skipping changelog fetching.");
|
|
27
|
-
return null;
|
|
28
|
-
}
|
|
29
|
-
return await changeLogSource.getChangeLogJSON(config);
|
|
30
|
-
} catch (err) /* istanbul ignore next */ {
|
|
31
|
-
logger.error({
|
|
32
|
-
config,
|
|
33
|
-
err
|
|
34
|
-
}, "getChangeLogJSON error");
|
|
35
|
-
return null;
|
|
36
|
-
}
|
|
39
|
+
});
|
|
37
40
|
}
|
|
38
41
|
function getChangeLogSourceFor(platform) {
|
|
39
42
|
return api.get(platform) ?? null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["allVersioning.get"],"sources":["../../../../../../lib/workers/repository/update/pr/changelog/index.ts"],"sourcesContent":["import { isNullOrUndefined } from '@sindresorhus/is';\nimport { logger } from '../../../../../logger/index.ts';\nimport * as allVersioning from '../../../../../modules/versioning/index.ts';\nimport { detectPlatform } from '../../../../../util/common.ts';\nimport type { BranchUpgradeConfig } from '../../../../types.ts';\nimport api from './api.ts';\nimport type { ChangeLogSource } from './source.ts';\nimport type { ChangeLogResult } from './types.ts';\n\nexport * from './types.ts';\n\nexport async function getChangeLogJSON(\n config: BranchUpgradeConfig,\n): Promise<ChangeLogResult | null> {\n const { sourceUrl, versioning, currentVersion, newVersion } = config;\n
|
|
1
|
+
{"version":3,"file":"index.js","names":["allVersioning.get"],"sources":["../../../../../../lib/workers/repository/update/pr/changelog/index.ts"],"sourcesContent":["import { isNullOrUndefined } from '@sindresorhus/is';\nimport { instrument } from '../../../../../instrumentation/index.ts';\nimport { logger } from '../../../../../logger/index.ts';\nimport * as allVersioning from '../../../../../modules/versioning/index.ts';\nimport { detectPlatform } from '../../../../../util/common.ts';\nimport type { BranchUpgradeConfig } from '../../../../types.ts';\nimport api from './api.ts';\nimport type { ChangeLogSource } from './source.ts';\nimport type { ChangeLogResult } from './types.ts';\n\nexport * from './types.ts';\n\nexport async function getChangeLogJSON(\n config: BranchUpgradeConfig,\n): Promise<ChangeLogResult | null> {\n return await instrument('getChangeLogJSON()', async () => {\n const { sourceUrl, versioning, currentVersion, newVersion } = config;\n try {\n if (!(sourceUrl && currentVersion && newVersion)) {\n return null;\n }\n const versioningApi = allVersioning.get(versioning);\n if (versioningApi.equals(currentVersion, newVersion)) {\n return null;\n }\n logger.debug(\n `Fetching changelog: ${sourceUrl} (${currentVersion} -> ${newVersion})`,\n );\n\n const platform = detectPlatform(sourceUrl);\n\n if (isNullOrUndefined(platform)) {\n logger.info(\n { sourceUrl, hostType: platform },\n 'Unknown platform, skipping changelog fetching.',\n );\n return null;\n }\n\n const changeLogSource = getChangeLogSourceFor(platform);\n\n if (isNullOrUndefined(changeLogSource)) {\n logger.info(\n { sourceUrl, hostType: platform },\n 'Unknown changelog source, skipping changelog fetching.',\n );\n return null;\n }\n\n return await changeLogSource.getChangeLogJSON(config);\n } catch (err) /* istanbul ignore next */ {\n logger.error({ config, err }, 'getChangeLogJSON error');\n return null;\n }\n });\n}\n\nexport function getChangeLogSourceFor(\n platform: string,\n): ChangeLogSource | null {\n return api.get(platform) ?? null;\n}\n"],"mappings":";;;;;;;AAYA,eAAsB,iBACpB,QACiC;CACjC,OAAO,MAAM,WAAW,sBAAsB,YAAY;EACxD,MAAM,EAAE,WAAW,YAAY,gBAAgB,eAAe;EAC9D,IAAI;GACF,IAAI,EAAE,aAAa,kBAAkB,aACnC,OAAO;GAGT,IADsBA,IAAkB,UACxB,CAAC,CAAC,OAAO,gBAAgB,UAAU,GACjD,OAAO;GAET,OAAO,MACL,uBAAuB,UAAU,IAAI,eAAe,MAAM,WAAW,EACvE;GAEA,MAAM,WAAW,eAAe,SAAS;GAEzC,IAAI,kBAAkB,QAAQ,GAAG;IAC/B,OAAO,KACL;KAAE;KAAW,UAAU;IAAS,GAChC,gDACF;IACA,OAAO;GACT;GAEA,MAAM,kBAAkB,sBAAsB,QAAQ;GAEtD,IAAI,kBAAkB,eAAe,GAAG;IACtC,OAAO,KACL;KAAE;KAAW,UAAU;IAAS,GAChC,wDACF;IACA,OAAO;GACT;GAEA,OAAO,MAAM,gBAAgB,iBAAiB,MAAM;EACtD,SAAS,gCAAgC;GACvC,OAAO,MAAM;IAAE;IAAQ;GAAI,GAAG,wBAAwB;GACtD,OAAO;EACT;CACF,CAAC;AACH;AAEA,SAAgB,sBACd,UACwB;CACxB,OAAO,IAAI,IAAI,QAAQ,KAAK;AAC9B"}
|
|
@@ -3,8 +3,10 @@ import { newlineRegex, regEx } from "../../../../../util/regex.js";
|
|
|
3
3
|
import { coerceString } from "../../../../../util/string.js";
|
|
4
4
|
import { logger } from "../../../../../logger/index.js";
|
|
5
5
|
import { isHttpUrl } from "../../../../../util/url.js";
|
|
6
|
+
import { instrument } from "../../../../../instrumentation/index.js";
|
|
6
7
|
import { detectPlatform } from "../../../../../util/common.js";
|
|
7
8
|
import { get as get$1, set as set$1 } from "../../../../../util/cache/package/index.js";
|
|
9
|
+
import { platform } from "../../../../../modules/platform/index.js";
|
|
8
10
|
import { linkify } from "../../../../../util/markdown.js";
|
|
9
11
|
import { getReleaseList as getReleaseList$1, getReleaseNotesMd as getReleaseNotesMd$1 } from "./bitbucket/index.js";
|
|
10
12
|
import { getReleaseNotesMd as getReleaseNotesMd$2 } from "./bitbucket-server/index.js";
|
|
@@ -86,24 +88,26 @@ function massageName(input, version) {
|
|
|
86
88
|
return name;
|
|
87
89
|
}
|
|
88
90
|
async function getReleaseNotes(project, release, config) {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
91
|
+
return await instrument("getReleaseNotes", async () => {
|
|
92
|
+
const { packageName, depName, repository } = project;
|
|
93
|
+
const { version, gitRef } = release;
|
|
94
|
+
logger.trace(`getReleaseNotes(${repository}, ${version}, ${packageName}, ${depName})`);
|
|
95
|
+
const releases = await getCachedReleaseList(project, release);
|
|
96
|
+
logger.trace({ releases }, "Release list from getReleaseList");
|
|
97
|
+
let releaseNotes = null;
|
|
98
|
+
let matchedRelease = getExactReleaseMatch(packageName, depName, version, releases);
|
|
99
|
+
if (isUndefined(matchedRelease)) matchedRelease = releases.find((r) => r.tag === version || r.tag === `v${version}` || r.tag === gitRef || r.tag === `v${gitRef}`);
|
|
100
|
+
if (isUndefined(matchedRelease) && config.extractVersion) {
|
|
101
|
+
const extractVersionRegEx = regEx(config.extractVersion);
|
|
102
|
+
matchedRelease = releases.find((r) => {
|
|
103
|
+
const extractedVersion = extractVersionRegEx.exec(r.tag)?.groups?.version;
|
|
104
|
+
return version === extractedVersion;
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
releaseNotes = await releaseNotesResult(matchedRelease, project);
|
|
108
|
+
logger.trace({ releaseNotes });
|
|
109
|
+
return releaseNotes;
|
|
110
|
+
});
|
|
107
111
|
}
|
|
108
112
|
function getExactReleaseMatch(packageName, depName, version, releases) {
|
|
109
113
|
const exactReleaseReg = regEx(`(?:^|/)(?:${packageName}|${depName})[@_/-]v?${version}`);
|
|
@@ -267,38 +271,57 @@ function releaseNotesCacheMinutes(releaseDate) {
|
|
|
267
271
|
return 14495;
|
|
268
272
|
}
|
|
269
273
|
async function addReleaseNotes(input, config, source) {
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
const { repository, sourceDirectory, type: projectType } = input.project;
|
|
280
|
-
const cacheNamespace = `changelog-${projectType}-notes@v2`;
|
|
281
|
-
const cacheKeyPrefix = sourceDirectory ? `${repository}:${sourceDirectory}` : `${repository}`;
|
|
282
|
-
for (const v of input.versions) {
|
|
283
|
-
let releaseNotes;
|
|
284
|
-
const gitRefCachePart = v.gitRef ? `:${v.gitRef}` : "";
|
|
285
|
-
const cacheKey = `${cacheKeyPrefix}:${v.version}${gitRefCachePart}`;
|
|
286
|
-
releaseNotes = await get$1(cacheNamespace, cacheKey);
|
|
287
|
-
releaseNotes ??= await getReleaseNotesMd(input.project, v, source);
|
|
288
|
-
releaseNotes ??= await getReleaseNotes(input.project, v, config);
|
|
289
|
-
if (!releaseNotes && v.compare.url) releaseNotes = {
|
|
290
|
-
url: v.compare.url,
|
|
291
|
-
notesSourceUrl: ""
|
|
274
|
+
return await instrument(`addReleaseNotes`, async () => {
|
|
275
|
+
if (!input?.versions || !input.project?.type) {
|
|
276
|
+
logger.debug("Missing project or versions");
|
|
277
|
+
return input ?? null;
|
|
278
|
+
}
|
|
279
|
+
const output = {
|
|
280
|
+
...input,
|
|
281
|
+
versions: [],
|
|
282
|
+
hasReleaseNotes: false
|
|
292
283
|
};
|
|
293
|
-
const
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
284
|
+
const { repository, sourceDirectory, type: projectType } = input.project;
|
|
285
|
+
const cacheNamespace = `changelog-${projectType}-notes@v2`;
|
|
286
|
+
const cacheKeyPrefix = sourceDirectory ? `${repository}:${sourceDirectory}` : `${repository}`;
|
|
287
|
+
const shouldTruncateToPlatformLimit = config.fetchChangeLogs === "pr";
|
|
288
|
+
const maxBodyLength = shouldTruncateToPlatformLimit ? platform.maxBodyLength() : 0;
|
|
289
|
+
let fetchedNotesLength = 0;
|
|
290
|
+
for (const v of input.versions) {
|
|
291
|
+
let releaseNotes;
|
|
292
|
+
if (!shouldTruncateToPlatformLimit || fetchedNotesLength < maxBodyLength) {
|
|
293
|
+
const gitRefCachePart = v.gitRef ? `:${v.gitRef}` : "";
|
|
294
|
+
const cacheKey = `${cacheKeyPrefix}:${v.version}${gitRefCachePart}`;
|
|
295
|
+
releaseNotes = await get$1(cacheNamespace, cacheKey);
|
|
296
|
+
releaseNotes ??= await getReleaseNotesMd(input.project, v, source);
|
|
297
|
+
releaseNotes ??= await getReleaseNotes(input.project, v, config);
|
|
298
|
+
if (!releaseNotes && v.compare.url) releaseNotes = {
|
|
299
|
+
url: v.compare.url,
|
|
300
|
+
notesSourceUrl: ""
|
|
301
|
+
};
|
|
302
|
+
const cacheMinutes = releaseNotesCacheMinutes(v.date);
|
|
303
|
+
await set$1(cacheNamespace, cacheKey, releaseNotes, cacheMinutes);
|
|
304
|
+
if (shouldTruncateToPlatformLimit) {
|
|
305
|
+
fetchedNotesLength += releaseNotes?.body?.length ?? 0;
|
|
306
|
+
if (fetchedNotesLength >= maxBodyLength) logger.debug({
|
|
307
|
+
repository,
|
|
308
|
+
project: input.project,
|
|
309
|
+
skippingVersionFrom: v.version,
|
|
310
|
+
maxBodyLength
|
|
311
|
+
}, `Already fetched enough changelogs to hit the platform PR body limit, skipping version ${v.version} and below`);
|
|
312
|
+
}
|
|
313
|
+
} else if (v.compare.url) releaseNotes = {
|
|
314
|
+
url: v.compare.url,
|
|
315
|
+
notesSourceUrl: ""
|
|
316
|
+
};
|
|
317
|
+
output.versions.push({
|
|
318
|
+
...v,
|
|
319
|
+
releaseNotes
|
|
320
|
+
});
|
|
321
|
+
if (releaseNotes) output.hasReleaseNotes = true;
|
|
322
|
+
}
|
|
323
|
+
return output;
|
|
324
|
+
});
|
|
302
325
|
}
|
|
303
326
|
/**
|
|
304
327
|
* Skip fetching changelog/release-notes markdown files.
|
|
@@ -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 } 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
|
+
{"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 { instrument } from '../../../../../instrumentation/index.ts';\nimport { logger } from '../../../../../logger/index.ts';\nimport { platform } from '../../../../../modules/platform/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 return await instrument('getReleaseNotes', async () => {\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}\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 return await instrument(`addReleaseNotes`, async () => {\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 const shouldTruncateToPlatformLimit = config.fetchChangeLogs === 'pr';\n const maxBodyLength = shouldTruncateToPlatformLimit\n ? platform.maxBodyLength()\n : 0;\n let fetchedNotesLength = 0;\n\n for (const v of input.versions) {\n let releaseNotes: ChangeLogNotes | null | undefined;\n\n if (\n !shouldTruncateToPlatformLimit ||\n fetchedNotesLength < maxBodyLength\n ) {\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\n // when we have received enough changelog content to exceed the platform's limit, we should stop trying to look up more changelog entries, as we fetch newest releases first, so the most recent changelog entries will be visible in the PR\n if (shouldTruncateToPlatformLimit) {\n fetchedNotesLength += releaseNotes?.body?.length ?? 0;\n if (fetchedNotesLength >= maxBodyLength) {\n logger.debug(\n {\n repository,\n project: input.project,\n skippingVersionFrom: v.version,\n maxBodyLength,\n },\n `Already fetched enough changelogs to hit the platform PR body limit, skipping version ${v.version} and below`,\n );\n }\n }\n } else if (v.compare.url) {\n releaseNotes = { url: v.compare.url, notesSourceUrl: '' };\n }\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/**\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,4 +1,5 @@
|
|
|
1
1
|
import { logger } from "../../../../../logger/index.js";
|
|
2
|
+
import { instrument } from "../../../../../instrumentation/index.js";
|
|
2
3
|
import { coerceArray } from "../../../../../util/array.js";
|
|
3
4
|
import { get } from "../../../../../modules/versioning/index.js";
|
|
4
5
|
import { isGetPkgReleasesConfig } from "../../../../../modules/datasource/common.js";
|
|
@@ -11,38 +12,40 @@ function matchesUnstable(versioningApi, v1, v2) {
|
|
|
11
12
|
return !versioningApi.isStable(v1) && matchesMMP(versioningApi, v1, v2);
|
|
12
13
|
}
|
|
13
14
|
async function getInRangeReleases(config) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
15
|
+
return await instrument(`getInRangeReleases`, async () => {
|
|
16
|
+
const versioning = config.versioning;
|
|
17
|
+
const currentVersion = config.currentVersion;
|
|
18
|
+
const newVersion = config.newVersion;
|
|
19
|
+
const depName = config.depName;
|
|
20
|
+
const datasource = config.datasource;
|
|
21
|
+
// istanbul ignore if
|
|
22
|
+
if (!isGetPkgReleasesConfig(config)) return null;
|
|
23
|
+
try {
|
|
24
|
+
const pkgReleases = (await getPkgReleases(config)).releases;
|
|
25
|
+
const version = get(versioning);
|
|
26
|
+
const previousReleases = pkgReleases.filter((release) => version.isCompatible(release.version, currentVersion)).filter((release) => !version.isGreaterThan(release.version, newVersion)).filter((release) => version.isStable(release.version) || matchesUnstable(version, currentVersion, release.version) || matchesUnstable(version, newVersion, release.version));
|
|
27
|
+
const releases = previousReleases.filter((release) => version.equals(release.version, currentVersion) || version.isGreaterThan(release.version, currentVersion));
|
|
28
|
+
/**
|
|
29
|
+
* If there is only one release, it can be one of two things:
|
|
30
|
+
*
|
|
31
|
+
* 1. There really is only one release
|
|
32
|
+
*
|
|
33
|
+
* 2. Pinned version doesn't actually exist, i.e pinning `^1.2.3` to `1.2.3`
|
|
34
|
+
* while only `1.2.2` and `1.2.4` exist.
|
|
35
|
+
*/
|
|
36
|
+
if (releases.length === 1) {
|
|
37
|
+
const newRelease = releases[0];
|
|
38
|
+
const closestPreviousRelease = previousReleases.filter((release) => !version.equals(release.version, newVersion)).sort((b, a) => version.sortVersions(a.version, b.version)).shift();
|
|
39
|
+
if (closestPreviousRelease && closestPreviousRelease.version !== newRelease.version) releases.unshift(closestPreviousRelease);
|
|
40
|
+
}
|
|
41
|
+
if (version.valueToVersion) for (const release of coerceArray(releases)) release.version = version.valueToVersion(release.version);
|
|
42
|
+
return releases;
|
|
43
|
+
} catch (err) /* istanbul ignore next */ {
|
|
44
|
+
logger.debug({ err }, "getInRangeReleases err");
|
|
45
|
+
logger.debug(`Error getting releases for ${depName} from ${datasource}`);
|
|
46
|
+
return null;
|
|
38
47
|
}
|
|
39
|
-
|
|
40
|
-
return releases;
|
|
41
|
-
} catch (err) /* istanbul ignore next */ {
|
|
42
|
-
logger.debug({ err }, "getInRangeReleases err");
|
|
43
|
-
logger.debug(`Error getting releases for ${depName} from ${datasource}`);
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
48
|
+
});
|
|
46
49
|
}
|
|
47
50
|
//#endregion
|
|
48
51
|
export { getInRangeReleases };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"releases.js","names":[],"sources":["../../../../../../lib/workers/repository/update/pr/changelog/releases.ts"],"sourcesContent":["// TODO #22198\nimport { logger } from '../../../../../logger/index.ts';\nimport type { Release } from '../../../../../modules/datasource/index.ts';\nimport {\n getPkgReleases,\n isGetPkgReleasesConfig,\n} from '../../../../../modules/datasource/index.ts';\nimport type { VersioningApi } from '../../../../../modules/versioning/index.ts';\nimport { get } from '../../../../../modules/versioning/index.ts';\nimport { coerceArray } from '../../../../../util/array.ts';\nimport type { BranchUpgradeConfig } from '../../../../types.ts';\n\nfunction matchesMMP(\n versioningApi: VersioningApi,\n v1: string,\n v2: string,\n): boolean {\n return (\n versioningApi.getMajor(v1) === versioningApi.getMajor(v2) &&\n versioningApi.getMinor(v1) === versioningApi.getMinor(v2) &&\n versioningApi.getPatch(v1) === versioningApi.getPatch(v2)\n );\n}\n\nfunction matchesUnstable(\n versioningApi: VersioningApi,\n v1: string,\n v2: string,\n): boolean {\n return !versioningApi.isStable(v1) && matchesMMP(versioningApi, v1, v2);\n}\n\nexport async function getInRangeReleases(\n config: BranchUpgradeConfig,\n): Promise<Release[] | null> {\n const versioning = config.versioning!;\n
|
|
1
|
+
{"version":3,"file":"releases.js","names":[],"sources":["../../../../../../lib/workers/repository/update/pr/changelog/releases.ts"],"sourcesContent":["// TODO #22198\nimport { instrument } from '../../../../../instrumentation/index.ts';\nimport { logger } from '../../../../../logger/index.ts';\nimport type { Release } from '../../../../../modules/datasource/index.ts';\nimport {\n getPkgReleases,\n isGetPkgReleasesConfig,\n} from '../../../../../modules/datasource/index.ts';\nimport type { VersioningApi } from '../../../../../modules/versioning/index.ts';\nimport { get } from '../../../../../modules/versioning/index.ts';\nimport { coerceArray } from '../../../../../util/array.ts';\nimport type { BranchUpgradeConfig } from '../../../../types.ts';\n\nfunction matchesMMP(\n versioningApi: VersioningApi,\n v1: string,\n v2: string,\n): boolean {\n return (\n versioningApi.getMajor(v1) === versioningApi.getMajor(v2) &&\n versioningApi.getMinor(v1) === versioningApi.getMinor(v2) &&\n versioningApi.getPatch(v1) === versioningApi.getPatch(v2)\n );\n}\n\nfunction matchesUnstable(\n versioningApi: VersioningApi,\n v1: string,\n v2: string,\n): boolean {\n return !versioningApi.isStable(v1) && matchesMMP(versioningApi, v1, v2);\n}\n\nexport async function getInRangeReleases(\n config: BranchUpgradeConfig,\n): Promise<Release[] | null> {\n return await instrument(`getInRangeReleases`, async () => {\n const versioning = config.versioning!;\n const currentVersion = config.currentVersion!;\n const newVersion = config.newVersion!;\n const depName = config.depName!;\n const datasource = config.datasource!;\n // istanbul ignore if\n if (!isGetPkgReleasesConfig(config)) {\n return null;\n }\n try {\n const pkgReleases = (await getPkgReleases(config))!.releases;\n const version = get(versioning);\n\n const previousReleases = pkgReleases\n .filter((release) =>\n version.isCompatible(release.version, currentVersion),\n )\n .filter(\n (release) => !version.isGreaterThan(release.version, newVersion),\n )\n .filter(\n (release) =>\n version.isStable(release.version) ||\n matchesUnstable(version, currentVersion, release.version) ||\n matchesUnstable(version, newVersion, release.version),\n );\n\n const releases = previousReleases.filter(\n (release) =>\n version.equals(release.version, currentVersion) ||\n version.isGreaterThan(release.version, currentVersion),\n );\n\n /**\n * If there is only one release, it can be one of two things:\n *\n * 1. There really is only one release\n *\n * 2. Pinned version doesn't actually exist, i.e pinning `^1.2.3` to `1.2.3`\n * while only `1.2.2` and `1.2.4` exist.\n */\n if (releases.length === 1) {\n const newRelease = releases[0];\n const closestPreviousRelease = previousReleases\n .filter((release) => !version.equals(release.version, newVersion))\n .sort((b, a) => version.sortVersions(a.version, b.version))\n .shift();\n\n if (\n closestPreviousRelease &&\n closestPreviousRelease.version !== newRelease.version\n ) {\n releases.unshift(closestPreviousRelease);\n }\n }\n\n if (version.valueToVersion) {\n for (const release of coerceArray(releases)) {\n release.version = version.valueToVersion(release.version);\n }\n }\n return releases;\n } catch (err) /* istanbul ignore next */ {\n logger.debug({ err }, 'getInRangeReleases err');\n logger.debug(`Error getting releases for ${depName} from ${datasource}`);\n return null;\n }\n });\n}\n"],"mappings":";;;;;;;AAaA,SAAS,WACP,eACA,IACA,IACS;CACT,OACE,cAAc,SAAS,EAAE,MAAM,cAAc,SAAS,EAAE,KACxD,cAAc,SAAS,EAAE,MAAM,cAAc,SAAS,EAAE,KACxD,cAAc,SAAS,EAAE,MAAM,cAAc,SAAS,EAAE;AAE5D;AAEA,SAAS,gBACP,eACA,IACA,IACS;CACT,OAAO,CAAC,cAAc,SAAS,EAAE,KAAK,WAAW,eAAe,IAAI,EAAE;AACxE;AAEA,eAAsB,mBACpB,QAC2B;CAC3B,OAAO,MAAM,WAAW,sBAAsB,YAAY;EACxD,MAAM,aAAa,OAAO;EAC1B,MAAM,iBAAiB,OAAO;EAC9B,MAAM,aAAa,OAAO;EAC1B,MAAM,UAAU,OAAO;EACvB,MAAM,aAAa,OAAO;;EAE1B,IAAI,CAAC,uBAAuB,MAAM,GAChC,OAAO;EAET,IAAI;GACF,MAAM,eAAe,MAAM,eAAe,MAAM,EAAA,CAAI;GACpD,MAAM,UAAU,IAAI,UAAU;GAE9B,MAAM,mBAAmB,YACtB,QAAQ,YACP,QAAQ,aAAa,QAAQ,SAAS,cAAc,CACtD,CAAC,CACA,QACE,YAAY,CAAC,QAAQ,cAAc,QAAQ,SAAS,UAAU,CACjE,CAAC,CACA,QACE,YACC,QAAQ,SAAS,QAAQ,OAAO,KAChC,gBAAgB,SAAS,gBAAgB,QAAQ,OAAO,KACxD,gBAAgB,SAAS,YAAY,QAAQ,OAAO,CACxD;GAEF,MAAM,WAAW,iBAAiB,QAC/B,YACC,QAAQ,OAAO,QAAQ,SAAS,cAAc,KAC9C,QAAQ,cAAc,QAAQ,SAAS,cAAc,CACzD;;;;;;;;;GAUA,IAAI,SAAS,WAAW,GAAG;IACzB,MAAM,aAAa,SAAS;IAC5B,MAAM,yBAAyB,iBAC5B,QAAQ,YAAY,CAAC,QAAQ,OAAO,QAAQ,SAAS,UAAU,CAAC,CAAC,CACjE,MAAM,GAAG,MAAM,QAAQ,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAC1D,MAAM;IAET,IACE,0BACA,uBAAuB,YAAY,WAAW,SAE9C,SAAS,QAAQ,sBAAsB;GAE3C;GAEA,IAAI,QAAQ,gBACV,KAAK,MAAM,WAAW,YAAY,QAAQ,GACxC,QAAQ,UAAU,QAAQ,eAAe,QAAQ,OAAO;GAG5D,OAAO;EACT,SAAS,gCAAgC;GACvC,OAAO,MAAM,EAAE,IAAI,GAAG,wBAAwB;GAC9C,OAAO,MAAM,8BAA8B,QAAQ,QAAQ,YAAY;GACvE,OAAO;EACT;CACF,CAAC;AACH"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { regEx } from "../../../../../util/regex.js";
|
|
2
2
|
import { logger } from "../../../../../logger/index.js";
|
|
3
3
|
import { isHttpUrl, joinUrlParts, parseUrl, trimSlashes } from "../../../../../util/url.js";
|
|
4
|
+
import { instrument } from "../../../../../instrumentation/index.js";
|
|
4
5
|
import { get } from "../../../../../modules/versioning/index.js";
|
|
5
6
|
import { get as get$1, set } from "../../../../../util/cache/package/index.js";
|
|
6
7
|
import { getPkgReleases } from "../../../../../modules/datasource/index.js";
|
|
@@ -33,79 +34,81 @@ var ChangeLogSource = class {
|
|
|
33
34
|
return tags.map(({ version }) => version);
|
|
34
35
|
}
|
|
35
36
|
async getChangeLogJSON(config) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
if (tokenResponse.
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
if (isFalsy(this.hasValidRepository(repository))) {
|
|
55
|
-
logger.debug(`Invalid ${this.platform} URL found: ${sourceUrl}`);
|
|
56
|
-
return null;
|
|
57
|
-
}
|
|
58
|
-
const releases = config.releases ?? await getInRangeReleases(config);
|
|
59
|
-
if (!releases?.length) {
|
|
60
|
-
logger.debug("No releases");
|
|
61
|
-
return null;
|
|
62
|
-
}
|
|
63
|
-
const validReleases = [...releases].filter((release) => versioningApi.isVersion(release.version)).sort((a, b) => versioningApi.sortVersions(a.version, b.version)).filter((release, index, sorted) => index === sorted.length - 1 || !versioningApi.equals(release.version, sorted[index + 1].version));
|
|
64
|
-
if (validReleases.length < 2) {
|
|
65
|
-
logger.debug(`Not enough valid releases for dep ${depName} (${packageName})`);
|
|
66
|
-
return null;
|
|
67
|
-
}
|
|
68
|
-
const changelogReleases = [];
|
|
69
|
-
function inRange(v) {
|
|
70
|
-
return versioningApi.isGreaterThan(v, currentVersion) && !versioningApi.isGreaterThan(v, newVersion);
|
|
71
|
-
}
|
|
72
|
-
const getTags = memoize(() => this.getAllTags(apiBaseUrl, repository));
|
|
73
|
-
for (let i = 1; i < validReleases.length; i += 1) {
|
|
74
|
-
const prev = validReleases[i - 1];
|
|
75
|
-
const next = validReleases[i];
|
|
76
|
-
if (!inRange(next.version)) continue;
|
|
77
|
-
let release = await get$1(this.cacheNamespace, this.getCacheKey(sourceUrl, packageName, prev.version, next.version));
|
|
78
|
-
if (!release) {
|
|
79
|
-
release = {
|
|
80
|
-
version: next.version,
|
|
81
|
-
date: next.releaseTimestamp,
|
|
82
|
-
gitRef: next.gitRef,
|
|
83
|
-
changes: [],
|
|
84
|
-
compare: {}
|
|
85
|
-
};
|
|
86
|
-
const tags = await getTags();
|
|
87
|
-
const prevHead = this.getRef(versioningApi, packageName, depName, prev, tags);
|
|
88
|
-
const nextHead = this.getRef(versioningApi, packageName, depName, next, tags);
|
|
89
|
-
if (isNonEmptyString(prevHead) && isNonEmptyString(nextHead)) release.compare.url = this.getCompareURL(baseUrl, repository, prevHead, nextHead);
|
|
90
|
-
await set(this.cacheNamespace, this.getCacheKey(sourceUrl, packageName, prev.version, next.version), release, 55);
|
|
37
|
+
return await instrument(`source.getChangeLogJSON(${this.platform})`, async () => {
|
|
38
|
+
logger.trace(`getChangeLogJSON for ${this.platform}`);
|
|
39
|
+
const versioning = config.versioning;
|
|
40
|
+
const currentVersion = config.currentVersion;
|
|
41
|
+
const newVersion = config.newVersion;
|
|
42
|
+
const sourceUrl = config.sourceUrl;
|
|
43
|
+
const packageName = config.packageName;
|
|
44
|
+
const depName = config.depName;
|
|
45
|
+
const sourceDirectory = config.sourceDirectory;
|
|
46
|
+
const versioningApi = get(versioning);
|
|
47
|
+
if (this.shouldSkipPackage(config)) return null;
|
|
48
|
+
const baseUrl = this.getBaseUrl(config);
|
|
49
|
+
const apiBaseUrl = this.getAPIBaseUrl(config);
|
|
50
|
+
const repository = this.getRepositoryFromUrl(config);
|
|
51
|
+
const tokenResponse = this.hasValidToken(config);
|
|
52
|
+
if (!tokenResponse.isValid) {
|
|
53
|
+
if (tokenResponse.error) return { error: tokenResponse.error };
|
|
54
|
+
return null;
|
|
91
55
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
depName
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
56
|
+
if (isFalsy(this.hasValidRepository(repository))) {
|
|
57
|
+
logger.debug(`Invalid ${this.platform} URL found: ${sourceUrl}`);
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
const releases = config.releases ?? await getInRangeReleases(config);
|
|
61
|
+
if (!releases?.length) {
|
|
62
|
+
logger.debug("No releases");
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
const validReleases = [...releases].filter((release) => versioningApi.isVersion(release.version)).sort((a, b) => versioningApi.sortVersions(a.version, b.version)).filter((release, index, sorted) => index === sorted.length - 1 || !versioningApi.equals(release.version, sorted[index + 1].version));
|
|
66
|
+
if (validReleases.length < 2) {
|
|
67
|
+
logger.debug(`Not enough valid releases for dep ${depName} (${packageName})`);
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
const changelogReleases = [];
|
|
71
|
+
function inRange(v) {
|
|
72
|
+
return versioningApi.isGreaterThan(v, currentVersion) && !versioningApi.isGreaterThan(v, newVersion);
|
|
73
|
+
}
|
|
74
|
+
const getTags = memoize(() => this.getAllTags(apiBaseUrl, repository));
|
|
75
|
+
for (let i = validReleases.length - 1; i >= 1; i -= 1) {
|
|
76
|
+
const prev = validReleases[i - 1];
|
|
77
|
+
const next = validReleases[i];
|
|
78
|
+
if (!inRange(next.version)) continue;
|
|
79
|
+
let release = await get$1(this.cacheNamespace, this.getCacheKey(sourceUrl, packageName, prev.version, next.version));
|
|
80
|
+
if (!release) {
|
|
81
|
+
release = {
|
|
82
|
+
version: next.version,
|
|
83
|
+
date: next.releaseTimestamp,
|
|
84
|
+
gitRef: next.gitRef,
|
|
85
|
+
changes: [],
|
|
86
|
+
compare: {}
|
|
87
|
+
};
|
|
88
|
+
const tags = await getTags();
|
|
89
|
+
const prevHead = this.getRef(versioningApi, packageName, depName, prev, tags);
|
|
90
|
+
const nextHead = this.getRef(versioningApi, packageName, depName, next, tags);
|
|
91
|
+
if (isNonEmptyString(prevHead) && isNonEmptyString(nextHead)) release.compare.url = this.getCompareURL(baseUrl, repository, prevHead, nextHead);
|
|
92
|
+
await set(this.cacheNamespace, this.getCacheKey(sourceUrl, packageName, prev.version, next.version), release, 55);
|
|
93
|
+
}
|
|
94
|
+
changelogReleases.push(release);
|
|
95
|
+
}
|
|
96
|
+
let res = {
|
|
97
|
+
project: {
|
|
98
|
+
apiBaseUrl,
|
|
99
|
+
baseUrl,
|
|
100
|
+
type: this.platform,
|
|
101
|
+
repository,
|
|
102
|
+
sourceUrl,
|
|
103
|
+
sourceDirectory,
|
|
104
|
+
packageName,
|
|
105
|
+
depName
|
|
106
|
+
},
|
|
107
|
+
versions: changelogReleases
|
|
108
|
+
};
|
|
109
|
+
res = await addReleaseNotes(res, config, this);
|
|
110
|
+
return res;
|
|
111
|
+
});
|
|
109
112
|
}
|
|
110
113
|
findTagOfRelease(versioningApi, packageName, depName, depNewVersion, tags) {
|
|
111
114
|
const releaseRegexPrefix = `^(?:${packageName}|${depName}|release)[@_-]v?`;
|
|
@@ -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 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 // Drop versions equal under this versioning, e.g. the Docker tags\n // `3.7.12` and `v3.7.12`, else their notes are rendered twice\n .filter(\n (release, index, sorted) =>\n index === sorted.length - 1 ||\n !versioningApi.equals(release.version, sorted[index + 1].version),\n );\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,CAAC,CAGhE,QACE,SAAS,OAAO,WACf,UAAU,OAAO,SAAS,KAC1B,CAAC,cAAc,OAAO,QAAQ,SAAS,OAAO,QAAQ,EAAE,CAAC,OAAO,CACpE;EAEF,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"}
|
|
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 { instrument } from '../../../../../instrumentation/index.ts';\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 return await instrument(\n `source.getChangeLogJSON(${this.platform})`,\n async () => {\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 // Drop versions equal under this versioning, e.g. the Docker tags\n // `3.7.12` and `v3.7.12`, else their notes are rendered twice\n .filter(\n (release, index, sorted) =>\n index === sorted.length - 1 ||\n !versioningApi.equals(release.version, sorted[index + 1].version),\n );\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 // Fetch releases newest-first, matching the order they're shown in the PR body.\n for (let i = validReleases.length - 1; i >= 1; 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(\n sourceUrl,\n packageName,\n prev.version,\n next.version,\n ),\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(\n sourceUrl,\n packageName,\n prev.version,\n next.version,\n ),\n release,\n cacheMinutes,\n );\n }\n changelogReleases.push(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 }\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
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.49.0 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.49.0",
|
|
6
6
|
"allowComments": true,
|
|
7
7
|
"type": "object",
|
|
8
8
|
"definitions": {
|