renovate 41.39.0 → 41.41.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 (86) hide show
  1. package/dist/config/options/index.js +26 -11
  2. package/dist/config/options/index.js.map +1 -1
  3. package/dist/config/presets/forgejo/index.d.ts +5 -0
  4. package/dist/config/presets/forgejo/index.js +43 -0
  5. package/dist/config/presets/forgejo/index.js.map +1 -0
  6. package/dist/config/presets/index.js +6 -4
  7. package/dist/config/presets/index.js.map +1 -1
  8. package/dist/config/presets/local/index.js +2 -0
  9. package/dist/config/presets/local/index.js.map +1 -1
  10. package/dist/config/presets/parse.js +4 -0
  11. package/dist/config/presets/parse.js.map +1 -1
  12. package/dist/config/validation.js +0 -2
  13. package/dist/config/validation.js.map +1 -1
  14. package/dist/constants/platforms.d.ts +2 -1
  15. package/dist/constants/platforms.js +8 -1
  16. package/dist/constants/platforms.js.map +1 -1
  17. package/dist/modules/datasource/api.js +4 -0
  18. package/dist/modules/datasource/api.js.map +1 -1
  19. package/dist/modules/datasource/forgejo-releases/index.d.ts +17 -0
  20. package/dist/modules/datasource/forgejo-releases/index.js +80 -0
  21. package/dist/modules/datasource/forgejo-releases/index.js.map +1 -0
  22. package/dist/modules/datasource/forgejo-releases/schema.d.ts +39 -0
  23. package/dist/modules/datasource/forgejo-releases/schema.js +14 -0
  24. package/dist/modules/datasource/forgejo-releases/schema.js.map +1 -0
  25. package/dist/modules/datasource/forgejo-tags/index.d.ts +21 -0
  26. package/dist/modules/datasource/forgejo-tags/index.js +96 -0
  27. package/dist/modules/datasource/forgejo-tags/index.js.map +1 -0
  28. package/dist/modules/datasource/forgejo-tags/schema.d.ts +65 -0
  29. package/dist/modules/datasource/forgejo-tags/schema.js +19 -0
  30. package/dist/modules/datasource/forgejo-tags/schema.js.map +1 -0
  31. package/dist/modules/manager/fingerprint.generated.js +1 -1
  32. package/dist/modules/manager/fingerprint.generated.js.map +1 -1
  33. package/dist/modules/manager/github-actions/extract.js +8 -2
  34. package/dist/modules/manager/github-actions/extract.js.map +1 -1
  35. package/dist/modules/platform/api.d.ts +1 -1
  36. package/dist/modules/platform/api.js +2 -0
  37. package/dist/modules/platform/api.js.map +1 -1
  38. package/dist/modules/platform/forgejo/forgejo-helper.d.ts +36 -0
  39. package/dist/modules/platform/forgejo/forgejo-helper.js +282 -0
  40. package/dist/modules/platform/forgejo/forgejo-helper.js.map +1 -0
  41. package/dist/modules/platform/forgejo/index.d.ts +6 -0
  42. package/dist/modules/platform/forgejo/index.js +749 -0
  43. package/dist/modules/platform/forgejo/index.js.map +1 -0
  44. package/dist/modules/platform/forgejo/pr-cache.d.ts +23 -0
  45. package/dist/modules/platform/forgejo/pr-cache.js +134 -0
  46. package/dist/modules/platform/forgejo/pr-cache.js.map +1 -0
  47. package/dist/modules/platform/forgejo/types.d.ts +185 -0
  48. package/dist/modules/platform/forgejo/types.js +3 -0
  49. package/dist/modules/platform/forgejo/types.js.map +1 -0
  50. package/dist/modules/platform/forgejo/utils.d.ts +20 -0
  51. package/dist/modules/platform/forgejo/utils.js +142 -0
  52. package/dist/modules/platform/forgejo/utils.js.map +1 -0
  53. package/dist/modules/platform/gitea/index.js +1 -0
  54. package/dist/modules/platform/gitea/index.js.map +1 -1
  55. package/dist/modules/platform/scm.d.ts +1 -1
  56. package/dist/util/cache/package/namespaces.d.ts +1 -1
  57. package/dist/util/cache/package/namespaces.js +4 -0
  58. package/dist/util/cache/package/namespaces.js.map +1 -1
  59. package/dist/util/cache/repository/impl/base.d.ts +1 -1
  60. package/dist/util/cache/repository/types.d.ts +3 -0
  61. package/dist/util/cache/repository/types.js.map +1 -1
  62. package/dist/util/common.d.ts +1 -1
  63. package/dist/util/common.js +10 -3
  64. package/dist/util/common.js.map +1 -1
  65. package/dist/util/http/forgejo.d.ts +11 -0
  66. package/dist/util/http/forgejo.js +57 -0
  67. package/dist/util/http/forgejo.js.map +1 -0
  68. package/dist/workers/repository/update/pr/changelog/api.js +8 -6
  69. package/dist/workers/repository/update/pr/changelog/api.js.map +1 -1
  70. package/dist/workers/repository/update/pr/changelog/forgejo/index.d.ts +4 -0
  71. package/dist/workers/repository/update/pr/changelog/forgejo/index.js +62 -0
  72. package/dist/workers/repository/update/pr/changelog/forgejo/index.js.map +1 -0
  73. package/dist/workers/repository/update/pr/changelog/forgejo/source.d.ts +8 -0
  74. package/dist/workers/repository/update/pr/changelog/forgejo/source.js +20 -0
  75. package/dist/workers/repository/update/pr/changelog/forgejo/source.js.map +1 -0
  76. package/dist/workers/repository/update/pr/changelog/release-notes.js +17 -12
  77. package/dist/workers/repository/update/pr/changelog/release-notes.js.map +1 -1
  78. package/dist/workers/repository/update/pr/changelog/source.d.ts +1 -1
  79. package/dist/workers/repository/update/pr/changelog/source.js.map +1 -1
  80. package/dist/workers/repository/update/pr/changelog/types.d.ts +1 -1
  81. package/dist/workers/repository/update/pr/changelog/types.js.map +1 -1
  82. package/package.json +1 -1
  83. package/renovate-schema.json +1 -0
  84. package/dist/config/validation-helpers/managers.d.ts +0 -6
  85. package/dist/config/validation-helpers/managers.js +0 -29
  86. package/dist/config/validation-helpers/managers.js.map +0 -1
@@ -29,10 +29,14 @@ function detectPlatform(url) {
29
29
  if (hostname?.includes('bitbucket')) {
30
30
  return 'bitbucket-server';
31
31
  }
32
+ if (hostname?.includes('forgejo')) {
33
+ return 'forgejo';
34
+ }
35
+ if (hostname && ['codeberg.org', 'codefloe.com'].includes(hostname)) {
36
+ return 'forgejo';
37
+ }
32
38
  if (hostname &&
33
- (['gitea.com', 'codeberg.org'].includes(hostname) ||
34
- hostname.includes('gitea') ||
35
- hostname.includes('forgejo'))) {
39
+ (['gitea.com'].includes(hostname) || hostname.includes('gitea'))) {
36
40
  return 'gitea';
37
41
  }
38
42
  if (hostname === 'github.com' || hostname?.includes('github')) {
@@ -51,6 +55,9 @@ function detectPlatform(url) {
51
55
  if (constants_1.BITBUCKET_API_USING_HOST_TYPES.includes(hostType)) {
52
56
  return 'bitbucket';
53
57
  }
58
+ if (constants_1.FORGEJO_API_USING_HOST_TYPES.includes(hostType)) {
59
+ return 'forgejo';
60
+ }
54
61
  if (constants_1.GITEA_API_USING_HOST_TYPES.includes(hostType)) {
55
62
  return 'gitea';
56
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../lib/util/common.ts"],"names":[],"mappings":"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","sourcesContent":["import JSON5 from 'json5';\nimport * as JSONC from 'jsonc-parser';\nimport type { JsonValue } from 'type-fest';\nimport {\n BITBUCKET_API_USING_HOST_TYPES,\n BITBUCKET_SERVER_API_USING_HOST_TYPES,\n GITEA_API_USING_HOST_TYPES,\n GITHUB_API_USING_HOST_TYPES,\n GITLAB_API_USING_HOST_TYPES,\n} from '../constants';\nimport { logger } from '../logger';\nimport * as hostRules from './host-rules';\nimport { parseUrl } from './url';\n\n/**\n * Tries to detect the `platform` from a url.\n *\n * @param url the url to detect `platform` from\n * @returns matched `platform` if found, otherwise `null`\n */\nexport function detectPlatform(\n url: string,\n):\n | 'azure'\n | 'bitbucket'\n | 'bitbucket-server'\n | 'gitea'\n | 'github'\n | 'gitlab'\n | null {\n const { hostname } = parseUrl(url) ?? {};\n if (hostname === 'dev.azure.com' || hostname?.endsWith('.visualstudio.com')) {\n return 'azure';\n }\n if (hostname === 'bitbucket.org' || hostname === 'bitbucket.com') {\n return 'bitbucket';\n }\n if (hostname?.includes('bitbucket')) {\n return 'bitbucket-server';\n }\n if (\n hostname &&\n (['gitea.com', 'codeberg.org'].includes(hostname) ||\n hostname.includes('gitea') ||\n hostname.includes('forgejo'))\n ) {\n return 'gitea';\n }\n if (hostname === 'github.com' || hostname?.includes('github')) {\n return 'github';\n }\n if (hostname === 'gitlab.com' || hostname?.includes('gitlab')) {\n return 'gitlab';\n }\n\n const hostType = hostRules.hostType({ url });\n\n if (!hostType) {\n return null;\n }\n\n if (BITBUCKET_SERVER_API_USING_HOST_TYPES.includes(hostType)) {\n return 'bitbucket-server';\n }\n if (BITBUCKET_API_USING_HOST_TYPES.includes(hostType)) {\n return 'bitbucket';\n }\n if (GITEA_API_USING_HOST_TYPES.includes(hostType)) {\n return 'gitea';\n }\n if (GITHUB_API_USING_HOST_TYPES.includes(hostType)) {\n return 'github';\n }\n if (GITLAB_API_USING_HOST_TYPES.includes(hostType)) {\n return 'gitlab';\n }\n\n return null;\n}\n\nexport function noLeadingAtSymbol(input: string): string {\n return input.startsWith('@') ? input.slice(1) : input;\n}\n\nexport function parseJson(content: string | null, filename: string): JsonValue {\n if (!content) {\n return null;\n }\n\n if (filename.endsWith('.jsonc')) {\n return parseJsonc(content);\n }\n\n if (filename.endsWith('.json5')) {\n return JSON5.parse(content);\n }\n\n return parseJsonWithFallback(content, filename);\n}\n\nexport function parseJsonWithFallback(\n content: string,\n context: string,\n): JsonValue {\n let parsedJson: JsonValue;\n\n try {\n parsedJson = parseJsonc(content);\n } catch {\n // warn if json5 format used in json\n parsedJson = JSON5.parse(content);\n logger.warn(\n { context },\n 'File contents are invalid JSONC but parse using JSON5. Support for this will be removed in a future release so please change to a support .json5 file name or ensure correct JSON syntax.',\n );\n }\n\n return parsedJson;\n}\n\nexport function parseJsonc(content: string): JsonValue {\n const errors: JSONC.ParseError[] = [];\n const value = JSONC.parse(content, errors, { allowTrailingComma: true });\n if (errors.length === 0) {\n return value;\n }\n throw new Error('Invalid JSONC');\n}\n"]}
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../lib/util/common.ts"],"names":[],"mappings":"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","sourcesContent":["import JSON5 from 'json5';\nimport * as JSONC from 'jsonc-parser';\nimport type { JsonValue } from 'type-fest';\nimport {\n BITBUCKET_API_USING_HOST_TYPES,\n BITBUCKET_SERVER_API_USING_HOST_TYPES,\n FORGEJO_API_USING_HOST_TYPES,\n GITEA_API_USING_HOST_TYPES,\n GITHUB_API_USING_HOST_TYPES,\n GITLAB_API_USING_HOST_TYPES,\n} from '../constants';\nimport { logger } from '../logger';\nimport * as hostRules from './host-rules';\nimport { parseUrl } from './url';\n\n/**\n * Tries to detect the `platform` from a url.\n *\n * @param url the url to detect `platform` from\n * @returns matched `platform` if found, otherwise `null`\n */\nexport function detectPlatform(\n url: string,\n):\n | 'azure'\n | 'bitbucket'\n | 'bitbucket-server'\n | 'forgejo'\n | 'gitea'\n | 'github'\n | 'gitlab'\n | null {\n const { hostname } = parseUrl(url) ?? {};\n if (hostname === 'dev.azure.com' || hostname?.endsWith('.visualstudio.com')) {\n return 'azure';\n }\n if (hostname === 'bitbucket.org' || hostname === 'bitbucket.com') {\n return 'bitbucket';\n }\n if (hostname?.includes('bitbucket')) {\n return 'bitbucket-server';\n }\n if (hostname?.includes('forgejo')) {\n return 'forgejo';\n }\n if (hostname && ['codeberg.org', 'codefloe.com'].includes(hostname)) {\n return 'forgejo';\n }\n if (\n hostname &&\n (['gitea.com'].includes(hostname) || hostname.includes('gitea'))\n ) {\n return 'gitea';\n }\n if (hostname === 'github.com' || hostname?.includes('github')) {\n return 'github';\n }\n if (hostname === 'gitlab.com' || hostname?.includes('gitlab')) {\n return 'gitlab';\n }\n\n const hostType = hostRules.hostType({ url });\n\n if (!hostType) {\n return null;\n }\n\n if (BITBUCKET_SERVER_API_USING_HOST_TYPES.includes(hostType)) {\n return 'bitbucket-server';\n }\n if (BITBUCKET_API_USING_HOST_TYPES.includes(hostType)) {\n return 'bitbucket';\n }\n if (FORGEJO_API_USING_HOST_TYPES.includes(hostType)) {\n return 'forgejo';\n }\n if (GITEA_API_USING_HOST_TYPES.includes(hostType)) {\n return 'gitea';\n }\n if (GITHUB_API_USING_HOST_TYPES.includes(hostType)) {\n return 'github';\n }\n if (GITLAB_API_USING_HOST_TYPES.includes(hostType)) {\n return 'gitlab';\n }\n\n return null;\n}\n\nexport function noLeadingAtSymbol(input: string): string {\n return input.startsWith('@') ? input.slice(1) : input;\n}\n\nexport function parseJson(content: string | null, filename: string): JsonValue {\n if (!content) {\n return null;\n }\n\n if (filename.endsWith('.jsonc')) {\n return parseJsonc(content);\n }\n\n if (filename.endsWith('.json5')) {\n return JSON5.parse(content);\n }\n\n return parseJsonWithFallback(content, filename);\n}\n\nexport function parseJsonWithFallback(\n content: string,\n context: string,\n): JsonValue {\n let parsedJson: JsonValue;\n\n try {\n parsedJson = parseJsonc(content);\n } catch {\n // warn if json5 format used in json\n parsedJson = JSON5.parse(content);\n logger.warn(\n { context },\n 'File contents are invalid JSONC but parse using JSON5. Support for this will be removed in a future release so please change to a support .json5 file name or ensure correct JSON syntax.',\n );\n }\n\n return parsedJson;\n}\n\nexport function parseJsonc(content: string): JsonValue {\n const errors: JSONC.ParseError[] = [];\n const value = JSONC.parse(content, errors, { allowTrailingComma: true });\n if (errors.length === 0) {\n return value;\n }\n throw new Error('Invalid JSONC');\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import { HttpBase, type InternalJsonUnsafeOptions } from './http';
2
+ import type { HttpMethod, HttpOptions, HttpResponse } from './types';
3
+ export declare const setBaseUrl: (newBaseUrl: string) => void;
4
+ export interface ForgejoHttpOptions extends HttpOptions {
5
+ paginate?: boolean;
6
+ }
7
+ export declare class ForgejoHttp extends HttpBase<ForgejoHttpOptions> {
8
+ protected get baseUrl(): string | undefined;
9
+ constructor(hostType?: string, options?: HttpOptions);
10
+ protected requestJsonUnsafe<T = unknown>(method: HttpMethod, options: InternalJsonUnsafeOptions<ForgejoHttpOptions>): Promise<HttpResponse<T>>;
11
+ }
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ForgejoHttp = exports.setBaseUrl = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const is_1 = tslib_1.__importDefault(require("@sindresorhus/is"));
6
+ const http_1 = require("./http");
7
+ let baseUrl;
8
+ const setBaseUrl = (newBaseUrl) => {
9
+ baseUrl = newBaseUrl.replace(/\/*$/, '/'); // TODO #12875
10
+ };
11
+ exports.setBaseUrl = setBaseUrl;
12
+ function getPaginationContainer(body) {
13
+ if (is_1.default.array(body) && body.length) {
14
+ return body;
15
+ }
16
+ if (is_1.default.plainObject(body) && is_1.default.array(body?.data) && body.data.length) {
17
+ return body.data;
18
+ }
19
+ return null;
20
+ }
21
+ class ForgejoHttp extends http_1.HttpBase {
22
+ get baseUrl() {
23
+ return baseUrl;
24
+ }
25
+ constructor(hostType, options) {
26
+ super(hostType ?? 'forgejo', options);
27
+ }
28
+ async requestJsonUnsafe(method, options) {
29
+ const resolvedUrl = this.resolveUrl(options.url, options.httpOptions);
30
+ const opts = {
31
+ ...options,
32
+ url: resolvedUrl,
33
+ };
34
+ const res = await super.requestJsonUnsafe(method, opts);
35
+ const pc = getPaginationContainer(res.body);
36
+ if (opts.httpOptions?.paginate && pc) {
37
+ delete opts.httpOptions.cacheProvider;
38
+ opts.httpOptions.memCache = false;
39
+ delete opts.httpOptions.paginate;
40
+ const total = parseInt(res.headers['x-total-count'], 10);
41
+ let nextPage = parseInt(resolvedUrl.searchParams.get('page') ?? '1', 10);
42
+ while (total && pc.length < total) {
43
+ nextPage += 1;
44
+ resolvedUrl.searchParams.set('page', nextPage.toString());
45
+ const nextRes = await super.requestJsonUnsafe(method, opts);
46
+ const nextPc = getPaginationContainer(nextRes.body);
47
+ if (nextPc === null) {
48
+ break;
49
+ }
50
+ pc.push(...nextPc);
51
+ }
52
+ }
53
+ return res;
54
+ }
55
+ }
56
+ exports.ForgejoHttp = ForgejoHttp;
57
+ //# sourceMappingURL=forgejo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forgejo.js","sourceRoot":"","sources":["../../../lib/util/http/forgejo.ts"],"names":[],"mappings":";;;;AAAA,kEAAkC;AAClC,iCAAkE;AAGlE,IAAI,OAAe,CAAC;AACb,MAAM,UAAU,GAAG,CAAC,UAAkB,EAAQ,EAAE;IACrD,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,cAAc;AAC3D,CAAC,CAAC;AAFW,QAAA,UAAU,cAErB;AAMF,SAAS,sBAAsB,CAAc,IAAa;IACxD,IAAI,YAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAClC,OAAO,IAAW,CAAC;IACrB,CAAC;IAED,IAAI,YAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,YAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACrE,OAAO,IAAI,CAAC,IAAW,CAAC;IAC1B,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAa,WAAY,SAAQ,eAA4B;IAC3D,IAAuB,OAAO;QAC5B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,YAAY,QAAiB,EAAE,OAAqB;QAClD,KAAK,CAAC,QAAQ,IAAI,SAAS,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAEkB,KAAK,CAAC,iBAAiB,CACxC,MAAkB,EAClB,OAAsD;QAEtD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QACtE,MAAM,IAAI,GAAG;YACX,GAAG,OAAO;YACV,GAAG,EAAE,WAAW;SACjB,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,iBAAiB,CAAI,MAAM,EAAE,IAAI,CAAC,CAAC;QAC3D,MAAM,EAAE,GAAG,sBAAsB,CAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,IAAI,CAAC,WAAW,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC;YACrC,OAAO,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC;YACtC,IAAI,CAAC,WAAW,CAAC,QAAQ,GAAG,KAAK,CAAC;YAElC,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;YACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAW,EAAE,EAAE,CAAC,CAAC;YACnE,IAAI,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;YAEzE,OAAO,KAAK,IAAI,EAAE,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;gBAClC,QAAQ,IAAI,CAAC,CAAC;gBACd,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAE1D,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,iBAAiB,CAAI,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC/D,MAAM,MAAM,GAAG,sBAAsB,CAAI,OAAO,CAAC,IAAI,CAAC,CAAC;gBACvD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;oBACpB,MAAM;gBACR,CAAC;gBAED,EAAE,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AA5CD,kCA4CC","sourcesContent":["import is from '@sindresorhus/is';\nimport { HttpBase, type InternalJsonUnsafeOptions } from './http';\nimport type { HttpMethod, HttpOptions, HttpResponse } from './types';\n\nlet baseUrl: string;\nexport const setBaseUrl = (newBaseUrl: string): void => {\n baseUrl = newBaseUrl.replace(/\\/*$/, '/'); // TODO #12875\n};\n\nexport interface ForgejoHttpOptions extends HttpOptions {\n paginate?: boolean;\n}\n\nfunction getPaginationContainer<T = unknown>(body: unknown): T[] | null {\n if (is.array(body) && body.length) {\n return body as T[];\n }\n\n if (is.plainObject(body) && is.array(body?.data) && body.data.length) {\n return body.data as T[];\n }\n\n return null;\n}\n\nexport class ForgejoHttp extends HttpBase<ForgejoHttpOptions> {\n protected override get baseUrl(): string | undefined {\n return baseUrl;\n }\n\n constructor(hostType?: string, options?: HttpOptions) {\n super(hostType ?? 'forgejo', options);\n }\n\n protected override async requestJsonUnsafe<T = unknown>(\n method: HttpMethod,\n options: InternalJsonUnsafeOptions<ForgejoHttpOptions>,\n ): Promise<HttpResponse<T>> {\n const resolvedUrl = this.resolveUrl(options.url, options.httpOptions);\n const opts = {\n ...options,\n url: resolvedUrl,\n };\n const res = await super.requestJsonUnsafe<T>(method, opts);\n const pc = getPaginationContainer<T>(res.body);\n if (opts.httpOptions?.paginate && pc) {\n delete opts.httpOptions.cacheProvider;\n opts.httpOptions.memCache = false;\n\n delete opts.httpOptions.paginate;\n const total = parseInt(res.headers['x-total-count'] as string, 10);\n let nextPage = parseInt(resolvedUrl.searchParams.get('page') ?? '1', 10);\n\n while (total && pc.length < total) {\n nextPage += 1;\n resolvedUrl.searchParams.set('page', nextPage.toString());\n\n const nextRes = await super.requestJsonUnsafe<T>(method, opts);\n const nextPc = getPaginationContainer<T>(nextRes.body);\n if (nextPc === null) {\n break;\n }\n\n pc.push(...nextPc);\n }\n }\n\n return res;\n }\n}\n"]}
@@ -2,14 +2,16 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const source_1 = require("./bitbucket/source");
4
4
  const source_2 = require("./bitbucket-server/source");
5
- const source_3 = require("./gitea/source");
6
- const source_4 = require("./github/source");
7
- const source_5 = require("./gitlab/source");
5
+ const source_3 = require("./forgejo/source");
6
+ const source_4 = require("./gitea/source");
7
+ const source_5 = require("./github/source");
8
+ const source_6 = require("./gitlab/source");
8
9
  const api = new Map();
9
10
  exports.default = api;
10
11
  api.set('bitbucket', new source_1.BitbucketChangeLogSource());
11
12
  api.set('bitbucket-server', new source_2.BitbucketServerChangeLogSource());
12
- api.set('gitea', new source_3.GiteaChangeLogSource());
13
- api.set('github', new source_4.GitHubChangeLogSource());
14
- api.set('gitlab', new source_5.GitLabChangeLogSource());
13
+ api.set('forgejo', new source_3.ForgejoChangeLogSource());
14
+ api.set('gitea', new source_4.GiteaChangeLogSource());
15
+ api.set('github', new source_5.GitHubChangeLogSource());
16
+ api.set('gitlab', new source_6.GitLabChangeLogSource());
15
17
  //# sourceMappingURL=api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../../../lib/workers/repository/update/pr/changelog/api.ts"],"names":[],"mappings":";;AAAA,+CAA8D;AAC9D,sDAA2E;AAC3E,2CAAsD;AACtD,4CAAwD;AACxD,4CAAwD;AAGxD,MAAM,GAAG,GAAG,IAAI,GAAG,EAA2B,CAAC;AAC/C,kBAAe,GAAG,CAAC;AAEnB,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,iCAAwB,EAAE,CAAC,CAAC;AACrD,GAAG,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,uCAA8B,EAAE,CAAC,CAAC;AAClE,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,6BAAoB,EAAE,CAAC,CAAC;AAC7C,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,8BAAqB,EAAE,CAAC,CAAC;AAC/C,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,8BAAqB,EAAE,CAAC,CAAC","sourcesContent":["import { BitbucketChangeLogSource } from './bitbucket/source';\nimport { BitbucketServerChangeLogSource } from './bitbucket-server/source';\nimport { GiteaChangeLogSource } from './gitea/source';\nimport { GitHubChangeLogSource } from './github/source';\nimport { GitLabChangeLogSource } from './gitlab/source';\nimport type { ChangeLogSource } from './source';\n\nconst api = new Map<string, ChangeLogSource>();\nexport default api;\n\napi.set('bitbucket', new BitbucketChangeLogSource());\napi.set('bitbucket-server', new BitbucketServerChangeLogSource());\napi.set('gitea', new GiteaChangeLogSource());\napi.set('github', new GitHubChangeLogSource());\napi.set('gitlab', new GitLabChangeLogSource());\n"]}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../../../lib/workers/repository/update/pr/changelog/api.ts"],"names":[],"mappings":";;AAAA,+CAA8D;AAC9D,sDAA2E;AAC3E,6CAA0D;AAC1D,2CAAsD;AACtD,4CAAwD;AACxD,4CAAwD;AAGxD,MAAM,GAAG,GAAG,IAAI,GAAG,EAA2B,CAAC;AAC/C,kBAAe,GAAG,CAAC;AAEnB,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,iCAAwB,EAAE,CAAC,CAAC;AACrD,GAAG,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,uCAA8B,EAAE,CAAC,CAAC;AAClE,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,+BAAsB,EAAE,CAAC,CAAC;AACjD,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,6BAAoB,EAAE,CAAC,CAAC;AAC7C,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,8BAAqB,EAAE,CAAC,CAAC;AAC/C,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,8BAAqB,EAAE,CAAC,CAAC","sourcesContent":["import { BitbucketChangeLogSource } from './bitbucket/source';\nimport { BitbucketServerChangeLogSource } from './bitbucket-server/source';\nimport { ForgejoChangeLogSource } from './forgejo/source';\nimport { GiteaChangeLogSource } from './gitea/source';\nimport { GitHubChangeLogSource } from './github/source';\nimport { GitLabChangeLogSource } from './gitlab/source';\nimport type { ChangeLogSource } from './source';\n\nconst api = new Map<string, ChangeLogSource>();\nexport default api;\n\napi.set('bitbucket', new BitbucketChangeLogSource());\napi.set('bitbucket-server', new BitbucketServerChangeLogSource());\napi.set('forgejo', new ForgejoChangeLogSource());\napi.set('gitea', new GiteaChangeLogSource());\napi.set('github', new GitHubChangeLogSource());\napi.set('gitlab', new GitLabChangeLogSource());\n"]}
@@ -0,0 +1,4 @@
1
+ import type { ChangeLogFile, ChangeLogNotes, ChangeLogProject, ChangeLogRelease } from '../types';
2
+ export declare const id = "forgejo-changelog";
3
+ export declare function getReleaseNotesMd(repository: string, apiBaseUrl: string, sourceDirectory?: string): Promise<ChangeLogFile | null>;
4
+ export declare function getReleaseList(project: ChangeLogProject, _release: ChangeLogRelease): Promise<ChangeLogNotes[]>;
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.id = void 0;
4
+ exports.getReleaseNotesMd = getReleaseNotesMd;
5
+ exports.getReleaseList = getReleaseList;
6
+ const tslib_1 = require("tslib");
7
+ const changelog_filename_regex_1 = tslib_1.__importDefault(require("changelog-filename-regex"));
8
+ const logger_1 = require("../../../../../../logger");
9
+ const schema_1 = require("../../../../../../modules/datasource/forgejo-releases/schema");
10
+ const schema_2 = require("../../../../../../modules/platform/gitea/schema");
11
+ const forgejo_1 = require("../../../../../../util/http/forgejo");
12
+ const string_1 = require("../../../../../../util/string");
13
+ const common_1 = require("../common");
14
+ exports.id = 'forgejo-changelog';
15
+ const http = new forgejo_1.ForgejoHttp(exports.id);
16
+ async function getReleaseNotesMd(repository, apiBaseUrl, sourceDirectory) {
17
+ logger_1.logger.trace('forgejo.getReleaseNotesMd()');
18
+ const apiPrefix = `${apiBaseUrl}repos/${repository}/contents`;
19
+ const sourceDir = sourceDirectory ? `/${sourceDirectory}` : '';
20
+ const tree = (await http.getJson(`${apiPrefix}${sourceDir}`, {
21
+ paginate: false, // no pagination yet
22
+ }, schema_2.ContentsListResponseSchema)).body;
23
+ const allFiles = tree.filter((f) => f.type === 'file');
24
+ let files = [];
25
+ if (!files.length) {
26
+ files = allFiles.filter((f) => changelog_filename_regex_1.default.test(f.name));
27
+ }
28
+ if (!files.length) {
29
+ logger_1.logger.trace('no changelog file found');
30
+ return null;
31
+ }
32
+ const { path: changelogFile } = files
33
+ .sort((a, b) => (0, common_1.compareChangelogFilePath)(a.path, b.path))
34
+ .shift();
35
+ /* istanbul ignore if */
36
+ if (files.length !== 0) {
37
+ logger_1.logger.debug(`Multiple candidates for changelog file, using ${changelogFile}`);
38
+ }
39
+ const fileRes = await http.getJson(`${apiPrefix}/${changelogFile}`, schema_2.ContentsResponseSchema);
40
+ // istanbul ignore if: should never happen
41
+ if (!fileRes.body.content) {
42
+ logger_1.logger.debug(`Missing content for changelog file, using ${changelogFile}`);
43
+ return null;
44
+ }
45
+ const changelogMd = (0, string_1.fromBase64)(fileRes.body.content) + '\n#\n##';
46
+ return { changelogFile, changelogMd };
47
+ }
48
+ async function getReleaseList(project, _release) {
49
+ logger_1.logger.trace('forgejo.getReleaseNotesMd()');
50
+ const apiUrl = `${project.apiBaseUrl}repos/${project.repository}/releases`;
51
+ const res = await http.getJson(`${apiUrl}?draft=false`, {
52
+ paginate: true,
53
+ }, schema_1.ReleasesSchema);
54
+ return res.body.map((release) => ({
55
+ url: `${project.baseUrl}${project.repository}/releases/tag/${release.tag_name}`,
56
+ notesSourceUrl: apiUrl,
57
+ name: release.name,
58
+ body: release.body,
59
+ tag: release.tag_name,
60
+ }));
61
+ }
62
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../lib/workers/repository/update/pr/changelog/forgejo/index.ts"],"names":[],"mappings":"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","sourcesContent":["import changelogFilenameRegex from 'changelog-filename-regex';\nimport { logger } from '../../../../../../logger';\nimport { ReleasesSchema } from '../../../../../../modules/datasource/forgejo-releases/schema';\nimport type { ContentsResponse } from '../../../../../../modules/platform/gitea/schema';\nimport {\n ContentsListResponseSchema,\n ContentsResponseSchema,\n} from '../../../../../../modules/platform/gitea/schema';\nimport { ForgejoHttp } from '../../../../../../util/http/forgejo';\nimport { fromBase64 } from '../../../../../../util/string';\nimport { compareChangelogFilePath } from '../common';\nimport type {\n ChangeLogFile,\n ChangeLogNotes,\n ChangeLogProject,\n ChangeLogRelease,\n} from '../types';\n\nexport const id = 'forgejo-changelog';\nconst http = new ForgejoHttp(id);\n\nexport async function getReleaseNotesMd(\n repository: string,\n apiBaseUrl: string,\n sourceDirectory?: string,\n): Promise<ChangeLogFile | null> {\n logger.trace('forgejo.getReleaseNotesMd()');\n const apiPrefix = `${apiBaseUrl}repos/${repository}/contents`;\n\n const sourceDir = sourceDirectory ? `/${sourceDirectory}` : '';\n const tree = (\n await http.getJson(\n `${apiPrefix}${sourceDir}`,\n {\n paginate: false, // no pagination yet\n },\n ContentsListResponseSchema,\n )\n ).body;\n const allFiles = tree.filter((f) => f.type === 'file');\n let files: ContentsResponse[] = [];\n if (!files.length) {\n files = allFiles.filter((f) => changelogFilenameRegex.test(f.name));\n }\n if (!files.length) {\n logger.trace('no changelog file found');\n return null;\n }\n\n const { path: changelogFile } = files\n .sort((a, b) => compareChangelogFilePath(a.path, b.path))\n .shift()!;\n /* istanbul ignore if */\n if (files.length !== 0) {\n logger.debug(\n `Multiple candidates for changelog file, using ${changelogFile}`,\n );\n }\n\n const fileRes = await http.getJson(\n `${apiPrefix}/${changelogFile}`,\n ContentsResponseSchema,\n );\n // istanbul ignore if: should never happen\n if (!fileRes.body.content) {\n logger.debug(`Missing content for changelog file, using ${changelogFile}`);\n return null;\n }\n const changelogMd = fromBase64(fileRes.body.content) + '\\n#\\n##';\n\n return { changelogFile, changelogMd };\n}\n\nexport async function getReleaseList(\n project: ChangeLogProject,\n _release: ChangeLogRelease,\n): Promise<ChangeLogNotes[]> {\n logger.trace('forgejo.getReleaseNotesMd()');\n const apiUrl = `${project.apiBaseUrl}repos/${project.repository}/releases`;\n\n const res = await http.getJson(\n `${apiUrl}?draft=false`,\n {\n paginate: true,\n },\n ReleasesSchema,\n );\n return res.body.map((release) => ({\n url: `${project.baseUrl}${project.repository}/releases/tag/${release.tag_name}`,\n notesSourceUrl: apiUrl,\n name: release.name,\n body: release.body,\n tag: release.tag_name,\n }));\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import type { BranchUpgradeConfig } from '../../../../../types';
2
+ import { ChangeLogSource } from '../source';
3
+ export declare class ForgejoChangeLogSource extends ChangeLogSource {
4
+ constructor();
5
+ getAPIBaseUrl(config: BranchUpgradeConfig): string;
6
+ getCompareURL(baseUrl: string, repository: string, prevHead: string, nextHead: string): string;
7
+ hasValidRepository(repository: string): boolean;
8
+ }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ForgejoChangeLogSource = void 0;
4
+ const source_1 = require("../source");
5
+ class ForgejoChangeLogSource extends source_1.ChangeLogSource {
6
+ constructor() {
7
+ super('forgejo', 'forgejo-tags');
8
+ }
9
+ getAPIBaseUrl(config) {
10
+ return this.getBaseUrl(config) + 'api/v1/';
11
+ }
12
+ getCompareURL(baseUrl, repository, prevHead, nextHead) {
13
+ return `${baseUrl}${repository}/compare/${prevHead}...${nextHead}`;
14
+ }
15
+ hasValidRepository(repository) {
16
+ return repository.split('/').length === 2;
17
+ }
18
+ }
19
+ exports.ForgejoChangeLogSource = ForgejoChangeLogSource;
20
+ //# sourceMappingURL=source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.js","sourceRoot":"","sources":["../../../../../../../lib/workers/repository/update/pr/changelog/forgejo/source.ts"],"names":[],"mappings":";;;AACA,sCAA4C;AAE5C,MAAa,sBAAuB,SAAQ,wBAAe;IACzD;QACE,KAAK,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACnC,CAAC;IAED,aAAa,CAAC,MAA2B;QACvC,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAC7C,CAAC;IAED,aAAa,CACX,OAAe,EACf,UAAkB,EAClB,QAAgB,EAChB,QAAgB;QAEhB,OAAO,GAAG,OAAO,GAAG,UAAU,YAAY,QAAQ,MAAM,QAAQ,EAAE,CAAC;IACrE,CAAC;IAEQ,kBAAkB,CAAC,UAAkB;QAC5C,OAAO,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IAC5C,CAAC;CACF;AArBD,wDAqBC","sourcesContent":["import type { BranchUpgradeConfig } from '../../../../../types';\nimport { ChangeLogSource } from '../source';\n\nexport class ForgejoChangeLogSource extends ChangeLogSource {\n constructor() {\n super('forgejo', 'forgejo-tags');\n }\n\n getAPIBaseUrl(config: BranchUpgradeConfig): string {\n return this.getBaseUrl(config) + 'api/v1/';\n }\n\n getCompareURL(\n baseUrl: string,\n repository: string,\n prevHead: string,\n nextHead: string,\n ): string {\n return `${baseUrl}${repository}/compare/${prevHead}...${nextHead}`;\n }\n\n override hasValidRepository(repository: string): boolean {\n return repository.split('/').length === 2;\n }\n}\n"]}
@@ -25,6 +25,7 @@ const string_1 = require("../../../../../util/string");
25
25
  const url_1 = require("../../../../../util/url");
26
26
  const bitbucket = tslib_1.__importStar(require("./bitbucket"));
27
27
  const bitbucketServer = tslib_1.__importStar(require("./bitbucket-server"));
28
+ const forgejo = tslib_1.__importStar(require("./forgejo"));
28
29
  const gitea = tslib_1.__importStar(require("./gitea"));
29
30
  const github = tslib_1.__importStar(require("./github"));
30
31
  const gitlab = tslib_1.__importStar(require("./gitlab"));
@@ -36,17 +37,19 @@ async function getReleaseList(project, release) {
36
37
  const { apiBaseUrl, repository, type } = project;
37
38
  try {
38
39
  switch (type) {
39
- case 'gitea':
40
- return await gitea.getReleaseList(project, release);
41
- case 'gitlab':
42
- return await gitlab.getReleaseList(project, release);
43
- case 'github':
44
- return await github.getReleaseList(project, release);
45
40
  case 'bitbucket':
46
41
  return bitbucket.getReleaseList(project, release);
47
42
  case 'bitbucket-server':
48
43
  logger_1.logger.trace('Unsupported Bitbucket Server feature. Skipping release fetching.');
49
44
  return [];
45
+ case 'forgejo':
46
+ return await forgejo.getReleaseList(project, release);
47
+ case 'gitea':
48
+ return await gitea.getReleaseList(project, release);
49
+ case 'github':
50
+ return await github.getReleaseList(project, release);
51
+ case 'gitlab':
52
+ return await gitlab.getReleaseList(project, release);
50
53
  default:
51
54
  logger_1.logger.warn({ apiBaseUrl, repository, type }, 'Invalid project type');
52
55
  return [];
@@ -201,16 +204,18 @@ async function getReleaseNotesMdFileInner(project) {
201
204
  const sourceDirectory = project.sourceDirectory;
202
205
  try {
203
206
  switch (type) {
204
- case 'gitea':
205
- return await gitea.getReleaseNotesMd(repository, apiBaseUrl, sourceDirectory);
206
- case 'gitlab':
207
- return await gitlab.getReleaseNotesMd(repository, apiBaseUrl, sourceDirectory);
208
- case 'github':
209
- return await github.getReleaseNotesMd(repository, apiBaseUrl, sourceDirectory);
210
207
  case 'bitbucket':
211
208
  return await bitbucket.getReleaseNotesMd(repository, apiBaseUrl, sourceDirectory);
212
209
  case 'bitbucket-server':
213
210
  return await bitbucketServer.getReleaseNotesMd(repository, apiBaseUrl, sourceDirectory);
211
+ case 'forgejo':
212
+ return await forgejo.getReleaseNotesMd(repository, apiBaseUrl, sourceDirectory);
213
+ case 'gitea':
214
+ return await gitea.getReleaseNotesMd(repository, apiBaseUrl, sourceDirectory);
215
+ case 'github':
216
+ return await github.getReleaseNotesMd(repository, apiBaseUrl, sourceDirectory);
217
+ case 'gitlab':
218
+ return await gitlab.getReleaseNotesMd(repository, apiBaseUrl, sourceDirectory);
214
219
  default:
215
220
  logger_1.logger.warn({ apiBaseUrl, repository, type }, 'Invalid project type');
216
221
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"release-notes.js","sourceRoot":"","sources":["../../../../../../lib/workers/repository/update/pr/changelog/release-notes.ts"],"names":[],"mappings":"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","sourcesContent":["import is from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport MarkdownIt from 'markdown-it';\nimport { logger } from '../../../../../logger';\nimport * as memCache from '../../../../../util/cache/memory';\nimport * as packageCache from '../../../../../util/cache/package';\nimport type { PackageCacheNamespace } from '../../../../../util/cache/package/types';\nimport { detectPlatform } from '../../../../../util/common';\nimport { linkify } from '../../../../../util/markdown';\nimport { newlineRegex, regEx } from '../../../../../util/regex';\nimport { coerceString } from '../../../../../util/string';\nimport { isHttpUrl, joinUrlParts } from '../../../../../util/url';\nimport type { BranchUpgradeConfig } from '../../../../types';\nimport * as bitbucket from './bitbucket';\nimport * as bitbucketServer from './bitbucket-server';\nimport * as gitea from './gitea';\nimport * as github from './github';\nimport * as gitlab from './gitlab';\nimport type {\n ChangeLogFile,\n ChangeLogNotes,\n ChangeLogProject,\n ChangeLogRelease,\n ChangeLogResult,\n} from './types';\n\nconst markdown = new MarkdownIt('zero');\nmarkdown.enable(['heading', 'lheading']);\n\nconst repositoriesToSkipMdFetching = ['facebook/react-native'];\n\nexport async function getReleaseList(\n project: ChangeLogProject,\n release: ChangeLogRelease,\n): Promise<ChangeLogNotes[]> {\n logger.trace('getReleaseList()');\n const { apiBaseUrl, repository, type } = project;\n try {\n switch (type) {\n case 'gitea':\n return await gitea.getReleaseList(project, release);\n case 'gitlab':\n return await gitlab.getReleaseList(project, release);\n case 'github':\n return await github.getReleaseList(project, release);\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 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 .replace(regEx(/\\n\\s*####? /g), '\\n##### ')\n .replace(regEx(/\\n\\s*## /g), '\\n#### ')\n .replace(regEx(/\\n\\s*# /g), '\\n### ');\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 (is.undefined(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 (is.undefined(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 'gitea':\n return await gitea.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n case 'gitlab':\n return await gitlab.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 '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 default:\n logger.warn({ apiBaseUrl, repository, type }, 'Invalid project type');\n return null;\n }\n } catch (err) /* istanbul ignore next */ {\n if (err.statusCode === 404) {\n logger.debug(\n { repository, type, apiBaseUrl },\n 'Error 404 getting changelog md',\n );\n } else {\n logger.debug(\n { err, repository, type, apiBaseUrl },\n 'Error getting changelog md',\n );\n }\n }\n return null;\n}\n\nexport function getReleaseNotesMdFile(\n project: ChangeLogProject,\n): Promise<ChangeLogFile | null> {\n const { sourceDirectory, repository, apiBaseUrl } = project;\n // TODO: types (#22198)\n const cacheKey = sourceDirectory\n ? `getReleaseNotesMdFile@v2-${repository}-${sourceDirectory}-${apiBaseUrl}`\n : `getReleaseNotesMdFile@v2-${repository}-${apiBaseUrl}`;\n const cachedResult = memCache.get<Promise<ChangeLogFile | null>>(cacheKey);\n // istanbul ignore if\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n const promisedRes = getReleaseNotesMdFileInner(project);\n memCache.set(cacheKey, promisedRes);\n return promisedRes;\n}\n\nexport async function getReleaseNotesMd(\n project: ChangeLogProject,\n release: ChangeLogRelease,\n): Promise<ChangeLogNotes | null> {\n const { baseUrl, repository, packageName } = project;\n const version = release.version;\n logger.trace(`getReleaseNotesMd(${repository}, ${version})`);\n\n if (shouldSkipChangelogMd(repository)) {\n return null;\n }\n\n const changelog = await getReleaseNotesMdFile(project);\n if (!changelog) {\n return null;\n }\n const { changelogFile } = changelog;\n const changelogMd = changelog.changelogMd.replace(\n regEx(/\\n\\s*<a name=\"[^\"]*\">.*?<\\/a>\\n/g),\n '\\n',\n );\n for (const level of [1, 2, 3, 4, 5, 6, 7]) {\n const changelogParsed = sectionize(changelogMd, level);\n if (changelogParsed.length >= 2) {\n for (const section of changelogParsed) {\n try {\n // replace brackets and parenthesis with space\n const deParenthesizedSection = section.replace(\n regEx(/[[\\]()]/g),\n ' ',\n );\n const [heading] = deParenthesizedSection.split(newlineRegex);\n const title = heading\n .replace(regEx(/^\\s*#*\\s*/), '')\n .split(' ')\n .filter(Boolean);\n const body = section.replace(regEx(/.*?\\n(-{3,}\\n)?/), '').trim();\n const notesSourceUrl = getNotesSourceUrl(\n baseUrl,\n repository,\n project,\n changelogFile,\n );\n const mdHeadingLink = title\n .filter((word) => !isHttpUrl(word))\n .join('-')\n .replace(regEx(/[^A-Za-z0-9-]/g), '');\n const url = `${notesSourceUrl}#${mdHeadingLink}`;\n // Look for version in title\n for (const word of title) {\n if (word.includes(version) && !isHttpUrl(word)) {\n logger.trace({ body }, 'Found release notes for v' + version);\n return {\n body: await linkifyBody(project, body),\n url,\n notesSourceUrl,\n };\n }\n }\n // Look for version in body - useful for monorepos. First check for heading with \"(yyyy-mm-dd)\"\n const releasesRegex = regEx(/([0-9]{4}-[0-9]{2}-[0-9]{2})/);\n if (packageName && heading.search(releasesRegex) !== -1) {\n // Now check if any line contains both the package name and the version\n const bodyLines = body.split('\\n');\n if (\n bodyLines.some(\n (line) =>\n line.includes(packageName) &&\n line.includes(version) &&\n !isHttpUrl(line),\n )\n ) {\n logger.trace({ body }, 'Found release notes for v' + version);\n return {\n body: await linkifyBody(project, body),\n url,\n notesSourceUrl,\n };\n }\n }\n } catch (err) /* istanbul ignore next */ {\n logger.warn(\n { file: changelogFile, err },\n `Error parsing changelog file`,\n );\n }\n }\n }\n logger.trace({ repository }, `No level ${level} changelogs headings found`);\n }\n logger.trace({ repository, version }, `No entry found in ${changelogFile}`);\n return null;\n}\n\n/**\n * Determine how long to cache release notes based on when the version was released.\n *\n * It's not uncommon for release notes to be updated shortly after the release itself,\n * so only cache for about an hour when the release is less than a week old. Otherwise,\n * cache for days.\n */\nexport function releaseNotesCacheMinutes(releaseDate?: string | Date): number {\n const dt = is.date(releaseDate)\n ? DateTime.fromJSDate(releaseDate)\n : DateTime.fromISO(releaseDate!);\n\n const now = DateTime.local();\n\n if (!dt.isValid || now.diff(dt, 'days').days < 7) {\n return 55;\n }\n\n if (now.diff(dt, 'months').months < 6) {\n return 1435; // 5 minutes shy of one day\n }\n\n return 14495; // 5 minutes shy of 10 days\n}\n\nexport async function addReleaseNotes(\n input: ChangeLogResult | null | undefined,\n config: BranchUpgradeConfig,\n): Promise<ChangeLogResult | null> {\n if (!input?.versions || !input.project?.type) {\n logger.debug('Missing project or versions');\n return input ?? null;\n }\n const output: ChangeLogResult = {\n ...input,\n versions: [],\n hasReleaseNotes: false,\n };\n\n const { repository, sourceDirectory, type: projectType } = input.project;\n const cacheNamespace: PackageCacheNamespace = `changelog-${projectType}-notes@v2`;\n const cacheKeyPrefix = sourceDirectory\n ? `${repository}:${sourceDirectory}`\n : `${repository}`;\n\n for (const v of input.versions) {\n let releaseNotes: ChangeLogNotes | null | undefined;\n const cacheKey = `${cacheKeyPrefix}:${v.version}`;\n releaseNotes = await packageCache.get(cacheNamespace, cacheKey);\n releaseNotes ??= await getReleaseNotesMd(input.project, v);\n releaseNotes ??= await getReleaseNotes(input.project, v, config);\n\n // If there is no release notes, at least try to show the compare URL\n if (!releaseNotes && v.compare.url) {\n releaseNotes = { url: v.compare.url, notesSourceUrl: '' };\n }\n\n const cacheMinutes = releaseNotesCacheMinutes(v.date);\n await packageCache.set(\n cacheNamespace,\n cacheKey,\n releaseNotes,\n cacheMinutes,\n );\n output.versions!.push({\n ...v,\n releaseNotes: releaseNotes!,\n });\n\n if (releaseNotes) {\n output.hasReleaseNotes = true;\n }\n }\n return output;\n}\n\n/**\n * Skip fetching changelog/release-notes markdown files.\n * Will force a fallback to using GitHub release notes\n */\nexport function shouldSkipChangelogMd(repository: string): boolean {\n return repositoriesToSkipMdFetching.includes(repository);\n}\n\nfunction getNotesSourceUrl(\n baseUrl: string,\n repository: string,\n project: ChangeLogProject,\n changelogFile: string,\n): string {\n if (project.type === 'bitbucket-server') {\n const [projectKey, repositorySlug] = repository.split('/');\n return joinUrlParts(\n baseUrl,\n 'projects',\n projectKey,\n 'repos',\n repositorySlug,\n 'browse',\n changelogFile,\n '?at=HEAD',\n );\n }\n\n return joinUrlParts(\n baseUrl,\n repository,\n project.type === 'bitbucket' ? 'src' : 'blob',\n 'HEAD',\n changelogFile,\n );\n}\n\nasync function linkifyBody(\n { baseUrl, repository }: ChangeLogProject,\n bodyStr: string,\n): Promise<string> {\n const body = massageBody(bodyStr, baseUrl);\n if (body?.length) {\n try {\n return await linkify(body, {\n repository: `${baseUrl}${repository}`,\n });\n } catch (err) /* istanbul ignore next */ {\n logger.warn({ body, err }, 'linkify error');\n }\n }\n return body;\n}\n"]}
1
+ {"version":3,"file":"release-notes.js","sourceRoot":"","sources":["../../../../../../lib/workers/repository/update/pr/changelog/release-notes.ts"],"names":[],"mappings":"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","sourcesContent":["import is from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport MarkdownIt from 'markdown-it';\nimport { logger } from '../../../../../logger';\nimport * as memCache from '../../../../../util/cache/memory';\nimport * as packageCache from '../../../../../util/cache/package';\nimport type { PackageCacheNamespace } from '../../../../../util/cache/package/types';\nimport { detectPlatform } from '../../../../../util/common';\nimport { linkify } from '../../../../../util/markdown';\nimport { newlineRegex, regEx } from '../../../../../util/regex';\nimport { coerceString } from '../../../../../util/string';\nimport { isHttpUrl, joinUrlParts } from '../../../../../util/url';\nimport type { BranchUpgradeConfig } from '../../../../types';\nimport * as bitbucket from './bitbucket';\nimport * as bitbucketServer from './bitbucket-server';\nimport * as forgejo from './forgejo';\nimport * as gitea from './gitea';\nimport * as github from './github';\nimport * as gitlab from './gitlab';\nimport type {\n ChangeLogFile,\n ChangeLogNotes,\n ChangeLogProject,\n ChangeLogRelease,\n ChangeLogResult,\n} from './types';\n\nconst markdown = new MarkdownIt('zero');\nmarkdown.enable(['heading', 'lheading']);\n\nconst repositoriesToSkipMdFetching = ['facebook/react-native'];\n\nexport async function getReleaseList(\n project: ChangeLogProject,\n release: ChangeLogRelease,\n): Promise<ChangeLogNotes[]> {\n logger.trace('getReleaseList()');\n const { apiBaseUrl, repository, type } = project;\n try {\n switch (type) {\n case 'bitbucket':\n return bitbucket.getReleaseList(project, release);\n case 'bitbucket-server':\n logger.trace(\n 'Unsupported Bitbucket Server feature. Skipping release fetching.',\n );\n return [];\n case 'forgejo':\n return await forgejo.getReleaseList(project, release);\n case 'gitea':\n return await gitea.getReleaseList(project, release);\n case 'github':\n return await github.getReleaseList(project, release);\n case 'gitlab':\n return await gitlab.getReleaseList(project, release);\n default:\n logger.warn({ apiBaseUrl, repository, type }, 'Invalid project type');\n return [];\n }\n } catch (err) /* istanbul ignore next */ {\n if (err.statusCode === 404) {\n logger.debug({ repository, type, apiBaseUrl }, 'getReleaseList 404');\n } else {\n logger.debug(\n { repository, type, apiBaseUrl, err },\n 'getReleaseList error',\n );\n }\n }\n return [];\n}\n\nexport function getCachedReleaseList(\n project: ChangeLogProject,\n release: ChangeLogRelease,\n): Promise<ChangeLogNotes[]> {\n const { repository, apiBaseUrl } = project;\n // TODO: types (#22198)\n const cacheKey = `getReleaseList-${apiBaseUrl}-${repository}`;\n const cachedResult = memCache.get<Promise<ChangeLogNotes[]>>(cacheKey);\n // istanbul ignore if\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n const promisedRes = getReleaseList(project, release);\n memCache.set(cacheKey, promisedRes);\n return promisedRes;\n}\n\nexport function massageBody(\n input: string | undefined | null,\n baseUrl: string,\n): string {\n let body = coerceString(input);\n // Convert line returns\n body = body.replace(regEx(/\\r\\n/g), '\\n');\n // semantic-release cleanup\n body = body.replace(regEx(/^<a name=\"[^\"]*\"><\\/a>\\n/), '');\n body = body.replace(\n regEx(\n `^##? \\\\[[^\\\\]]*\\\\]\\\\(${baseUrl}[^/]*/[^/]*/compare/.*?\\\\n`,\n undefined,\n false,\n ),\n '',\n );\n // Clean-up unnecessary commits link\n body = `\\n${body}\\n`.replace(\n regEx(`\\\\n${baseUrl}[^/]+/[^/]+/compare/[^\\\\n]+(\\\\n|$)`),\n '\\n',\n );\n // Reduce headings size\n body = body\n .replace(regEx(/\\n\\s*####? /g), '\\n##### ')\n .replace(regEx(/\\n\\s*## /g), '\\n#### ')\n .replace(regEx(/\\n\\s*# /g), '\\n### ');\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 (is.undefined(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 (is.undefined(matchedRelease) && config.extractVersion) {\n const extractVersionRegEx = regEx(config.extractVersion);\n matchedRelease = releases.find((r) => {\n const extractedVersion = extractVersionRegEx.exec(r.tag!)?.groups\n ?.version;\n return version === extractedVersion;\n });\n }\n releaseNotes = await releaseNotesResult(matchedRelease, project);\n logger.trace({ releaseNotes });\n return releaseNotes;\n}\n\nfunction getExactReleaseMatch(\n packageName: string,\n depName: string,\n version: string,\n releases: ChangeLogNotes[],\n): ChangeLogNotes | undefined {\n const exactReleaseReg = regEx(\n `(?:^|/)(?:${packageName}|${depName})[@_-]v?${version}`,\n );\n const candidateReleases = releases.filter((r) => r.tag?.endsWith(version));\n const matchedRelease = candidateReleases.find((r) =>\n exactReleaseReg.test(r.tag!),\n );\n return matchedRelease;\n}\n\nasync function releaseNotesResult(\n releaseMatch: ChangeLogNotes | undefined,\n project: ChangeLogProject,\n): Promise<ChangeLogNotes | null> {\n if (!releaseMatch) {\n return null;\n }\n const { baseUrl, repository } = project;\n const releaseNotes: ChangeLogNotes = releaseMatch;\n if (detectPlatform(baseUrl) === 'gitlab') {\n releaseNotes.url = `${baseUrl}${repository}/tags/${releaseMatch.tag!}`;\n } else {\n releaseNotes.url = releaseMatch.url\n ? releaseMatch.url\n : /* istanbul ignore next */\n `${baseUrl}${repository}/releases/${releaseMatch.tag!}`;\n }\n // set body for release notes\n releaseNotes.body = massageBody(releaseNotes.body, baseUrl);\n releaseNotes.name = massageName(releaseNotes.name, releaseNotes.tag);\n if (releaseNotes.body.length || releaseNotes.name?.length) {\n try {\n if (baseUrl !== 'https://gitlab.com/') {\n releaseNotes.body = await linkify(releaseNotes.body, {\n repository: `${baseUrl}${repository}`,\n });\n }\n } catch (err) /* istanbul ignore next */ {\n logger.warn({ err, baseUrl, repository }, 'Error linkifying');\n }\n } else {\n return null;\n }\n\n return releaseNotes;\n}\n\nfunction sectionize(text: string, level: number): string[] {\n const sections: [number, number][] = [];\n const lines = text.split(newlineRegex);\n const tokens = markdown.parse(text, undefined);\n tokens.forEach((token) => {\n if (token.type === 'heading_open') {\n const lev = +token.tag.substring(1);\n if (lev <= level) {\n sections.push([lev, token.map![0]]);\n }\n }\n });\n sections.push([-1, lines.length]);\n const result: string[] = [];\n for (let i = 1; i < sections.length; i += 1) {\n const [lev, start] = sections[i - 1];\n const [, end] = sections[i];\n if (lev === level) {\n result.push(lines.slice(start, end).join('\\n'));\n }\n }\n return result;\n}\n\nexport async function getReleaseNotesMdFileInner(\n project: ChangeLogProject,\n): Promise<ChangeLogFile | null> {\n const { repository, type } = project;\n const apiBaseUrl = project.apiBaseUrl;\n const sourceDirectory = project.sourceDirectory!;\n try {\n switch (type) {\n case 'bitbucket':\n return await bitbucket.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n case 'bitbucket-server':\n return await bitbucketServer.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n case 'forgejo':\n return await forgejo.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n case 'gitea':\n return await gitea.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n case 'github':\n return await github.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n case 'gitlab':\n return await gitlab.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n default:\n logger.warn({ apiBaseUrl, repository, type }, 'Invalid project type');\n return null;\n }\n } catch (err) /* istanbul ignore next */ {\n if (err.statusCode === 404) {\n logger.debug(\n { repository, type, apiBaseUrl },\n 'Error 404 getting changelog md',\n );\n } else {\n logger.debug(\n { err, repository, type, apiBaseUrl },\n 'Error getting changelog md',\n );\n }\n }\n return null;\n}\n\nexport function getReleaseNotesMdFile(\n project: ChangeLogProject,\n): Promise<ChangeLogFile | null> {\n const { sourceDirectory, repository, apiBaseUrl } = project;\n // TODO: types (#22198)\n const cacheKey = sourceDirectory\n ? `getReleaseNotesMdFile@v2-${repository}-${sourceDirectory}-${apiBaseUrl}`\n : `getReleaseNotesMdFile@v2-${repository}-${apiBaseUrl}`;\n const cachedResult = memCache.get<Promise<ChangeLogFile | null>>(cacheKey);\n // istanbul ignore if\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n const promisedRes = getReleaseNotesMdFileInner(project);\n memCache.set(cacheKey, promisedRes);\n return promisedRes;\n}\n\nexport async function getReleaseNotesMd(\n project: ChangeLogProject,\n release: ChangeLogRelease,\n): Promise<ChangeLogNotes | null> {\n const { baseUrl, repository, packageName } = project;\n const version = release.version;\n logger.trace(`getReleaseNotesMd(${repository}, ${version})`);\n\n if (shouldSkipChangelogMd(repository)) {\n return null;\n }\n\n const changelog = await getReleaseNotesMdFile(project);\n if (!changelog) {\n return null;\n }\n const { changelogFile } = changelog;\n const changelogMd = changelog.changelogMd.replace(\n regEx(/\\n\\s*<a name=\"[^\"]*\">.*?<\\/a>\\n/g),\n '\\n',\n );\n for (const level of [1, 2, 3, 4, 5, 6, 7]) {\n const changelogParsed = sectionize(changelogMd, level);\n if (changelogParsed.length >= 2) {\n for (const section of changelogParsed) {\n try {\n // replace brackets and parenthesis with space\n const deParenthesizedSection = section.replace(\n regEx(/[[\\]()]/g),\n ' ',\n );\n const [heading] = deParenthesizedSection.split(newlineRegex);\n const title = heading\n .replace(regEx(/^\\s*#*\\s*/), '')\n .split(' ')\n .filter(Boolean);\n const body = section.replace(regEx(/.*?\\n(-{3,}\\n)?/), '').trim();\n const notesSourceUrl = getNotesSourceUrl(\n baseUrl,\n repository,\n project,\n changelogFile,\n );\n const mdHeadingLink = title\n .filter((word) => !isHttpUrl(word))\n .join('-')\n .replace(regEx(/[^A-Za-z0-9-]/g), '');\n const url = `${notesSourceUrl}#${mdHeadingLink}`;\n // Look for version in title\n for (const word of title) {\n if (word.includes(version) && !isHttpUrl(word)) {\n logger.trace({ body }, 'Found release notes for v' + version);\n return {\n body: await linkifyBody(project, body),\n url,\n notesSourceUrl,\n };\n }\n }\n // Look for version in body - useful for monorepos. First check for heading with \"(yyyy-mm-dd)\"\n const releasesRegex = regEx(/([0-9]{4}-[0-9]{2}-[0-9]{2})/);\n if (packageName && heading.search(releasesRegex) !== -1) {\n // Now check if any line contains both the package name and the version\n const bodyLines = body.split('\\n');\n if (\n bodyLines.some(\n (line) =>\n line.includes(packageName) &&\n line.includes(version) &&\n !isHttpUrl(line),\n )\n ) {\n logger.trace({ body }, 'Found release notes for v' + version);\n return {\n body: await linkifyBody(project, body),\n url,\n notesSourceUrl,\n };\n }\n }\n } catch (err) /* istanbul ignore next */ {\n logger.warn(\n { file: changelogFile, err },\n `Error parsing changelog file`,\n );\n }\n }\n }\n logger.trace({ repository }, `No level ${level} changelogs headings found`);\n }\n logger.trace({ repository, version }, `No entry found in ${changelogFile}`);\n return null;\n}\n\n/**\n * Determine how long to cache release notes based on when the version was released.\n *\n * It's not uncommon for release notes to be updated shortly after the release itself,\n * so only cache for about an hour when the release is less than a week old. Otherwise,\n * cache for days.\n */\nexport function releaseNotesCacheMinutes(releaseDate?: string | Date): number {\n const dt = is.date(releaseDate)\n ? DateTime.fromJSDate(releaseDate)\n : DateTime.fromISO(releaseDate!);\n\n const now = DateTime.local();\n\n if (!dt.isValid || now.diff(dt, 'days').days < 7) {\n return 55;\n }\n\n if (now.diff(dt, 'months').months < 6) {\n return 1435; // 5 minutes shy of one day\n }\n\n return 14495; // 5 minutes shy of 10 days\n}\n\nexport async function addReleaseNotes(\n input: ChangeLogResult | null | undefined,\n config: BranchUpgradeConfig,\n): Promise<ChangeLogResult | null> {\n if (!input?.versions || !input.project?.type) {\n logger.debug('Missing project or versions');\n return input ?? null;\n }\n const output: ChangeLogResult = {\n ...input,\n versions: [],\n hasReleaseNotes: false,\n };\n\n const { repository, sourceDirectory, type: projectType } = input.project;\n const cacheNamespace: PackageCacheNamespace = `changelog-${projectType}-notes@v2`;\n const cacheKeyPrefix = sourceDirectory\n ? `${repository}:${sourceDirectory}`\n : `${repository}`;\n\n for (const v of input.versions) {\n let releaseNotes: ChangeLogNotes | null | undefined;\n const cacheKey = `${cacheKeyPrefix}:${v.version}`;\n releaseNotes = await packageCache.get(cacheNamespace, cacheKey);\n releaseNotes ??= await getReleaseNotesMd(input.project, v);\n releaseNotes ??= await getReleaseNotes(input.project, v, config);\n\n // If there is no release notes, at least try to show the compare URL\n if (!releaseNotes && v.compare.url) {\n releaseNotes = { url: v.compare.url, notesSourceUrl: '' };\n }\n\n const cacheMinutes = releaseNotesCacheMinutes(v.date);\n await packageCache.set(\n cacheNamespace,\n cacheKey,\n releaseNotes,\n cacheMinutes,\n );\n output.versions!.push({\n ...v,\n releaseNotes: releaseNotes!,\n });\n\n if (releaseNotes) {\n output.hasReleaseNotes = true;\n }\n }\n return output;\n}\n\n/**\n * Skip fetching changelog/release-notes markdown files.\n * Will force a fallback to using GitHub release notes\n */\nexport function shouldSkipChangelogMd(repository: string): boolean {\n return repositoriesToSkipMdFetching.includes(repository);\n}\n\nfunction getNotesSourceUrl(\n baseUrl: string,\n repository: string,\n project: ChangeLogProject,\n changelogFile: string,\n): string {\n if (project.type === 'bitbucket-server') {\n const [projectKey, repositorySlug] = repository.split('/');\n return joinUrlParts(\n baseUrl,\n 'projects',\n projectKey,\n 'repos',\n repositorySlug,\n 'browse',\n changelogFile,\n '?at=HEAD',\n );\n }\n\n return joinUrlParts(\n baseUrl,\n repository,\n project.type === 'bitbucket' ? 'src' : 'blob',\n 'HEAD',\n changelogFile,\n );\n}\n\nasync function linkifyBody(\n { baseUrl, repository }: ChangeLogProject,\n bodyStr: string,\n): Promise<string> {\n const body = massageBody(bodyStr, baseUrl);\n if (body?.length) {\n try {\n return await linkify(body, {\n repository: `${baseUrl}${repository}`,\n });\n } catch (err) /* istanbul ignore next */ {\n logger.warn({ body, err }, 'linkify error');\n }\n }\n return body;\n}\n"]}
@@ -4,7 +4,7 @@ export declare abstract class ChangeLogSource {
4
4
  private readonly platform;
5
5
  private readonly datasource;
6
6
  private readonly cacheNamespace;
7
- constructor(platform: ChangeLogPlatform, datasource: 'bitbucket-tags' | 'bitbucket-server-tags' | 'gitea-tags' | 'github-tags' | 'gitlab-tags');
7
+ constructor(platform: ChangeLogPlatform, datasource: 'bitbucket-tags' | 'bitbucket-server-tags' | 'forgejo-tags' | 'gitea-tags' | 'github-tags' | 'gitlab-tags');
8
8
  abstract getCompareURL(baseUrl: string, repository: string, prevHead: string, nextHead: string): string;
9
9
  abstract getAPIBaseUrl(config: BranchUpgradeConfig): string;
10
10
  getAllTags(endpoint: string, repository: string): Promise<string[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"source.js","sourceRoot":"","sources":["../../../../../../lib/workers/repository/update/pr/changelog/source.ts"],"names":[],"mappings":";;;;AAAA,kEAAkC;AAClC,kDAA+C;AAC/C,kEAAmE;AAEnE,yFAAmE;AACnE,wFAAkE;AAElE,yDAAsD;AACtD,qDAAkD;AAClD,iDAAgE;AAEhE,qCAAsC;AACtC,mDAAkD;AAClD,yCAAgD;AAQhD,MAAsB,eAAe;IAIhB;IACA;IAJF,cAAc,CAAwB;IAEvD,YACmB,QAA2B,EAC3B,UAKA;QANA,aAAQ,GAAR,QAAQ,CAAmB;QAC3B,eAAU,GAAV,UAAU,CAKV;QAEjB,IAAI,CAAC,cAAc,GAAG,aAAa,QAAQ,UAAU,CAAC;IACxD,CAAC;IAWD,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,UAAkB;QACnD,MAAM,IAAI,GAAG,CACX,MAAM,IAAA,2BAAc,EAAC;YACnB,YAAY,EAAE,CAAC,QAAQ,CAAC;YACxB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,WAAW,EAAE,UAAU;YACvB,UAAU,EACR,8DAA8D;SACjE,CAAC,CACH,EAAE,QAAQ,CAAC;QAEZ,IAAI,YAAE,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACpD,eAAM,CAAC,KAAK,CACV,MAAM,IAAI,CAAC,UAAU,+BAA+B,UAAU,EAAE,CACjE,CAAC;YAEF,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAC3B,MAA2B;QAE3B,eAAM,CAAC,KAAK,CAAC,wBAAwB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEtD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAW,CAAC;QACtC,MAAM,cAAc,GAAG,MAAM,CAAC,cAAe,CAAC;QAC9C,MAAM,UAAU,GAAG,MAAM,CAAC,UAAW,CAAC;QACtC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAU,CAAC;QACpC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAY,CAAC;QACxC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAQ,CAAC;QAChC,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;QAC/C,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAEpD,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAErD,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YAC3B,IAAI,aAAa,CAAC,KAAK,EAAE,CAAC;gBACxB,OAAO;oBACL,KAAK,EAAE,aAAa,CAAC,KAAK;iBAC3B,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,YAAE,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YAClD,eAAM,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,QAAQ,eAAe,SAAS,EAAE,CAAC,CAAC;YACjE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,IAAA,6BAAkB,EAAC,MAAM,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;YACtB,eAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,6EAA6E;QAC7E,MAAM,aAAa,GAAG,CAAC,GAAG,QAAQ,CAAC;aAChC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;aAC7D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAEpE,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,eAAM,CAAC,KAAK,CACV,qCAAqC,OAAO,KAAK,WAAW,GAAG,CAChE,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,iBAAiB,GAAuB,EAAE,CAAC;QAEjD,iEAAiE;QACjE,MAAM,OAAO,GAAG,CAAC,CAAS,EAAW,EAAE,CACrC,aAAa,CAAC,aAAa,CAAC,CAAC,EAAE,cAAc,CAAC;YAC9C,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAE9C,MAAM,OAAO,GAAG,IAAA,iBAAO,EAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;QACvE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,SAAS;YACX,CAAC;YACD,IAAI,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,CAClC,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CACrE,CAAC;YACF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG;oBACR,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,IAAI,EAAE,IAAI,CAAC,gBAAgB;oBAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,2DAA2D;oBAC3D,OAAO,EAAE,EAAE;oBACX,OAAO,EAAE,EAAE;iBACZ,CAAC;gBACF,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAC1B,aAAa,EACb,WAAW,EACX,OAAO,EACP,IAAI,EACJ,IAAI,CACL,CAAC;gBACF,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAC1B,aAAa,EACb,WAAW,EACX,OAAO,EACP,IAAI,EACJ,IAAI,CACL,CAAC;gBACF,IAAI,YAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,YAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC/D,OAAO,CAAC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,aAAa,CACtC,OAAO,EACP,UAAU,EACV,QAAQ,EACR,QAAQ,CACT,CAAC;gBACJ,CAAC;gBACD,MAAM,YAAY,GAAG,EAAE,CAAC;gBACxB,MAAM,YAAY,CAAC,GAAG,CACpB,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,EACpE,OAAO,EACP,YAAY,CACb,CAAC;YACJ,CAAC;YACD,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,GAAG,GAA2B;YAChC,OAAO,EAAE;gBACP,UAAU;gBACV,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,QAAQ;gBACnB,UAAU;gBACV,SAAS;gBACT,eAAe;gBACf,WAAW;gBACX,OAAO;aACR;YACD,QAAQ,EAAE,iBAAiB;SAC5B,CAAC;QAEF,GAAG,GAAG,MAAM,IAAA,+BAAe,EAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAEzC,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,gBAAgB,CACtB,aAA0C,EAC1C,WAAmB,EACnB,OAAe,EACf,aAAqB,EACrB,IAAc;QAEd,MAAM,kBAAkB,GAAG,OAAO,WAAW,IAAI,OAAO,kBAAkB,CAAC;QAC3E,MAAM,KAAK,GAAG,IAAA,aAAK,EAAC,kBAAkB,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAC1D,MAAM,iBAAiB,GAAG,IAAA,aAAK,EAAC,GAAG,kBAAkB,GAAG,aAAa,EAAE,CAAC,CAAC;QACzE,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YACxC,OAAO,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5D,OAAO,OAAO;aACX,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;aAChE,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CACZ,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,aAAa,CAAC,CAC5D,CAAC;IACN,CAAC;IAEO,MAAM,CACZ,aAA0C,EAC1C,WAAmB,EACnB,OAAe,EACf,OAAgB,EAChB,IAAc;QAEd,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CACnC,aAAa,EACb,WAAW,EACX,OAAO,EACP,OAAO,CAAC,OAAO,EACf,IAAI,CACL,CAAC;QACF,IAAI,YAAE,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,IAAI,YAAE,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,OAAO,OAAO,CAAC,MAAM,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,WAAW,CACjB,SAAiB,EACjB,WAAmB,EACnB,IAAY,EACZ,IAAY;QAEZ,OAAO,GAAG,IAAA,mBAAU,EAAC,SAAS,CAAC,IAAI,WAAW,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;IACnE,CAAC;IAED,UAAU,CAAC,MAA2B;QACpC,MAAM,SAAS,GAAG,IAAA,cAAQ,EAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,YAAE,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAA,aAAK,EAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;QAC5B,OAAO,GAAG,QAAQ,KAAK,IAAI,GAAG,CAAC;IACjC,CAAC;IAED,oBAAoB,CAAC,MAA2B;QAC9C,MAAM,SAAS,GAAG,IAAA,cAAQ,EAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,YAAE,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;QACpC,OAAO,IAAA,iBAAW,EAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAA,aAAK,EAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5D,CAAC;IAES,aAAa,CAAC,MAA2B;QAIjD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAES,iBAAiB,CAAC,MAA2B;QACrD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,kBAAkB,CAAC,UAAkB;QACnC,OAAO,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IAC5C,CAAC;CACF;AA1QD,0CA0QC","sourcesContent":["import is from '@sindresorhus/is';\nimport { logger } from '../../../../../logger';\nimport { getPkgReleases } from '../../../../../modules/datasource';\nimport type { Release } from '../../../../../modules/datasource/types';\nimport * as allVersioning from '../../../../../modules/versioning';\nimport * as packageCache from '../../../../../util/cache/package';\nimport type { PackageCacheNamespace } from '../../../../../util/cache/package/types';\nimport { memoize } from '../../../../../util/memoize';\nimport { regEx } from '../../../../../util/regex';\nimport { parseUrl, trimSlashes } from '../../../../../util/url';\nimport type { BranchUpgradeConfig } from '../../../../types';\nimport { slugifyUrl } from './common';\nimport { addReleaseNotes } from './release-notes';\nimport { getInRangeReleases } from './releases';\nimport type {\n ChangeLogError,\n ChangeLogPlatform,\n ChangeLogRelease,\n ChangeLogResult,\n} from './types';\n\nexport abstract class ChangeLogSource {\n private readonly cacheNamespace: PackageCacheNamespace;\n\n constructor(\n private readonly platform: ChangeLogPlatform,\n private readonly datasource:\n | 'bitbucket-tags'\n | 'bitbucket-server-tags'\n | 'gitea-tags'\n | 'github-tags'\n | 'gitlab-tags',\n ) {\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 (is.nullOrUndefined(tags) || is.emptyArray(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 (is.falsy(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 const inRange = (v: string): boolean =>\n versioningApi.isGreaterThan(v, currentVersion) &&\n !versioningApi.isGreaterThan(v, newVersion);\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 (is.nonEmptyString(prevHead) && is.nonEmptyString(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 (is.nonEmptyString(tagName)) {\n return tagName;\n }\n if (is.nonEmptyString(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 (is.nullOrUndefined(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 (is.nullOrUndefined(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"]}
1
+ {"version":3,"file":"source.js","sourceRoot":"","sources":["../../../../../../lib/workers/repository/update/pr/changelog/source.ts"],"names":[],"mappings":";;;;AAAA,kEAAkC;AAClC,kDAA+C;AAC/C,kEAAmE;AAEnE,yFAAmE;AACnE,wFAAkE;AAElE,yDAAsD;AACtD,qDAAkD;AAClD,iDAAgE;AAEhE,qCAAsC;AACtC,mDAAkD;AAClD,yCAAgD;AAQhD,MAAsB,eAAe;IAIhB;IACA;IAJF,cAAc,CAAwB;IAEvD,YACmB,QAA2B,EAC3B,UAMA;QAPA,aAAQ,GAAR,QAAQ,CAAmB;QAC3B,eAAU,GAAV,UAAU,CAMV;QAEjB,IAAI,CAAC,cAAc,GAAG,aAAa,QAAQ,UAAU,CAAC;IACxD,CAAC;IAWD,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,UAAkB;QACnD,MAAM,IAAI,GAAG,CACX,MAAM,IAAA,2BAAc,EAAC;YACnB,YAAY,EAAE,CAAC,QAAQ,CAAC;YACxB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,WAAW,EAAE,UAAU;YACvB,UAAU,EACR,8DAA8D;SACjE,CAAC,CACH,EAAE,QAAQ,CAAC;QAEZ,IAAI,YAAE,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACpD,eAAM,CAAC,KAAK,CACV,MAAM,IAAI,CAAC,UAAU,+BAA+B,UAAU,EAAE,CACjE,CAAC;YAEF,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAC3B,MAA2B;QAE3B,eAAM,CAAC,KAAK,CAAC,wBAAwB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEtD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAW,CAAC;QACtC,MAAM,cAAc,GAAG,MAAM,CAAC,cAAe,CAAC;QAC9C,MAAM,UAAU,GAAG,MAAM,CAAC,UAAW,CAAC;QACtC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAU,CAAC;QACpC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAY,CAAC;QACxC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAQ,CAAC;QAChC,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;QAC/C,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAEpD,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAErD,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YAC3B,IAAI,aAAa,CAAC,KAAK,EAAE,CAAC;gBACxB,OAAO;oBACL,KAAK,EAAE,aAAa,CAAC,KAAK;iBAC3B,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,YAAE,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YAClD,eAAM,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,QAAQ,eAAe,SAAS,EAAE,CAAC,CAAC;YACjE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,IAAA,6BAAkB,EAAC,MAAM,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;YACtB,eAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,6EAA6E;QAC7E,MAAM,aAAa,GAAG,CAAC,GAAG,QAAQ,CAAC;aAChC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;aAC7D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAEpE,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,eAAM,CAAC,KAAK,CACV,qCAAqC,OAAO,KAAK,WAAW,GAAG,CAChE,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,iBAAiB,GAAuB,EAAE,CAAC;QAEjD,iEAAiE;QACjE,MAAM,OAAO,GAAG,CAAC,CAAS,EAAW,EAAE,CACrC,aAAa,CAAC,aAAa,CAAC,CAAC,EAAE,cAAc,CAAC;YAC9C,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAE9C,MAAM,OAAO,GAAG,IAAA,iBAAO,EAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;QACvE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,SAAS;YACX,CAAC;YACD,IAAI,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,CAClC,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CACrE,CAAC;YACF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG;oBACR,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,IAAI,EAAE,IAAI,CAAC,gBAAgB;oBAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,2DAA2D;oBAC3D,OAAO,EAAE,EAAE;oBACX,OAAO,EAAE,EAAE;iBACZ,CAAC;gBACF,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAC1B,aAAa,EACb,WAAW,EACX,OAAO,EACP,IAAI,EACJ,IAAI,CACL,CAAC;gBACF,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAC1B,aAAa,EACb,WAAW,EACX,OAAO,EACP,IAAI,EACJ,IAAI,CACL,CAAC;gBACF,IAAI,YAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,YAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC/D,OAAO,CAAC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,aAAa,CACtC,OAAO,EACP,UAAU,EACV,QAAQ,EACR,QAAQ,CACT,CAAC;gBACJ,CAAC;gBACD,MAAM,YAAY,GAAG,EAAE,CAAC;gBACxB,MAAM,YAAY,CAAC,GAAG,CACpB,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,EACpE,OAAO,EACP,YAAY,CACb,CAAC;YACJ,CAAC;YACD,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,GAAG,GAA2B;YAChC,OAAO,EAAE;gBACP,UAAU;gBACV,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,QAAQ;gBACnB,UAAU;gBACV,SAAS;gBACT,eAAe;gBACf,WAAW;gBACX,OAAO;aACR;YACD,QAAQ,EAAE,iBAAiB;SAC5B,CAAC;QAEF,GAAG,GAAG,MAAM,IAAA,+BAAe,EAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAEzC,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,gBAAgB,CACtB,aAA0C,EAC1C,WAAmB,EACnB,OAAe,EACf,aAAqB,EACrB,IAAc;QAEd,MAAM,kBAAkB,GAAG,OAAO,WAAW,IAAI,OAAO,kBAAkB,CAAC;QAC3E,MAAM,KAAK,GAAG,IAAA,aAAK,EAAC,kBAAkB,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAC1D,MAAM,iBAAiB,GAAG,IAAA,aAAK,EAAC,GAAG,kBAAkB,GAAG,aAAa,EAAE,CAAC,CAAC;QACzE,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YACxC,OAAO,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5D,OAAO,OAAO;aACX,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;aAChE,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CACZ,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,aAAa,CAAC,CAC5D,CAAC;IACN,CAAC;IAEO,MAAM,CACZ,aAA0C,EAC1C,WAAmB,EACnB,OAAe,EACf,OAAgB,EAChB,IAAc;QAEd,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CACnC,aAAa,EACb,WAAW,EACX,OAAO,EACP,OAAO,CAAC,OAAO,EACf,IAAI,CACL,CAAC;QACF,IAAI,YAAE,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,IAAI,YAAE,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,OAAO,OAAO,CAAC,MAAM,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,WAAW,CACjB,SAAiB,EACjB,WAAmB,EACnB,IAAY,EACZ,IAAY;QAEZ,OAAO,GAAG,IAAA,mBAAU,EAAC,SAAS,CAAC,IAAI,WAAW,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;IACnE,CAAC;IAED,UAAU,CAAC,MAA2B;QACpC,MAAM,SAAS,GAAG,IAAA,cAAQ,EAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,YAAE,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAA,aAAK,EAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;QAC5B,OAAO,GAAG,QAAQ,KAAK,IAAI,GAAG,CAAC;IACjC,CAAC;IAED,oBAAoB,CAAC,MAA2B;QAC9C,MAAM,SAAS,GAAG,IAAA,cAAQ,EAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,YAAE,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;QACpC,OAAO,IAAA,iBAAW,EAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAA,aAAK,EAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5D,CAAC;IAES,aAAa,CAAC,MAA2B;QAIjD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAES,iBAAiB,CAAC,MAA2B;QACrD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,kBAAkB,CAAC,UAAkB;QACnC,OAAO,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IAC5C,CAAC;CACF;AA3QD,0CA2QC","sourcesContent":["import is from '@sindresorhus/is';\nimport { logger } from '../../../../../logger';\nimport { getPkgReleases } from '../../../../../modules/datasource';\nimport type { Release } from '../../../../../modules/datasource/types';\nimport * as allVersioning from '../../../../../modules/versioning';\nimport * as packageCache from '../../../../../util/cache/package';\nimport type { PackageCacheNamespace } from '../../../../../util/cache/package/types';\nimport { memoize } from '../../../../../util/memoize';\nimport { regEx } from '../../../../../util/regex';\nimport { parseUrl, trimSlashes } from '../../../../../util/url';\nimport type { BranchUpgradeConfig } from '../../../../types';\nimport { slugifyUrl } from './common';\nimport { addReleaseNotes } from './release-notes';\nimport { getInRangeReleases } from './releases';\nimport type {\n ChangeLogError,\n ChangeLogPlatform,\n ChangeLogRelease,\n ChangeLogResult,\n} from './types';\n\nexport abstract class ChangeLogSource {\n private readonly cacheNamespace: PackageCacheNamespace;\n\n constructor(\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 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 (is.nullOrUndefined(tags) || is.emptyArray(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 (is.falsy(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 const inRange = (v: string): boolean =>\n versioningApi.isGreaterThan(v, currentVersion) &&\n !versioningApi.isGreaterThan(v, newVersion);\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 (is.nonEmptyString(prevHead) && is.nonEmptyString(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 (is.nonEmptyString(tagName)) {\n return tagName;\n }\n if (is.nonEmptyString(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 (is.nullOrUndefined(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 (is.nullOrUndefined(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"]}