|
82 | 82 | // Match and extract changelog item |
83 | 83 | const itemMatch = trimmedLine.match(/^[*-]\s(.*)$/); |
84 | 84 | if (itemMatch) { |
85 | | - const originalContent = itemMatch[1]; |
| 85 | + let originalContent = itemMatch[1]; |
| 86 | +
|
| 87 | + // This is a two-step process to prevent `release-please` from |
| 88 | + // creating mangled, doubly-nested links for PRs. |
| 89 | +
|
| 90 | + // STEP 1: CLEAN THE INPUT. |
| 91 | + // The source changelog contains a zero-width space as an HTML entity (`​`). |
| 92 | + // This breaks the regex in the next step, so we must remove it first. |
| 93 | + // E.g., "[#​1770](...)" becomes "[#1770](...)" |
| 94 | + originalContent = originalContent.replace(/​/g, ''); |
| 95 | +
|
| 96 | + // STEP 2: PROTECT THE OUTPUT. |
| 97 | + // `release-please` aggressively tries to auto-link any text that looks like `#1234`. |
| 98 | + // To prevent this, we insert an invisible Unicode zero-width space (`\u200B`) |
| 99 | + // between the '#' and the number in the link text. This breaks the parser's |
| 100 | + // pattern matching without changing the visual appearance of the link. |
| 101 | + // E.g., "[#1770](...)" becomes "[genai-toolbox#1770](...)" |
| 102 | + originalContent = originalContent.replace(/\[#(\d+)\](\([^)]+\))/g, '[genai-toolbox#\u200B$1]$2'); |
| 103 | + |
86 | 104 | const lineAsLowerCase = originalContent.toLowerCase(); |
87 | | -
|
88 | 105 | const hasPrefix = prefixesToFilter.some(prefix => lineAsLowerCase.includes(prefix)); |
89 | 106 | |
90 | 107 | // Check if the line includes ANY of the required keywords |
|
0 commit comments