renovate 40.42.2 → 40.42.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/workers/repository/update/branch/auto-replace.js +30 -7
- package/dist/workers/repository/update/branch/auto-replace.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/release-notes.js +23 -19
- package/dist/workers/repository/update/pr/changelog/release-notes.js.map +1 -1
- package/package.json +1 -1
@@ -199,6 +199,7 @@ async function doAutoReplace(upgrade, existingContent, reuseExistingBranch, firs
|
|
199
199
|
let newContent = existingContent;
|
200
200
|
let nameReplaced = !newName;
|
201
201
|
let valueReplaced = !newValue;
|
202
|
+
let digestReplaced = !newDigest;
|
202
203
|
let startIndex = searchIndex;
|
203
204
|
// Iterate through the rest of the file
|
204
205
|
for (; searchIndex < newContent.length; searchIndex += 1) {
|
@@ -212,8 +213,9 @@ async function doAutoReplace(upgrade, existingContent, reuseExistingBranch, firs
|
|
212
213
|
searchIndex = startIndex - 1;
|
213
214
|
await (0, fs_1.writeLocalFile)(upgrade.packageFile, existingContent);
|
214
215
|
newContent = existingContent;
|
215
|
-
nameReplaced =
|
216
|
-
valueReplaced =
|
216
|
+
nameReplaced = !newName;
|
217
|
+
valueReplaced = !newValue;
|
218
|
+
digestReplaced = !newDigest;
|
217
219
|
continue;
|
218
220
|
}
|
219
221
|
// replace with newName
|
@@ -230,8 +232,9 @@ async function doAutoReplace(upgrade, existingContent, reuseExistingBranch, firs
|
|
230
232
|
searchIndex = startIndex - 1;
|
231
233
|
await (0, fs_1.writeLocalFile)(upgrade.packageFile, existingContent);
|
232
234
|
newContent = existingContent;
|
233
|
-
nameReplaced =
|
234
|
-
valueReplaced =
|
235
|
+
nameReplaced = !newName;
|
236
|
+
valueReplaced = !newValue;
|
237
|
+
digestReplaced = !newDigest;
|
235
238
|
continue;
|
236
239
|
}
|
237
240
|
// Now test if the result matches
|
@@ -240,7 +243,26 @@ async function doAutoReplace(upgrade, existingContent, reuseExistingBranch, firs
|
|
240
243
|
valueReplaced = true;
|
241
244
|
searchIndex += newValue.length - 1;
|
242
245
|
}
|
243
|
-
if (
|
246
|
+
else if (newDigest &&
|
247
|
+
(0, string_1.matchAt)(newContent, searchIndex, currentDigest)) {
|
248
|
+
logger_1.logger.debug({ packageFile, currentDigest }, `Found currentDigest at index ${searchIndex}`);
|
249
|
+
if (digestReplaced) {
|
250
|
+
startIndex = firstIndexOf(existingContent, depName, currentValue, startIndex + 1);
|
251
|
+
searchIndex = startIndex - 1;
|
252
|
+
await (0, fs_1.writeLocalFile)(upgrade.packageFile, existingContent);
|
253
|
+
newContent = existingContent;
|
254
|
+
nameReplaced = !newName;
|
255
|
+
valueReplaced = !newValue;
|
256
|
+
digestReplaced = !newDigest;
|
257
|
+
continue;
|
258
|
+
}
|
259
|
+
// Now test if the result matches
|
260
|
+
newContent = (0, string_1.replaceAt)(newContent, searchIndex, currentDigest, newDigest);
|
261
|
+
await (0, fs_1.writeLocalFile)(upgrade.packageFile, newContent);
|
262
|
+
digestReplaced = true;
|
263
|
+
searchIndex += newDigest.length - 1;
|
264
|
+
}
|
265
|
+
if (nameReplaced && valueReplaced && digestReplaced) {
|
244
266
|
if (await confirmIfDepUpdated(upgrade, newContent)) {
|
245
267
|
return newContent;
|
246
268
|
}
|
@@ -248,8 +270,9 @@ async function doAutoReplace(upgrade, existingContent, reuseExistingBranch, firs
|
|
248
270
|
searchIndex = startIndex - 1;
|
249
271
|
await (0, fs_1.writeLocalFile)(upgrade.packageFile, existingContent);
|
250
272
|
newContent = existingContent;
|
251
|
-
nameReplaced =
|
252
|
-
valueReplaced =
|
273
|
+
nameReplaced = !newName;
|
274
|
+
valueReplaced = !newValue;
|
275
|
+
digestReplaced = !newDigest;
|
253
276
|
}
|
254
277
|
}
|
255
278
|
else if ((0, string_1.matchAt)(newContent, searchIndex, replaceString)) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"auto-replace.js","sourceRoot":"","sources":["../../../../../lib/workers/repository/update/branch/auto-replace.ts"],"names":[],"mappings":"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","sourcesContent":["// TODO #22198\nimport is from '@sindresorhus/is';\nimport { WORKER_FILE_UPDATE_FAILED } from '../../../../constants/error-messages';\nimport { logger } from '../../../../logger';\nimport { extractPackageFile } from '../../../../modules/manager';\nimport type { PackageDependency } from '../../../../modules/manager/types';\nimport { writeLocalFile } from '../../../../util/fs';\nimport { escapeRegExp, regEx } from '../../../../util/regex';\nimport { matchAt, replaceAt } from '../../../../util/string';\nimport { compile } from '../../../../util/template';\nimport type { BranchUpgradeConfig } from '../../../types';\n\nexport async function confirmIfDepUpdated(\n upgrade: BranchUpgradeConfig,\n newContent: string,\n): Promise<boolean> {\n const { manager, packageFile, depIndex } = upgrade;\n let newUpgrade: PackageDependency;\n try {\n const newExtract = await extractPackageFile(\n manager,\n newContent,\n packageFile!,\n upgrade,\n );\n // istanbul ignore if\n if (!newExtract) {\n // TODO: fix types (#22198)\n logger.debug(\n `Could not extract ${packageFile!} (manager=${manager}) after autoreplace. Did the autoreplace make the file unparseable?`,\n );\n logger.trace(\n { packageFile, content: newContent },\n 'packageFile content after autoreplace',\n );\n return false;\n }\n // istanbul ignore if\n if (!newExtract.deps?.length) {\n logger.debug(\n `Extracted ${packageFile!} after autoreplace has no deps array. Did the autoreplace make the file unparseable?`,\n );\n return false;\n }\n // istanbul ignore if\n if (is.number(depIndex) && depIndex >= newExtract.deps.length) {\n logger.debug(\n `Extracted ${packageFile!} after autoreplace has fewer deps than expected.`,\n );\n return false;\n }\n newUpgrade = newExtract.deps[depIndex!];\n } catch (err) /* istanbul ignore next */ {\n logger.debug({ manager, packageFile, err }, 'Failed to parse newContent');\n }\n\n if (!newUpgrade!) {\n logger.debug(`No newUpgrade in ${packageFile!}`);\n return false;\n }\n\n if (\n upgrade.depName !== newUpgrade.depName &&\n upgrade.newName !== newUpgrade.depName\n ) {\n logger.debug(\n {\n manager,\n packageFile,\n currentDepName: upgrade.depName,\n newDepName: newUpgrade.depName,\n },\n 'depName mismatch',\n );\n return false;\n }\n\n if (upgrade.newName && upgrade.newName !== newUpgrade.depName) {\n logger.debug(\n {\n manager,\n packageFile,\n currentDepName: upgrade.depName,\n newDepName: newUpgrade.depName,\n },\n 'depName is not updated',\n );\n return false;\n }\n\n if (upgrade.newValue && upgrade.newValue !== newUpgrade.currentValue) {\n logger.debug(\n {\n depName: upgrade.depName,\n manager,\n packageFile,\n expectedValue: upgrade.newValue,\n foundValue: newUpgrade.currentValue,\n },\n 'Value is not updated',\n );\n return false;\n }\n\n if (\n upgrade.newDigest &&\n (upgrade.isPinDigest === true || upgrade.currentDigest) &&\n upgrade.newDigest !== newUpgrade.currentDigest\n ) {\n logger.debug(\n {\n depName: upgrade.depName,\n manager,\n packageFile,\n expectedValue: upgrade.newDigest,\n foundValue: newUpgrade.currentDigest,\n },\n 'Digest is not updated',\n );\n return false;\n }\n\n return true;\n}\n\nfunction getDepsSignature(deps: PackageDependency[]): string {\n // TODO: types (#22198)\n return deps\n .map(\n (dep) =>\n `${(dep.depName ?? dep.packageName)!}${(dep.packageName ??\n dep.depName)!}`,\n )\n .join(',');\n}\n\nfunction firstIndexOf(\n existingContent: string,\n depName: string,\n currentValue: string,\n position = 0,\n): number {\n const depIndex = existingContent.indexOf(depName, position);\n const valIndex = existingContent.indexOf(currentValue, position);\n const index = depIndex < valIndex ? depIndex : valIndex;\n if (index < 0) {\n return position === 0 ? -1 : existingContent.length;\n }\n return index;\n}\n\nexport async function checkBranchDepsMatchBaseDeps(\n upgrade: BranchUpgradeConfig,\n branchContent: string,\n): Promise<boolean> {\n const { baseDeps, manager, packageFile } = upgrade;\n try {\n const res = await extractPackageFile(\n manager,\n branchContent,\n packageFile!,\n upgrade,\n )!;\n const branchDeps = res!.deps;\n return getDepsSignature(baseDeps!) === getDepsSignature(branchDeps);\n } catch /* istanbul ignore next */ {\n logger.info(\n { manager, packageFile },\n 'Failed to parse branchContent - rebasing',\n );\n return false;\n }\n}\n\nasync function checkExistingBranch(\n upgrade: BranchUpgradeConfig,\n existingContent: string,\n): Promise<string | null> {\n const { packageFile, depName } = upgrade;\n if (!(await checkBranchDepsMatchBaseDeps(upgrade, existingContent))) {\n logger.debug(\n { packageFile, depName },\n 'Rebasing branch after deps list has changed',\n );\n return null;\n }\n if (!(await confirmIfDepUpdated(upgrade, existingContent))) {\n logger.debug(\n { packageFile, depName },\n 'Rebasing after outdated branch dep found',\n );\n return null;\n }\n // TODO: fix types (#22198)\n logger.debug(`Branch dep ${depName!} in ${packageFile!} is already updated`);\n return existingContent;\n}\n\nexport async function doAutoReplace(\n upgrade: BranchUpgradeConfig,\n existingContent: string,\n reuseExistingBranch: boolean,\n firstUpdate = true,\n): Promise<string | null> {\n const {\n packageFile,\n depName,\n depNameTemplate,\n newName,\n currentValue,\n currentValueTemplate,\n newValue,\n currentDigest,\n currentDigestShort,\n newDigest,\n autoReplaceGlobalMatch,\n autoReplaceStringTemplate,\n } = upgrade;\n /*\n If replacement support for more managers is added,\n please also update the list in docs/usage/configuration-options.md\n at replacementName and replacementVersion\n */\n if (reuseExistingBranch) {\n return await checkExistingBranch(upgrade, existingContent);\n }\n const replaceWithoutReplaceString =\n is.string(newName) &&\n newName !== depName &&\n (is.undefined(upgrade.replaceString) ||\n !upgrade.replaceString?.includes(depName!));\n const replaceString = upgrade.replaceString ?? currentValue ?? currentDigest;\n logger.trace({ depName, replaceString }, 'autoReplace replaceString');\n let searchIndex: number;\n if (replaceWithoutReplaceString) {\n searchIndex = firstIndexOf(existingContent, depName!, currentValue!);\n } else {\n searchIndex = existingContent.indexOf(replaceString!);\n }\n if (searchIndex === -1) {\n logger.info(\n { packageFile, depName, existingContent, replaceString },\n 'Cannot find replaceString in current file content. Was it already updated?',\n );\n return existingContent;\n }\n try {\n let newString: string;\n if (autoReplaceStringTemplate && !newName) {\n newString = compile(autoReplaceStringTemplate, upgrade, false);\n } else {\n newString = replaceString!;\n\n const autoReplaceRegExpFlag = autoReplaceGlobalMatch ? 'g' : '';\n if (currentValue && newValue && currentValue !== newValue) {\n if (!newString.includes(currentValue)) {\n logger.debug(\n { stringToReplace: newString, currentValue, currentValueTemplate },\n 'currentValue not found in string to replace',\n );\n }\n newString = newString.replace(\n regEx(escapeRegExp(currentValue), autoReplaceRegExpFlag),\n newValue,\n );\n }\n if (depName && newName && depName !== newName) {\n if (!newString.includes(depName)) {\n logger.debug(\n { stringToReplace: newString, depName, depNameTemplate },\n 'depName not found in string to replace',\n );\n }\n newString = newString.replace(\n regEx(escapeRegExp(depName), autoReplaceRegExpFlag),\n newName,\n );\n }\n if (currentDigest && newDigest && currentDigest !== newDigest) {\n if (!newString.includes(currentDigest)) {\n logger.debug(\n { stringToReplace: newString, currentDigest },\n 'currentDigest not found in string to replace',\n );\n }\n newString = newString.replace(\n regEx(escapeRegExp(currentDigest), autoReplaceRegExpFlag),\n newDigest,\n );\n } else if (\n currentDigestShort &&\n newDigest &&\n currentDigestShort !== newDigest\n ) {\n if (!newString.includes(currentDigestShort)) {\n logger.debug(\n { stringToReplace: newString, currentDigestShort },\n 'currentDigestShort not found in string to replace',\n );\n }\n newString = newString.replace(\n regEx(escapeRegExp(currentDigestShort), autoReplaceRegExpFlag),\n newDigest,\n );\n }\n }\n if (!firstUpdate && (await confirmIfDepUpdated(upgrade, existingContent))) {\n logger.debug(\n { packageFile, depName },\n 'Package file is already updated - no work to do',\n );\n return existingContent;\n }\n logger.debug(\n { packageFile, depName },\n `Starting search at index ${searchIndex}`,\n );\n let newContent = existingContent;\n let nameReplaced = !newName;\n let valueReplaced = !newValue;\n let startIndex = searchIndex;\n // Iterate through the rest of the file\n for (; searchIndex < newContent.length; searchIndex += 1) {\n // First check if we have a hit for the old version\n if (replaceWithoutReplaceString) {\n // look for depName and currentValue\n if (newName && matchAt(newContent, searchIndex, depName!)) {\n logger.debug(\n { packageFile, depName },\n `Found depName at index ${searchIndex}`,\n );\n if (nameReplaced) {\n startIndex = firstIndexOf(\n existingContent,\n depName!,\n currentValue!,\n startIndex + 1,\n );\n searchIndex = startIndex - 1;\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n nameReplaced = false;\n valueReplaced = false;\n continue;\n }\n // replace with newName\n newContent = replaceAt(newContent, searchIndex, depName!, newName);\n await writeLocalFile(upgrade.packageFile!, newContent);\n nameReplaced = true;\n searchIndex += newName.length - 1;\n } else if (\n newValue &&\n matchAt(newContent, searchIndex, currentValue!)\n ) {\n logger.debug(\n { packageFile, currentValue },\n `Found currentValue at index ${searchIndex}`,\n );\n if (valueReplaced) {\n startIndex = firstIndexOf(\n existingContent,\n depName!,\n currentValue!,\n startIndex + 1,\n );\n searchIndex = startIndex - 1;\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n nameReplaced = false;\n valueReplaced = false;\n continue;\n }\n // Now test if the result matches\n newContent = replaceAt(\n newContent,\n searchIndex,\n currentValue!,\n newValue,\n );\n await writeLocalFile(upgrade.packageFile!, newContent);\n valueReplaced = true;\n searchIndex += newValue.length - 1;\n }\n if (nameReplaced && valueReplaced) {\n if (await confirmIfDepUpdated(upgrade, newContent)) {\n return newContent;\n }\n startIndex = firstIndexOf(\n existingContent,\n depName!,\n currentValue!,\n startIndex + 1,\n );\n searchIndex = startIndex - 1;\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n nameReplaced = false;\n valueReplaced = false;\n }\n } else if (matchAt(newContent, searchIndex, replaceString!)) {\n logger.debug(\n { packageFile, depName },\n `Found match at index ${searchIndex}`,\n );\n // Now test if the result matches\n newContent = replaceAt(\n newContent,\n searchIndex,\n replaceString!,\n newString,\n );\n await writeLocalFile(upgrade.packageFile!, newContent);\n if (await confirmIfDepUpdated(upgrade, newContent)) {\n return newContent;\n }\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n }\n }\n } catch (err) /* istanbul ignore next */ {\n logger.debug({ packageFile, depName, err }, 'doAutoReplace error');\n }\n // istanbul ignore next\n throw new Error(WORKER_FILE_UPDATE_FAILED);\n}\n"]}
|
1
|
+
{"version":3,"file":"auto-replace.js","sourceRoot":"","sources":["../../../../../lib/workers/repository/update/branch/auto-replace.ts"],"names":[],"mappings":"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","sourcesContent":["// TODO #22198\nimport is from '@sindresorhus/is';\nimport { WORKER_FILE_UPDATE_FAILED } from '../../../../constants/error-messages';\nimport { logger } from '../../../../logger';\nimport { extractPackageFile } from '../../../../modules/manager';\nimport type { PackageDependency } from '../../../../modules/manager/types';\nimport { writeLocalFile } from '../../../../util/fs';\nimport { escapeRegExp, regEx } from '../../../../util/regex';\nimport { matchAt, replaceAt } from '../../../../util/string';\nimport { compile } from '../../../../util/template';\nimport type { BranchUpgradeConfig } from '../../../types';\n\nexport async function confirmIfDepUpdated(\n upgrade: BranchUpgradeConfig,\n newContent: string,\n): Promise<boolean> {\n const { manager, packageFile, depIndex } = upgrade;\n let newUpgrade: PackageDependency;\n try {\n const newExtract = await extractPackageFile(\n manager,\n newContent,\n packageFile!,\n upgrade,\n );\n // istanbul ignore if\n if (!newExtract) {\n // TODO: fix types (#22198)\n logger.debug(\n `Could not extract ${packageFile!} (manager=${manager}) after autoreplace. Did the autoreplace make the file unparseable?`,\n );\n logger.trace(\n { packageFile, content: newContent },\n 'packageFile content after autoreplace',\n );\n return false;\n }\n // istanbul ignore if\n if (!newExtract.deps?.length) {\n logger.debug(\n `Extracted ${packageFile!} after autoreplace has no deps array. Did the autoreplace make the file unparseable?`,\n );\n return false;\n }\n // istanbul ignore if\n if (is.number(depIndex) && depIndex >= newExtract.deps.length) {\n logger.debug(\n `Extracted ${packageFile!} after autoreplace has fewer deps than expected.`,\n );\n return false;\n }\n newUpgrade = newExtract.deps[depIndex!];\n } catch (err) /* istanbul ignore next */ {\n logger.debug({ manager, packageFile, err }, 'Failed to parse newContent');\n }\n\n if (!newUpgrade!) {\n logger.debug(`No newUpgrade in ${packageFile!}`);\n return false;\n }\n\n if (\n upgrade.depName !== newUpgrade.depName &&\n upgrade.newName !== newUpgrade.depName\n ) {\n logger.debug(\n {\n manager,\n packageFile,\n currentDepName: upgrade.depName,\n newDepName: newUpgrade.depName,\n },\n 'depName mismatch',\n );\n return false;\n }\n\n if (upgrade.newName && upgrade.newName !== newUpgrade.depName) {\n logger.debug(\n {\n manager,\n packageFile,\n currentDepName: upgrade.depName,\n newDepName: newUpgrade.depName,\n },\n 'depName is not updated',\n );\n return false;\n }\n\n if (upgrade.newValue && upgrade.newValue !== newUpgrade.currentValue) {\n logger.debug(\n {\n depName: upgrade.depName,\n manager,\n packageFile,\n expectedValue: upgrade.newValue,\n foundValue: newUpgrade.currentValue,\n },\n 'Value is not updated',\n );\n return false;\n }\n\n if (\n upgrade.newDigest &&\n (upgrade.isPinDigest === true || upgrade.currentDigest) &&\n upgrade.newDigest !== newUpgrade.currentDigest\n ) {\n logger.debug(\n {\n depName: upgrade.depName,\n manager,\n packageFile,\n expectedValue: upgrade.newDigest,\n foundValue: newUpgrade.currentDigest,\n },\n 'Digest is not updated',\n );\n return false;\n }\n\n return true;\n}\n\nfunction getDepsSignature(deps: PackageDependency[]): string {\n // TODO: types (#22198)\n return deps\n .map(\n (dep) =>\n `${(dep.depName ?? dep.packageName)!}${(dep.packageName ??\n dep.depName)!}`,\n )\n .join(',');\n}\n\nfunction firstIndexOf(\n existingContent: string,\n depName: string,\n currentValue: string,\n position = 0,\n): number {\n const depIndex = existingContent.indexOf(depName, position);\n const valIndex = existingContent.indexOf(currentValue, position);\n const index = depIndex < valIndex ? depIndex : valIndex;\n if (index < 0) {\n return position === 0 ? -1 : existingContent.length;\n }\n return index;\n}\n\nexport async function checkBranchDepsMatchBaseDeps(\n upgrade: BranchUpgradeConfig,\n branchContent: string,\n): Promise<boolean> {\n const { baseDeps, manager, packageFile } = upgrade;\n try {\n const res = await extractPackageFile(\n manager,\n branchContent,\n packageFile!,\n upgrade,\n )!;\n const branchDeps = res!.deps;\n return getDepsSignature(baseDeps!) === getDepsSignature(branchDeps);\n } catch /* istanbul ignore next */ {\n logger.info(\n { manager, packageFile },\n 'Failed to parse branchContent - rebasing',\n );\n return false;\n }\n}\n\nasync function checkExistingBranch(\n upgrade: BranchUpgradeConfig,\n existingContent: string,\n): Promise<string | null> {\n const { packageFile, depName } = upgrade;\n if (!(await checkBranchDepsMatchBaseDeps(upgrade, existingContent))) {\n logger.debug(\n { packageFile, depName },\n 'Rebasing branch after deps list has changed',\n );\n return null;\n }\n if (!(await confirmIfDepUpdated(upgrade, existingContent))) {\n logger.debug(\n { packageFile, depName },\n 'Rebasing after outdated branch dep found',\n );\n return null;\n }\n // TODO: fix types (#22198)\n logger.debug(`Branch dep ${depName!} in ${packageFile!} is already updated`);\n return existingContent;\n}\n\nexport async function doAutoReplace(\n upgrade: BranchUpgradeConfig,\n existingContent: string,\n reuseExistingBranch: boolean,\n firstUpdate = true,\n): Promise<string | null> {\n const {\n packageFile,\n depName,\n depNameTemplate,\n newName,\n currentValue,\n currentValueTemplate,\n newValue,\n currentDigest,\n currentDigestShort,\n newDigest,\n autoReplaceGlobalMatch,\n autoReplaceStringTemplate,\n } = upgrade;\n /*\n If replacement support for more managers is added,\n please also update the list in docs/usage/configuration-options.md\n at replacementName and replacementVersion\n */\n if (reuseExistingBranch) {\n return await checkExistingBranch(upgrade, existingContent);\n }\n const replaceWithoutReplaceString =\n is.string(newName) &&\n newName !== depName &&\n (is.undefined(upgrade.replaceString) ||\n !upgrade.replaceString?.includes(depName!));\n const replaceString = upgrade.replaceString ?? currentValue ?? currentDigest;\n logger.trace({ depName, replaceString }, 'autoReplace replaceString');\n let searchIndex: number;\n if (replaceWithoutReplaceString) {\n searchIndex = firstIndexOf(existingContent, depName!, currentValue!);\n } else {\n searchIndex = existingContent.indexOf(replaceString!);\n }\n if (searchIndex === -1) {\n logger.info(\n { packageFile, depName, existingContent, replaceString },\n 'Cannot find replaceString in current file content. Was it already updated?',\n );\n return existingContent;\n }\n try {\n let newString: string;\n if (autoReplaceStringTemplate && !newName) {\n newString = compile(autoReplaceStringTemplate, upgrade, false);\n } else {\n newString = replaceString!;\n\n const autoReplaceRegExpFlag = autoReplaceGlobalMatch ? 'g' : '';\n if (currentValue && newValue && currentValue !== newValue) {\n if (!newString.includes(currentValue)) {\n logger.debug(\n { stringToReplace: newString, currentValue, currentValueTemplate },\n 'currentValue not found in string to replace',\n );\n }\n newString = newString.replace(\n regEx(escapeRegExp(currentValue), autoReplaceRegExpFlag),\n newValue,\n );\n }\n if (depName && newName && depName !== newName) {\n if (!newString.includes(depName)) {\n logger.debug(\n { stringToReplace: newString, depName, depNameTemplate },\n 'depName not found in string to replace',\n );\n }\n newString = newString.replace(\n regEx(escapeRegExp(depName), autoReplaceRegExpFlag),\n newName,\n );\n }\n if (currentDigest && newDigest && currentDigest !== newDigest) {\n if (!newString.includes(currentDigest)) {\n logger.debug(\n { stringToReplace: newString, currentDigest },\n 'currentDigest not found in string to replace',\n );\n }\n newString = newString.replace(\n regEx(escapeRegExp(currentDigest), autoReplaceRegExpFlag),\n newDigest,\n );\n } else if (\n currentDigestShort &&\n newDigest &&\n currentDigestShort !== newDigest\n ) {\n if (!newString.includes(currentDigestShort)) {\n logger.debug(\n { stringToReplace: newString, currentDigestShort },\n 'currentDigestShort not found in string to replace',\n );\n }\n newString = newString.replace(\n regEx(escapeRegExp(currentDigestShort), autoReplaceRegExpFlag),\n newDigest,\n );\n }\n }\n if (!firstUpdate && (await confirmIfDepUpdated(upgrade, existingContent))) {\n logger.debug(\n { packageFile, depName },\n 'Package file is already updated - no work to do',\n );\n return existingContent;\n }\n logger.debug(\n { packageFile, depName },\n `Starting search at index ${searchIndex}`,\n );\n let newContent = existingContent;\n let nameReplaced = !newName;\n let valueReplaced = !newValue;\n let digestReplaced = !newDigest;\n let startIndex = searchIndex;\n // Iterate through the rest of the file\n for (; searchIndex < newContent.length; searchIndex += 1) {\n // First check if we have a hit for the old version\n if (replaceWithoutReplaceString) {\n // look for depName and currentValue\n if (newName && matchAt(newContent, searchIndex, depName!)) {\n logger.debug(\n { packageFile, depName },\n `Found depName at index ${searchIndex}`,\n );\n if (nameReplaced) {\n startIndex = firstIndexOf(\n existingContent,\n depName!,\n currentValue!,\n startIndex + 1,\n );\n searchIndex = startIndex - 1;\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n nameReplaced = !newName;\n valueReplaced = !newValue;\n digestReplaced = !newDigest;\n continue;\n }\n // replace with newName\n newContent = replaceAt(newContent, searchIndex, depName!, newName);\n await writeLocalFile(upgrade.packageFile!, newContent);\n nameReplaced = true;\n searchIndex += newName.length - 1;\n } else if (\n newValue &&\n matchAt(newContent, searchIndex, currentValue!)\n ) {\n logger.debug(\n { packageFile, currentValue },\n `Found currentValue at index ${searchIndex}`,\n );\n if (valueReplaced) {\n startIndex = firstIndexOf(\n existingContent,\n depName!,\n currentValue!,\n startIndex + 1,\n );\n searchIndex = startIndex - 1;\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n nameReplaced = !newName;\n valueReplaced = !newValue;\n digestReplaced = !newDigest;\n continue;\n }\n // Now test if the result matches\n newContent = replaceAt(\n newContent,\n searchIndex,\n currentValue!,\n newValue,\n );\n await writeLocalFile(upgrade.packageFile!, newContent);\n valueReplaced = true;\n searchIndex += newValue.length - 1;\n } else if (\n newDigest &&\n matchAt(newContent, searchIndex, currentDigest!)\n ) {\n logger.debug(\n { packageFile, currentDigest },\n `Found currentDigest at index ${searchIndex}`,\n );\n if (digestReplaced) {\n startIndex = firstIndexOf(\n existingContent,\n depName!,\n currentValue!,\n startIndex + 1,\n );\n searchIndex = startIndex - 1;\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n nameReplaced = !newName;\n valueReplaced = !newValue;\n digestReplaced = !newDigest;\n continue;\n }\n // Now test if the result matches\n newContent = replaceAt(\n newContent,\n searchIndex,\n currentDigest!,\n newDigest,\n );\n await writeLocalFile(upgrade.packageFile!, newContent);\n digestReplaced = true;\n searchIndex += newDigest.length - 1;\n }\n if (nameReplaced && valueReplaced && digestReplaced) {\n if (await confirmIfDepUpdated(upgrade, newContent)) {\n return newContent;\n }\n startIndex = firstIndexOf(\n existingContent,\n depName!,\n currentValue!,\n startIndex + 1,\n );\n searchIndex = startIndex - 1;\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n nameReplaced = !newName;\n valueReplaced = !newValue;\n digestReplaced = !newDigest;\n }\n } else if (matchAt(newContent, searchIndex, replaceString!)) {\n logger.debug(\n { packageFile, depName },\n `Found match at index ${searchIndex}`,\n );\n // Now test if the result matches\n newContent = replaceAt(\n newContent,\n searchIndex,\n replaceString!,\n newString,\n );\n await writeLocalFile(upgrade.packageFile!, newContent);\n if (await confirmIfDepUpdated(upgrade, newContent)) {\n return newContent;\n }\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n }\n }\n } catch (err) /* istanbul ignore next */ {\n logger.debug({ packageFile, depName, err }, 'doAutoReplace error');\n }\n // istanbul ignore next\n throw new Error(WORKER_FILE_UPDATE_FAILED);\n}\n"]}
|
@@ -266,29 +266,19 @@ async function getReleaseNotesMd(project, release) {
|
|
266
266
|
.replace((0, regex_1.regEx)(/^\s*#*\s*/), '')
|
267
267
|
.split(' ')
|
268
268
|
.filter(Boolean);
|
269
|
-
|
269
|
+
const body = section.replace((0, regex_1.regEx)(/.*?\n(-{3,}\n)?/), '').trim();
|
270
|
+
const notesSourceUrl = getNotesSourceUrl(baseUrl, repository, project, changelogFile);
|
271
|
+
const mdHeadingLink = title
|
272
|
+
.filter((word) => !(0, url_1.isHttpUrl)(word))
|
273
|
+
.join('-')
|
274
|
+
.replace((0, regex_1.regEx)(/[^A-Za-z0-9-]/g), '');
|
275
|
+
const url = `${notesSourceUrl}#${mdHeadingLink}`;
|
276
|
+
// Look for version in title
|
270
277
|
for (const word of title) {
|
271
278
|
if (word.includes(version) && !(0, url_1.isHttpUrl)(word)) {
|
272
279
|
logger_1.logger.trace({ body }, 'Found release notes for v' + version);
|
273
|
-
const notesSourceUrl = getNotesSourceUrl(baseUrl, repository, project, changelogFile);
|
274
|
-
const mdHeadingLink = title
|
275
|
-
.filter((word) => !(0, url_1.isHttpUrl)(word))
|
276
|
-
.join('-')
|
277
|
-
.replace((0, regex_1.regEx)(/[^A-Za-z0-9-]/g), '');
|
278
|
-
const url = `${notesSourceUrl}#${mdHeadingLink}`;
|
279
|
-
body = massageBody(body, baseUrl);
|
280
|
-
if (body?.length) {
|
281
|
-
try {
|
282
|
-
body = await (0, markdown_1.linkify)(body, {
|
283
|
-
repository: `${baseUrl}${repository}`,
|
284
|
-
});
|
285
|
-
}
|
286
|
-
catch (err) /* istanbul ignore next */ {
|
287
|
-
logger_1.logger.warn({ body, err }, 'linkify error');
|
288
|
-
}
|
289
|
-
}
|
290
280
|
return {
|
291
|
-
body,
|
281
|
+
body: await linkifyBody(project, body),
|
292
282
|
url,
|
293
283
|
notesSourceUrl,
|
294
284
|
};
|
@@ -376,4 +366,18 @@ function getNotesSourceUrl(baseUrl, repository, project, changelogFile) {
|
|
376
366
|
}
|
377
367
|
return (0, url_1.joinUrlParts)(baseUrl, repository, project.type === 'bitbucket' ? 'src' : 'blob', 'HEAD', changelogFile);
|
378
368
|
}
|
369
|
+
async function linkifyBody({ baseUrl, repository }, bodyStr) {
|
370
|
+
const body = massageBody(bodyStr, baseUrl);
|
371
|
+
if (body?.length) {
|
372
|
+
try {
|
373
|
+
return await (0, markdown_1.linkify)(body, {
|
374
|
+
repository: `${baseUrl}${repository}`,
|
375
|
+
});
|
376
|
+
}
|
377
|
+
catch (err) /* istanbul ignore next */ {
|
378
|
+
logger_1.logger.warn({ body, err }, 'linkify error');
|
379
|
+
}
|
380
|
+
}
|
381
|
+
return body;
|
382
|
+
}
|
379
383
|
//# sourceMappingURL=release-notes.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"release-notes.js","sourceRoot":"","sources":["../../../../../../lib/workers/repository/update/pr/changelog/release-notes.ts"],"names":[],"mappings":";;AA+BA,wCAoCC;AAED,oDAeC;AAED,kCA6BC;AAED,kCAgBC;AAED,0CA0CC;AA+ED,gEAwDC;AAED,sDAgBC;AAED,8CAgFC;AASD,4DAgBC;AAED,0CAiDC;AAMD,sDAEC;;AAhfD,kEAAkC;AAClC,iCAAiC;AACjC,sEAAqC;AACrC,kDAA+C;AAC/C,mFAA6D;AAC7D,wFAAkE;AAElE,uDAA4D;AAC5D,2DAAuD;AACvD,qDAAgE;AAChE,uDAA0D;AAC1D,iDAAkE;AAElE,+DAAyC;AACzC,4EAAsD;AACtD,uDAAiC;AACjC,yDAAmC;AACnC,yDAAmC;AASnC,MAAM,QAAQ,GAAG,IAAI,qBAAU,CAAC,MAAM,CAAC,CAAC;AACxC,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;AAEzC,MAAM,4BAA4B,GAAG,CAAC,uBAAuB,CAAC,CAAC;AAExD,KAAK,UAAU,cAAc,CAClC,OAAyB,EACzB,OAAyB;IAEzB,eAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACjC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IACjD,IAAI,CAAC;QACH,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,OAAO;gBACV,OAAO,MAAM,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACtD,KAAK,QAAQ;gBACX,OAAO,MAAM,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACvD,KAAK,QAAQ;gBACX,OAAO,MAAM,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACvD,KAAK,WAAW;gBACd,OAAO,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACpD,KAAK,kBAAkB;gBACrB,eAAM,CAAC,KAAK,CACV,kEAAkE,CACnE,CAAC;gBACF,OAAO,EAAE,CAAC;YACZ;gBACE,eAAM,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,sBAAsB,CAAC,CAAC;gBACtE,OAAO,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,0BAA0B,CAAC,CAAC;QACxC,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YAC3B,eAAM,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,oBAAoB,CAAC,CAAC;QACvE,CAAC;aAAM,CAAC;YACN,eAAM,CAAC,KAAK,CACV,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,EACrC,sBAAsB,CACvB,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAgB,oBAAoB,CAClC,OAAyB,EACzB,OAAyB;IAEzB,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAC3C,uBAAuB;IACvB,MAAM,QAAQ,GAAG,kBAAkB,UAAU,IAAI,UAAU,EAAE,CAAC;IAC9D,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAA4B,QAAQ,CAAC,CAAC;IACvE,qBAAqB;IACrB,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACrD,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACpC,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAgB,WAAW,CACzB,KAAgC,EAChC,OAAe;IAEf,IAAI,IAAI,GAAG,IAAA,qBAAY,EAAC,KAAK,CAAC,CAAC;IAC/B,uBAAuB;IACvB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAA,aAAK,EAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;IAC1C,2BAA2B;IAC3B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAA,aAAK,EAAC,0BAA0B,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3D,IAAI,GAAG,IAAI,CAAC,OAAO,CACjB,IAAA,aAAK,EACH,wBAAwB,OAAO,4BAA4B,EAC3D,SAAS,EACT,KAAK,CACN,EACD,EAAE,CACH,CAAC;IACF,oCAAoC;IACpC,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,OAAO,CAC1B,IAAA,aAAK,EAAC,MAAM,OAAO,oCAAoC,CAAC,EACxD,IAAI,CACL,CAAC;IACF,uBAAuB;IACvB,IAAI,GAAG,IAAI;SACR,OAAO,CAAC,IAAA,aAAK,EAAC,cAAc,CAAC,EAAE,UAAU,CAAC;SAC1C,OAAO,CAAC,IAAA,aAAK,EAAC,WAAW,CAAC,EAAE,SAAS,CAAC;SACtC,OAAO,CAAC,IAAA,aAAK,EAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAC;IACxC,kBAAkB;IAClB,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;AACrB,CAAC;AAED,SAAgB,WAAW,CACzB,KAAgC,EAChC,OAA2B;IAE3B,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;IAEvB,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,OAAO,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1E,CAAC;IAED,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACnB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,KAAK,UAAU,eAAe,CACnC,OAAyB,EACzB,OAAyB,EACzB,MAA2B;IAE3B,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IACrD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACpC,uBAAuB;IACvB,eAAM,CAAC,KAAK,CACV,mBAAmB,UAAU,KAAK,OAAO,KAAK,WAAY,KAAK,OAAQ,GAAG,CAC3E,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9D,eAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,kCAAkC,CAAC,CAAC;IAC/D,IAAI,YAAY,GAA0B,IAAI,CAAC;IAE/C,IAAI,cAAc,GAAG,oBAAoB,CACvC,WAAY,EACZ,OAAQ,EACR,OAAO,EACP,QAAQ,CACT,CAAC;IACF,IAAI,YAAE,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC;QACjC,qDAAqD;QACrD,cAAc,GAAG,QAAQ,CAAC,IAAI,CAC5B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,GAAG,KAAK,OAAO;YACjB,CAAC,CAAC,GAAG,KAAK,IAAI,OAAO,EAAE;YACvB,CAAC,CAAC,GAAG,KAAK,MAAM;YAChB,CAAC,CAAC,GAAG,KAAK,IAAI,MAAM,EAAE,CACzB,CAAC;IACJ,CAAC;IACD,IAAI,YAAE,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1D,MAAM,mBAAmB,GAAG,IAAA,aAAK,EAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QACzD,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YACnC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,GAAI,CAAC,EAAE,MAAM;gBAC/D,EAAE,OAAO,CAAC;YACZ,OAAO,OAAO,KAAK,gBAAgB,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC;IACD,YAAY,GAAG,MAAM,kBAAkB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IACjE,eAAM,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;IAC/B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,oBAAoB,CAC3B,WAAmB,EACnB,OAAe,EACf,OAAe,EACf,QAA0B;IAE1B,MAAM,eAAe,GAAG,IAAA,aAAK,EAC3B,aAAa,WAAW,IAAI,OAAO,WAAW,OAAO,EAAE,CACxD,CAAC;IACF,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3E,MAAM,cAAc,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAClD,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,GAAI,CAAC,CAC7B,CAAC;IACF,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,YAAwC,EACxC,OAAyB;IAEzB,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IACxC,MAAM,YAAY,GAAmB,YAAY,CAAC;IAClD,IAAI,IAAA,uBAAc,EAAC,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QACzC,YAAY,CAAC,GAAG,GAAG,GAAG,OAAO,GAAG,UAAU,SAAS,YAAY,CAAC,GAAI,EAAE,CAAC;IACzE,CAAC;SAAM,CAAC;QACN,YAAY,CAAC,GAAG,GAAG,YAAY,CAAC,GAAG;YACjC,CAAC,CAAC,YAAY,CAAC,GAAG;YAClB,CAAC,CAAC,0BAA0B;gBAC1B,GAAG,OAAO,GAAG,UAAU,aAAa,YAAY,CAAC,GAAI,EAAE,CAAC;IAC9D,CAAC;IACD,6BAA6B;IAC7B,YAAY,CAAC,IAAI,GAAG,WAAW,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5D,YAAY,CAAC,IAAI,GAAG,WAAW,CAAC,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;IACrE,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,IAAI,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1D,IAAI,CAAC;YACH,IAAI,OAAO,KAAK,qBAAqB,EAAE,CAAC;gBACtC,YAAY,CAAC,IAAI,GAAG,MAAM,IAAA,kBAAO,EAAC,YAAY,CAAC,IAAI,EAAE;oBACnD,UAAU,EAAE,GAAG,OAAO,GAAG,UAAU,EAAE;iBACtC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,0BAA0B,CAAC,CAAC;YACxC,eAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,KAAa;IAC7C,MAAM,QAAQ,GAAuB,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAY,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC/C,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QACvB,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;gBACjB,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,GAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAClC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAEM,KAAK,UAAU,0BAA0B,CAC9C,OAAyB;IAEzB,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IACrC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACtC,MAAM,eAAe,GAAG,OAAO,CAAC,eAAgB,CAAC;IACjD,IAAI,CAAC;QACH,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,OAAO;gBACV,OAAO,MAAM,KAAK,CAAC,iBAAiB,CAClC,UAAU,EACV,UAAU,EACV,eAAe,CAChB,CAAC;YACJ,KAAK,QAAQ;gBACX,OAAO,MAAM,MAAM,CAAC,iBAAiB,CACnC,UAAU,EACV,UAAU,EACV,eAAe,CAChB,CAAC;YACJ,KAAK,QAAQ;gBACX,OAAO,MAAM,MAAM,CAAC,iBAAiB,CACnC,UAAU,EACV,UAAU,EACV,eAAe,CAChB,CAAC;YACJ,KAAK,WAAW;gBACd,OAAO,MAAM,SAAS,CAAC,iBAAiB,CACtC,UAAU,EACV,UAAU,EACV,eAAe,CAChB,CAAC;YACJ,KAAK,kBAAkB;gBACrB,OAAO,MAAM,eAAe,CAAC,iBAAiB,CAC5C,UAAU,EACV,UAAU,EACV,eAAe,CAChB,CAAC;YACJ;gBACE,eAAM,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,sBAAsB,CAAC,CAAC;gBACtE,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,0BAA0B,CAAC,CAAC;QACxC,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YAC3B,eAAM,CAAC,KAAK,CACV,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,EAChC,gCAAgC,CACjC,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,eAAM,CAAC,KAAK,CACV,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,EACrC,4BAA4B,CAC7B,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,qBAAqB,CACnC,OAAyB;IAEzB,MAAM,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAC5D,uBAAuB;IACvB,MAAM,QAAQ,GAAG,eAAe;QAC9B,CAAC,CAAC,4BAA4B,UAAU,IAAI,eAAe,IAAI,UAAU,EAAE;QAC3E,CAAC,CAAC,4BAA4B,UAAU,IAAI,UAAU,EAAE,CAAC;IAC3D,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAgC,QAAQ,CAAC,CAAC;IAC3E,qBAAqB;IACrB,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,MAAM,WAAW,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC;IACxD,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACpC,OAAO,WAAW,CAAC;AACrB,CAAC;AAEM,KAAK,UAAU,iBAAiB,CACrC,OAAyB,EACzB,OAAyB;IAEzB,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IACxC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,eAAM,CAAC,KAAK,CAAC,qBAAqB,UAAU,KAAK,OAAO,GAAG,CAAC,CAAC;IAE7D,IAAI,qBAAqB,CAAC,UAAU,CAAC,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACvD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,EAAE,aAAa,EAAE,GAAG,SAAS,CAAC;IACpC,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC,OAAO,CAC/C,IAAA,aAAK,EAAC,kCAAkC,CAAC,EACzC,IAAI,CACL,CAAC;IACF,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC1C,MAAM,eAAe,GAAG,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACvD,IAAI,eAAe,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAChC,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;gBACtC,IAAI,CAAC;oBACH,8CAA8C;oBAC9C,MAAM,sBAAsB,GAAG,OAAO,CAAC,OAAO,CAC5C,IAAA,aAAK,EAAC,UAAU,CAAC,EACjB,GAAG,CACJ,CAAC;oBACF,MAAM,CAAC,OAAO,CAAC,GAAG,sBAAsB,CAAC,KAAK,CAAC,oBAAY,CAAC,CAAC;oBAC7D,MAAM,KAAK,GAAG,OAAO;yBAClB,OAAO,CAAC,IAAA,aAAK,EAAC,WAAW,CAAC,EAAE,EAAE,CAAC;yBAC/B,KAAK,CAAC,GAAG,CAAC;yBACV,MAAM,CAAC,OAAO,CAAC,CAAC;oBACnB,IAAI,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAA,aAAK,EAAC,iBAAiB,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;oBAChE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;wBACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAA,eAAS,EAAC,IAAI,CAAC,EAAE,CAAC;4BAC/C,eAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,2BAA2B,GAAG,OAAO,CAAC,CAAC;4BAC9D,MAAM,cAAc,GAAG,iBAAiB,CACtC,OAAO,EACP,UAAU,EACV,OAAO,EACP,aAAa,CACd,CAAC;4BACF,MAAM,aAAa,GAAG,KAAK;iCACxB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAA,eAAS,EAAC,IAAI,CAAC,CAAC;iCAClC,IAAI,CAAC,GAAG,CAAC;iCACT,OAAO,CAAC,IAAA,aAAK,EAAC,gBAAgB,CAAC,EAAE,EAAE,CAAC,CAAC;4BACxC,MAAM,GAAG,GAAG,GAAG,cAAc,IAAI,aAAa,EAAE,CAAC;4BACjD,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;4BAClC,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC;gCACjB,IAAI,CAAC;oCACH,IAAI,GAAG,MAAM,IAAA,kBAAO,EAAC,IAAI,EAAE;wCACzB,UAAU,EAAE,GAAG,OAAO,GAAG,UAAU,EAAE;qCACtC,CAAC,CAAC;gCACL,CAAC;gCAAC,OAAO,GAAG,EAAE,0BAA0B,CAAC,CAAC;oCACxC,eAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,eAAe,CAAC,CAAC;gCAC9C,CAAC;4BACH,CAAC;4BACD,OAAO;gCACL,IAAI;gCACJ,GAAG;gCACH,cAAc;6BACf,CAAC;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,0BAA0B,CAAC,CAAC;oBACxC,eAAM,CAAC,IAAI,CACT,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,EAC5B,8BAA8B,CAC/B,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QACD,eAAM,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,EAAE,YAAY,KAAK,4BAA4B,CAAC,CAAC;IAC9E,CAAC;IACD,eAAM,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,qBAAqB,aAAa,EAAE,CAAC,CAAC;IAC5E,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,wBAAwB,CAAC,WAA2B;IAClE,MAAM,EAAE,GAAG,YAAE,CAAC,IAAI,CAAC,WAAW,CAAC;QAC7B,CAAC,CAAC,gBAAQ,CAAC,UAAU,CAAC,WAAW,CAAC;QAClC,CAAC,CAAC,gBAAQ,CAAC,OAAO,CAAC,WAAY,CAAC,CAAC;IAEnC,MAAM,GAAG,GAAG,gBAAQ,CAAC,KAAK,EAAE,CAAC;IAE7B,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACjD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC,CAAC,2BAA2B;IAC1C,CAAC;IAED,OAAO,KAAK,CAAC,CAAC,2BAA2B;AAC3C,CAAC;AAEM,KAAK,UAAU,eAAe,CACnC,KAAyC,EACzC,MAA2B;IAE3B,IAAI,CAAC,KAAK,EAAE,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QAC7C,eAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC5C,OAAO,KAAK,IAAI,IAAI,CAAC;IACvB,CAAC;IACD,MAAM,MAAM,GAAoB;QAC9B,GAAG,KAAK;QACR,QAAQ,EAAE,EAAE;QACZ,eAAe,EAAE,KAAK;KACvB,CAAC;IAEF,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC;IACzE,MAAM,cAAc,GAA0B,aAAa,WAAW,WAAW,CAAC;IAClF,MAAM,cAAc,GAAG,eAAe;QACpC,CAAC,CAAC,GAAG,UAAU,IAAI,eAAe,EAAE;QACpC,CAAC,CAAC,GAAG,UAAU,EAAE,CAAC;IAEpB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC/B,IAAI,YAA+C,CAAC;QACpD,MAAM,QAAQ,GAAG,GAAG,cAAc,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QAClD,YAAY,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QAChE,YAAY,KAAK,MAAM,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC3D,YAAY,KAAK,MAAM,eAAe,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QAEjE,qEAAqE;QACrE,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YACnC,YAAY,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;QAC5D,CAAC;QAED,MAAM,YAAY,GAAG,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,YAAY,CAAC,GAAG,CACpB,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,YAAY,CACb,CAAC;QACF,MAAM,CAAC,QAAS,CAAC,IAAI,CAAC;YACpB,GAAG,CAAC;YACJ,YAAY,EAAE,YAAa;SAC5B,CAAC,CAAC;QAEH,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC;QAChC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAgB,qBAAqB,CAAC,UAAkB;IACtD,OAAO,4BAA4B,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,iBAAiB,CACxB,OAAe,EACf,UAAkB,EAClB,OAAyB,EACzB,aAAqB;IAErB,IAAI,OAAO,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QACxC,MAAM,CAAC,UAAU,EAAE,cAAc,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3D,OAAO,IAAA,kBAAY,EACjB,OAAO,EACP,UAAU,EACV,UAAU,EACV,OAAO,EACP,cAAc,EACd,QAAQ,EACR,aAAa,EACb,UAAU,CACX,CAAC;IACJ,CAAC;IAED,OAAO,IAAA,kBAAY,EACjB,OAAO,EACP,UAAU,EACV,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAC7C,MAAM,EACN,aAAa,CACd,CAAC;AACJ,CAAC","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 } = 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 let body = section.replace(regEx(/.*?\\n(-{3,}\\n)?/), '').trim();\n for (const word of title) {\n if (word.includes(version) && !isHttpUrl(word)) {\n logger.trace({ body }, 'Found release notes for v' + version);\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 body = massageBody(body, baseUrl);\n if (body?.length) {\n try {\n body = 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 {\n 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"]}
|
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 } = 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 } 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"]}
|