@mnaoumov/typescript-dev-toolkit 6.0.2 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -12,10 +12,46 @@ npm install --save-dev @mnaoumov/typescript-dev-toolkit
12
12
 
13
13
  The guides and the API reference are at <https://mnaoumov.dev/typescript-dev-toolkit/>.
14
14
 
15
+ ## Publish release assets before the version bump
16
+
17
+ For a project whose updater reads a version file on its default branch and then downloads matching GitHub release assets, opt into publication before the branch push:
18
+
19
+ ```typescript
20
+ import { updateVersion } from '@mnaoumov/typescript-dev-toolkit/version';
21
+
22
+ await updateVersion('patch', {
23
+ getReleaseAssetPaths: () => Promise.resolve(['dist/main.js']),
24
+ shouldEditChangelog: false,
25
+ shouldPublishBeforePush: true
26
+ });
27
+ ```
28
+
29
+ Use `updateVersionInExtraFiles` to update project-specific version files and `prepareGitHubRelease` to prepare assets. Preparation and asset validation finish before any push. The release tag is pushed to `origin` first, then the release is published and checked for its exact tag, non-draft status and completed asset uploads. Only then is the verified version commit pushed to the original branch, followed by issue closing. Missing assets or a failed publication or verification leave the remote branch unchanged. Local commits and tags, and any remote tag or release already created, remain for recovery; this mode does not roll them back.
30
+
31
+ The default npm release order is unchanged. `shouldRelease: false` keeps all work local with either order.
32
+
15
33
  ## Where it fits
16
34
 
17
35
  It is one of five packages that replace [`obsidian-dev-utils`](https://github.com/mnaoumov/obsidian-dev-utils): [`@mnaoumov/typescript-lib`](https://github.com/mnaoumov/typescript-lib), [`@mnaoumov/typescript-test-toolkit`](https://github.com/mnaoumov/typescript-test-toolkit), [`@mnaoumov/typescript-dev-toolkit`](https://github.com/mnaoumov/typescript-dev-toolkit), [`@mnaoumov/obsidian-lib`](https://github.com/mnaoumov/obsidian-lib) and [`@mnaoumov/obsidian-dev-toolkit`](https://github.com/mnaoumov/obsidian-dev-toolkit). It depends on [`@mnaoumov/typescript-lib`](https://github.com/mnaoumov/typescript-lib). It moved here from that repository with its history.
18
36
 
37
+ ## See also
38
+
39
+ <!-- cspell:words TSDX -->
40
+
41
+ | Tool | Features | How `@mnaoumov/typescript-dev-toolkit` differs |
42
+ | --- | --- | --- |
43
+ | [`@mnaoumov/obsidian-dev-toolkit`](https://github.com/mnaoumov/obsidian-dev-toolkit) (my tool) | Obsidian plugin builds; demo vaults; plugin releases; plugin-specific lint and test setup | Generic foundation of `@mnaoumov/obsidian-dev-toolkit`; usable outside Obsidian; leaves plugin packaging and demo vaults to that extension |
44
+ | [`gts`](https://github.com/google/gts) | TypeScript style guide; ESLint and Prettier configuration; project setup and compilation | Overlaps with `gts` in shared lint and format tooling; adds ESM/CommonJS packaging, test runners, spellcheck, documentation sites and release orchestration; uses its own conventions rather than Google's style guide |
45
+ | [`tsdown`](https://tsdown.dev/) | Rolldown-based library builds; declaration generation; Rollup and unplugin plugin support | Overlaps with `tsdown` in library builds; adds lint, format, test and release tooling; uses esbuild rather than the Rolldown plugin ecosystem |
46
+ | [`TSDX`](https://tsdx.io/docs) | Package scaffolding; ESM and CommonJS builds; Vitest tests; oxlint and oxfmt commands | Same goal as `TSDX` for TypeScript package development; exposes composable script APIs and shared configurations; adds spellcheck and documentation-site generation; leaves project scaffolding to other tools |
47
+ | [`tsup`](https://github.com/egoist/tsup) | esbuild-based library bundling; multiple entry points; watch mode | Overlaps with `tsup` in esbuild-based builds; adds shared lint, format, test, gate and release tooling; does not implement the tsup CLI or its configuration API |
48
+
49
+ Last searched for similar tools on 2026-11-03.
50
+
51
+ ## Changelog
52
+
53
+ All notable changes to this project will be documented in the [CHANGELOG](./CHANGELOG.md).
54
+
19
55
  ## Filing an issue (for AI agents and humans)
20
56
 
21
57
  Open issues through the [issue forms](https://github.com/mnaoumov/typescript-dev-toolkit/issues/new/choose), not as blank issues.
@@ -0,0 +1,132 @@
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 __defProp = Object.defineProperty;
8
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
9
+ var __getOwnPropNames = Object.getOwnPropertyNames;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __export = (target, all) => {
12
+ for (var name in all)
13
+ __defProp(target, name, { get: all[name], enumerable: true });
14
+ };
15
+ var __copyProps = (to, from, except, desc) => {
16
+ if (from && typeof from === "object" || typeof from === "function") {
17
+ for (let key of __getOwnPropNames(from))
18
+ if (!__hasOwnProp.call(to, key) && key !== except)
19
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
20
+ }
21
+ return to;
22
+ };
23
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
24
+ var changelog_grouping_exports = {};
25
+ __export(changelog_grouping_exports, {
26
+ CHANGELOG_STYLES: () => CHANGELOG_STYLES,
27
+ MAINTENANCE_COMMIT_TYPES: () => MAINTENANCE_COMMIT_TYPES,
28
+ renderGroupedChangelogSection: () => renderGroupedChangelogSection
29
+ });
30
+ module.exports = __toCommonJS(changelog_grouping_exports);
31
+ const CHANGELOG_STYLES = ["grouped", "commits"];
32
+ const MAINTENANCE_COMMIT_TYPES = /* @__PURE__ */ new Set(["build", "chore", "ci", "refactor", "style", "test"]);
33
+ const BREAKING_SECTION = { heading: "Breaking changes", plural: "breaking changes", singular: "breaking change" };
34
+ const NEW_SECTION = { heading: "New", plural: "new features", singular: "new feature" };
35
+ const FIXED_SECTION = { heading: "Fixed", plural: "fixes", singular: "fix" };
36
+ const IMPROVED_SECTION = { heading: "Improved", plural: "improvements", singular: "improvement" };
37
+ const DOCUMENTATION_SECTION = { heading: "Documentation", plural: "documentation changes", singular: "documentation change" };
38
+ const OTHER_SECTION = { heading: "Other changes", plural: "other changes", singular: "other change" };
39
+ const SECTIONS = [BREAKING_SECTION, NEW_SECTION, FIXED_SECTION, IMPROVED_SECTION, DOCUMENTATION_SECTION, OTHER_SECTION];
40
+ const SECTIONS_BY_TYPE = /* @__PURE__ */ new Map([
41
+ ["docs", DOCUMENTATION_SECTION],
42
+ ["feat", NEW_SECTION],
43
+ ["fix", FIXED_SECTION],
44
+ ["perf", IMPROVED_SECTION]
45
+ ]);
46
+ const CONVENTIONAL_ENTRY_REG_EXP = /^(?<type>[a-z]+)(?:\((?<scope>[^()]*)\))?(?<breaking>!)?:\s+(?<description>\S.*)$/i;
47
+ const ISSUE_ONLY_DESCRIPTION_REG_EXP = /^re (?<issue>#\d+)$/i;
48
+ function renderGroupedChangelogSection(entries) {
49
+ const sectionEntries = /* @__PURE__ */ new Map();
50
+ let maintenanceCount = 0;
51
+ for (const entry of entries) {
52
+ const classified = classifyEntry(entry);
53
+ if (!classified) {
54
+ maintenanceCount++;
55
+ continue;
56
+ }
57
+ const list = sectionEntries.get(classified.section) ?? [];
58
+ sectionEntries.set(classified.section, list);
59
+ const existing = list.find((sectionEntry) => sectionEntry.text === classified.text);
60
+ if (!existing) {
61
+ list.push({ references: [...classified.references], text: classified.text });
62
+ continue;
63
+ }
64
+ existing.references = [.../* @__PURE__ */ new Set([...existing.references, ...classified.references])];
65
+ }
66
+ const blocks = [toSummaryLine(sectionEntries, maintenanceCount)];
67
+ for (const section of SECTIONS) {
68
+ const list = sectionEntries.get(section);
69
+ if (!list) {
70
+ continue;
71
+ }
72
+ blocks.push(`### ${section.heading}`, list.map((sectionEntry) => `- ${toEntryLine(sectionEntry)}`).join("\n"));
73
+ }
74
+ return blocks.join("\n\n");
75
+ }
76
+ function classifyEntry(entry) {
77
+ const groups = CONVENTIONAL_ENTRY_REG_EXP.exec(entry.entry)?.groups;
78
+ if (!groups) {
79
+ return { references: entry.references, section: entry.hasBreakingFooter ? BREAKING_SECTION : OTHER_SECTION, text: entry.entry };
80
+ }
81
+ const type = String(groups["type"]).toLowerCase();
82
+ const isBreaking = groups["breaking"] !== void 0 || entry.hasBreakingFooter;
83
+ const section = isBreaking ? BREAKING_SECTION : toTypeSection(type);
84
+ if (!section) {
85
+ return null;
86
+ }
87
+ const description = String(groups["description"]);
88
+ const issue = ISSUE_ONLY_DESCRIPTION_REG_EXP.exec(description)?.groups?.["issue"];
89
+ const issueTitle = entry.detailLines[0];
90
+ const isIssueTitleUsed = issue !== void 0 && issueTitle !== void 0;
91
+ const text = isIssueTitleUsed ? issueTitle : description;
92
+ const references = isIssueTitleUsed ? [issue, ...entry.references] : entry.references;
93
+ const scope = groups["scope"];
94
+ return {
95
+ references,
96
+ section,
97
+ text: scope ? `**${scope}:** ${text}` : text
98
+ };
99
+ }
100
+ function countPhrase(count, section) {
101
+ return `${String(count)} ${count === 1 ? section.singular : section.plural}`;
102
+ }
103
+ function joinPhrases(phrases) {
104
+ const last = phrases.slice(-1).join("");
105
+ return phrases.length === 1 ? last : `${phrases.slice(0, -1).join(", ")} and ${last}`;
106
+ }
107
+ function toEntryLine(sectionEntry) {
108
+ return sectionEntry.references.length === 0 ? sectionEntry.text : `${sectionEntry.text} (${sectionEntry.references.join(", ")})`;
109
+ }
110
+ function toSummaryLine(sectionEntries, maintenanceCount) {
111
+ const phrases = SECTIONS.map((section) => ({ count: sectionEntries.get(section)?.length ?? 0, section })).filter(({ count }) => count > 0).map(({ count, section }) => countPhrase(count, section));
112
+ const isOne = maintenanceCount === 1;
113
+ const maintenance = maintenanceCount === 0 ? "" : ` ${String(maintenanceCount)} maintenance ${isOne ? "commit" : "commits"} (tests, build, CI, refactoring, dependencies) ${isOne ? "is" : "are"} not listed.`;
114
+ if (phrases.length > 0) {
115
+ return `This release has ${joinPhrases(phrases)}.${maintenance}`;
116
+ }
117
+ return maintenanceCount === 0 ? "This release has no changes." : `This release has maintenance changes only.${maintenance}`;
118
+ }
119
+ function toTypeSection(type) {
120
+ const section = SECTIONS_BY_TYPE.get(type);
121
+ if (section) {
122
+ return section;
123
+ }
124
+ return MAINTENANCE_COMMIT_TYPES.has(type) ? null : OTHER_SECTION;
125
+ }
126
+ // Annotate the CommonJS export names for ESM import in node:
127
+ 0 && (module.exports = {
128
+ CHANGELOG_STYLES,
129
+ MAINTENANCE_COMMIT_TYPES,
130
+ renderGroupedChangelogSection
131
+ });
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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
@@ -0,0 +1,59 @@
1
+ /// <reference path="./library-references.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Groups the commit-derived entries of a new changelog section into plain-language sections, so the release notes a
6
+ * release writes with nobody reviewing them can be scanned rather than read commit by commit.
7
+ *
8
+ * The input is still the first-parent commit history, so this is a deterministic transformation of what the author
9
+ * already wrote: it sorts entries by their Conventional-Commits type, leaves out the commit types that do not change
10
+ * what a user gets, merges entries that say the same thing, and swaps a `re #<n>` subject for the issue title its body
11
+ * carries. Prose a human (or an agent) writes still goes in through `--changelog-file`.
12
+ */
13
+ /**
14
+ * How the generated changelog section of a release is laid out.
15
+ *
16
+ * - `grouped` — a one-line summary, then the entries under `### Breaking changes`, `### New`, `### Fixed`,
17
+ * `### Improved`, `### Documentation` and `### Other changes`, with maintenance commits counted rather than listed.
18
+ * - `commits` — one bullet per first-parent commit, in history order, as every release wrote before `grouped` existed.
19
+ */
20
+ export type ChangelogStyle = 'commits' | 'grouped';
21
+ /**
22
+ * Every {@link ChangelogStyle}, in the order the `--changelog-style` error lists them.
23
+ */
24
+ export declare const CHANGELOG_STYLES: readonly ChangelogStyle[];
25
+ /**
26
+ * One first-parent commit, as {@link renderGroupedChangelogSection} takes it.
27
+ */
28
+ export interface ChangelogCommitEntry {
29
+ /**
30
+ * The body lines that are neither the entry itself nor an issue reference line nor a breaking-change footer, in
31
+ * order. The first of them is the issue title an issue-closing `re #<n>` merge carries.
32
+ */
33
+ readonly detailLines: readonly string[];
34
+ /**
35
+ * The changelog line the commit produces before grouping: its subject, or the body line lifted onto a default merge
36
+ * subject.
37
+ */
38
+ readonly entry: string;
39
+ /**
40
+ * Whether the commit carries a `BREAKING CHANGE:` footer. The `!` marker is read off {@link entry} itself.
41
+ */
42
+ readonly hasBreakingFooter: boolean;
43
+ /**
44
+ * The issue references the body names that {@link entry} does not already show, rendered as the line shows them.
45
+ */
46
+ readonly references: readonly string[];
47
+ }
48
+ /**
49
+ * The commit types that change nothing a user of the release gets, so the grouped section counts them instead of
50
+ * listing them. A commit of one of these types that is marked breaking is still listed, under breaking changes.
51
+ */
52
+ export declare const MAINTENANCE_COMMIT_TYPES: ReadonlySet<string>;
53
+ /**
54
+ * Renders the body of a new changelog section in the {@link ChangelogStyle} `grouped` layout.
55
+ *
56
+ * @param entries - The first-parent commits since the previous release, in `git log` order.
57
+ * @returns The section body, without its `## <version>` heading and without a trailing newline.
58
+ */
59
+ export declare function renderGroupedChangelogSection(entries: readonly ChangelogCommitEntry[]): string;
@@ -36,6 +36,7 @@ __export(index_exports, {
36
36
  build: () => build,
37
37
  "bulk-concurrency": () => bulk_concurrency,
38
38
  bundlers: () => bundlers,
39
+ "changelog-grouping": () => changelog_grouping,
39
40
  "check-project-types": () => check_project_types,
40
41
  "cli-utils": () => cli_utils,
41
42
  "code-generator": () => code_generator,
@@ -76,6 +77,7 @@ module.exports = __toCommonJS(index_exports);
76
77
  var build = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./build.cjs')), 1);
77
78
  var bulk_concurrency = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./bulk-concurrency.cjs')), 1);
78
79
  var bundlers = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./bundlers/index.cjs')), 1);
80
+ var changelog_grouping = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./changelog-grouping.cjs')), 1);
79
81
  var check_project_types = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./check-project-types.cjs')), 1);
80
82
  var cli_utils = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./cli-utils.cjs')), 1);
81
83
  var code_generator = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./code-generator.cjs')), 1);
@@ -116,6 +118,7 @@ var version = __toESM(((module) => module && module.__esModule && 'default' in m
116
118
  build,
117
119
  "bulk-concurrency": null,
118
120
  bundlers,
121
+ "changelog-grouping": null,
119
122
  "check-project-types": null,
120
123
  "cli-utils": null,
121
124
  "code-generator": null,
@@ -152,4 +155,4 @@ var version = __toESM(((module) => module && module.__esModule && 'default' in m
152
155
  "validate-dependencies": null,
153
156
  version
154
157
  });
155
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgJ2J1aWxkJyBmcm9tICcuL2J1aWxkLnRzJztcbmV4cG9ydCAqIGFzICdidWxrLWNvbmN1cnJlbmN5JyBmcm9tICcuL2J1bGstY29uY3VycmVuY3kudHMnO1xuZXhwb3J0ICogYXMgJ2J1bmRsZXJzJyBmcm9tICcuL2J1bmRsZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdjaGVjay1wcm9qZWN0LXR5cGVzJyBmcm9tICcuL2NoZWNrLXByb2plY3QtdHlwZXMudHMnO1xuZXhwb3J0ICogYXMgJ2NsaS11dGlscycgZnJvbSAnLi9jbGktdXRpbHMudHMnO1xuZXhwb3J0ICogYXMgJ2NvZGUtZ2VuZXJhdG9yJyBmcm9tICcuL2NvZGUtZ2VuZXJhdG9yLnRzJztcbmV4cG9ydCAqIGFzICdjb21taXRsaW50LWNvbmZpZycgZnJvbSAnLi9jb21taXRsaW50LWNvbmZpZy50cyc7XG5leHBvcnQgKiBhcyAnY29tbWl0bGludC1mb3JiaWRkZW4tcGF0dGVybnMnIGZyb20gJy4vY29tbWl0bGludC1mb3JiaWRkZW4tcGF0dGVybnMudHMnO1xuZXhwb3J0ICogYXMgJ2NvbW1pdGxpbnQtbGludC1tZC1oZWFkZXInIGZyb20gJy4vY29tbWl0bGludC1saW50LW1kLWhlYWRlci50cyc7XG5leHBvcnQgKiBhcyAnY29tbWl0bGludC1zcGVsbGNoZWNrLWhlYWRlcicgZnJvbSAnLi9jb21taXRsaW50LXNwZWxsY2hlY2staGVhZGVyLnRzJztcbmV4cG9ydCAqIGFzICdkb2NzLXNpdGUnIGZyb20gJy4vZG9jcy1zaXRlL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdlbnYtdG9nZ2xlJyBmcm9tICcuL2Vudi10b2dnbGUudHMnO1xuZXhwb3J0ICogYXMgJ2V4ZWMnIGZyb20gJy4vZXhlYy50cyc7XG5leHBvcnQgKiBhcyAnZm9yYmlkZGVuLXBhdHRlcm5zJyBmcm9tICcuL2ZvcmJpZGRlbi1wYXR0ZXJucy50cyc7XG5leHBvcnQgKiBhcyAnZm9ybWF0dGVycycgZnJvbSAnLi9mb3JtYXR0ZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdmcycgZnJvbSAnLi9mcy50cyc7XG5leHBvcnQgKiBhcyAnZ2F0ZScgZnJvbSAnLi9nYXRlLnRzJztcbmV4cG9ydCAqIGFzICdnaXQnIGZyb20gJy4vZ2l0LnRzJztcbmV4cG9ydCAqIGFzICdqc29uJyBmcm9tICcuL2pzb24udHMnO1xuZXhwb3J0ICogYXMgJ2xpYnJhcnktYnVpbGQnIGZyb20gJy4vbGlicmFyeS1idWlsZC50cyc7XG5leHBvcnQgKiBhcyAnbGluay1jaGVjay1za2lwJyBmcm9tICcuL2xpbmstY2hlY2stc2tpcC50cyc7XG5leHBvcnQgKiBhcyAnbGludGVycycgZnJvbSAnLi9saW50ZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICduYW5vLXN0YWdlZC1jb25maWcnIGZyb20gJy4vbmFuby1zdGFnZWQtY29uZmlnLnRzJztcbmV4cG9ydCAqIGFzICducG0tcHVibGlzaCcgZnJvbSAnLi9ucG0tcHVibGlzaC50cyc7XG5leHBvcnQgKiBhcyAnbnBtLXJ1bicgZnJvbSAnLi9ucG0tcnVuLnRzJztcbmV4cG9ydCAqIGFzICducG0nIGZyb20gJy4vbnBtLnRzJztcbmV4cG9ydCAqIGFzICdwYWNrYWdlLWxvY2staW50ZWdyaXR5JyBmcm9tICcuL3BhY2thZ2UtbG9jay1pbnRlZ3JpdHkudHMnO1xuZXhwb3J0ICogYXMgJ3BhY2thZ2UtbWFuYWdlcicgZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuZXhwb3J0ICogYXMgJ3JlbGVhc2VkLWlzc3VlcycgZnJvbSAnLi9yZWxlYXNlZC1pc3N1ZXMudHMnO1xuZXhwb3J0ICogYXMgJ3JlcG8tcGF0aHMnIGZyb20gJy4vcmVwby1wYXRocy50cyc7XG5leHBvcnQgKiBhcyAncm9vdCcgZnJvbSAnLi9yb290LnRzJztcbmV4cG9ydCAqIGFzICdzaGFyZWQtY29uZmlnLWZpbGVzJyBmcm9tICcuL3NoYXJlZC1jb25maWctZmlsZXMudHMnO1xuZXhwb3J0ICogYXMgJ3Rlc3QtcnVubmVycycgZnJvbSAnLi90ZXN0LXJ1bm5lcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ3Vwc3RyZWFtLXN5bmMtY2xpJyBmcm9tICcuL3Vwc3RyZWFtLXN5bmMtY2xpLnRzJztcbmV4cG9ydCAqIGFzICd1cHN0cmVhbS1zeW5jJyBmcm9tICcuL3Vwc3RyZWFtLXN5bmMudHMnO1xuZXhwb3J0ICogYXMgJ3ZhbGlkYXRlLWRlY2xhcmF0aW9ucycgZnJvbSAnLi92YWxpZGF0ZS1kZWNsYXJhdGlvbnMudHMnO1xuZXhwb3J0ICogYXMgJ3ZhbGlkYXRlLWRlcGVuZGVuY2llcycgZnJvbSAnLi92YWxpZGF0ZS1kZXBlbmRlbmNpZXMudHMnO1xuZXhwb3J0ICogYXMgJ3ZlcnNpb24nIGZyb20gJy4vdmVyc2lvbi50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQSw0QkFBQUE7QUFBQSxFQUFBO0FBQUEsK0JBQUFDO0FBQUEsRUFBQSxtQkFBQUM7QUFBQSxFQUFBLHdCQUFBQztBQUFBLEVBQUEsMkJBQUFDO0FBQUEsRUFBQSx1Q0FBQUM7QUFBQSxFQUFBLG1DQUFBQztBQUFBLEVBQUEsc0NBQUFDO0FBQUEsRUFBQSxtQkFBQUM7QUFBQSxFQUFBLG9CQUFBQztBQUFBLEVBQUE7QUFBQSw4QkFBQUM7QUFBQSxFQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSx5QkFBQUM7QUFBQSxFQUFBLHlCQUFBQztBQUFBLEVBQUE7QUFBQSw4QkFBQUM7QUFBQSxFQUFBO0FBQUEsdUJBQUFDO0FBQUEsRUFBQSxpQkFBQUM7QUFBQSxFQUFBLGdDQUFBQztBQUFBLEVBQUEseUJBQUFDO0FBQUEsRUFBQSx5QkFBQUM7QUFBQSxFQUFBLG9CQUFBQztBQUFBLEVBQUE7QUFBQSwrQkFBQUM7QUFBQSxFQUFBLHNCQUFBQztBQUFBLEVBQUEsdUJBQUFDO0FBQUEsRUFBQSwyQkFBQUM7QUFBQSxFQUFBLCtCQUFBQztBQUFBLEVBQUEsK0JBQUFDO0FBQUEsRUFBQTtBQUFBO0FBQUE7QUFFQSxZQUF5QjtBQUN6QixJQUFBekIsbUJBQW9DO0FBQ3BDLGVBQTRCO0FBQzVCLElBQUFDLHNCQUF1QztBQUN2QyxJQUFBQyxZQUE2QjtBQUM3QixJQUFBQyxpQkFBa0M7QUFDbEMsSUFBQUMsb0JBQXFDO0FBQ3JDLElBQUFDLGdDQUFpRDtBQUNqRCxJQUFBQyw0QkFBNkM7QUFDN0MsSUFBQUMsK0JBQWdEO0FBQ2hELElBQUFDLFlBQTZCO0FBQzdCLElBQUFDLGFBQThCO0FBQzlCLFdBQXdCO0FBQ3hCLElBQUFDLHFCQUFzQztBQUN0QyxpQkFBOEI7QUFDOUIsU0FBc0I7QUFDdEIsV0FBd0I7QUFDeEIsVUFBdUI7QUFDdkIsV0FBd0I7QUFDeEIsSUFBQUMsZ0JBQWlDO0FBQ2pDLElBQUFDLGtCQUFtQztBQUNuQyxjQUEyQjtBQUMzQixJQUFBQyxxQkFBc0M7QUFDdEMsSUFBQUMsY0FBK0I7QUFDL0IsSUFBQUMsVUFBMkI7QUFDM0IsVUFBdUI7QUFDdkIsSUFBQUMseUJBQTBDO0FBQzFDLElBQUFDLGtCQUFtQztBQUNuQyxJQUFBQyxrQkFBbUM7QUFDbkMsSUFBQUMsYUFBOEI7QUFDOUIsV0FBd0I7QUFDeEIsSUFBQUMsc0JBQXVDO0FBQ3ZDLElBQUFDLGVBQWdDO0FBQ2hDLElBQUFFLG9CQUFxQztBQUNyQyxJQUFBRCxnQkFBaUM7QUFDakMsSUFBQUUsd0JBQXlDO0FBQ3pDLElBQUFDLHdCQUF5QztBQUN6QyxjQUEyQjsiLAogICJuYW1lcyI6IFsiYnVsay1jb25jdXJyZW5jeSIsICJjaGVjay1wcm9qZWN0LXR5cGVzIiwgImNsaS11dGlscyIsICJjb2RlLWdlbmVyYXRvciIsICJjb21taXRsaW50LWNvbmZpZyIsICJjb21taXRsaW50LWZvcmJpZGRlbi1wYXR0ZXJucyIsICJjb21taXRsaW50LWxpbnQtbWQtaGVhZGVyIiwgImNvbW1pdGxpbnQtc3BlbGxjaGVjay1oZWFkZXIiLCAiZG9jcy1zaXRlIiwgImVudi10b2dnbGUiLCAiZm9yYmlkZGVuLXBhdHRlcm5zIiwgImxpYnJhcnktYnVpbGQiLCAibGluay1jaGVjay1za2lwIiwgIm5hbm8tc3RhZ2VkLWNvbmZpZyIsICJucG0tcHVibGlzaCIsICJucG0tcnVuIiwgInBhY2thZ2UtbG9jay1pbnRlZ3JpdHkiLCAicGFja2FnZS1tYW5hZ2VyIiwgInJlbGVhc2VkLWlzc3VlcyIsICJyZXBvLXBhdGhzIiwgInNoYXJlZC1jb25maWctZmlsZXMiLCAidGVzdC1ydW5uZXJzIiwgInVwc3RyZWFtLXN5bmMiLCAidXBzdHJlYW0tc3luYy1jbGkiLCAidmFsaWRhdGUtZGVjbGFyYXRpb25zIiwgInZhbGlkYXRlLWRlcGVuZGVuY2llcyJdCn0K
158
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgJ2J1aWxkJyBmcm9tICcuL2J1aWxkLnRzJztcbmV4cG9ydCAqIGFzICdidWxrLWNvbmN1cnJlbmN5JyBmcm9tICcuL2J1bGstY29uY3VycmVuY3kudHMnO1xuZXhwb3J0ICogYXMgJ2J1bmRsZXJzJyBmcm9tICcuL2J1bmRsZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdjaGFuZ2Vsb2ctZ3JvdXBpbmcnIGZyb20gJy4vY2hhbmdlbG9nLWdyb3VwaW5nLnRzJztcbmV4cG9ydCAqIGFzICdjaGVjay1wcm9qZWN0LXR5cGVzJyBmcm9tICcuL2NoZWNrLXByb2plY3QtdHlwZXMudHMnO1xuZXhwb3J0ICogYXMgJ2NsaS11dGlscycgZnJvbSAnLi9jbGktdXRpbHMudHMnO1xuZXhwb3J0ICogYXMgJ2NvZGUtZ2VuZXJhdG9yJyBmcm9tICcuL2NvZGUtZ2VuZXJhdG9yLnRzJztcbmV4cG9ydCAqIGFzICdjb21taXRsaW50LWNvbmZpZycgZnJvbSAnLi9jb21taXRsaW50LWNvbmZpZy50cyc7XG5leHBvcnQgKiBhcyAnY29tbWl0bGludC1mb3JiaWRkZW4tcGF0dGVybnMnIGZyb20gJy4vY29tbWl0bGludC1mb3JiaWRkZW4tcGF0dGVybnMudHMnO1xuZXhwb3J0ICogYXMgJ2NvbW1pdGxpbnQtbGludC1tZC1oZWFkZXInIGZyb20gJy4vY29tbWl0bGludC1saW50LW1kLWhlYWRlci50cyc7XG5leHBvcnQgKiBhcyAnY29tbWl0bGludC1zcGVsbGNoZWNrLWhlYWRlcicgZnJvbSAnLi9jb21taXRsaW50LXNwZWxsY2hlY2staGVhZGVyLnRzJztcbmV4cG9ydCAqIGFzICdkb2NzLXNpdGUnIGZyb20gJy4vZG9jcy1zaXRlL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdlbnYtdG9nZ2xlJyBmcm9tICcuL2Vudi10b2dnbGUudHMnO1xuZXhwb3J0ICogYXMgJ2V4ZWMnIGZyb20gJy4vZXhlYy50cyc7XG5leHBvcnQgKiBhcyAnZm9yYmlkZGVuLXBhdHRlcm5zJyBmcm9tICcuL2ZvcmJpZGRlbi1wYXR0ZXJucy50cyc7XG5leHBvcnQgKiBhcyAnZm9ybWF0dGVycycgZnJvbSAnLi9mb3JtYXR0ZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdmcycgZnJvbSAnLi9mcy50cyc7XG5leHBvcnQgKiBhcyAnZ2F0ZScgZnJvbSAnLi9nYXRlLnRzJztcbmV4cG9ydCAqIGFzICdnaXQnIGZyb20gJy4vZ2l0LnRzJztcbmV4cG9ydCAqIGFzICdqc29uJyBmcm9tICcuL2pzb24udHMnO1xuZXhwb3J0ICogYXMgJ2xpYnJhcnktYnVpbGQnIGZyb20gJy4vbGlicmFyeS1idWlsZC50cyc7XG5leHBvcnQgKiBhcyAnbGluay1jaGVjay1za2lwJyBmcm9tICcuL2xpbmstY2hlY2stc2tpcC50cyc7XG5leHBvcnQgKiBhcyAnbGludGVycycgZnJvbSAnLi9saW50ZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICduYW5vLXN0YWdlZC1jb25maWcnIGZyb20gJy4vbmFuby1zdGFnZWQtY29uZmlnLnRzJztcbmV4cG9ydCAqIGFzICducG0tcHVibGlzaCcgZnJvbSAnLi9ucG0tcHVibGlzaC50cyc7XG5leHBvcnQgKiBhcyAnbnBtLXJ1bicgZnJvbSAnLi9ucG0tcnVuLnRzJztcbmV4cG9ydCAqIGFzICducG0nIGZyb20gJy4vbnBtLnRzJztcbmV4cG9ydCAqIGFzICdwYWNrYWdlLWxvY2staW50ZWdyaXR5JyBmcm9tICcuL3BhY2thZ2UtbG9jay1pbnRlZ3JpdHkudHMnO1xuZXhwb3J0ICogYXMgJ3BhY2thZ2UtbWFuYWdlcicgZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuZXhwb3J0ICogYXMgJ3JlbGVhc2VkLWlzc3VlcycgZnJvbSAnLi9yZWxlYXNlZC1pc3N1ZXMudHMnO1xuZXhwb3J0ICogYXMgJ3JlcG8tcGF0aHMnIGZyb20gJy4vcmVwby1wYXRocy50cyc7XG5leHBvcnQgKiBhcyAncm9vdCcgZnJvbSAnLi9yb290LnRzJztcbmV4cG9ydCAqIGFzICdzaGFyZWQtY29uZmlnLWZpbGVzJyBmcm9tICcuL3NoYXJlZC1jb25maWctZmlsZXMudHMnO1xuZXhwb3J0ICogYXMgJ3Rlc3QtcnVubmVycycgZnJvbSAnLi90ZXN0LXJ1bm5lcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ3Vwc3RyZWFtLXN5bmMtY2xpJyBmcm9tICcuL3Vwc3RyZWFtLXN5bmMtY2xpLnRzJztcbmV4cG9ydCAqIGFzICd1cHN0cmVhbS1zeW5jJyBmcm9tICcuL3Vwc3RyZWFtLXN5bmMudHMnO1xuZXhwb3J0ICogYXMgJ3ZhbGlkYXRlLWRlY2xhcmF0aW9ucycgZnJvbSAnLi92YWxpZGF0ZS1kZWNsYXJhdGlvbnMudHMnO1xuZXhwb3J0ICogYXMgJ3ZhbGlkYXRlLWRlcGVuZGVuY2llcycgZnJvbSAnLi92YWxpZGF0ZS1kZXBlbmRlbmNpZXMudHMnO1xuZXhwb3J0ICogYXMgJ3ZlcnNpb24nIGZyb20gJy4vdmVyc2lvbi50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQSw0QkFBQUE7QUFBQSxFQUFBO0FBQUEsOEJBQUFDO0FBQUEsRUFBQSw2QkFBQUM7QUFBQSxFQUFBLG1CQUFBQztBQUFBLEVBQUEsd0JBQUFDO0FBQUEsRUFBQSwyQkFBQUM7QUFBQSxFQUFBLHVDQUFBQztBQUFBLEVBQUEsbUNBQUFDO0FBQUEsRUFBQSxzQ0FBQUM7QUFBQSxFQUFBLG1CQUFBQztBQUFBLEVBQUEsb0JBQUFDO0FBQUEsRUFBQTtBQUFBLDhCQUFBQztBQUFBLEVBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHlCQUFBQztBQUFBLEVBQUEseUJBQUFDO0FBQUEsRUFBQTtBQUFBLDhCQUFBQztBQUFBLEVBQUE7QUFBQSx1QkFBQUM7QUFBQSxFQUFBLGlCQUFBQztBQUFBLEVBQUEsZ0NBQUFDO0FBQUEsRUFBQSx5QkFBQUM7QUFBQSxFQUFBLHlCQUFBQztBQUFBLEVBQUEsb0JBQUFDO0FBQUEsRUFBQTtBQUFBLCtCQUFBQztBQUFBLEVBQUEsc0JBQUFDO0FBQUEsRUFBQSx1QkFBQUM7QUFBQSxFQUFBLDJCQUFBQztBQUFBLEVBQUEsK0JBQUFDO0FBQUEsRUFBQSwrQkFBQUM7QUFBQSxFQUFBO0FBQUE7QUFBQTtBQUVBLFlBQXlCO0FBQ3pCLElBQUExQixtQkFBb0M7QUFDcEMsZUFBNEI7QUFDNUIsSUFBQUMscUJBQXNDO0FBQ3RDLElBQUFDLHNCQUF1QztBQUN2QyxJQUFBQyxZQUE2QjtBQUM3QixJQUFBQyxpQkFBa0M7QUFDbEMsSUFBQUMsb0JBQXFDO0FBQ3JDLElBQUFDLGdDQUFpRDtBQUNqRCxJQUFBQyw0QkFBNkM7QUFDN0MsSUFBQUMsK0JBQWdEO0FBQ2hELElBQUFDLFlBQTZCO0FBQzdCLElBQUFDLGFBQThCO0FBQzlCLFdBQXdCO0FBQ3hCLElBQUFDLHFCQUFzQztBQUN0QyxpQkFBOEI7QUFDOUIsU0FBc0I7QUFDdEIsV0FBd0I7QUFDeEIsVUFBdUI7QUFDdkIsV0FBd0I7QUFDeEIsSUFBQUMsZ0JBQWlDO0FBQ2pDLElBQUFDLGtCQUFtQztBQUNuQyxjQUEyQjtBQUMzQixJQUFBQyxxQkFBc0M7QUFDdEMsSUFBQUMsY0FBK0I7QUFDL0IsSUFBQUMsVUFBMkI7QUFDM0IsVUFBdUI7QUFDdkIsSUFBQUMseUJBQTBDO0FBQzFDLElBQUFDLGtCQUFtQztBQUNuQyxJQUFBQyxrQkFBbUM7QUFDbkMsSUFBQUMsYUFBOEI7QUFDOUIsV0FBd0I7QUFDeEIsSUFBQUMsc0JBQXVDO0FBQ3ZDLElBQUFDLGVBQWdDO0FBQ2hDLElBQUFFLG9CQUFxQztBQUNyQyxJQUFBRCxnQkFBaUM7QUFDakMsSUFBQUUsd0JBQXlDO0FBQ3pDLElBQUFDLHdCQUF5QztBQUN6QyxjQUEyQjsiLAogICJuYW1lcyI6IFsiYnVsay1jb25jdXJyZW5jeSIsICJjaGFuZ2Vsb2ctZ3JvdXBpbmciLCAiY2hlY2stcHJvamVjdC10eXBlcyIsICJjbGktdXRpbHMiLCAiY29kZS1nZW5lcmF0b3IiLCAiY29tbWl0bGludC1jb25maWciLCAiY29tbWl0bGludC1mb3JiaWRkZW4tcGF0dGVybnMiLCAiY29tbWl0bGludC1saW50LW1kLWhlYWRlciIsICJjb21taXRsaW50LXNwZWxsY2hlY2staGVhZGVyIiwgImRvY3Mtc2l0ZSIsICJlbnYtdG9nZ2xlIiwgImZvcmJpZGRlbi1wYXR0ZXJucyIsICJsaWJyYXJ5LWJ1aWxkIiwgImxpbmstY2hlY2stc2tpcCIsICJuYW5vLXN0YWdlZC1jb25maWciLCAibnBtLXB1Ymxpc2giLCAibnBtLXJ1biIsICJwYWNrYWdlLWxvY2staW50ZWdyaXR5IiwgInBhY2thZ2UtbWFuYWdlciIsICJyZWxlYXNlZC1pc3N1ZXMiLCAicmVwby1wYXRocyIsICJzaGFyZWQtY29uZmlnLWZpbGVzIiwgInRlc3QtcnVubmVycyIsICJ1cHN0cmVhbS1zeW5jIiwgInVwc3RyZWFtLXN5bmMtY2xpIiwgInZhbGlkYXRlLWRlY2xhcmF0aW9ucyIsICJ2YWxpZGF0ZS1kZXBlbmRlbmNpZXMiXQp9Cg==
@@ -6,6 +6,7 @@
6
6
  export * as 'build' from './build.cjs';
7
7
  export * as 'bulk-concurrency' from './bulk-concurrency.cjs';
8
8
  export * as 'bundlers' from './bundlers/index.cjs';
9
+ export * as 'changelog-grouping' from './changelog-grouping.cjs';
9
10
  export * as 'check-project-types' from './check-project-types.cjs';
10
11
  export * as 'cli-utils' from './cli-utils.cjs';
11
12
  export * as 'code-generator' from './code-generator.cjs';