@mnaoumov/typescript-dev-toolkit 6.2.0 → 6.3.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.
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+
3
+ // The `rewrite-changelog` command. The logic lives in `src/changelog-rewrite-cli.ts`, built into `dist/`.
4
+ import process from 'node:process';
5
+
6
+ import { runRewriteChangelogCli } from '../dist/lib/esm/changelog-rewrite-cli.mjs';
7
+
8
+ process.exitCode = await runRewriteChangelogCli(process.argv.slice(2));
@@ -25,6 +25,7 @@ var changelog_grouping_exports = {};
25
25
  __export(changelog_grouping_exports, {
26
26
  CHANGELOG_STYLES: () => CHANGELOG_STYLES,
27
27
  MAINTENANCE_COMMIT_TYPES: () => MAINTENANCE_COMMIT_TYPES,
28
+ escapeLinkBrackets: () => escapeLinkBrackets,
28
29
  renderGroupedChangelogSection: () => renderGroupedChangelogSection
29
30
  });
30
31
  module.exports = __toCommonJS(changelog_grouping_exports);
@@ -45,6 +46,18 @@ const SECTIONS_BY_TYPE = /* @__PURE__ */ new Map([
45
46
  ]);
46
47
  const CONVENTIONAL_ENTRY_REG_EXP = /^(?<type>[a-z]+)(?:\((?<scope>[^()]*)\))?(?<breaking>!)?:\s+(?<description>\S.*)$/i;
47
48
  const ISSUE_ONLY_DESCRIPTION_REG_EXP = /^re (?<issue>#\d+)$/i;
49
+ const CODE_SPAN_REG_EXP = /(?<!`)(?<fence>`+)(?!`)[\s\S]*?(?<!`)\k<fence>(?!`)/g;
50
+ const BRACKET_REG_EXP = /\\*[[\]]/g;
51
+ function escapeLinkBrackets(text) {
52
+ const parts = [];
53
+ let lastIndex = 0;
54
+ for (const match of text.matchAll(CODE_SPAN_REG_EXP)) {
55
+ parts.push(escapeBracketsInPlainText(text.slice(lastIndex, match.index)), match[0]);
56
+ lastIndex = match.index + match[0].length;
57
+ }
58
+ parts.push(escapeBracketsInPlainText(text.slice(lastIndex)));
59
+ return parts.join("");
60
+ }
48
61
  function renderGroupedChangelogSection(entries) {
49
62
  const sectionEntries = /* @__PURE__ */ new Map();
50
63
  let maintenanceCount = 0;
@@ -88,7 +101,7 @@ function classifyEntry(entry) {
88
101
  const issue = ISSUE_ONLY_DESCRIPTION_REG_EXP.exec(description)?.groups?.["issue"];
89
102
  const issueTitle = entry.detailLines[0];
90
103
  const isIssueTitleUsed = issue !== void 0 && issueTitle !== void 0;
91
- const text = isIssueTitleUsed ? issueTitle : description;
104
+ const text = isIssueTitleUsed ? escapeLinkBrackets(issueTitle) : description;
92
105
  const references = isIssueTitleUsed ? [issue, ...entry.references] : entry.references;
93
106
  const scope = groups["scope"];
94
107
  return {
@@ -100,6 +113,13 @@ function classifyEntry(entry) {
100
113
  function countPhrase(count, section) {
101
114
  return `${String(count)} ${count === 1 ? section.singular : section.plural}`;
102
115
  }
116
+ function escapeBracketsInPlainText(text) {
117
+ return text.replaceAll(BRACKET_REG_EXP, (match) => {
118
+ const backslashes = match.slice(0, -1);
119
+ const isEscaped = backslashes.replaceAll("\\\\", "") === "\\";
120
+ return isEscaped ? match : `${backslashes}\\${match.slice(-1)}`;
121
+ });
122
+ }
103
123
  function joinPhrases(phrases) {
104
124
  const last = phrases.slice(-1).join("");
105
125
  return phrases.length === 1 ? last : `${phrases.slice(0, -1).join(", ")} and ${last}`;
@@ -127,6 +147,7 @@ function toTypeSection(type) {
127
147
  0 && (module.exports = {
128
148
  CHANGELOG_STYLES,
129
149
  MAINTENANCE_COMMIT_TYPES,
150
+ escapeLinkBrackets,
130
151
  renderGroupedChangelogSection
131
152
  });
132
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NoYW5nZWxvZy1ncm91cGluZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEdyb3VwcyB0aGUgY29tbWl0LWRlcml2ZWQgZW50cmllcyBvZiBhIG5ldyBjaGFuZ2Vsb2cgc2VjdGlvbiBpbnRvIHBsYWluLWxhbmd1YWdlIHNlY3Rpb25zLCBzbyB0aGUgcmVsZWFzZSBub3RlcyBhXG4gKiByZWxlYXNlIHdyaXRlcyB3aXRoIG5vYm9keSByZXZpZXdpbmcgdGhlbSBjYW4gYmUgc2Nhbm5lZCByYXRoZXIgdGhhbiByZWFkIGNvbW1pdCBieSBjb21taXQuXG4gKlxuICogVGhlIGlucHV0IGlzIHN0aWxsIHRoZSBmaXJzdC1wYXJlbnQgY29tbWl0IGhpc3RvcnksIHNvIHRoaXMgaXMgYSBkZXRlcm1pbmlzdGljIHRyYW5zZm9ybWF0aW9uIG9mIHdoYXQgdGhlIGF1dGhvclxuICogYWxyZWFkeSB3cm90ZTogaXQgc29ydHMgZW50cmllcyBieSB0aGVpciBDb252ZW50aW9uYWwtQ29tbWl0cyB0eXBlLCBsZWF2ZXMgb3V0IHRoZSBjb21taXQgdHlwZXMgdGhhdCBkbyBub3QgY2hhbmdlXG4gKiB3aGF0IGEgdXNlciBnZXRzLCBtZXJnZXMgZW50cmllcyB0aGF0IHNheSB0aGUgc2FtZSB0aGluZywgYW5kIHN3YXBzIGEgYHJlICM8bj5gIHN1YmplY3QgZm9yIHRoZSBpc3N1ZSB0aXRsZSBpdHMgYm9keVxuICogY2Fycmllcy4gUHJvc2UgYSBodW1hbiAob3IgYW4gYWdlbnQpIHdyaXRlcyBzdGlsbCBnb2VzIGluIHRocm91Z2ggYC0tY2hhbmdlbG9nLWZpbGVgLlxuICovXG5cbi8qKlxuICogSG93IHRoZSBnZW5lcmF0ZWQgY2hhbmdlbG9nIHNlY3Rpb24gb2YgYSByZWxlYXNlIGlzIGxhaWQgb3V0LlxuICpcbiAqIC0gYGdyb3VwZWRgIFx1MjAxNCBhIG9uZS1saW5lIHN1bW1hcnksIHRoZW4gdGhlIGVudHJpZXMgdW5kZXIgYCMjIyBCcmVha2luZyBjaGFuZ2VzYCwgYCMjIyBOZXdgLCBgIyMjIEZpeGVkYCxcbiAqICAgYCMjIyBJbXByb3ZlZGAsIGAjIyMgRG9jdW1lbnRhdGlvbmAgYW5kIGAjIyMgT3RoZXIgY2hhbmdlc2AsIHdpdGggbWFpbnRlbmFuY2UgY29tbWl0cyBjb3VudGVkIHJhdGhlciB0aGFuIGxpc3RlZC5cbiAqIC0gYGNvbW1pdHNgIFx1MjAxNCBvbmUgYnVsbGV0IHBlciBmaXJzdC1wYXJlbnQgY29tbWl0LCBpbiBoaXN0b3J5IG9yZGVyLCBhcyBldmVyeSByZWxlYXNlIHdyb3RlIGJlZm9yZSBgZ3JvdXBlZGAgZXhpc3RlZC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2hhbmdlbG9nU3R5bGUgPSAnY29tbWl0cycgfCAnZ3JvdXBlZCc7XG5cbi8qKlxuICogRXZlcnkge0BsaW5rIENoYW5nZWxvZ1N0eWxlfSwgaW4gdGhlIG9yZGVyIHRoZSBgLS1jaGFuZ2Vsb2ctc3R5bGVgIGVycm9yIGxpc3RzIHRoZW0uXG4gKi9cbmV4cG9ydCBjb25zdCBDSEFOR0VMT0dfU1RZTEVTOiByZWFkb25seSBDaGFuZ2Vsb2dTdHlsZVtdID0gWydncm91cGVkJywgJ2NvbW1pdHMnXTtcblxuLyoqXG4gKiBPbmUgZmlyc3QtcGFyZW50IGNvbW1pdCwgYXMge0BsaW5rIHJlbmRlckdyb3VwZWRDaGFuZ2Vsb2dTZWN0aW9ufSB0YWtlcyBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGFuZ2Vsb2dDb21taXRFbnRyeSB7XG4gIC8qKlxuICAgKiBUaGUgYm9keSBsaW5lcyB0aGF0IGFyZSBuZWl0aGVyIHRoZSBlbnRyeSBpdHNlbGYgbm9yIGFuIGlzc3VlIHJlZmVyZW5jZSBsaW5lIG5vciBhIGJyZWFraW5nLWNoYW5nZSBmb290ZXIsIGluXG4gICAqIG9yZGVyLiBUaGUgZmlyc3Qgb2YgdGhlbSBpcyB0aGUgaXNzdWUgdGl0bGUgYW4gaXNzdWUtY2xvc2luZyBgcmUgIzxuPmAgbWVyZ2UgY2Fycmllcy5cbiAgICovXG4gIHJlYWRvbmx5IGRldGFpbExpbmVzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGNoYW5nZWxvZyBsaW5lIHRoZSBjb21taXQgcHJvZHVjZXMgYmVmb3JlIGdyb3VwaW5nOiBpdHMgc3ViamVjdCwgb3IgdGhlIGJvZHkgbGluZSBsaWZ0ZWQgb250byBhIGRlZmF1bHQgbWVyZ2VcbiAgICogc3ViamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IGVudHJ5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNvbW1pdCBjYXJyaWVzIGEgYEJSRUFLSU5HIENIQU5HRTpgIGZvb3Rlci4gVGhlIGAhYCBtYXJrZXIgaXMgcmVhZCBvZmYge0BsaW5rIGVudHJ5fSBpdHNlbGYuXG4gICAqL1xuICByZWFkb25seSBoYXNCcmVha2luZ0Zvb3RlcjogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGlzc3VlIHJlZmVyZW5jZXMgdGhlIGJvZHkgbmFtZXMgdGhhdCB7QGxpbmsgZW50cnl9IGRvZXMgbm90IGFscmVhZHkgc2hvdywgcmVuZGVyZWQgYXMgdGhlIGxpbmUgc2hvd3MgdGhlbS5cbiAgICovXG4gIHJlYWRvbmx5IHJlZmVyZW5jZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBjb21taXQgdHlwZXMgdGhhdCBjaGFuZ2Ugbm90aGluZyBhIHVzZXIgb2YgdGhlIHJlbGVhc2UgZ2V0cywgc28gdGhlIGdyb3VwZWQgc2VjdGlvbiBjb3VudHMgdGhlbSBpbnN0ZWFkIG9mXG4gKiBsaXN0aW5nIHRoZW0uIEEgY29tbWl0IG9mIG9uZSBvZiB0aGVzZSB0eXBlcyB0aGF0IGlzIG1hcmtlZCBicmVha2luZyBpcyBzdGlsbCBsaXN0ZWQsIHVuZGVyIGJyZWFraW5nIGNoYW5nZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBNQUlOVEVOQU5DRV9DT01NSVRfVFlQRVM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFsnYnVpbGQnLCAnY2hvcmUnLCAnY2knLCAncmVmYWN0b3InLCAnc3R5bGUnLCAndGVzdCddKTtcblxuaW50ZXJmYWNlIENsYXNzaWZpZWRFbnRyeSB7XG4gIHJlYWRvbmx5IHJlZmVyZW5jZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSBzZWN0aW9uOiBTZWN0aW9uRGVmaW5pdGlvbjtcbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgU2VjdGlvbkRlZmluaXRpb24ge1xuICByZWFkb25seSBoZWFkaW5nOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdXJhbDogc3RyaW5nO1xuICByZWFkb25seSBzaW5ndWxhcjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgU2VjdGlvbkVudHJ5IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcmVhZG9ubHktaW50ZXJmYWNlLW1lbWJlcnMgLS0gTWVyZ2VkIGVudHJpZXMgY29sbGVjdCByZWZlcmVuY2VzIGluIHBsYWNlLlxuICByZWZlcmVuY2VzOiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xufVxuXG5jb25zdCBCUkVBS0lOR19TRUNUSU9OOiBTZWN0aW9uRGVmaW5pdGlvbiA9IHsgaGVhZGluZzogJ0JyZWFraW5nIGNoYW5nZXMnLCBwbHVyYWw6ICdicmVha2luZyBjaGFuZ2VzJywgc2luZ3VsYXI6ICdicmVha2luZyBjaGFuZ2UnIH07XG5jb25zdCBORVdfU0VDVElPTjogU2VjdGlvbkRlZmluaXRpb24gPSB7IGhlYWRpbmc6ICdOZXcnLCBwbHVyYWw6ICduZXcgZmVhdHVyZXMnLCBzaW5ndWxhcjogJ25ldyBmZWF0dXJlJyB9O1xuY29uc3QgRklYRURfU0VDVElPTjogU2VjdGlvbkRlZmluaXRpb24gPSB7IGhlYWRpbmc6ICdGaXhlZCcsIHBsdXJhbDogJ2ZpeGVzJywgc2luZ3VsYXI6ICdmaXgnIH07XG5jb25zdCBJTVBST1ZFRF9TRUNUSU9OOiBTZWN0aW9uRGVmaW5pdGlvbiA9IHsgaGVhZGluZzogJ0ltcHJvdmVkJywgcGx1cmFsOiAnaW1wcm92ZW1lbnRzJywgc2luZ3VsYXI6ICdpbXByb3ZlbWVudCcgfTtcbmNvbnN0IERPQ1VNRU5UQVRJT05fU0VDVElPTjogU2VjdGlvbkRlZmluaXRpb24gPSB7IGhlYWRpbmc6ICdEb2N1bWVudGF0aW9uJywgcGx1cmFsOiAnZG9jdW1lbnRhdGlvbiBjaGFuZ2VzJywgc2luZ3VsYXI6ICdkb2N1bWVudGF0aW9uIGNoYW5nZScgfTtcbmNvbnN0IE9USEVSX1NFQ1RJT046IFNlY3Rpb25EZWZpbml0aW9uID0geyBoZWFkaW5nOiAnT3RoZXIgY2hhbmdlcycsIHBsdXJhbDogJ290aGVyIGNoYW5nZXMnLCBzaW5ndWxhcjogJ290aGVyIGNoYW5nZScgfTtcblxuLyoqXG4gKiBUaGUgc2VjdGlvbnMsIGluIHRoZSBvcmRlciB0aGV5IGFyZSByZW5kZXJlZCBhbmQgc3VtbWFyaXplZC5cbiAqL1xuY29uc3QgU0VDVElPTlM6IHJlYWRvbmx5IFNlY3Rpb25EZWZpbml0aW9uW10gPSBbQlJFQUtJTkdfU0VDVElPTiwgTkVXX1NFQ1RJT04sIEZJWEVEX1NFQ1RJT04sIElNUFJPVkVEX1NFQ1RJT04sIERPQ1VNRU5UQVRJT05fU0VDVElPTiwgT1RIRVJfU0VDVElPTl07XG5cbmNvbnN0IFNFQ1RJT05TX0JZX1RZUEUgPSBuZXcgTWFwPHN0cmluZywgU2VjdGlvbkRlZmluaXRpb24+KFtcbiAgWydkb2NzJywgRE9DVU1FTlRBVElPTl9TRUNUSU9OXSxcbiAgWydmZWF0JywgTkVXX1NFQ1RJT05dLFxuICBbJ2ZpeCcsIEZJWEVEX1NFQ1RJT05dLFxuICBbJ3BlcmYnLCBJTVBST1ZFRF9TRUNUSU9OXVxuXSk7XG5cbmNvbnN0IENPTlZFTlRJT05BTF9FTlRSWV9SRUdfRVhQID0gL14oPzx0eXBlPlthLXpdKykoPzpcXCgoPzxzY29wZT5bXigpXSopXFwpKT8oPzxicmVha2luZz4hKT86XFxzKyg/PGRlc2NyaXB0aW9uPlxcUy4qKSQvaTtcblxuLyoqXG4gKiBBbiBpc3N1ZS1jbG9zaW5nIG1lcmdlIHN1YmplY3QsIHdob3NlIHJlYWRhYmxlIGhhbGYgaXMgdGhlIGlzc3VlIHRpdGxlIG9uIHRoZSBib2R5J3MgZmlyc3QgbGluZS5cbiAqL1xuY29uc3QgSVNTVUVfT05MWV9ERVNDUklQVElPTl9SRUdfRVhQID0gL15yZSAoPzxpc3N1ZT4jXFxkKykkL2k7XG5cbi8qKlxuICogUmVuZGVycyB0aGUgYm9keSBvZiBhIG5ldyBjaGFuZ2Vsb2cgc2VjdGlvbiBpbiB0aGUge0BsaW5rIENoYW5nZWxvZ1N0eWxlfSBgZ3JvdXBlZGAgbGF5b3V0LlxuICpcbiAqIEBwYXJhbSBlbnRyaWVzIC0gVGhlIGZpcnN0LXBhcmVudCBjb21taXRzIHNpbmNlIHRoZSBwcmV2aW91cyByZWxlYXNlLCBpbiBgZ2l0IGxvZ2Agb3JkZXIuXG4gKiBAcmV0dXJucyBUaGUgc2VjdGlvbiBib2R5LCB3aXRob3V0IGl0cyBgIyMgPHZlcnNpb24+YCBoZWFkaW5nIGFuZCB3aXRob3V0IGEgdHJhaWxpbmcgbmV3bGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckdyb3VwZWRDaGFuZ2Vsb2dTZWN0aW9uKGVudHJpZXM6IHJlYWRvbmx5IENoYW5nZWxvZ0NvbW1pdEVudHJ5W10pOiBzdHJpbmcge1xuICBjb25zdCBzZWN0aW9uRW50cmllcyA9IG5ldyBNYXA8U2VjdGlvbkRlZmluaXRpb24sIFNlY3Rpb25FbnRyeVtdPigpO1xuICBsZXQgbWFpbnRlbmFuY2VDb3VudCA9IDA7XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgY2xhc3NpZmllZCA9IGNsYXNzaWZ5RW50cnkoZW50cnkpO1xuICAgIGlmICghY2xhc3NpZmllZCkge1xuICAgICAgbWFpbnRlbmFuY2VDb3VudCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgbGlzdCA9IHNlY3Rpb25FbnRyaWVzLmdldChjbGFzc2lmaWVkLnNlY3Rpb24pID8/IFtdO1xuICAgIHNlY3Rpb25FbnRyaWVzLnNldChjbGFzc2lmaWVkLnNlY3Rpb24sIGxpc3QpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gbGlzdC5maW5kKChzZWN0aW9uRW50cnkpID0+IHNlY3Rpb25FbnRyeS50ZXh0ID09PSBjbGFzc2lmaWVkLnRleHQpO1xuICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgIGxpc3QucHVzaCh7IHJlZmVyZW5jZXM6IFsuLi5jbGFzc2lmaWVkLnJlZmVyZW5jZXNdLCB0ZXh0OiBjbGFzc2lmaWVkLnRleHQgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBleGlzdGluZy5yZWZlcmVuY2VzID0gWy4uLm5ldyBTZXQoWy4uLmV4aXN0aW5nLnJlZmVyZW5jZXMsIC4uLmNsYXNzaWZpZWQucmVmZXJlbmNlc10pXTtcbiAgfVxuXG4gIGNvbnN0IGJsb2NrcyA9IFt0b1N1bW1hcnlMaW5lKHNlY3Rpb25FbnRyaWVzLCBtYWludGVuYW5jZUNvdW50KV07XG4gIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBTRUNUSU9OUykge1xuICAgIGNvbnN0IGxpc3QgPSBzZWN0aW9uRW50cmllcy5nZXQoc2VjdGlvbik7XG4gICAgaWYgKCFsaXN0KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBibG9ja3MucHVzaChgIyMjICR7c2VjdGlvbi5oZWFkaW5nfWAsIGxpc3QubWFwKChzZWN0aW9uRW50cnkpID0+IGAtICR7dG9FbnRyeUxpbmUoc2VjdGlvbkVudHJ5KX1gKS5qb2luKCdcXG4nKSk7XG4gIH1cblxuICByZXR1cm4gYmxvY2tzLmpvaW4oJ1xcblxcbicpO1xufVxuXG5mdW5jdGlvbiBjbGFzc2lmeUVudHJ5KGVudHJ5OiBDaGFuZ2Vsb2dDb21taXRFbnRyeSk6IENsYXNzaWZpZWRFbnRyeSB8IG51bGwge1xuICBjb25zdCBncm91cHMgPSBDT05WRU5USU9OQUxfRU5UUllfUkVHX0VYUC5leGVjKGVudHJ5LmVudHJ5KT8uZ3JvdXBzO1xuICBpZiAoIWdyb3Vwcykge1xuICAgIHJldHVybiB7IHJlZmVyZW5jZXM6IGVudHJ5LnJlZmVyZW5jZXMsIHNlY3Rpb246IGVudHJ5Lmhhc0JyZWFraW5nRm9vdGVyID8gQlJFQUtJTkdfU0VDVElPTiA6IE9USEVSX1NFQ1RJT04sIHRleHQ6IGVudHJ5LmVudHJ5IH07XG4gIH1cblxuICAvLyBUaGUgcmVndWxhciBleHByZXNzaW9uJ3MgYHR5cGVgIGFuZCBgZGVzY3JpcHRpb25gIGdyb3VwcyBhcmUgbm90IG9wdGlvbmFsLCBzbyBhIG1hdGNoIGFsd2F5cyBmaWxscyB0aGVtLlxuICBjb25zdCB0eXBlID0gU3RyaW5nKGdyb3Vwc1sndHlwZSddKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBpc0JyZWFraW5nID0gZ3JvdXBzWydicmVha2luZyddICE9PSB1bmRlZmluZWQgfHwgZW50cnkuaGFzQnJlYWtpbmdGb290ZXI7XG4gIGNvbnN0IHNlY3Rpb24gPSBpc0JyZWFraW5nID8gQlJFQUtJTkdfU0VDVElPTiA6IHRvVHlwZVNlY3Rpb24odHlwZSk7XG4gIGlmICghc2VjdGlvbikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZGVzY3JpcHRpb24gPSBTdHJpbmcoZ3JvdXBzWydkZXNjcmlwdGlvbiddKTtcbiAgY29uc3QgaXNzdWUgPSBJU1NVRV9PTkxZX0RFU0NSSVBUSU9OX1JFR19FWFAuZXhlYyhkZXNjcmlwdGlvbik/Lmdyb3Vwcz8uWydpc3N1ZSddO1xuICBjb25zdCBpc3N1ZVRpdGxlID0gZW50cnkuZGV0YWlsTGluZXNbMF07XG4gIGNvbnN0IGlzSXNzdWVUaXRsZVVzZWQgPSBpc3N1ZSAhPT0gdW5kZWZpbmVkICYmIGlzc3VlVGl0bGUgIT09IHVuZGVmaW5lZDtcbiAgY29uc3QgdGV4dCA9IGlzSXNzdWVUaXRsZVVzZWQgPyBpc3N1ZVRpdGxlIDogZGVzY3JpcHRpb247XG4gIGNvbnN0IHJlZmVyZW5jZXMgPSBpc0lzc3VlVGl0bGVVc2VkID8gW2lzc3VlLCAuLi5lbnRyeS5yZWZlcmVuY2VzXSA6IGVudHJ5LnJlZmVyZW5jZXM7XG4gIGNvbnN0IHNjb3BlID0gZ3JvdXBzWydzY29wZSddO1xuICByZXR1cm4ge1xuICAgIHJlZmVyZW5jZXMsXG4gICAgc2VjdGlvbixcbiAgICB0ZXh0OiBzY29wZSA/IGAqKiR7c2NvcGV9OioqICR7dGV4dH1gIDogdGV4dFxuICB9O1xufVxuXG5mdW5jdGlvbiBjb3VudFBocmFzZShjb3VudDogbnVtYmVyLCBzZWN0aW9uOiBTZWN0aW9uRGVmaW5pdGlvbik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtTdHJpbmcoY291bnQpfSAke2NvdW50ID09PSAxID8gc2VjdGlvbi5zaW5ndWxhciA6IHNlY3Rpb24ucGx1cmFsfWA7XG59XG5cbmZ1bmN0aW9uIGpvaW5QaHJhc2VzKHBocmFzZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgbGFzdCA9IHBocmFzZXMuc2xpY2UoLTEpLmpvaW4oJycpO1xuICByZXR1cm4gcGhyYXNlcy5sZW5ndGggPT09IDEgPyBsYXN0IDogYCR7cGhyYXNlcy5zbGljZSgwLCAtMSkuam9pbignLCAnKX0gYW5kICR7bGFzdH1gO1xufVxuXG5mdW5jdGlvbiB0b0VudHJ5TGluZShzZWN0aW9uRW50cnk6IFNlY3Rpb25FbnRyeSk6IHN0cmluZyB7XG4gIHJldHVybiBzZWN0aW9uRW50cnkucmVmZXJlbmNlcy5sZW5ndGggPT09IDAgPyBzZWN0aW9uRW50cnkudGV4dCA6IGAke3NlY3Rpb25FbnRyeS50ZXh0fSAoJHtzZWN0aW9uRW50cnkucmVmZXJlbmNlcy5qb2luKCcsICcpfSlgO1xufVxuXG5mdW5jdGlvbiB0b1N1bW1hcnlMaW5lKHNlY3Rpb25FbnRyaWVzOiBSZWFkb25seU1hcDxTZWN0aW9uRGVmaW5pdGlvbiwgcmVhZG9ubHkgU2VjdGlvbkVudHJ5W10+LCBtYWludGVuYW5jZUNvdW50OiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBwaHJhc2VzID0gU0VDVElPTlNcbiAgICAubWFwKChzZWN0aW9uKSA9PiAoeyBjb3VudDogc2VjdGlvbkVudHJpZXMuZ2V0KHNlY3Rpb24pPy5sZW5ndGggPz8gMCwgc2VjdGlvbiB9KSlcbiAgICAuZmlsdGVyKCh7IGNvdW50IH0pID0+IGNvdW50ID4gMClcbiAgICAubWFwKCh7IGNvdW50LCBzZWN0aW9uIH0pID0+IGNvdW50UGhyYXNlKGNvdW50LCBzZWN0aW9uKSk7XG4gIGNvbnN0IGlzT25lID0gbWFpbnRlbmFuY2VDb3VudCA9PT0gMTtcbiAgY29uc3QgbWFpbnRlbmFuY2UgPSBtYWludGVuYW5jZUNvdW50ID09PSAwXG4gICAgPyAnJ1xuICAgIDogYCAke1N0cmluZyhtYWludGVuYW5jZUNvdW50KX0gbWFpbnRlbmFuY2UgJHtpc09uZSA/ICdjb21taXQnIDogJ2NvbW1pdHMnfSAodGVzdHMsIGJ1aWxkLCBDSSwgcmVmYWN0b3JpbmcsIGRlcGVuZGVuY2llcykgJHtpc09uZSA/ICdpcycgOiAnYXJlJ30gbm90IGxpc3RlZC5gO1xuXG4gIGlmIChwaHJhc2VzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gYFRoaXMgcmVsZWFzZSBoYXMgJHtqb2luUGhyYXNlcyhwaHJhc2VzKX0uJHttYWludGVuYW5jZX1gO1xuICB9XG5cbiAgcmV0dXJuIG1haW50ZW5hbmNlQ291bnQgPT09IDAgPyAnVGhpcyByZWxlYXNlIGhhcyBubyBjaGFuZ2VzLicgOiBgVGhpcyByZWxlYXNlIGhhcyBtYWludGVuYW5jZSBjaGFuZ2VzIG9ubHkuJHttYWludGVuYW5jZX1gO1xufVxuXG5mdW5jdGlvbiB0b1R5cGVTZWN0aW9uKHR5cGU6IHN0cmluZyk6IG51bGwgfCBTZWN0aW9uRGVmaW5pdGlvbiB7XG4gIGNvbnN0IHNlY3Rpb24gPSBTRUNUSU9OU19CWV9UWVBFLmdldCh0eXBlKTtcbiAgaWYgKHNlY3Rpb24pIHtcbiAgICByZXR1cm4gc2VjdGlvbjtcbiAgfVxuXG4gIHJldHVybiBNQUlOVEVOQU5DRV9DT01NSVRfVFlQRVMuaGFzKHR5cGUpID8gbnVsbCA6IE9USEVS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
153
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NoYW5nZWxvZy1ncm91cGluZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEdyb3VwcyB0aGUgY29tbWl0LWRlcml2ZWQgZW50cmllcyBvZiBhIG5ldyBjaGFuZ2Vsb2cgc2VjdGlvbiBpbnRvIHBsYWluLWxhbmd1YWdlIHNlY3Rpb25zLCBzbyB0aGUgcmVsZWFzZSBub3RlcyBhXG4gKiByZWxlYXNlIHdyaXRlcyB3aXRoIG5vYm9keSByZXZpZXdpbmcgdGhlbSBjYW4gYmUgc2Nhbm5lZCByYXRoZXIgdGhhbiByZWFkIGNvbW1pdCBieSBjb21taXQuXG4gKlxuICogVGhlIGlucHV0IGlzIHN0aWxsIHRoZSBmaXJzdC1wYXJlbnQgY29tbWl0IGhpc3RvcnksIHNvIHRoaXMgaXMgYSBkZXRlcm1pbmlzdGljIHRyYW5zZm9ybWF0aW9uIG9mIHdoYXQgdGhlIGF1dGhvclxuICogYWxyZWFkeSB3cm90ZTogaXQgc29ydHMgZW50cmllcyBieSB0aGVpciBDb252ZW50aW9uYWwtQ29tbWl0cyB0eXBlLCBsZWF2ZXMgb3V0IHRoZSBjb21taXQgdHlwZXMgdGhhdCBkbyBub3QgY2hhbmdlXG4gKiB3aGF0IGEgdXNlciBnZXRzLCBtZXJnZXMgZW50cmllcyB0aGF0IHNheSB0aGUgc2FtZSB0aGluZywgYW5kIHN3YXBzIGEgYHJlICM8bj5gIHN1YmplY3QgZm9yIHRoZSBpc3N1ZSB0aXRsZSBpdHMgYm9keVxuICogY2Fycmllcy4gUHJvc2UgYSBodW1hbiAob3IgYW4gYWdlbnQpIHdyaXRlcyBzdGlsbCBnb2VzIGluIHRocm91Z2ggYC0tY2hhbmdlbG9nLWZpbGVgLlxuICovXG5cbi8qKlxuICogSG93IHRoZSBnZW5lcmF0ZWQgY2hhbmdlbG9nIHNlY3Rpb24gb2YgYSByZWxlYXNlIGlzIGxhaWQgb3V0LlxuICpcbiAqIC0gYGdyb3VwZWRgIFx1MjAxNCBhIG9uZS1saW5lIHN1bW1hcnksIHRoZW4gdGhlIGVudHJpZXMgdW5kZXIgYCMjIyBCcmVha2luZyBjaGFuZ2VzYCwgYCMjIyBOZXdgLCBgIyMjIEZpeGVkYCxcbiAqICAgYCMjIyBJbXByb3ZlZGAsIGAjIyMgRG9jdW1lbnRhdGlvbmAgYW5kIGAjIyMgT3RoZXIgY2hhbmdlc2AsIHdpdGggbWFpbnRlbmFuY2UgY29tbWl0cyBjb3VudGVkIHJhdGhlciB0aGFuIGxpc3RlZC5cbiAqIC0gYGNvbW1pdHNgIFx1MjAxNCBvbmUgYnVsbGV0IHBlciBmaXJzdC1wYXJlbnQgY29tbWl0LCBpbiBoaXN0b3J5IG9yZGVyLCBhcyBldmVyeSByZWxlYXNlIHdyb3RlIGJlZm9yZSBgZ3JvdXBlZGAgZXhpc3RlZC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2hhbmdlbG9nU3R5bGUgPSAnY29tbWl0cycgfCAnZ3JvdXBlZCc7XG5cbi8qKlxuICogRXZlcnkge0BsaW5rIENoYW5nZWxvZ1N0eWxlfSwgaW4gdGhlIG9yZGVyIHRoZSBgLS1jaGFuZ2Vsb2ctc3R5bGVgIGVycm9yIGxpc3RzIHRoZW0uXG4gKi9cbmV4cG9ydCBjb25zdCBDSEFOR0VMT0dfU1RZTEVTOiByZWFkb25seSBDaGFuZ2Vsb2dTdHlsZVtdID0gWydncm91cGVkJywgJ2NvbW1pdHMnXTtcblxuLyoqXG4gKiBPbmUgZmlyc3QtcGFyZW50IGNvbW1pdCwgYXMge0BsaW5rIHJlbmRlckdyb3VwZWRDaGFuZ2Vsb2dTZWN0aW9ufSB0YWtlcyBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGFuZ2Vsb2dDb21taXRFbnRyeSB7XG4gIC8qKlxuICAgKiBUaGUgYm9keSBsaW5lcyB0aGF0IGFyZSBuZWl0aGVyIHRoZSBlbnRyeSBpdHNlbGYgbm9yIGFuIGlzc3VlIHJlZmVyZW5jZSBsaW5lIG5vciBhIGJyZWFraW5nLWNoYW5nZSBmb290ZXIsIGluXG4gICAqIG9yZGVyLiBUaGUgZmlyc3Qgb2YgdGhlbSBpcyB0aGUgaXNzdWUgdGl0bGUgYW4gaXNzdWUtY2xvc2luZyBgcmUgIzxuPmAgbWVyZ2UgY2Fycmllcy5cbiAgICovXG4gIHJlYWRvbmx5IGRldGFpbExpbmVzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGNoYW5nZWxvZyBsaW5lIHRoZSBjb21taXQgcHJvZHVjZXMgYmVmb3JlIGdyb3VwaW5nOiBpdHMgc3ViamVjdCwgb3IgdGhlIGJvZHkgbGluZSBsaWZ0ZWQgb250byBhIGRlZmF1bHQgbWVyZ2VcbiAgICogc3ViamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IGVudHJ5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNvbW1pdCBjYXJyaWVzIGEgYEJSRUFLSU5HIENIQU5HRTpgIGZvb3Rlci4gVGhlIGAhYCBtYXJrZXIgaXMgcmVhZCBvZmYge0BsaW5rIGVudHJ5fSBpdHNlbGYuXG4gICAqL1xuICByZWFkb25seSBoYXNCcmVha2luZ0Zvb3RlcjogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGlzc3VlIHJlZmVyZW5jZXMgdGhlIGJvZHkgbmFtZXMgdGhhdCB7QGxpbmsgZW50cnl9IGRvZXMgbm90IGFscmVhZHkgc2hvdywgcmVuZGVyZWQgYXMgdGhlIGxpbmUgc2hvd3MgdGhlbS5cbiAgICovXG4gIHJlYWRvbmx5IHJlZmVyZW5jZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBjb21taXQgdHlwZXMgdGhhdCBjaGFuZ2Ugbm90aGluZyBhIHVzZXIgb2YgdGhlIHJlbGVhc2UgZ2V0cywgc28gdGhlIGdyb3VwZWQgc2VjdGlvbiBjb3VudHMgdGhlbSBpbnN0ZWFkIG9mXG4gKiBsaXN0aW5nIHRoZW0uIEEgY29tbWl0IG9mIG9uZSBvZiB0aGVzZSB0eXBlcyB0aGF0IGlzIG1hcmtlZCBicmVha2luZyBpcyBzdGlsbCBsaXN0ZWQsIHVuZGVyIGJyZWFraW5nIGNoYW5nZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBNQUlOVEVOQU5DRV9DT01NSVRfVFlQRVM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFsnYnVpbGQnLCAnY2hvcmUnLCAnY2knLCAncmVmYWN0b3InLCAnc3R5bGUnLCAndGVzdCddKTtcblxuaW50ZXJmYWNlIENsYXNzaWZpZWRFbnRyeSB7XG4gIHJlYWRvbmx5IHJlZmVyZW5jZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSBzZWN0aW9uOiBTZWN0aW9uRGVmaW5pdGlvbjtcbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgU2VjdGlvbkRlZmluaXRpb24ge1xuICByZWFkb25seSBoZWFkaW5nOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdXJhbDogc3RyaW5nO1xuICByZWFkb25seSBzaW5ndWxhcjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgU2VjdGlvbkVudHJ5IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcmVhZG9ubHktaW50ZXJmYWNlLW1lbWJlcnMgLS0gTWVyZ2VkIGVudHJpZXMgY29sbGVjdCByZWZlcmVuY2VzIGluIHBsYWNlLlxuICByZWZlcmVuY2VzOiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xufVxuXG5jb25zdCBCUkVBS0lOR19TRUNUSU9OOiBTZWN0aW9uRGVmaW5pdGlvbiA9IHsgaGVhZGluZzogJ0JyZWFraW5nIGNoYW5nZXMnLCBwbHVyYWw6ICdicmVha2luZyBjaGFuZ2VzJywgc2luZ3VsYXI6ICdicmVha2luZyBjaGFuZ2UnIH07XG5jb25zdCBORVdfU0VDVElPTjogU2VjdGlvbkRlZmluaXRpb24gPSB7IGhlYWRpbmc6ICdOZXcnLCBwbHVyYWw6ICduZXcgZmVhdHVyZXMnLCBzaW5ndWxhcjogJ25ldyBmZWF0dXJlJyB9O1xuY29uc3QgRklYRURfU0VDVElPTjogU2VjdGlvbkRlZmluaXRpb24gPSB7IGhlYWRpbmc6ICdGaXhlZCcsIHBsdXJhbDogJ2ZpeGVzJywgc2luZ3VsYXI6ICdmaXgnIH07XG5jb25zdCBJTVBST1ZFRF9TRUNUSU9OOiBTZWN0aW9uRGVmaW5pdGlvbiA9IHsgaGVhZGluZzogJ0ltcHJvdmVkJywgcGx1cmFsOiAnaW1wcm92ZW1lbnRzJywgc2luZ3VsYXI6ICdpbXByb3ZlbWVudCcgfTtcbmNvbnN0IERPQ1VNRU5UQVRJT05fU0VDVElPTjogU2VjdGlvbkRlZmluaXRpb24gPSB7IGhlYWRpbmc6ICdEb2N1bWVudGF0aW9uJywgcGx1cmFsOiAnZG9jdW1lbnRhdGlvbiBjaGFuZ2VzJywgc2luZ3VsYXI6ICdkb2N1bWVudGF0aW9uIGNoYW5nZScgfTtcbmNvbnN0IE9USEVSX1NFQ1RJT046IFNlY3Rpb25EZWZpbml0aW9uID0geyBoZWFkaW5nOiAnT3RoZXIgY2hhbmdlcycsIHBsdXJhbDogJ290aGVyIGNoYW5nZXMnLCBzaW5ndWxhcjogJ290aGVyIGNoYW5nZScgfTtcblxuLyoqXG4gKiBUaGUgc2VjdGlvbnMsIGluIHRoZSBvcmRlciB0aGV5IGFyZSByZW5kZXJlZCBhbmQgc3VtbWFyaXplZC5cbiAqL1xuY29uc3QgU0VDVElPTlM6IHJlYWRvbmx5IFNlY3Rpb25EZWZpbml0aW9uW10gPSBbQlJFQUtJTkdfU0VDVElPTiwgTkVXX1NFQ1RJT04sIEZJWEVEX1NFQ1RJT04sIElNUFJPVkVEX1NFQ1RJT04sIERPQ1VNRU5UQVRJT05fU0VDVElPTiwgT1RIRVJfU0VDVElPTl07XG5cbmNvbnN0IFNFQ1RJT05TX0JZX1RZUEUgPSBuZXcgTWFwPHN0cmluZywgU2VjdGlvbkRlZmluaXRpb24+KFtcbiAgWydkb2NzJywgRE9DVU1FTlRBVElPTl9TRUNUSU9OXSxcbiAgWydmZWF0JywgTkVXX1NFQ1RJT05dLFxuICBbJ2ZpeCcsIEZJWEVEX1NFQ1RJT05dLFxuICBbJ3BlcmYnLCBJTVBST1ZFRF9TRUNUSU9OXVxuXSk7XG5cbmNvbnN0IENPTlZFTlRJT05BTF9FTlRSWV9SRUdfRVhQID0gL14oPzx0eXBlPlthLXpdKykoPzpcXCgoPzxzY29wZT5bXigpXSopXFwpKT8oPzxicmVha2luZz4hKT86XFxzKyg/PGRlc2NyaXB0aW9uPlxcUy4qKSQvaTtcblxuLyoqXG4gKiBBbiBpc3N1ZS1jbG9zaW5nIG1lcmdlIHN1YmplY3QsIHdob3NlIHJlYWRhYmxlIGhhbGYgaXMgdGhlIGlzc3VlIHRpdGxlIG9uIHRoZSBib2R5J3MgZmlyc3QgbGluZS5cbiAqL1xuY29uc3QgSVNTVUVfT05MWV9ERVNDUklQVElPTl9SRUdfRVhQID0gL15yZSAoPzxpc3N1ZT4jXFxkKykkL2k7XG5cbi8qKlxuICogQSBjb2RlIHNwYW46IGEgYmFja3RpY2sgcnVuLCB0aGUgc2hvcnRlc3QgdGV4dCB1cCB0byBhIGJhY2t0aWNrIHJ1biBvZiB0aGUgc2FtZSBsZW5ndGguXG4gKi9cbmNvbnN0IENPREVfU1BBTl9SRUdfRVhQID0gLyg/PCFgKSg/PGZlbmNlPmArKSg/IWApW1xcc1xcU10qPyg/PCFgKVxcazxmZW5jZT4oPyFgKS9nO1xuXG4vKipcbiAqIEEgc3F1YXJlIGJyYWNrZXQgYW5kIHRoZSBiYWNrc2xhc2hlcyByaWdodCBiZWZvcmUgaXQuXG4gKi9cbmNvbnN0IEJSQUNLRVRfUkVHX0VYUCA9IC9cXFxcKltbXFxdXS9nO1xuXG4vKipcbiAqIEVzY2FwZXMgdGhlIHNxdWFyZSBicmFja2V0cyBvZiBhbiBpc3N1ZSB0aXRsZSBvdXRzaWRlIGl0cyBjb2RlIHNwYW5zLCBzbyBhIHRpdGxlIHN1Y2ggYXMgYFtCVUddIExpbmtzIGJyZWFrYCBpc1xuICogcHVibGlzaGVkIGFzIHRleHQgcmF0aGVyIHRoYW4gcmVhZCBhcyBhIHJlZmVyZW5jZSBsaW5rIHdpdGggbm8gZGVmaW5pdGlvbiAobWFya2Rvd25saW50J3MgTUQwNTIpLlxuICpcbiAqIEFuIGlzc3VlIHRpdGxlIGlzIHdyaXR0ZW4gYnkgd2hvZXZlciBvcGVuZWQgdGhlIGlzc3VlLCBhbmQgbm8gY29tbWl0IGhvb2sgZXZlciBjaGVja3MgaXQsIHNvIGl0IGlzIHRoZSBvbmUgcGFydCBvZiBhXG4gKiBnZW5lcmF0ZWQgZW50cnkgdGhhdCBjYW4gY2FycnkgTWFya2Rvd24gdGhlIGF1dGhvciBuZXZlciBtZWFudC4gQSBicmFja2V0IGFscmVhZHkgZXNjYXBlZCBpcyBsZWZ0IGFzIGl0IGlzLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIGlzc3VlIHRpdGxlLlxuICogQHJldHVybnMgVGhlIHRpdGxlIHdpdGggZXZlcnkgdW5lc2NhcGVkIGBbYCBhbmQgYF1gIG91dHNpZGUgYSBjb2RlIHNwYW4gcHJlY2VkZWQgYnkgYSBiYWNrc2xhc2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVMaW5rQnJhY2tldHModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gIGxldCBsYXN0SW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IG1hdGNoIG9mIHRleHQubWF0Y2hBbGwoQ09ERV9TUEFOX1JFR19FWFApKSB7XG4gICAgcGFydHMucHVzaChlc2NhcGVCcmFja2V0c0luUGxhaW5UZXh0KHRleHQuc2xpY2UobGFzdEluZGV4LCBtYXRjaC5pbmRleCkpLCBtYXRjaFswXSk7XG4gICAgbGFzdEluZGV4ID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7XG4gIH1cblxuICBwYXJ0cy5wdXNoKGVzY2FwZUJyYWNrZXRzSW5QbGFpblRleHQodGV4dC5zbGljZShsYXN0SW5kZXgpKSk7XG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIHRoZSBib2R5IG9mIGEgbmV3IGNoYW5nZWxvZyBzZWN0aW9uIGluIHRoZSB7QGxpbmsgQ2hhbmdlbG9nU3R5bGV9IGBncm91cGVkYCBsYXlvdXQuXG4gKlxuICogQHBhcmFtIGVudHJpZXMgLSBUaGUgZmlyc3QtcGFyZW50IGNvbW1pdHMgc2luY2UgdGhlIHByZXZpb3VzIHJlbGVhc2UsIGluIGBnaXQgbG9nYCBvcmRlci5cbiAqIEByZXR1cm5zIFRoZSBzZWN0aW9uIGJvZHksIHdpdGhvdXQgaXRzIGAjIyA8dmVyc2lvbj5gIGhlYWRpbmcgYW5kIHdpdGhvdXQgYSB0cmFpbGluZyBuZXdsaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyR3JvdXBlZENoYW5nZWxvZ1NlY3Rpb24oZW50cmllczogcmVhZG9ubHkgQ2hhbmdlbG9nQ29tbWl0RW50cnlbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHNlY3Rpb25FbnRyaWVzID0gbmV3IE1hcDxTZWN0aW9uRGVmaW5pdGlvbiwgU2VjdGlvbkVudHJ5W10+KCk7XG4gIGxldCBtYWludGVuYW5jZUNvdW50ID0gMDtcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBjbGFzc2lmaWVkID0gY2xhc3NpZnlFbnRyeShlbnRyeSk7XG4gICAgaWYgKCFjbGFzc2lmaWVkKSB7XG4gICAgICBtYWludGVuYW5jZUNvdW50Kys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBsaXN0ID0gc2VjdGlvbkVudHJpZXMuZ2V0KGNsYXNzaWZpZWQuc2VjdGlvbikgPz8gW107XG4gICAgc2VjdGlvbkVudHJpZXMuc2V0KGNsYXNzaWZpZWQuc2VjdGlvbiwgbGlzdCk7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBsaXN0LmZpbmQoKHNlY3Rpb25FbnRyeSkgPT4gc2VjdGlvbkVudHJ5LnRleHQgPT09IGNsYXNzaWZpZWQudGV4dCk7XG4gICAgaWYgKCFleGlzdGluZykge1xuICAgICAgbGlzdC5wdXNoKHsgcmVmZXJlbmNlczogWy4uLmNsYXNzaWZpZWQucmVmZXJlbmNlc10sIHRleHQ6IGNsYXNzaWZpZWQudGV4dCB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGV4aXN0aW5nLnJlZmVyZW5jZXMgPSBbLi4ubmV3IFNldChbLi4uZXhpc3RpbmcucmVmZXJlbmNlcywgLi4uY2xhc3NpZmllZC5yZWZlcmVuY2VzXSldO1xuICB9XG5cbiAgY29uc3QgYmxvY2tzID0gW3RvU3VtbWFyeUxpbmUoc2VjdGlvbkVudHJpZXMsIG1haW50ZW5hbmNlQ291bnQpXTtcbiAgZm9yIChjb25zdCBzZWN0aW9uIG9mIFNFQ1RJT05TKSB7XG4gICAgY29uc3QgbGlzdCA9IHNlY3Rpb25FbnRyaWVzLmdldChzZWN0aW9uKTtcbiAgICBpZiAoIWxpc3QpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGJsb2Nrcy5wdXNoKGAjIyMgJHtzZWN0aW9uLmhlYWRpbmd9YCwgbGlzdC5tYXAoKHNlY3Rpb25FbnRyeSkgPT4gYC0gJHt0b0VudHJ5TGluZShzZWN0aW9uRW50cnkpfWApLmpvaW4oJ1xcbicpKTtcbiAgfVxuXG4gIHJldHVybiBibG9ja3Muam9pbignXFxuXFxuJyk7XG59XG5cbmZ1bmN0aW9uIGNsYXNzaWZ5RW50cnkoZW50cnk6IENoYW5nZWxvZ0NvbW1pdEVudHJ5KTogQ2xhc3NpZmllZEVudHJ5IHwgbnVsbCB7XG4gIGNvbnN0IGdyb3VwcyA9IENPTlZFTlRJT05BTF9FTlRSWV9SRUdfRVhQLmV4ZWMoZW50cnkuZW50cnkpPy5ncm91cHM7XG4gIGlmICghZ3JvdXBzKSB7XG4gICAgcmV0dXJuIHsgcmVmZXJlbmNlczogZW50cnkucmVmZXJlbmNlcywgc2VjdGlvbjogZW50cnkuaGFzQnJlYWtpbmdGb290ZXIgPyBCUkVBS0lOR19TRUNUSU9OIDogT1RIRVJfU0VDVElPTiwgdGV4dDogZW50cnkuZW50cnkgfTtcbiAgfVxuXG4gIC8vIFRoZSByZWd1bGFyIGV4cHJlc3Npb24ncyBgdHlwZWAgYW5kIGBkZXNjcmlwdGlvbmAgZ3JvdXBzIGFyZSBub3Qgb3B0aW9uYWwsIHNvIGEgbWF0Y2ggYWx3YXlzIGZpbGxzIHRoZW0uXG4gIGNvbnN0IHR5cGUgPSBTdHJpbmcoZ3JvdXBzWyd0eXBlJ10pLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGlzQnJlYWtpbmcgPSBncm91cHNbJ2JyZWFraW5nJ10gIT09IHVuZGVmaW5lZCB8fCBlbnRyeS5oYXNCcmVha2luZ0Zvb3RlcjtcbiAgY29uc3Qgc2VjdGlvbiA9IGlzQnJlYWtpbmcgPyBCUkVBS0lOR19TRUNUSU9OIDogdG9UeXBlU2VjdGlvbih0eXBlKTtcbiAgaWYgKCFzZWN0aW9uKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBkZXNjcmlwdGlvbiA9IFN0cmluZyhncm91cHNbJ2Rlc2NyaXB0aW9uJ10pO1xuICBjb25zdCBpc3N1ZSA9IElTU1VFX09OTFlfREVTQ1JJUFRJT05fUkVHX0VYUC5leGVjKGRlc2NyaXB0aW9uKT8uZ3JvdXBzPy5bJ2lzc3VlJ107XG4gIGNvbnN0IGlzc3VlVGl0bGUgPSBlbnRyeS5kZXRhaWxMaW5lc1swXTtcbiAgY29uc3QgaXNJc3N1ZVRpdGxlVXNlZCA9IGlzc3VlICE9PSB1bmRlZmluZWQgJiYgaXNzdWVUaXRsZSAhPT0gdW5kZWZpbmVkO1xuICBjb25zdCB0ZXh0ID0gaXNJc3N1ZVRpdGxlVXNlZCA/IGVzY2FwZUxpbmtCcmFja2V0cyhpc3N1ZVRpdGxlKSA6IGRlc2NyaXB0aW9uO1xuICBjb25zdCByZWZlcmVuY2VzID0gaXNJc3N1ZVRpdGxlVXNlZCA/IFtpc3N1ZSwgLi4uZW50cnkucmVmZXJlbmNlc10gOiBlbnRyeS5yZWZlcmVuY2VzO1xuICBjb25zdCBzY29wZSA9IGdyb3Vwc1snc2NvcGUnXTtcbiAgcmV0dXJuIHtcbiAgICByZWZlcmVuY2VzLFxuICAgIHNlY3Rpb24sXG4gICAgdGV4dDogc2NvcGUgPyBgKioke3Njb3BlfToqKiAke3RleHR9YCA6IHRleHRcbiAgfTtcbn1cblxuZnVuY3Rpb24gY291bnRQaHJhc2UoY291bnQ6IG51bWJlciwgc2VjdGlvbjogU2VjdGlvbkRlZmluaXRpb24pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7U3RyaW5nKGNvdW50KX0gJHtjb3VudCA9PT0gMSA/IHNlY3Rpb24uc2luZ3VsYXIgOiBzZWN0aW9uLnBsdXJhbH1gO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVCcmFja2V0c0luUGxhaW5UZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2VBbGwoQlJBQ0tFVF9SRUdfRVhQLCAobWF0Y2g6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGJhY2tzbGFzaGVzID0gbWF0Y2guc2xpY2UoMCwgLTEpO1xuICAgIC8vIEFuIG9kZCBydW4gb2YgYmFja3NsYXNoZXMgZXNjYXBlcyB0aGUgYnJhY2tldDsgYW4gZXZlbiBvbmUgaXMgZXNjYXBlZCBiYWNrc2xhc2hlcyBvbmx5LlxuICAgIGNvbnN0IGlzRXNjYXBlZCA9IGJhY2tzbGFzaGVzLnJlcGxhY2VBbGwoJ1xcXFxcXFxcJywgJycpID09PSAnXFxcXCc7XG4gICAgcmV0dXJuIGlzRXNjYXBlZCA/IG1hdGNoIDogYCR7YmFja3NsYXNoZXN9XFxcXCR7bWF0Y2guc2xpY2UoLTEpfWA7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBqb2luUGhyYXNlcyhwaHJhc2VzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGxhc3QgPSBwaHJhc2VzLnNsaWNlKC0xKS5qb2luKCcnKTtcbiAgcmV0dXJuIHBocmFzZXMubGVuZ3RoID09PSAxID8gbGFzdCA6IGAke3BocmFzZXMuc2xpY2UoMCwgLTEpLmpvaW4oJywgJyl9IGFuZCAke2xhc3R9YDtcbn1cblxuZnVuY3Rpb24gdG9FbnRyeUxpbmUoc2VjdGlvbkVudHJ5OiBTZWN0aW9uRW50cnkpOiBzdHJpbmcge1xuICByZXR1cm4gc2VjdGlvbkVudHJ5LnJlZmVyZW5jZXMubGVuZ3RoID09PSAwID8gc2VjdGlvbkVudHJ5LnRleHQgOiBgJHtzZWN0aW9uRW50cnkudGV4dH0gKCR7c2VjdGlvbkVudHJ5LnJlZmVyZW5jZXMuam9pbignLCAnKX0pYDtcbn1cblxuZnVuY3Rpb24gdG9TdW1tYXJ5TGluZShzZWN0aW9uRW50cmllczogUmVhZG9ubHlNYXA8U2VjdGlvbkRlZmluaXRpb24sIHJlYWRvbmx5IFNlY3Rpb25FbnRyeVtdPiwgbWFpbnRlbmFuY2VDb3VudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgcGhyYXNlcyA9IFNFQ1RJT05TXG4gICAgLm1hcCgoc2VjdGlvbikgPT4gKHsgY291bnQ6IHNlY3Rpb25FbnRyaWVzLmdldChzZWN0aW9uKT8ubGVuZ3RoID8/IDAsIHNlY3Rpb24gfSkpXG4gICAgLmZpbHRlcigoeyBjb3VudCB9KSA9PiBjb3VudCA+IDApXG4gICAgLm1hcCgoeyBjb3VudCwgc2VjdGlvbiB9KSA9PiBjb3VudFBocmFzZShjb3VudCwgc2VjdGlvbikpO1xuICBjb25zdCBpc09uZSA9IG1haW50ZW5hbmNlQ291bnQgPT09IDE7XG4gIGNvbnN0IG1haW50ZW5hbmNlID0gbWFpbnRlbmFuY2VDb3VudCA9PT0gMFxuICAgID8gJydcbiAgICA6IGAgJHtTdHJpbmcobWFpbnRlbmFuY2VDb3VudCl9IG1haW50ZW5hbmNlICR7aXNPbmUgPyAnY29tbWl0JyA6ICdjb21taXRzJ30gKHRlc3RzLCBidWlsZCwgQ0ksIHJlZmFjdG9yaW5nLCBkZXBlbmRlbmNpZXMpICR7aXNPbmUgPyAnaXMnIDogJ2FyZSd9IG5vdCBsaXN0ZWQuYDtcblxuICBpZiAocGhyYXNlcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGBUaGlzIHJlbGVhc2UgaGFzICR7am9pblBocmFzZXMocGhyYXNlcyl9LiR7bWFpbnRlbmFuY2V9YDtcbiAgfVxuXG4gIHJldHVybiBtYWludGVuYW5jZUNvdW50ID09PSAwID8gJ1RoaXMgcmVsZWFzZSBoYXMgbm8gY2hhbmdlcy4nIDogYFRoaXMgcmVsZWFzZSBoYXMgbWFpbnRlbmFuY2UgY2hhbmdlcyBvbmx5LiR7bWFpbnRlbmFuY2V9YDtcbn1cblxuZnVuY3Rpb24gdG9UeXBlU2VjdGlvbih0eXBlOiBzdHJpbmcpOiBudWxsIHwgU2VjdGlvbkRlZmluaXRpb24ge1xuICBjb25zdCBzZWN0aW9uID0gU0VDVElPTlNfQllfVFlQRS5nZXQodHlwZSk7XG4gIGlmIChzZWN0aW9uKSB7XG4gICAgcmV0dXJuIHNlY3Rpb247XG4gIH1cblxuICByZXR1cm4gTUFJTlRFTkFOQ0VfQ09NTUlUX1RZUEVTLmhhcyh0eXBlKSA/IG51bGwgOiBPVEhFUl9TRUNUSU9OO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7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
@@ -50,6 +50,17 @@ export interface ChangelogCommitEntry {
50
50
  * listing them. A commit of one of these types that is marked breaking is still listed, under breaking changes.
51
51
  */
52
52
  export declare const MAINTENANCE_COMMIT_TYPES: ReadonlySet<string>;
53
+ /**
54
+ * Escapes the square brackets of an issue title outside its code spans, so a title such as `[BUG] Links break` is
55
+ * published as text rather than read as a reference link with no definition (markdownlint's MD052).
56
+ *
57
+ * An issue title is written by whoever opened the issue, and no commit hook ever checks it, so it is the one part of a
58
+ * generated entry that can carry Markdown the author never meant. A bracket already escaped is left as it is.
59
+ *
60
+ * @param text - The issue title.
61
+ * @returns The title with every unescaped `[` and `]` outside a code span preceded by a backslash.
62
+ */
63
+ export declare function escapeLinkBrackets(text: string): string;
53
64
  /**
54
65
  * Renders the body of a new changelog section in the {@link ChangelogStyle} `grouped` layout.
55
66
  *
@@ -0,0 +1,177 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ "use strict";
7
+ var __create = Object.create;
8
+ var __defProp = Object.defineProperty;
9
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
10
+ var __getOwnPropNames = Object.getOwnPropertyNames;
11
+ var __getProtoOf = Object.getPrototypeOf;
12
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
13
+ var __export = (target, all) => {
14
+ for (var name in all)
15
+ __defProp(target, name, { get: all[name], enumerable: true });
16
+ };
17
+ var __copyProps = (to, from, except, desc) => {
18
+ if (from && typeof from === "object" || typeof from === "function") {
19
+ for (let key of __getOwnPropNames(from))
20
+ if (!__hasOwnProp.call(to, key) && key !== except)
21
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
22
+ }
23
+ return to;
24
+ };
25
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
26
+ // If the importer is in node compatibility mode or this is not an ESM
27
+ // file that has been converted to a CommonJS file using a Babel-
28
+ // compatible transform (i.e. "__esModule" has not been set), then set
29
+ // "default" to the CommonJS "module.exports" for node compatibility.
30
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
31
+ mod
32
+ ));
33
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
34
+ var changelog_rewrite_cli_exports = {};
35
+ __export(changelog_rewrite_cli_exports, {
36
+ createNodeRewriteChangelogDependencies: () => createNodeRewriteChangelogDependencies,
37
+ parseRewriteChangelogArguments: () => parseRewriteChangelogArguments,
38
+ runRewriteChangelogCli: () => runRewriteChangelogCli
39
+ });
40
+ module.exports = __toCommonJS(changelog_rewrite_cli_exports);
41
+ var import_node_child_process = require('node:child_process');
42
+ var import_node_fs = require('node:fs');
43
+ var import_node_process = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('node:process')), 1);
44
+ var import_changelog_rewrite = require('./changelog-rewrite.cjs');
45
+ const DEFAULT_CHANGELOG_PATH = "CHANGELOG.md";
46
+ const KNOWN_ARGUMENTS = ["--write", "--releases", "--overwrite-edited-releases", "--path="];
47
+ function createNodeRewriteChangelogDependencies() {
48
+ return {
49
+ exec(file, arguments_, input) {
50
+ return toResult((0, import_node_child_process.spawnSync)(file, arguments_, { encoding: "utf-8", input, maxBuffer: Number.MAX_SAFE_INTEGER }));
51
+ },
52
+ log(text) {
53
+ import_node_process.default.stdout.write(`${text}
54
+ `);
55
+ },
56
+ readFile(path) {
57
+ return (0, import_node_fs.readFileSync)(path, "utf-8");
58
+ },
59
+ writeFile(path, content) {
60
+ (0, import_node_fs.writeFileSync)(path, content, "utf-8");
61
+ }
62
+ };
63
+ }
64
+ function parseRewriteChangelogArguments(cliArguments) {
65
+ const unknown = cliArguments.filter((argument) => KNOWN_ARGUMENTS.every((known) => !(known.endsWith("=") ? argument.startsWith(known) : argument === known)));
66
+ if (unknown.length > 0) {
67
+ throw new Error(
68
+ `rewrite-changelog: unknown argument ${unknown.map((argument) => `"${argument}"`).join(", ")}. Known: ${KNOWN_ARGUMENTS.join(", ")}.`
69
+ );
70
+ }
71
+ const path = cliArguments.find((argument) => argument.startsWith("--path="))?.slice("--path=".length);
72
+ return {
73
+ changelogPath: path === void 0 || path === "" ? DEFAULT_CHANGELOG_PATH : path,
74
+ shouldOverwriteEditedReleases: cliArguments.includes("--overwrite-edited-releases"),
75
+ shouldRewriteReleases: cliArguments.includes("--releases"),
76
+ shouldWrite: cliArguments.includes("--write")
77
+ };
78
+ }
79
+ async function runRewriteChangelogCli(cliArguments, dependencies = createNodeRewriteChangelogDependencies()) {
80
+ try {
81
+ return await runRewriteChangelog(parseRewriteChangelogArguments(cliArguments), dependencies);
82
+ } catch (error) {
83
+ import_node_process.default.stderr.write(`${error instanceof Error ? error.message : String(error)}
84
+ `);
85
+ return 1;
86
+ }
87
+ }
88
+ function execOrThrow(dependencies, file, arguments_) {
89
+ const result = dependencies.exec(file, arguments_);
90
+ if (result.exitCode !== 0) {
91
+ throw new Error(`rewrite-changelog: ${file} ${arguments_.join(" ")} failed: ${result.stderr.trim()}`);
92
+ }
93
+ return result.stdout;
94
+ }
95
+ function readReleaseNotes(dependencies) {
96
+ const output = execOrThrow(dependencies, "gh", [
97
+ "api",
98
+ "--paginate",
99
+ "repos/{owner}/{repo}/releases?per_page=100",
100
+ "--jq",
101
+ '.[] | {tag: .tag_name, body: (.body // "")}'
102
+ ]);
103
+ const notesByTag = /* @__PURE__ */ new Map();
104
+ for (const line of output.split(/\r?\n/)) {
105
+ if (line.trim() === "") {
106
+ continue;
107
+ }
108
+ const release = JSON.parse(line);
109
+ notesByTag.set(release.tag, release.body);
110
+ }
111
+ return notesByTag;
112
+ }
113
+ function rewriteRelease(section, releaseNotes, options, dependencies) {
114
+ if (releaseNotes === void 0) {
115
+ dependencies.log(`release ${section.tag}: left alone, the repository has no GitHub release for it`);
116
+ return "ok";
117
+ }
118
+ const notes = (0, import_changelog_rewrite.rewriteReleaseNotes)(releaseNotes, section, options.shouldOverwriteEditedReleases);
119
+ if (notes === null) {
120
+ dependencies.log(`release ${section.tag}: left alone, its notes are not the changelog section as it was (--overwrite-edited-releases rewrites it)`);
121
+ return "ok";
122
+ }
123
+ if (!options.shouldWrite) {
124
+ dependencies.log(`release ${section.tag}: would be rewritten`);
125
+ return "ok";
126
+ }
127
+ const edit = dependencies.exec("gh", ["release", "edit", section.tag, "--notes-file", "-"], notes);
128
+ if (edit.exitCode !== 0) {
129
+ dependencies.log(`release ${section.tag}: the edit FAILED: ${edit.stderr.trim()}`);
130
+ return "failed";
131
+ }
132
+ dependencies.log(`release ${section.tag}: rewritten`);
133
+ return "ok";
134
+ }
135
+ async function runRewriteChangelog(options, dependencies) {
136
+ const changelog = dependencies.readFile(options.changelogPath);
137
+ const tags = execOrThrow(dependencies, "git", ["tag", "--list"]).split(/\r?\n/).filter(Boolean);
138
+ const result = await (0, import_changelog_rewrite.rewriteChangelog)(changelog, {
139
+ getCommitMessages: (fromTag, toTag) => Promise.resolve(
140
+ execOrThrow(dependencies, "git", ["log", "--format=%B", "--first-parent", "-z", fromTag === void 0 ? toTag : `${fromTag}..${toTag}`]).split("\0").filter((message) => message.trim() !== "")
141
+ ),
142
+ tags
143
+ });
144
+ for (const section of result.rewritten) {
145
+ const tagNote = section.tag === void 0 ? ", no tag, so grouped from the bullets alone" : "";
146
+ dependencies.log(`${section.version}: rewritten, ${String(section.matchedCount)} of ${String(section.oldBody.split("\n").length)} bullets matched to commits${tagNote}`);
147
+ }
148
+ for (const section of result.kept) {
149
+ dependencies.log(`${section.version}: kept, ${section.reason}`);
150
+ }
151
+ if (options.shouldWrite) {
152
+ dependencies.writeFile(options.changelogPath, result.content);
153
+ dependencies.log(`${options.changelogPath}: written`);
154
+ } else {
155
+ dependencies.log(`${options.changelogPath}: dry run, nothing written (pass --write to apply)`);
156
+ }
157
+ let isSuccess = true;
158
+ if (options.shouldRewriteReleases) {
159
+ const notesByTag = readReleaseNotes(dependencies);
160
+ for (const section of result.rewritten) {
161
+ if (section.tag !== void 0) {
162
+ isSuccess = rewriteRelease({ ...section, tag: section.tag }, notesByTag.get(section.tag), options, dependencies) === "ok" && isSuccess;
163
+ }
164
+ }
165
+ }
166
+ return isSuccess ? 0 : 1;
167
+ }
168
+ function toResult(result) {
169
+ return result.error ? { exitCode: 1, stderr: result.error.message, stdout: "" } : { exitCode: result.status ?? 1, stderr: result.stderr, stdout: result.stdout };
170
+ }
171
+ // Annotate the CommonJS export names for ESM import in node:
172
+ 0 && (module.exports = {
173
+ createNodeRewriteChangelogDependencies,
174
+ parseRewriteChangelogArguments,
175
+ runRewriteChangelogCli
176
+ });
177
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NoYW5nZWxvZy1yZXdyaXRlLWNsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBgcmV3cml0ZS1jaGFuZ2Vsb2dgIGNvbW1hbmQ6IHJld3JpdGVzIGEgcHJvamVjdCdzIHB1Ymxpc2hlZCBgQ0hBTkdFTE9HLm1kYCBzZWN0aW9ucywgYW5kIG9wdGlvbmFsbHkgaXRzIEdpdEh1YlxuICogcmVsZWFzZSBub3RlcywgaW50byB0aGUgYGdyb3VwZWRgIGxheW91dCwgYnkgd2lyaW5nIHtAbGluayByZXdyaXRlQ2hhbmdlbG9nfSB0byB0aGUgcmVhbCBnaXQsIGBnaGAgYW5kIGZpbGUgc3lzdGVtLlxuICpcbiAqIEl0IGNoYW5nZXMgbm90aGluZyB1bmxlc3MgYC0td3JpdGVgIGlzIHBhc3NlZCwgc28gdGhlIGZpcnN0IHJ1biBpcyBhbHdheXMgYSByZXBvcnQgb2Ygd2hhdCBpdCB3b3VsZCBkby5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFNwYXduU3luY1JldHVybnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHtcbiAgcmVhZEZpbGVTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBSZXdyaXR0ZW5DaGFuZ2Vsb2dTZWN0aW9uIH0gZnJvbSAnLi9jaGFuZ2Vsb2ctcmV3cml0ZS50cyc7XG5cbmltcG9ydCB7XG4gIHJld3JpdGVDaGFuZ2Vsb2csXG4gIHJld3JpdGVSZWxlYXNlTm90ZXNcbn0gZnJvbSAnLi9jaGFuZ2Vsb2ctcmV3cml0ZS50cyc7XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiBvbmUgY29tbWFuZCB0aGUgYHJld3JpdGUtY2hhbmdlbG9nYCBjb21tYW5kIHJ1bnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV3cml0ZUNoYW5nZWxvZ0NvbW1hbmRSZXN1bHQge1xuICAvKipcbiAgICogVGhlIGV4aXQgY29kZS5cbiAgICovXG4gIHJlYWRvbmx5IGV4aXRDb2RlOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGFuZGFyZCBlcnJvci5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZGVycjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhbmRhcmQgb3V0cHV0LlxuICAgKi9cbiAgcmVhZG9ubHkgc3Rkb3V0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG91dHNpZGUgd29ybGQgb2YgdGhlIGByZXdyaXRlLWNoYW5nZWxvZ2AgY29tbWFuZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXdyaXRlQ2hhbmdlbG9nRGVwZW5kZW5jaWVzIHtcbiAgLyoqXG4gICAqIFJ1bnMgYSBjb21tYW5kIGluIHRoZSB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICpcbiAgICogQHBhcmFtIGZpbGUgLSBUaGUgZXhlY3V0YWJsZS5cbiAgICogQHBhcmFtIGFyZ3VtZW50c18gLSBJdHMgYXJndW1lbnRzLlxuICAgKiBAcGFyYW0gaW5wdXQgLSBXaGF0IHRvIHdyaXRlIHRvIGl0cyBzdGFuZGFyZCBpbnB1dC5cbiAgICogQHJldHVybnMgVGhlIHJlc3VsdC5cbiAgICovXG4gIHJlYWRvbmx5IGV4ZWM6IChmaWxlOiBzdHJpbmcsIGFyZ3VtZW50c186IHJlYWRvbmx5IHN0cmluZ1tdLCBpbnB1dD86IHN0cmluZykgPT4gUmV3cml0ZUNoYW5nZWxvZ0NvbW1hbmRSZXN1bHQ7XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBvbmUgbGluZSBvZiB0aGUgcmVwb3J0LlxuICAgKlxuICAgKiBAcGFyYW0gdGV4dCAtIFRoZSBsaW5lLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9nOiAodGV4dDogc3RyaW5nKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZWFkcyBhIHRleHQgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aC5cbiAgICogQHJldHVybnMgVGhlIGNvbnRlbnQuXG4gICAqL1xuICByZWFkb25seSByZWFkRmlsZTogKHBhdGg6IHN0cmluZykgPT4gc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXcml0ZXMgYSB0ZXh0IGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGguXG4gICAqIEBwYXJhbSBjb250ZW50IC0gVGhlIGNvbnRlbnQuXG4gICAqL1xuICByZWFkb25seSB3cml0ZUZpbGU6IChwYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZykgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgb3B0aW9ucyBvZiB0aGUgYHJld3JpdGUtY2hhbmdlbG9nYCBjb21tYW5kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJld3JpdGVDaGFuZ2Vsb2dPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBgQ0hBTkdFTE9HLm1kYCB0byByZXdyaXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbmdlbG9nUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgR2l0SHViIHJlbGVhc2Ugd2hvc2Ugbm90ZXMgYXJlIG5vIGxvbmdlciBpdHMgY2hhbmdlbG9nIHNlY3Rpb24gYXMgaXQgd2FzIGlzIHJld3JpdHRlbiB0b28uXG4gICAqL1xuICByZWFkb25seSBzaG91bGRPdmVyd3JpdGVFZGl0ZWRSZWxlYXNlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgR2l0SHViIHJlbGVhc2Ugb2YgZWFjaCByZXdyaXR0ZW4gc2VjdGlvbiBpcyByZXdyaXR0ZW4gdG9vLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmV3cml0ZVJlbGVhc2VzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGFueXRoaW5nIGlzIGNoYW5nZWQuIFdpdGhvdXQgaXQgdGhlIGNvbW1hbmQgb25seSByZXBvcnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkV3JpdGU6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBSZWxlYXNlUmVjb3JkIHtcbiAgcmVhZG9ubHkgYm9keTogc3RyaW5nO1xuICByZWFkb25seSB0YWc6IHN0cmluZztcbn1cblxudHlwZSBSZWxlYXNlUmV3cml0ZU91dGNvbWUgPSAnZmFpbGVkJyB8ICdvayc7XG5cbmludGVyZmFjZSBUYWdnZWRSZXdyaXR0ZW5TZWN0aW9uIGV4dGVuZHMgUmV3cml0dGVuQ2hhbmdlbG9nU2VjdGlvbiB7XG4gIHJlYWRvbmx5IHRhZzogc3RyaW5nO1xufVxuXG5jb25zdCBERUZBVUxUX0NIQU5HRUxPR19QQVRIID0gJ0NIQU5HRUxPRy5tZCc7XG5cbmNvbnN0IEtOT1dOX0FSR1VNRU5UUyA9IFsnLS13cml0ZScsICctLXJlbGVhc2VzJywgJy0tb3ZlcndyaXRlLWVkaXRlZC1yZWxlYXNlcycsICctLXBhdGg9J107XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgY29tbWFuZCdzIG91dHNpZGUgd29ybGQ6IGNvbW1hbmRzIHJ1biB3aXRoIGBzcGF3blN5bmNgLCBmaWxlcyByZWFkIGFuZCB3cml0dGVuIHdpdGggYG5vZGU6ZnNgLCB0aGVcbiAqIHJlcG9ydCB3cml0dGVuIHRvIHN0ZG91dC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgZGVwZW5kZW5jaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTm9kZVJld3JpdGVDaGFuZ2Vsb2dEZXBlbmRlbmNpZXMoKTogUmV3cml0ZUNoYW5nZWxvZ0RlcGVuZGVuY2llcyB7XG4gIHJldHVybiB7XG4gICAgZXhlYyhmaWxlLCBhcmd1bWVudHNfLCBpbnB1dCk6IFJld3JpdGVDaGFuZ2Vsb2dDb21tYW5kUmVzdWx0IHtcbiAgICAgIHJldHVybiB0b1Jlc3VsdChzcGF3blN5bmMoZmlsZSwgYXJndW1lbnRzXywgeyBlbmNvZGluZzogJ3V0Zi04JywgaW5wdXQsIG1heEJ1ZmZlcjogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgfSkpO1xuICAgIH0sXG4gICAgbG9nKHRleHQpOiB2b2lkIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAke3RleHR9XFxuYCk7XG4gICAgfSxcbiAgICByZWFkRmlsZShwYXRoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiByZWFkRmlsZVN5bmMocGF0aCwgJ3V0Zi04Jyk7XG4gICAgfSxcbiAgICB3cml0ZUZpbGUocGF0aCwgY29udGVudCk6IHZvaWQge1xuICAgICAgd3JpdGVGaWxlU3luYyhwYXRoLCBjb250ZW50LCAndXRmLTgnKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBjb21tYW5kJ3Mgb3B0aW9ucyBmcm9tIHRoZSBjb21tYW5kIGxpbmU6IGAtLXdyaXRlYCBhcHBsaWVzIHRoZSBjaGFuZ2VzLCBgLS1yZWxlYXNlc2AgYWRkcyB0aGUgR2l0SHViXG4gKiByZWxlYXNlcyB0byB0aGVtLCBgLS1vdmVyd3JpdGUtZWRpdGVkLXJlbGVhc2VzYCBpbmNsdWRlcyB0aGUgcmVsZWFzZXMgd2hvc2Ugbm90ZXMgd2VyZSBlZGl0ZWQgYWZ0ZXIgcHVibGlzaGluZywgYW5kXG4gKiBgLS1wYXRoPTxmaWxlPmAgbmFtZXMgdGhlIGNoYW5nZWxvZyAoYENIQU5HRUxPRy5tZGAgYnkgZGVmYXVsdCkuXG4gKlxuICogQHBhcmFtIGNsaUFyZ3VtZW50cyAtIFRoZSBhcmd1bWVudHMgYWZ0ZXIgdGhlIGNvbW1hbmQgbmFtZS5cbiAqIEByZXR1cm5zIFRoZSBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSZXdyaXRlQ2hhbmdlbG9nQXJndW1lbnRzKGNsaUFyZ3VtZW50czogcmVhZG9ubHkgc3RyaW5nW10pOiBSZXdyaXRlQ2hhbmdlbG9nT3B0aW9ucyB7XG4gIGNvbnN0IHVua25vd24gPSBjbGlBcmd1bWVudHMuZmlsdGVyKChhcmd1bWVudCkgPT4gS05PV05fQVJHVU1FTlRTLmV2ZXJ5KChrbm93bikgPT4gIShrbm93bi5lbmRzV2l0aCgnPScpID8gYXJndW1lbnQuc3RhcnRzV2l0aChrbm93bikgOiBhcmd1bWVudCA9PT0ga25vd24pKSk7XG4gIGlmICh1bmtub3duLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgcmV3cml0ZS1jaGFuZ2Vsb2c6IHVua25vd24gYXJndW1lbnQgJHt1bmtub3duLm1hcCgoYXJndW1lbnQpID0+IGBcIiR7YXJndW1lbnR9XCJgKS5qb2luKCcsICcpfS4gS25vd246ICR7S05PV05fQVJHVU1FTlRTLmpvaW4oJywgJyl9LmBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgcGF0aCA9IGNsaUFyZ3VtZW50cy5maW5kKChhcmd1bWVudCkgPT4gYXJndW1lbnQuc3RhcnRzV2l0aCgnLS1wYXRoPScpKT8uc2xpY2UoJy0tcGF0aD0nLmxlbmd0aCk7XG4gIHJldHVybiB7XG4gICAgY2hhbmdlbG9nUGF0aDogcGF0aCA9PT0gdW5kZWZpbmVkIHx8IHBhdGggPT09ICcnID8gREVGQVVMVF9DSEFOR0VMT0dfUEFUSCA6IHBhdGgsXG4gICAgc2hvdWxkT3ZlcndyaXRlRWRpdGVkUmVsZWFzZXM6IGNsaUFyZ3VtZW50cy5pbmNsdWRlcygnLS1vdmVyd3JpdGUtZWRpdGVkLXJlbGVhc2VzJyksXG4gICAgc2hvdWxkUmV3cml0ZVJlbGVhc2VzOiBjbGlBcmd1bWVudHMuaW5jbHVkZXMoJy0tcmVsZWFzZXMnKSxcbiAgICBzaG91bGRXcml0ZTogY2xpQXJndW1lbnRzLmluY2x1ZGVzKCctLXdyaXRlJylcbiAgfTtcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBgcmV3cml0ZS1jaGFuZ2Vsb2dgIGNvbW1hbmQgaW4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5LCB3aGljaCBpcyB0aGUgcmVwb3NpdG9yeSByb290LlxuICpcbiAqIEBwYXJhbSBjbGlBcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIGFmdGVyIHRoZSBjb21tYW5kIG5hbWUuXG4gKiBAcGFyYW0gZGVwZW5kZW5jaWVzIC0gVGhlIG91dHNpZGUgd29ybGQuIFRoZSByZWFsIG9uZSB3aGVuIG9taXR0ZWQuXG4gKiBAcmV0dXJucyBUaGUgZXhpdCBjb2RlOiBgMWAgd2hlbiB0aGUgYXJndW1lbnRzIGFyZSB3cm9uZywgZ2l0IGNhbm5vdCBiZSByZWFkIG9yIGEgcmVsZWFzZSBlZGl0IGZhaWxlZCwgYDBgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blJld3JpdGVDaGFuZ2Vsb2dDbGkoXG4gIGNsaUFyZ3VtZW50czogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGRlcGVuZGVuY2llczogUmV3cml0ZUNoYW5nZWxvZ0RlcGVuZGVuY2llcyA9IGNyZWF0ZU5vZGVSZXdyaXRlQ2hhbmdlbG9nRGVwZW5kZW5jaWVzKClcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHJ1blJld3JpdGVDaGFuZ2Vsb2cocGFyc2VSZXdyaXRlQ2hhbmdlbG9nQXJndW1lbnRzKGNsaUFyZ3VtZW50cyksIGRlcGVuZGVuY2llcyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gQSB3cm9uZyBhcmd1bWVudCBvciBhbiB1bnJlYWRhYmxlIHJlcG9zaXRvcnkgaXMgdGhlIHVzZXIncyB0byBmaXgsIHNvIGl0IGdldHMgaXRzIG1lc3NhZ2UgcmF0aGVyIHRoYW4gYSBzdGFjayB0cmFjZS5cbiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShgJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9XFxuYCk7XG4gICAgcmV0dXJuIDE7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXhlY09yVGhyb3coZGVwZW5kZW5jaWVzOiBSZXdyaXRlQ2hhbmdlbG9nRGVwZW5kZW5jaWVzLCBmaWxlOiBzdHJpbmcsIGFyZ3VtZW50c186IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzdWx0ID0gZGVwZW5kZW5jaWVzLmV4ZWMoZmlsZSwgYXJndW1lbnRzXyk7XG4gIGlmIChyZXN1bHQuZXhpdENvZGUgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHJld3JpdGUtY2hhbmdlbG9nOiAke2ZpbGV9ICR7YXJndW1lbnRzXy5qb2luKCcgJyl9IGZhaWxlZDogJHtyZXN1bHQuc3RkZXJyLnRyaW0oKX1gKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQuc3Rkb3V0O1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBub3RlcyBvZiBldmVyeSBHaXRIdWIgcmVsZWFzZSBvZiB0aGUgcmVwb3NpdG9yeSBpbiBvbmUgcGFnaW5hdGVkIGNhbGwsIHNpbmNlIG9uZSBgZ2ggcmVsZWFzZSB2aWV3YCBwZXJcbiAqIHJlbGVhc2UgdGFrZXMgbWludXRlcyBvbiBhIHByb2plY3Qgd2l0aCBodW5kcmVkcyBvZiB0aGVtLlxuICpcbiAqIEBwYXJhbSBkZXBlbmRlbmNpZXMgLSBUaGUgb3V0c2lkZSB3b3JsZC5cbiAqIEByZXR1cm5zIFRoZSBub3RlcywgYnkgdGFnLlxuICovXG5mdW5jdGlvbiByZWFkUmVsZWFzZU5vdGVzKGRlcGVuZGVuY2llczogUmV3cml0ZUNoYW5nZWxvZ0RlcGVuZGVuY2llcyk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBvdXRwdXQgPSBleGVjT3JUaHJvdyhkZXBlbmRlbmNpZXMsICdnaCcsIFtcbiAgICAnYXBpJyxcbiAgICAnLS1wYWdpbmF0ZScsXG4gICAgJ3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzP3Blcl9wYWdlPTEwMCcsXG4gICAgJy0tanEnLFxuICAgICcuW10gfCB7dGFnOiAudGFnX25hbWUsIGJvZHk6ICguYm9keSAvLyBcIlwiKX0nXG4gIF0pO1xuICBjb25zdCBub3Rlc0J5VGFnID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIG91dHB1dC5zcGxpdCgvXFxyP1xcbi8pKSB7XG4gICAgaWYgKGxpbmUudHJpbSgpID09PSAnJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsZWFzZSA9IEpTT04ucGFyc2UobGluZSkgYXMgUmVsZWFzZVJlY29yZDtcbiAgICBub3Rlc0J5VGFnLnNldChyZWxlYXNlLnRhZywgcmVsZWFzZS5ib2R5KTtcbiAgfVxuXG4gIHJldHVybiBub3Rlc0J5VGFnO1xufVxuXG5mdW5jdGlvbiByZXdyaXRlUmVsZWFzZShcbiAgc2VjdGlvbjogVGFnZ2VkUmV3cml0dGVuU2VjdGlvbixcbiAgcmVsZWFzZU5vdGVzOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IFJld3JpdGVDaGFuZ2Vsb2dPcHRpb25zLFxuICBkZXBlbmRlbmNpZXM6IFJld3JpdGVDaGFuZ2Vsb2dEZXBlbmRlbmNpZXNcbik6IFJlbGVhc2VSZXdyaXRlT3V0Y29tZSB7XG4gIGlmIChyZWxlYXNlTm90ZXMgPT09IHVuZGVmaW5lZCkge1xuICAgIGRlcGVuZGVuY2llcy5sb2coYHJlbGVhc2UgJHtzZWN0aW9uLnRhZ306IGxlZnQgYWxvbmUsIHRoZSByZXBvc2l0b3J5IGhhcyBubyBHaXRIdWIgcmVsZWFzZSBmb3IgaXRgKTtcbiAgICByZXR1cm4gJ29rJztcbiAgfVxuXG4gIGNvbnN0IG5vdGVzID0gcmV3cml0ZVJlbGVhc2VOb3RlcyhyZWxlYXNlTm90ZXMsIHNlY3Rpb24sIG9wdGlvbnMuc2hvdWxkT3ZlcndyaXRlRWRpdGVkUmVsZWFzZXMpO1xuICBpZiAobm90ZXMgPT09IG51bGwpIHtcbiAgICBkZXBlbmRlbmNpZXMubG9nKGByZWxlYXNlICR7c2VjdGlvbi50YWd9OiBsZWZ0IGFsb25lLCBpdHMgbm90ZXMgYXJlIG5vdCB0aGUgY2hhbmdlbG9nIHNlY3Rpb24gYXMgaXQgd2FzICgtLW92ZXJ3cml0ZS1lZGl0ZWQtcmVsZWFzZXMgcmV3cml0ZXMgaXQpYCk7XG4gICAgcmV0dXJuICdvayc7XG4gIH1cblxuICBpZiAoIW9wdGlvbnMuc2hvdWxkV3JpdGUpIHtcbiAgICBkZXBlbmRlbmNpZXMubG9nKGByZWxlYXNlICR7c2VjdGlvbi50YWd9OiB3b3VsZCBiZSByZXdyaXR0ZW5gKTtcbiAgICByZXR1cm4gJ29rJztcbiAgfVxuXG4gIGNvbnN0IGVkaXQgPSBkZXBlbmRlbmNpZXMuZXhlYygnZ2gnLCBbJ3JlbGVhc2UnLCAnZWRpdCcsIHNlY3Rpb24udGFnLCAnLS1ub3Rlcy1maWxlJywgJy0nXSwgbm90ZXMpO1xuICBpZiAoZWRpdC5leGl0Q29kZSAhPT0gMCkge1xuICAgIGRlcGVuZGVuY2llcy5sb2coYHJlbGVhc2UgJHtzZWN0aW9uLnRhZ306IHRoZSBlZGl0IEZBSUxFRDogJHtlZGl0LnN0ZGVyci50cmltKCl9YCk7XG4gICAgcmV0dXJuICdmYWlsZWQnO1xuICB9XG5cbiAgZGVwZW5kZW5jaWVzLmxvZyhgcmVsZWFzZSAke3NlY3Rpb24udGFnfTogcmV3cml0dGVuYCk7XG4gIHJldHVybiAnb2snO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5SZXdyaXRlQ2hhbmdlbG9nKG9wdGlvbnM6IFJld3JpdGVDaGFuZ2Vsb2dPcHRpb25zLCBkZXBlbmRlbmNpZXM6IFJld3JpdGVDaGFuZ2Vsb2dEZXBlbmRlbmNpZXMpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBjaGFuZ2Vsb2cgPSBkZXBlbmRlbmNpZXMucmVhZEZpbGUob3B0aW9ucy5jaGFuZ2Vsb2dQYXRoKTtcbiAgY29uc3QgdGFncyA9IGV4ZWNPclRocm93KGRlcGVuZGVuY2llcywgJ2dpdCcsIFsndGFnJywgJy0tbGlzdCddKS5zcGxpdCgvXFxyP1xcbi8pLmZpbHRlcihCb29sZWFuKTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmV3cml0ZUNoYW5nZWxvZyhjaGFuZ2Vsb2csIHtcbiAgICBnZXRDb21taXRNZXNzYWdlczogKGZyb21UYWcsIHRvVGFnKSA9PlxuICAgICAgUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgICBleGVjT3JUaHJvdyhkZXBlbmRlbmNpZXMsICdnaXQnLCBbJ2xvZycsICctLWZvcm1hdD0lQicsICctLWZpcnN0LXBhcmVudCcsICcteicsIGZyb21UYWcgPT09IHVuZGVmaW5lZCA/IHRvVGFnIDogYCR7ZnJvbVRhZ30uLiR7dG9UYWd9YF0pXG4gICAgICAgICAgLnNwbGl0KCdcXDAnKVxuICAgICAgICAgIC5maWx0ZXIoKG1lc3NhZ2UpID0+IG1lc3NhZ2UudHJpbSgpICE9PSAnJylcbiAgICAgICksXG4gICAgdGFnc1xuICB9KTtcblxuICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgcmVzdWx0LnJld3JpdHRlbikge1xuICAgIGNvbnN0IHRhZ05vdGUgPSBzZWN0aW9uLnRhZyA9PT0gdW5kZWZpbmVkID8gJywgbm8gdGFnLCBzbyBncm91cGVkIGZyb20gdGhlIGJ1bGxldHMgYWxvbmUnIDogJyc7XG4gICAgZGVwZW5kZW5jaWVzLmxvZyhgJHtzZWN0aW9uLnZlcnNpb259OiByZXdyaXR0ZW4sICR7U3RyaW5nKHNlY3Rpb24ubWF0Y2hlZENvdW50KX0gb2YgJHtTdHJpbmcoc2VjdGlvbi5vbGRCb2R5LnNwbGl0KCdcXG4nKS5sZW5ndGgpfSBidWxsZXRzIG1hdGNoZWQgdG8gY29tbWl0cyR7dGFnTm90ZX1gKTtcbiAgfVxuXG4gIGZvciAoY29uc3Qgc2VjdGlvbiBvZiByZXN1bHQua2VwdCkge1xuICAgIGRlcGVuZGVuY2llcy5sb2coYCR7c2VjdGlvbi52ZXJzaW9ufToga2VwdCwgJHtzZWN0aW9uLnJlYXNvbn1gKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnNob3VsZFdyaXRlKSB7XG4gICAgZGVwZW5kZW5jaWVzLndyaXRlRmlsZShvcHRpb25zLmNoYW5nZWxvZ1BhdGgsIHJlc3VsdC5jb250ZW50KTtcbiAgICBkZXBlbmRlbmNpZXMubG9nKGAke29wdGlvbnMuY2hhbmdlbG9nUGF0aH06IHdyaXR0ZW5gKTtcbiAgfSBlbHNlIHtcbiAgICBkZXBlbmRlbmNpZXMubG9nKGAke29wdGlvbnMuY2hhbmdlbG9nUGF0aH06IGRyeSBydW4sIG5vdGhpbmcgd3JpdHRlbiAocGFzcyAtLXdyaXRlIHRvIGFwcGx5KWApO1xuICB9XG5cbiAgbGV0IGlzU3VjY2VzcyA9IHRydWU7XG4gIGlmIChvcHRpb25zLnNob3VsZFJld3JpdGVSZWxlYXNlcykge1xuICAgIGNvbnN0IG5vdGVzQnlUYWcgPSByZWFkUmVsZWFzZU5vdGVzKGRlcGVuZGVuY2llcyk7XG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHJlc3VsdC5yZXdyaXR0ZW4pIHtcbiAgICAgIGlmIChzZWN0aW9uLnRhZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlzU3VjY2VzcyA9IHJld3JpdGVSZWxlYXNlKHsgLi4uc2VjdGlvbiwgdGFnOiBzZWN0aW9uLnRhZyB9LCBub3Rlc0J5VGFnLmdldChzZWN0aW9uLnRhZyksIG9wdGlvbnMsIGRlcGVuZGVuY2llcykgPT09ICdvaycgJiYgaXNTdWNjZXNzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpc1N1Y2Nlc3MgPyAwIDogMTtcbn1cblxuZnVuY3Rpb24gdG9SZXN1bHQocmVzdWx0OiBTcGF3blN5bmNSZXR1cm5zPHN0cmluZz4pOiBSZXdyaXRlQ2hhbmdlbG9nQ29tbWFuZFJlc3VsdCB7XG4gIHJldHVybiByZXN1bHQuZXJyb3JcbiAgICA/IHsgZXhpdENvZGU6IDEsIHN0ZGVycjogcmVzdWx0LmVycm9yLm1lc3NhZ2UsIHN0ZG91dDogJycgfVxuICAgIDogeyBleGl0Q29kZTogcmVzdWx0LnN0YXR1cyA/PyAxLCBzdGRlcnI6IHJlc3VsdC5zdGRlcnIsIHN0ZG91dDogcmVzdWx0LnN0ZG91dCB9O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFXQSxnQ0FBMEI7QUFDMUIscUJBR087QUFDUCwwQkFBb0I7QUFJcEIsK0JBR087QUFnR1AsTUFBTSx5QkFBeUI7QUFFL0IsTUFBTSxrQkFBa0IsQ0FBQyxXQUFXLGNBQWMsK0JBQStCLFNBQVM7QUFRbkYsU0FBUyx5Q0FBdUU7QUFDckYsU0FBTztBQUFBLElBQ0wsS0FBSyxNQUFNLFlBQVksT0FB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
@@ -0,0 +1,105 @@
1
+ /// <reference path="./library-references.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * The `rewrite-changelog` command: rewrites a project's published `CHANGELOG.md` sections, and optionally its GitHub
6
+ * release notes, into the `grouped` layout, by wiring {@link rewriteChangelog} to the real git, `gh` and file system.
7
+ *
8
+ * It changes nothing unless `--write` is passed, so the first run is always a report of what it would do.
9
+ */
10
+ /**
11
+ * The result of one command the `rewrite-changelog` command runs.
12
+ */
13
+ export interface RewriteChangelogCommandResult {
14
+ /**
15
+ * The exit code.
16
+ */
17
+ readonly exitCode: number;
18
+ /**
19
+ * The standard error.
20
+ */
21
+ readonly stderr: string;
22
+ /**
23
+ * The standard output.
24
+ */
25
+ readonly stdout: string;
26
+ }
27
+ /**
28
+ * The outside world of the `rewrite-changelog` command.
29
+ */
30
+ export interface RewriteChangelogDependencies {
31
+ /**
32
+ * Runs a command in the working directory.
33
+ *
34
+ * @param file - The executable.
35
+ * @param arguments_ - Its arguments.
36
+ * @param input - What to write to its standard input.
37
+ * @returns The result.
38
+ */
39
+ readonly exec: (file: string, arguments_: readonly string[], input?: string) => RewriteChangelogCommandResult;
40
+ /**
41
+ * Writes one line of the report.
42
+ *
43
+ * @param text - The line.
44
+ */
45
+ readonly log: (text: string) => void;
46
+ /**
47
+ * Reads a text file.
48
+ *
49
+ * @param path - The path.
50
+ * @returns The content.
51
+ */
52
+ readonly readFile: (path: string) => string;
53
+ /**
54
+ * Writes a text file.
55
+ *
56
+ * @param path - The path.
57
+ * @param content - The content.
58
+ */
59
+ readonly writeFile: (path: string, content: string) => void;
60
+ }
61
+ /**
62
+ * The options of the `rewrite-changelog` command.
63
+ */
64
+ export interface RewriteChangelogOptions {
65
+ /**
66
+ * The `CHANGELOG.md` to rewrite.
67
+ */
68
+ readonly changelogPath: string;
69
+ /**
70
+ * Whether a GitHub release whose notes are no longer its changelog section as it was is rewritten too.
71
+ */
72
+ readonly shouldOverwriteEditedReleases: boolean;
73
+ /**
74
+ * Whether the GitHub release of each rewritten section is rewritten too.
75
+ */
76
+ readonly shouldRewriteReleases: boolean;
77
+ /**
78
+ * Whether anything is changed. Without it the command only reports.
79
+ */
80
+ readonly shouldWrite: boolean;
81
+ }
82
+ /**
83
+ * Creates the command's outside world: commands run with `spawnSync`, files read and written with `node:fs`, the
84
+ * report written to stdout.
85
+ *
86
+ * @returns The dependencies.
87
+ */
88
+ export declare function createNodeRewriteChangelogDependencies(): RewriteChangelogDependencies;
89
+ /**
90
+ * Builds the command's options from the command line: `--write` applies the changes, `--releases` adds the GitHub
91
+ * releases to them, `--overwrite-edited-releases` includes the releases whose notes were edited after publishing, and
92
+ * `--path=<file>` names the changelog (`CHANGELOG.md` by default).
93
+ *
94
+ * @param cliArguments - The arguments after the command name.
95
+ * @returns The options.
96
+ */
97
+ export declare function parseRewriteChangelogArguments(cliArguments: readonly string[]): RewriteChangelogOptions;
98
+ /**
99
+ * Runs the `rewrite-changelog` command in the working directory, which is the repository root.
100
+ *
101
+ * @param cliArguments - The arguments after the command name.
102
+ * @param dependencies - The outside world. The real one when omitted.
103
+ * @returns The exit code: `1` when the arguments are wrong, git cannot be read or a release edit failed, `0` otherwise.
104
+ */
105
+ export declare function runRewriteChangelogCli(cliArguments: readonly string[], dependencies?: RewriteChangelogDependencies): Promise<number>;