@mnaoumov/typescript-dev-toolkit 6.1.0 → 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.
@@ -9,6 +9,7 @@
9
9
  * Git operations such as tagging and pushing.
10
10
  */
11
11
  import { parseArgs } from 'node:util';
12
+ import type { ChangelogStyle } from './changelog-grouping.cjs';
12
13
  /**
13
14
  * Options for {@link addUpdatedFilesToGit}.
14
15
  */
@@ -76,6 +77,16 @@ export interface UpdateChangelogOptions {
76
77
  * @default the first-parent commit subjects since the previous version
77
78
  */
78
79
  readonly changelogFilePath?: string | undefined;
80
+ /**
81
+ * How the section generated from the commit messages is laid out: `grouped` sorts the entries under plain-language
82
+ * headings and counts the maintenance commits instead of listing them, `commits` writes one bullet per first-parent
83
+ * commit. See {@link ChangelogStyle}.
84
+ *
85
+ * Ignored when {@link changelogFilePath} is set.
86
+ *
87
+ * @default `'grouped'`
88
+ */
89
+ readonly changelogStyle?: ChangelogStyle | undefined;
79
90
  /**
80
91
  * Whether to open the generated changelog in the editor for an interactive review. When `false`,
81
92
  * the changelog is still generated from commit messages, but it is not opened in the editor for
@@ -102,6 +113,12 @@ export interface UpdateVersionOptions {
102
113
  * @default the first-parent commit subjects since the previous version
103
114
  */
104
115
  readonly changelogFilePath?: string | undefined;
116
+ /**
117
+ * How the section generated from the commit messages is laid out. See {@link UpdateChangelogOptions.changelogStyle}.
118
+ *
119
+ * @default `'grouped'`
120
+ */
121
+ readonly changelogStyle?: ChangelogStyle | undefined;
105
122
  /**
106
123
  * Returns the files to attach to the GitHub release. See {@link PublishGitHubReleaseOptions.getReleaseAssetPaths}.
107
124
  */
@@ -334,6 +351,9 @@ export declare const VERSION_ARGUMENT_OPTIONS: {
334
351
  readonly 'changelog-file': {
335
352
  readonly type: "string";
336
353
  };
354
+ readonly 'changelog-style': {
355
+ readonly type: "string";
356
+ };
337
357
  readonly 'no-build': {
338
358
  readonly type: "boolean";
339
359
  };
@@ -381,6 +401,7 @@ export declare function isPreRelease(version: string): boolean;
381
401
  * value instead and has no default. Recognized flags:
382
402
  * - `--changelog-file=<path>` — use this file's contents as the new version's changelog section instead of
383
403
  * the commit-derived bullets, and skip the interactive review entirely.
404
+ * - `--changelog-style=<grouped|commits>` — how the commit-derived section is laid out (default `grouped`).
384
405
  * - `--no-build` — skip the build step (only safe when the build output already matches the current code).
385
406
  * - `--no-changelog-editing` — generate the changelog without opening it for manual review.
386
407
  * - `--no-checks` — skip the clean-repo check, format, spellcheck, lint, over-exposure analysis, and tests (the build still runs).
@@ -0,0 +1,59 @@
1
+ /// <reference path="./library-references.d.mts" />
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;
@@ -0,0 +1,106 @@
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
+ const CHANGELOG_STYLES = ["grouped", "commits"];
7
+ const MAINTENANCE_COMMIT_TYPES = /* @__PURE__ */ new Set(["build", "chore", "ci", "refactor", "style", "test"]);
8
+ const BREAKING_SECTION = { heading: "Breaking changes", plural: "breaking changes", singular: "breaking change" };
9
+ const NEW_SECTION = { heading: "New", plural: "new features", singular: "new feature" };
10
+ const FIXED_SECTION = { heading: "Fixed", plural: "fixes", singular: "fix" };
11
+ const IMPROVED_SECTION = { heading: "Improved", plural: "improvements", singular: "improvement" };
12
+ const DOCUMENTATION_SECTION = { heading: "Documentation", plural: "documentation changes", singular: "documentation change" };
13
+ const OTHER_SECTION = { heading: "Other changes", plural: "other changes", singular: "other change" };
14
+ const SECTIONS = [BREAKING_SECTION, NEW_SECTION, FIXED_SECTION, IMPROVED_SECTION, DOCUMENTATION_SECTION, OTHER_SECTION];
15
+ const SECTIONS_BY_TYPE = /* @__PURE__ */ new Map([
16
+ ["docs", DOCUMENTATION_SECTION],
17
+ ["feat", NEW_SECTION],
18
+ ["fix", FIXED_SECTION],
19
+ ["perf", IMPROVED_SECTION]
20
+ ]);
21
+ const CONVENTIONAL_ENTRY_REG_EXP = /^(?<type>[a-z]+)(?:\((?<scope>[^()]*)\))?(?<breaking>!)?:\s+(?<description>\S.*)$/i;
22
+ const ISSUE_ONLY_DESCRIPTION_REG_EXP = /^re (?<issue>#\d+)$/i;
23
+ function renderGroupedChangelogSection(entries) {
24
+ const sectionEntries = /* @__PURE__ */ new Map();
25
+ let maintenanceCount = 0;
26
+ for (const entry of entries) {
27
+ const classified = classifyEntry(entry);
28
+ if (!classified) {
29
+ maintenanceCount++;
30
+ continue;
31
+ }
32
+ const list = sectionEntries.get(classified.section) ?? [];
33
+ sectionEntries.set(classified.section, list);
34
+ const existing = list.find((sectionEntry) => sectionEntry.text === classified.text);
35
+ if (!existing) {
36
+ list.push({ references: [...classified.references], text: classified.text });
37
+ continue;
38
+ }
39
+ existing.references = [.../* @__PURE__ */ new Set([...existing.references, ...classified.references])];
40
+ }
41
+ const blocks = [toSummaryLine(sectionEntries, maintenanceCount)];
42
+ for (const section of SECTIONS) {
43
+ const list = sectionEntries.get(section);
44
+ if (!list) {
45
+ continue;
46
+ }
47
+ blocks.push(`### ${section.heading}`, list.map((sectionEntry) => `- ${toEntryLine(sectionEntry)}`).join("\n"));
48
+ }
49
+ return blocks.join("\n\n");
50
+ }
51
+ function classifyEntry(entry) {
52
+ const groups = CONVENTIONAL_ENTRY_REG_EXP.exec(entry.entry)?.groups;
53
+ if (!groups) {
54
+ return { references: entry.references, section: entry.hasBreakingFooter ? BREAKING_SECTION : OTHER_SECTION, text: entry.entry };
55
+ }
56
+ const type = String(groups["type"]).toLowerCase();
57
+ const isBreaking = groups["breaking"] !== void 0 || entry.hasBreakingFooter;
58
+ const section = isBreaking ? BREAKING_SECTION : toTypeSection(type);
59
+ if (!section) {
60
+ return null;
61
+ }
62
+ const description = String(groups["description"]);
63
+ const issue = ISSUE_ONLY_DESCRIPTION_REG_EXP.exec(description)?.groups?.["issue"];
64
+ const issueTitle = entry.detailLines[0];
65
+ const isIssueTitleUsed = issue !== void 0 && issueTitle !== void 0;
66
+ const text = isIssueTitleUsed ? issueTitle : description;
67
+ const references = isIssueTitleUsed ? [issue, ...entry.references] : entry.references;
68
+ const scope = groups["scope"];
69
+ return {
70
+ references,
71
+ section,
72
+ text: scope ? `**${scope}:** ${text}` : text
73
+ };
74
+ }
75
+ function countPhrase(count, section) {
76
+ return `${String(count)} ${count === 1 ? section.singular : section.plural}`;
77
+ }
78
+ function joinPhrases(phrases) {
79
+ const last = phrases.slice(-1).join("");
80
+ return phrases.length === 1 ? last : `${phrases.slice(0, -1).join(", ")} and ${last}`;
81
+ }
82
+ function toEntryLine(sectionEntry) {
83
+ return sectionEntry.references.length === 0 ? sectionEntry.text : `${sectionEntry.text} (${sectionEntry.references.join(", ")})`;
84
+ }
85
+ function toSummaryLine(sectionEntries, maintenanceCount) {
86
+ const phrases = SECTIONS.map((section) => ({ count: sectionEntries.get(section)?.length ?? 0, section })).filter(({ count }) => count > 0).map(({ count, section }) => countPhrase(count, section));
87
+ const isOne = maintenanceCount === 1;
88
+ const maintenance = maintenanceCount === 0 ? "" : ` ${String(maintenanceCount)} maintenance ${isOne ? "commit" : "commits"} (tests, build, CI, refactoring, dependencies) ${isOne ? "is" : "are"} not listed.`;
89
+ if (phrases.length > 0) {
90
+ return `This release has ${joinPhrases(phrases)}.${maintenance}`;
91
+ }
92
+ return maintenanceCount === 0 ? "This release has no changes." : `This release has maintenance changes only.${maintenance}`;
93
+ }
94
+ function toTypeSection(type) {
95
+ const section = SECTIONS_BY_TYPE.get(type);
96
+ if (section) {
97
+ return section;
98
+ }
99
+ return MAINTENANCE_COMMIT_TYPES.has(type) ? null : OTHER_SECTION;
100
+ }
101
+ export {
102
+ CHANGELOG_STYLES,
103
+ MAINTENANCE_COMMIT_TYPES,
104
+ renderGroupedChangelogSection
105
+ };
106
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NoYW5nZWxvZy1ncm91cGluZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEdyb3VwcyB0aGUgY29tbWl0LWRlcml2ZWQgZW50cmllcyBvZiBhIG5ldyBjaGFuZ2Vsb2cgc2VjdGlvbiBpbnRvIHBsYWluLWxhbmd1YWdlIHNlY3Rpb25zLCBzbyB0aGUgcmVsZWFzZSBub3RlcyBhXG4gKiByZWxlYXNlIHdyaXRlcyB3aXRoIG5vYm9keSByZXZpZXdpbmcgdGhlbSBjYW4gYmUgc2Nhbm5lZCByYXRoZXIgdGhhbiByZWFkIGNvbW1pdCBieSBjb21taXQuXG4gKlxuICogVGhlIGlucHV0IGlzIHN0aWxsIHRoZSBmaXJzdC1wYXJlbnQgY29tbWl0IGhpc3RvcnksIHNvIHRoaXMgaXMgYSBkZXRlcm1pbmlzdGljIHRyYW5zZm9ybWF0aW9uIG9mIHdoYXQgdGhlIGF1dGhvclxuICogYWxyZWFkeSB3cm90ZTogaXQgc29ydHMgZW50cmllcyBieSB0aGVpciBDb252ZW50aW9uYWwtQ29tbWl0cyB0eXBlLCBsZWF2ZXMgb3V0IHRoZSBjb21taXQgdHlwZXMgdGhhdCBkbyBub3QgY2hhbmdlXG4gKiB3aGF0IGEgdXNlciBnZXRzLCBtZXJnZXMgZW50cmllcyB0aGF0IHNheSB0aGUgc2FtZSB0aGluZywgYW5kIHN3YXBzIGEgYHJlICM8bj5gIHN1YmplY3QgZm9yIHRoZSBpc3N1ZSB0aXRsZSBpdHMgYm9keVxuICogY2Fycmllcy4gUHJvc2UgYSBodW1hbiAob3IgYW4gYWdlbnQpIHdyaXRlcyBzdGlsbCBnb2VzIGluIHRocm91Z2ggYC0tY2hhbmdlbG9nLWZpbGVgLlxuICovXG5cbi8qKlxuICogSG93IHRoZSBnZW5lcmF0ZWQgY2hhbmdlbG9nIHNlY3Rpb24gb2YgYSByZWxlYXNlIGlzIGxhaWQgb3V0LlxuICpcbiAqIC0gYGdyb3VwZWRgIFx1MjAxNCBhIG9uZS1saW5lIHN1bW1hcnksIHRoZW4gdGhlIGVudHJpZXMgdW5kZXIgYCMjIyBCcmVha2luZyBjaGFuZ2VzYCwgYCMjIyBOZXdgLCBgIyMjIEZpeGVkYCxcbiAqICAgYCMjIyBJbXByb3ZlZGAsIGAjIyMgRG9jdW1lbnRhdGlvbmAgYW5kIGAjIyMgT3RoZXIgY2hhbmdlc2AsIHdpdGggbWFpbnRlbmFuY2UgY29tbWl0cyBjb3VudGVkIHJhdGhlciB0aGFuIGxpc3RlZC5cbiAqIC0gYGNvbW1pdHNgIFx1MjAxNCBvbmUgYnVsbGV0IHBlciBmaXJzdC1wYXJlbnQgY29tbWl0LCBpbiBoaXN0b3J5IG9yZGVyLCBhcyBldmVyeSByZWxlYXNlIHdyb3RlIGJlZm9yZSBgZ3JvdXBlZGAgZXhpc3RlZC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2hhbmdlbG9nU3R5bGUgPSAnY29tbWl0cycgfCAnZ3JvdXBlZCc7XG5cbi8qKlxuICogRXZlcnkge0BsaW5rIENoYW5nZWxvZ1N0eWxlfSwgaW4gdGhlIG9yZGVyIHRoZSBgLS1jaGFuZ2Vsb2ctc3R5bGVgIGVycm9yIGxpc3RzIHRoZW0uXG4gKi9cbmV4cG9ydCBjb25zdCBDSEFOR0VMT0dfU1RZTEVTOiByZWFkb25seSBDaGFuZ2Vsb2dTdHlsZVtdID0gWydncm91cGVkJywgJ2NvbW1pdHMnXTtcblxuLyoqXG4gKiBPbmUgZmlyc3QtcGFyZW50IGNvbW1pdCwgYXMge0BsaW5rIHJlbmRlckdyb3VwZWRDaGFuZ2Vsb2dTZWN0aW9ufSB0YWtlcyBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGFuZ2Vsb2dDb21taXRFbnRyeSB7XG4gIC8qKlxuICAgKiBUaGUgYm9keSBsaW5lcyB0aGF0IGFyZSBuZWl0aGVyIHRoZSBlbnRyeSBpdHNlbGYgbm9yIGFuIGlzc3VlIHJlZmVyZW5jZSBsaW5lIG5vciBhIGJyZWFraW5nLWNoYW5nZSBmb290ZXIsIGluXG4gICAqIG9yZGVyLiBUaGUgZmlyc3Qgb2YgdGhlbSBpcyB0aGUgaXNzdWUgdGl0bGUgYW4gaXNzdWUtY2xvc2luZyBgcmUgIzxuPmAgbWVyZ2UgY2Fycmllcy5cbiAgICovXG4gIHJlYWRvbmx5IGRldGFpbExpbmVzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGNoYW5nZWxvZyBsaW5lIHRoZSBjb21taXQgcHJvZHVjZXMgYmVmb3JlIGdyb3VwaW5nOiBpdHMgc3ViamVjdCwgb3IgdGhlIGJvZHkgbGluZSBsaWZ0ZWQgb250byBhIGRlZmF1bHQgbWVyZ2VcbiAgICogc3ViamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IGVudHJ5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNvbW1pdCBjYXJyaWVzIGEgYEJSRUFLSU5HIENIQU5HRTpgIGZvb3Rlci4gVGhlIGAhYCBtYXJrZXIgaXMgcmVhZCBvZmYge0BsaW5rIGVudHJ5fSBpdHNlbGYuXG4gICAqL1xuICByZWFkb25seSBoYXNCcmVha2luZ0Zvb3RlcjogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGlzc3VlIHJlZmVyZW5jZXMgdGhlIGJvZHkgbmFtZXMgdGhhdCB7QGxpbmsgZW50cnl9IGRvZXMgbm90IGFscmVhZHkgc2hvdywgcmVuZGVyZWQgYXMgdGhlIGxpbmUgc2hvd3MgdGhlbS5cbiAgICovXG4gIHJlYWRvbmx5IHJlZmVyZW5jZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBjb21taXQgdHlwZXMgdGhhdCBjaGFuZ2Ugbm90aGluZyBhIHVzZXIgb2YgdGhlIHJlbGVhc2UgZ2V0cywgc28gdGhlIGdyb3VwZWQgc2VjdGlvbiBjb3VudHMgdGhlbSBpbnN0ZWFkIG9mXG4gKiBsaXN0aW5nIHRoZW0uIEEgY29tbWl0IG9mIG9uZSBvZiB0aGVzZSB0eXBlcyB0aGF0IGlzIG1hcmtlZCBicmVha2luZyBpcyBzdGlsbCBsaXN0ZWQsIHVuZGVyIGJyZWFraW5nIGNoYW5nZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBNQUlOVEVOQU5DRV9DT01NSVRfVFlQRVM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFsnYnVpbGQnLCAnY2hvcmUnLCAnY2knLCAncmVmYWN0b3InLCAnc3R5bGUnLCAndGVzdCddKTtcblxuaW50ZXJmYWNlIENsYXNzaWZpZWRFbnRyeSB7XG4gIHJlYWRvbmx5IHJlZmVyZW5jZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSBzZWN0aW9uOiBTZWN0aW9uRGVmaW5pdGlvbjtcbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgU2VjdGlvbkRlZmluaXRpb24ge1xuICByZWFkb25seSBoZWFkaW5nOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdXJhbDogc3RyaW5nO1xuICByZWFkb25seSBzaW5ndWxhcjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgU2VjdGlvbkVudHJ5IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcmVhZG9ubHktaW50ZXJmYWNlLW1lbWJlcnMgLS0gTWVyZ2VkIGVudHJpZXMgY29sbGVjdCByZWZlcmVuY2VzIGluIHBsYWNlLlxuICByZWZlcmVuY2VzOiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xufVxuXG5jb25zdCBCUkVBS0lOR19TRUNUSU9OOiBTZWN0aW9uRGVmaW5pdGlvbiA9IHsgaGVhZGluZzogJ0JyZWFraW5nIGNoYW5nZXMnLCBwbHVyYWw6ICdicmVha2luZyBjaGFuZ2VzJywgc2luZ3VsYXI6ICdicmVha2luZyBjaGFuZ2UnIH07XG5jb25zdCBORVdfU0VDVElPTjogU2VjdGlvbkRlZmluaXRpb24gPSB7IGhlYWRpbmc6ICdOZXcnLCBwbHVyYWw6ICduZXcgZmVhdHVyZXMnLCBzaW5ndWxhcjogJ25ldyBmZWF0dXJlJyB9O1xuY29uc3QgRklYRURfU0VDVElPTjogU2VjdGlvbkRlZmluaXRpb24gPSB7IGhlYWRpbmc6ICdGaXhlZCcsIHBsdXJhbDogJ2ZpeGVzJywgc2luZ3VsYXI6ICdmaXgnIH07XG5jb25zdCBJTVBST1ZFRF9TRUNUSU9OOiBTZWN0aW9uRGVmaW5pdGlvbiA9IHsgaGVhZGluZzogJ0ltcHJvdmVkJywgcGx1cmFsOiAnaW1wcm92ZW1lbnRzJywgc2luZ3VsYXI6ICdpbXByb3ZlbWVudCcgfTtcbmNvbnN0IERPQ1VNRU5UQVRJT05fU0VDVElPTjogU2VjdGlvbkRlZmluaXRpb24gPSB7IGhlYWRpbmc6ICdEb2N1bWVudGF0aW9uJywgcGx1cmFsOiAnZG9jdW1lbnRhdGlvbiBjaGFuZ2VzJywgc2luZ3VsYXI6ICdkb2N1bWVudGF0aW9uIGNoYW5nZScgfTtcbmNvbnN0IE9USEVSX1NFQ1RJT046IFNlY3Rpb25EZWZpbml0aW9uID0geyBoZWFkaW5nOiAnT3RoZXIgY2hhbmdlcycsIHBsdXJhbDogJ290aGVyIGNoYW5nZXMnLCBzaW5ndWxhcjogJ290aGVyIGNoYW5nZScgfTtcblxuLyoqXG4gKiBUaGUgc2VjdGlvbnMsIGluIHRoZSBvcmRlciB0aGV5IGFyZSByZW5kZXJlZCBhbmQgc3VtbWFyaXplZC5cbiAqL1xuY29uc3QgU0VDVElPTlM6IHJlYWRvbmx5IFNlY3Rpb25EZWZpbml0aW9uW10gPSBbQlJFQUtJTkdfU0VDVElPTiwgTkVXX1NFQ1RJT04sIEZJWEVEX1NFQ1RJT04sIElNUFJPVkVEX1NFQ1RJT04sIERPQ1VNRU5UQVRJT05fU0VDVElPTiwgT1RIRVJfU0VDVElPTl07XG5cbmNvbnN0IFNFQ1RJT05TX0JZX1RZUEUgPSBuZXcgTWFwPHN0cmluZywgU2VjdGlvbkRlZmluaXRpb24+KFtcbiAgWydkb2NzJywgRE9DVU1FTlRBVElPTl9TRUNUSU9OXSxcbiAgWydmZWF0JywgTkVXX1NFQ1RJT05dLFxuICBbJ2ZpeCcsIEZJWEVEX1NFQ1RJT05dLFxuICBbJ3BlcmYnLCBJTVBST1ZFRF9TRUNUSU9OXVxuXSk7XG5cbmNvbnN0IENPTlZFTlRJT05BTF9FTlRSWV9SRUdfRVhQID0gL14oPzx0eXBlPlthLXpdKykoPzpcXCgoPzxzY29wZT5bXigpXSopXFwpKT8oPzxicmVha2luZz4hKT86XFxzKyg/PGRlc2NyaXB0aW9uPlxcUy4qKSQvaTtcblxuLyoqXG4gKiBBbiBpc3N1ZS1jbG9zaW5nIG1lcmdlIHN1YmplY3QsIHdob3NlIHJlYWRhYmxlIGhhbGYgaXMgdGhlIGlzc3VlIHRpdGxlIG9uIHRoZSBib2R5J3MgZmlyc3QgbGluZS5cbiAqL1xuY29uc3QgSVNTVUVfT05MWV9ERVNDUklQVElPTl9SRUdfRVhQID0gL15yZSAoPzxpc3N1ZT4jXFxkKykkL2k7XG5cbi8qKlxuICogUmVuZGVycyB0aGUgYm9keSBvZiBhIG5ldyBjaGFuZ2Vsb2cgc2VjdGlvbiBpbiB0aGUge0BsaW5rIENoYW5nZWxvZ1N0eWxlfSBgZ3JvdXBlZGAgbGF5b3V0LlxuICpcbiAqIEBwYXJhbSBlbnRyaWVzIC0gVGhlIGZpcnN0LXBhcmVudCBjb21taXRzIHNpbmNlIHRoZSBwcmV2aW91cyByZWxlYXNlLCBpbiBgZ2l0IGxvZ2Agb3JkZXIuXG4gKiBAcmV0dXJucyBUaGUgc2VjdGlvbiBib2R5LCB3aXRob3V0IGl0cyBgIyMgPHZlcnNpb24+YCBoZWFkaW5nIGFuZCB3aXRob3V0IGEgdHJhaWxpbmcgbmV3bGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckdyb3VwZWRDaGFuZ2Vsb2dTZWN0aW9uKGVudHJpZXM6IHJlYWRvbmx5IENoYW5nZWxvZ0NvbW1pdEVudHJ5W10pOiBzdHJpbmcge1xuICBjb25zdCBzZWN0aW9uRW50cmllcyA9IG5ldyBNYXA8U2VjdGlvbkRlZmluaXRpb24sIFNlY3Rpb25FbnRyeVtdPigpO1xuICBsZXQgbWFpbnRlbmFuY2VDb3VudCA9IDA7XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgY2xhc3NpZmllZCA9IGNsYXNzaWZ5RW50cnkoZW50cnkpO1xuICAgIGlmICghY2xhc3NpZmllZCkge1xuICAgICAgbWFpbnRlbmFuY2VDb3VudCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgbGlzdCA9IHNlY3Rpb25FbnRyaWVzLmdldChjbGFzc2lmaWVkLnNlY3Rpb24pID8/IFtdO1xuICAgIHNlY3Rpb25FbnRyaWVzLnNldChjbGFzc2lmaWVkLnNlY3Rpb24sIGxpc3QpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gbGlzdC5maW5kKChzZWN0aW9uRW50cnkpID0+IHNlY3Rpb25FbnRyeS50ZXh0ID09PSBjbGFzc2lmaWVkLnRleHQpO1xuICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgIGxpc3QucHVzaCh7IHJlZmVyZW5jZXM6IFsuLi5jbGFzc2lmaWVkLnJlZmVyZW5jZXNdLCB0ZXh0OiBjbGFzc2lmaWVkLnRleHQgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBleGlzdGluZy5yZWZlcmVuY2VzID0gWy4uLm5ldyBTZXQoWy4uLmV4aXN0aW5nLnJlZmVyZW5jZXMsIC4uLmNsYXNzaWZpZWQucmVmZXJlbmNlc10pXTtcbiAgfVxuXG4gIGNvbnN0IGJsb2NrcyA9IFt0b1N1bW1hcnlMaW5lKHNlY3Rpb25FbnRyaWVzLCBtYWludGVuYW5jZUNvdW50KV07XG4gIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBTRUNUSU9OUykge1xuICAgIGNvbnN0IGxpc3QgPSBzZWN0aW9uRW50cmllcy5nZXQoc2VjdGlvbik7XG4gICAgaWYgKCFsaXN0KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBibG9ja3MucHVzaChgIyMjICR7c2VjdGlvbi5oZWFkaW5nfWAsIGxpc3QubWFwKChzZWN0aW9uRW50cnkpID0+IGAtICR7dG9FbnRyeUxpbmUoc2VjdGlvbkVudHJ5KX1gKS5qb2luKCdcXG4nKSk7XG4gIH1cblxuICByZXR1cm4gYmxvY2tzLmpvaW4oJ1xcblxcbicpO1xufVxuXG5mdW5jdGlvbiBjbGFzc2lmeUVudHJ5KGVudHJ5OiBDaGFuZ2Vsb2dDb21taXRFbnRyeSk6IENsYXNzaWZpZWRFbnRyeSB8IG51bGwge1xuICBjb25zdCBncm91cHMgPSBDT05WRU5USU9OQUxfRU5UUllfUkVHX0VYUC5leGVjKGVudHJ5LmVudHJ5KT8uZ3JvdXBzO1xuICBpZiAoIWdyb3Vwcykge1xuICAgIHJldHVybiB7IHJlZmVyZW5jZXM6IGVudHJ5LnJlZmVyZW5jZXMsIHNlY3Rpb246IGVudHJ5Lmhhc0JyZWFraW5nRm9vdGVyID8gQlJFQUtJTkdfU0VDVElPTiA6IE9USEVSX1NFQ1RJT04sIHRleHQ6IGVudHJ5LmVudHJ5IH07XG4gIH1cblxuICAvLyBUaGUgcmVndWxhciBleHByZXNzaW9uJ3MgYHR5cGVgIGFuZCBgZGVzY3JpcHRpb25gIGdyb3VwcyBhcmUgbm90IG9wdGlvbmFsLCBzbyBhIG1hdGNoIGFsd2F5cyBmaWxscyB0aGVtLlxuICBjb25zdCB0eXBlID0gU3RyaW5nKGdyb3Vwc1sndHlwZSddKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBpc0JyZWFraW5nID0gZ3JvdXBzWydicmVha2luZyddICE9PSB1bmRlZmluZWQgfHwgZW50cnkuaGFzQnJlYWtpbmdGb290ZXI7XG4gIGNvbnN0IHNlY3Rpb24gPSBpc0JyZWFraW5nID8gQlJFQUtJTkdfU0VDVElPTiA6IHRvVHlwZVNlY3Rpb24odHlwZSk7XG4gIGlmICghc2VjdGlvbikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZGVzY3JpcHRpb24gPSBTdHJpbmcoZ3JvdXBzWydkZXNjcmlwdGlvbiddKTtcbiAgY29uc3QgaXNzdWUgPSBJU1NVRV9PTkxZX0RFU0NSSVBUSU9OX1JFR19FWFAuZXhlYyhkZXNjcmlwdGlvbik/Lmdyb3Vwcz8uWydpc3N1ZSddO1xuICBjb25zdCBpc3N1ZVRpdGxlID0gZW50cnkuZGV0YWlsTGluZXNbMF07XG4gIGNvbnN0IGlzSXNzdWVUaXRsZVVzZWQgPSBpc3N1ZSAhPT0gdW5kZWZpbmVkICYmIGlzc3VlVGl0bGUgIT09IHVuZGVmaW5lZDtcbiAgY29uc3QgdGV4dCA9IGlzSXNzdWVUaXRsZVVzZWQgPyBpc3N1ZVRpdGxlIDogZGVzY3JpcHRpb247XG4gIGNvbnN0IHJlZmVyZW5jZXMgPSBpc0lzc3VlVGl0bGVVc2VkID8gW2lzc3VlLCAuLi5lbnRyeS5yZWZlcmVuY2VzXSA6IGVudHJ5LnJlZmVyZW5jZXM7XG4gIGNvbnN0IHNjb3BlID0gZ3JvdXBzWydzY29wZSddO1xuICByZXR1cm4ge1xuICAgIHJlZmVyZW5jZXMsXG4gICAgc2VjdGlvbixcbiAgICB0ZXh0OiBzY29wZSA/IGAqKiR7c2NvcGV9OioqICR7dGV4dH1gIDogdGV4dFxuICB9O1xufVxuXG5mdW5jdGlvbiBjb3VudFBocmFzZShjb3VudDogbnVtYmVyLCBzZWN0aW9uOiBTZWN0aW9uRGVmaW5pdGlvbik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtTdHJpbmcoY291bnQpfSAke2NvdW50ID09PSAxID8gc2VjdGlvbi5zaW5ndWxhciA6IHNlY3Rpb24ucGx1cmFsfWA7XG59XG5cbmZ1bmN0aW9uIGpvaW5QaHJhc2VzKHBocmFzZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgbGFzdCA9IHBocmFzZXMuc2xpY2UoLTEpLmpvaW4oJycpO1xuICByZXR1cm4gcGhyYXNlcy5sZW5ndGggPT09IDEgPyBsYXN0IDogYCR7cGhyYXNlcy5zbGljZSgwLCAtMSkuam9pbignLCAnKX0gYW5kICR7bGFzdH1gO1xufVxuXG5mdW5jdGlvbiB0b0VudHJ5TGluZShzZWN0aW9uRW50cnk6IFNlY3Rpb25FbnRyeSk6IHN0cmluZyB7XG4gIHJldHVybiBzZWN0aW9uRW50cnkucmVmZXJlbmNlcy5sZW5ndGggPT09IDAgPyBzZWN0aW9uRW50cnkudGV4dCA6IGAke3NlY3Rpb25FbnRyeS50ZXh0fSAoJHtzZWN0aW9uRW50cnkucmVmZXJlbmNlcy5qb2luKCcsICcpfSlgO1xufVxuXG5mdW5jdGlvbiB0b1N1bW1hcnlMaW5lKHNlY3Rpb25FbnRyaWVzOiBSZWFkb25seU1hcDxTZWN0aW9uRGVmaW5pdGlvbiwgcmVhZG9ubHkgU2VjdGlvbkVudHJ5W10+LCBtYWludGVuYW5jZUNvdW50OiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBwaHJhc2VzID0gU0VDVElPTlNcbiAgICAubWFwKChzZWN0aW9uKSA9PiAoeyBjb3VudDogc2VjdGlvbkVudHJpZXMuZ2V0KHNlY3Rpb24pPy5sZW5ndGggPz8gMCwgc2VjdGlvbiB9KSlcbiAgICAuZmlsdGVyKCh7IGNvdW50IH0pID0+IGNvdW50ID4gMClcbiAgICAubWFwKCh7IGNvdW50LCBzZWN0aW9uIH0pID0+IGNvdW50UGhyYXNlKGNvdW50LCBzZWN0aW9uKSk7XG4gIGNvbnN0IGlzT25lID0gbWFpbnRlbmFuY2VDb3VudCA9PT0gMTtcbiAgY29uc3QgbWFpbnRlbmFuY2UgPSBtYWludGVuYW5jZUNvdW50ID09PSAwXG4gICAgPyAnJ1xuICAgIDogYCAke1N0cmluZyhtYWludGVuYW5jZUNvdW50KX0gbWFpbnRlbmFuY2UgJHtpc09uZSA/ICdjb21taXQnIDogJ2NvbW1pdHMnfSAodGVzdHMsIGJ1aWxkLCBDSSwgcmVmYWN0b3JpbmcsIGRlcGVuZGVuY2llcykgJHtpc09uZSA/ICdpcycgOiAnYXJlJ30gbm90IGxpc3RlZC5gO1xuXG4gIGlmIChwaHJhc2VzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gYFRoaXMgcmVsZWFzZSBoYXMgJHtqb2luUGhyYXNlcyhwaHJhc2VzKX0uJHttYWludGVuYW5jZX1gO1xuICB9XG5cbiAgcmV0dXJuIG1haW50ZW5hbmNlQ291bnQgPT09IDAgPyAnVGhpcyByZWxlYXNlIGhhcyBubyBjaGFuZ2VzLicgOiBgVGhpcyByZWxlYXNlIGhhcyBtYWludGVuYW5jZSBjaGFuZ2VzIG9ubHkuJHttYWludGVuYW5jZX1gO1xufVxuXG5mdW5jdGlvbiB0b1R5cGVTZWN0aW9uKHR5cGU6IHN0cmluZyk6IG51bGwgfCBTZWN0aW9uRGVmaW5pdGlvbiB7XG4gIGNvbnN0IHNlY3Rpb24gPSBTRUNUSU9OU19CWV9UWVBFLmdldCh0eXBlKTtcbiAgaWYgKHNlY3Rpb24pIHtcbiAgICByZXR1cm4gc2VjdGlvbjtcbiAgfVxuXG4gIHJldHVybiBNQUlOVEVOQU5DRV9DT01NSVRfVFlQRVMuaGFzKHR5cGUpID8gbnVsbCA6IE9USEVS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
@@ -6,6 +6,7 @@
6
6
  export * as 'build' from './build.mjs';
7
7
  export * as 'bulk-concurrency' from './bulk-concurrency.mjs';
8
8
  export * as 'bundlers' from './bundlers/index.mjs';
9
+ export * as 'changelog-grouping' from './changelog-grouping.mjs';
9
10
  export * as 'check-project-types' from './check-project-types.mjs';
10
11
  export * as 'cli-utils' from './cli-utils.mjs';
11
12
  export * as 'code-generator' from './code-generator.mjs';
@@ -6,6 +6,7 @@ if you want to view the source, please visit the github repository of this plugi
6
6
  import * as build from "./build.mjs";
7
7
  import * as bulk_concurrency from "./bulk-concurrency.mjs";
8
8
  import * as bundlers from "./bundlers/index.mjs";
9
+ import * as changelog_grouping from "./changelog-grouping.mjs";
9
10
  import * as check_project_types from "./check-project-types.mjs";
10
11
  import * as cli_utils from "./cli-utils.mjs";
11
12
  import * as code_generator from "./code-generator.mjs";
@@ -45,6 +46,7 @@ export {
45
46
  build,
46
47
  bulk_concurrency as "bulk-concurrency",
47
48
  bundlers,
49
+ changelog_grouping as "changelog-grouping",
48
50
  check_project_types as "check-project-types",
49
51
  cli_utils as "cli-utils",
50
52
  code_generator as "code-generator",
@@ -81,4 +83,4 @@ export {
81
83
  validate_dependencies as "validate-dependencies",
82
84
  version
83
85
  };
84
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgJ2J1aWxkJyBmcm9tICcuL2J1aWxkLnRzJztcbmV4cG9ydCAqIGFzICdidWxrLWNvbmN1cnJlbmN5JyBmcm9tICcuL2J1bGstY29uY3VycmVuY3kudHMnO1xuZXhwb3J0ICogYXMgJ2J1bmRsZXJzJyBmcm9tICcuL2J1bmRsZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdjaGVjay1wcm9qZWN0LXR5cGVzJyBmcm9tICcuL2NoZWNrLXByb2plY3QtdHlwZXMudHMnO1xuZXhwb3J0ICogYXMgJ2NsaS11dGlscycgZnJvbSAnLi9jbGktdXRpbHMudHMnO1xuZXhwb3J0ICogYXMgJ2NvZGUtZ2VuZXJhdG9yJyBmcm9tICcuL2NvZGUtZ2VuZXJhdG9yLnRzJztcbmV4cG9ydCAqIGFzICdjb21taXRsaW50LWNvbmZpZycgZnJvbSAnLi9jb21taXRsaW50LWNvbmZpZy50cyc7XG5leHBvcnQgKiBhcyAnY29tbWl0bGludC1mb3JiaWRkZW4tcGF0dGVybnMnIGZyb20gJy4vY29tbWl0bGludC1mb3JiaWRkZW4tcGF0dGVybnMudHMnO1xuZXhwb3J0ICogYXMgJ2NvbW1pdGxpbnQtbGludC1tZC1oZWFkZXInIGZyb20gJy4vY29tbWl0bGludC1saW50LW1kLWhlYWRlci50cyc7XG5leHBvcnQgKiBhcyAnY29tbWl0bGludC1zcGVsbGNoZWNrLWhlYWRlcicgZnJvbSAnLi9jb21taXRsaW50LXNwZWxsY2hlY2staGVhZGVyLnRzJztcbmV4cG9ydCAqIGFzICdkb2NzLXNpdGUnIGZyb20gJy4vZG9jcy1zaXRlL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdlbnYtdG9nZ2xlJyBmcm9tICcuL2Vudi10b2dnbGUudHMnO1xuZXhwb3J0ICogYXMgJ2V4ZWMnIGZyb20gJy4vZXhlYy50cyc7XG5leHBvcnQgKiBhcyAnZm9yYmlkZGVuLXBhdHRlcm5zJyBmcm9tICcuL2ZvcmJpZGRlbi1wYXR0ZXJucy50cyc7XG5leHBvcnQgKiBhcyAnZm9ybWF0dGVycycgZnJvbSAnLi9mb3JtYXR0ZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdmcycgZnJvbSAnLi9mcy50cyc7XG5leHBvcnQgKiBhcyAnZ2F0ZScgZnJvbSAnLi9nYXRlLnRzJztcbmV4cG9ydCAqIGFzICdnaXQnIGZyb20gJy4vZ2l0LnRzJztcbmV4cG9ydCAqIGFzICdqc29uJyBmcm9tICcuL2pzb24udHMnO1xuZXhwb3J0ICogYXMgJ2xpYnJhcnktYnVpbGQnIGZyb20gJy4vbGlicmFyeS1idWlsZC50cyc7XG5leHBvcnQgKiBhcyAnbGluay1jaGVjay1za2lwJyBmcm9tICcuL2xpbmstY2hlY2stc2tpcC50cyc7XG5leHBvcnQgKiBhcyAnbGludGVycycgZnJvbSAnLi9saW50ZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICduYW5vLXN0YWdlZC1jb25maWcnIGZyb20gJy4vbmFuby1zdGFnZWQtY29uZmlnLnRzJztcbmV4cG9ydCAqIGFzICducG0tcHVibGlzaCcgZnJvbSAnLi9ucG0tcHVibGlzaC50cyc7XG5leHBvcnQgKiBhcyAnbnBtLXJ1bicgZnJvbSAnLi9ucG0tcnVuLnRzJztcbmV4cG9ydCAqIGFzICducG0nIGZyb20gJy4vbnBtLnRzJztcbmV4cG9ydCAqIGFzICdwYWNrYWdlLWxvY2staW50ZWdyaXR5JyBmcm9tICcuL3BhY2thZ2UtbG9jay1pbnRlZ3JpdHkudHMnO1xuZXhwb3J0ICogYXMgJ3BhY2thZ2UtbWFuYWdlcicgZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuZXhwb3J0ICogYXMgJ3JlbGVhc2VkLWlzc3VlcycgZnJvbSAnLi9yZWxlYXNlZC1pc3N1ZXMudHMnO1xuZXhwb3J0ICogYXMgJ3JlcG8tcGF0aHMnIGZyb20gJy4vcmVwby1wYXRocy50cyc7XG5leHBvcnQgKiBhcyAncm9vdCcgZnJvbSAnLi9yb290LnRzJztcbmV4cG9ydCAqIGFzICdzaGFyZWQtY29uZmlnLWZpbGVzJyBmcm9tICcuL3NoYXJlZC1jb25maWctZmlsZXMudHMnO1xuZXhwb3J0ICogYXMgJ3Rlc3QtcnVubmVycycgZnJvbSAnLi90ZXN0LXJ1bm5lcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ3Vwc3RyZWFtLXN5bmMtY2xpJyBmcm9tICcuL3Vwc3RyZWFtLXN5bmMtY2xpLnRzJztcbmV4cG9ydCAqIGFzICd1cHN0cmVhbS1zeW5jJyBmcm9tICcuL3Vwc3RyZWFtLXN5bmMudHMnO1xuZXhwb3J0ICogYXMgJ3ZhbGlkYXRlLWRlY2xhcmF0aW9ucycgZnJvbSAnLi92YWxpZGF0ZS1kZWNsYXJhdGlvbnMudHMnO1xuZXhwb3J0ICogYXMgJ3ZhbGlkYXRlLWRlcGVuZGVuY2llcycgZnJvbSAnLi92YWxpZGF0ZS1kZXBlbmRlbmNpZXMudHMnO1xuZXhwb3J0ICogYXMgJ3ZlcnNpb24nIGZyb20gJy4vdmVyc2lvbi50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQUVBLFlBQVksV0FBYTtBQUN6QixZQUFZQSxzQkFBd0I7QUFDcEMsWUFBWSxjQUFnQjtBQUM1QixZQUFZQyx5QkFBMkI7QUFDdkMsWUFBWUMsZUFBaUI7QUFDN0IsWUFBWUMsb0JBQXNCO0FBQ2xDLFlBQVlDLHVCQUF5QjtBQUNyQyxZQUFZQyxtQ0FBcUM7QUFDakQsWUFBWUMsK0JBQWlDO0FBQzdDLFlBQVlDLGtDQUFvQztBQUNoRCxZQUFZQyxlQUFpQjtBQUM3QixZQUFZQyxnQkFBa0I7QUFDOUIsWUFBWSxVQUFZO0FBQ3hCLFlBQVlDLHdCQUEwQjtBQUN0QyxZQUFZLGdCQUFrQjtBQUM5QixZQUFZLFFBQVU7QUFDdEIsWUFBWSxVQUFZO0FBQ3hCLFlBQVksU0FBVztBQUN2QixZQUFZLFVBQVk7QUFDeEIsWUFBWUMsbUJBQXFCO0FBQ2pDLFlBQVlDLHFCQUF1QjtBQUNuQyxZQUFZLGFBQWU7QUFDM0IsWUFBWUMsd0JBQTBCO0FBQ3RDLFlBQVlDLGlCQUFtQjtBQUMvQixZQUFZQyxhQUFlO0FBQzNCLFlBQVksU0FBVztBQUN2QixZQUFZQyw0QkFBOEI7QUFDMUMsWUFBWUMscUJBQXVCO0FBQ25DLFlBQVlDLHFCQUF1QjtBQUNuQyxZQUFZQyxnQkFBa0I7QUFDOUIsWUFBWSxVQUFZO0FBQ3hCLFlBQVlDLHlCQUEyQjtBQUN2QyxZQUFZQyxrQkFBb0I7QUFDaEMsWUFBWUMsdUJBQXlCO0FBQ3JDLFlBQVlDLG1CQUFxQjtBQUNqQyxZQUFZQywyQkFBNkI7QUFDekMsWUFBWUMsMkJBQTZCO0FBQ3pDLFlBQVksYUFBZTsiLAogICJuYW1lcyI6IFsiYnVsay1jb25jdXJyZW5jeSIsICJjaGVjay1wcm9qZWN0LXR5cGVzIiwgImNsaS11dGlscyIsICJjb2RlLWdlbmVyYXRvciIsICJjb21taXRsaW50LWNvbmZpZyIsICJjb21taXRsaW50LWZvcmJpZGRlbi1wYXR0ZXJucyIsICJjb21taXRsaW50LWxpbnQtbWQtaGVhZGVyIiwgImNvbW1pdGxpbnQtc3BlbGxjaGVjay1oZWFkZXIiLCAiZG9jcy1zaXRlIiwgImVudi10b2dnbGUiLCAiZm9yYmlkZGVuLXBhdHRlcm5zIiwgImxpYnJhcnktYnVpbGQiLCAibGluay1jaGVjay1za2lwIiwgIm5hbm8tc3RhZ2VkLWNvbmZpZyIsICJucG0tcHVibGlzaCIsICJucG0tcnVuIiwgInBhY2thZ2UtbG9jay1pbnRlZ3JpdHkiLCAicGFja2FnZS1tYW5hZ2VyIiwgInJlbGVhc2VkLWlzc3VlcyIsICJyZXBvLXBhdGhzIiwgInNoYXJlZC1jb25maWctZmlsZXMiLCAidGVzdC1ydW5uZXJzIiwgInVwc3RyZWFtLXN5bmMtY2xpIiwgInVwc3RyZWFtLXN5bmMiLCAidmFsaWRhdGUtZGVjbGFyYXRpb25zIiwgInZhbGlkYXRlLWRlcGVuZGVuY2llcyJdCn0K
86
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgJ2J1aWxkJyBmcm9tICcuL2J1aWxkLnRzJztcbmV4cG9ydCAqIGFzICdidWxrLWNvbmN1cnJlbmN5JyBmcm9tICcuL2J1bGstY29uY3VycmVuY3kudHMnO1xuZXhwb3J0ICogYXMgJ2J1bmRsZXJzJyBmcm9tICcuL2J1bmRsZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdjaGFuZ2Vsb2ctZ3JvdXBpbmcnIGZyb20gJy4vY2hhbmdlbG9nLWdyb3VwaW5nLnRzJztcbmV4cG9ydCAqIGFzICdjaGVjay1wcm9qZWN0LXR5cGVzJyBmcm9tICcuL2NoZWNrLXByb2plY3QtdHlwZXMudHMnO1xuZXhwb3J0ICogYXMgJ2NsaS11dGlscycgZnJvbSAnLi9jbGktdXRpbHMudHMnO1xuZXhwb3J0ICogYXMgJ2NvZGUtZ2VuZXJhdG9yJyBmcm9tICcuL2NvZGUtZ2VuZXJhdG9yLnRzJztcbmV4cG9ydCAqIGFzICdjb21taXRsaW50LWNvbmZpZycgZnJvbSAnLi9jb21taXRsaW50LWNvbmZpZy50cyc7XG5leHBvcnQgKiBhcyAnY29tbWl0bGludC1mb3JiaWRkZW4tcGF0dGVybnMnIGZyb20gJy4vY29tbWl0bGludC1mb3JiaWRkZW4tcGF0dGVybnMudHMnO1xuZXhwb3J0ICogYXMgJ2NvbW1pdGxpbnQtbGludC1tZC1oZWFkZXInIGZyb20gJy4vY29tbWl0bGludC1saW50LW1kLWhlYWRlci50cyc7XG5leHBvcnQgKiBhcyAnY29tbWl0bGludC1zcGVsbGNoZWNrLWhlYWRlcicgZnJvbSAnLi9jb21taXRsaW50LXNwZWxsY2hlY2staGVhZGVyLnRzJztcbmV4cG9ydCAqIGFzICdkb2NzLXNpdGUnIGZyb20gJy4vZG9jcy1zaXRlL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdlbnYtdG9nZ2xlJyBmcm9tICcuL2Vudi10b2dnbGUudHMnO1xuZXhwb3J0ICogYXMgJ2V4ZWMnIGZyb20gJy4vZXhlYy50cyc7XG5leHBvcnQgKiBhcyAnZm9yYmlkZGVuLXBhdHRlcm5zJyBmcm9tICcuL2ZvcmJpZGRlbi1wYXR0ZXJucy50cyc7XG5leHBvcnQgKiBhcyAnZm9ybWF0dGVycycgZnJvbSAnLi9mb3JtYXR0ZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdmcycgZnJvbSAnLi9mcy50cyc7XG5leHBvcnQgKiBhcyAnZ2F0ZScgZnJvbSAnLi9nYXRlLnRzJztcbmV4cG9ydCAqIGFzICdnaXQnIGZyb20gJy4vZ2l0LnRzJztcbmV4cG9ydCAqIGFzICdqc29uJyBmcm9tICcuL2pzb24udHMnO1xuZXhwb3J0ICogYXMgJ2xpYnJhcnktYnVpbGQnIGZyb20gJy4vbGlicmFyeS1idWlsZC50cyc7XG5leHBvcnQgKiBhcyAnbGluay1jaGVjay1za2lwJyBmcm9tICcuL2xpbmstY2hlY2stc2tpcC50cyc7XG5leHBvcnQgKiBhcyAnbGludGVycycgZnJvbSAnLi9saW50ZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICduYW5vLXN0YWdlZC1jb25maWcnIGZyb20gJy4vbmFuby1zdGFnZWQtY29uZmlnLnRzJztcbmV4cG9ydCAqIGFzICducG0tcHVibGlzaCcgZnJvbSAnLi9ucG0tcHVibGlzaC50cyc7XG5leHBvcnQgKiBhcyAnbnBtLXJ1bicgZnJvbSAnLi9ucG0tcnVuLnRzJztcbmV4cG9ydCAqIGFzICducG0nIGZyb20gJy4vbnBtLnRzJztcbmV4cG9ydCAqIGFzICdwYWNrYWdlLWxvY2staW50ZWdyaXR5JyBmcm9tICcuL3BhY2thZ2UtbG9jay1pbnRlZ3JpdHkudHMnO1xuZXhwb3J0ICogYXMgJ3BhY2thZ2UtbWFuYWdlcicgZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuZXhwb3J0ICogYXMgJ3JlbGVhc2VkLWlzc3VlcycgZnJvbSAnLi9yZWxlYXNlZC1pc3N1ZXMudHMnO1xuZXhwb3J0ICogYXMgJ3JlcG8tcGF0aHMnIGZyb20gJy4vcmVwby1wYXRocy50cyc7XG5leHBvcnQgKiBhcyAncm9vdCcgZnJvbSAnLi9yb290LnRzJztcbmV4cG9ydCAqIGFzICdzaGFyZWQtY29uZmlnLWZpbGVzJyBmcm9tICcuL3NoYXJlZC1jb25maWctZmlsZXMudHMnO1xuZXhwb3J0ICogYXMgJ3Rlc3QtcnVubmVycycgZnJvbSAnLi90ZXN0LXJ1bm5lcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ3Vwc3RyZWFtLXN5bmMtY2xpJyBmcm9tICcuL3Vwc3RyZWFtLXN5bmMtY2xpLnRzJztcbmV4cG9ydCAqIGFzICd1cHN0cmVhbS1zeW5jJyBmcm9tICcuL3Vwc3RyZWFtLXN5bmMudHMnO1xuZXhwb3J0ICogYXMgJ3ZhbGlkYXRlLWRlY2xhcmF0aW9ucycgZnJvbSAnLi92YWxpZGF0ZS1kZWNsYXJhdGlvbnMudHMnO1xuZXhwb3J0ICogYXMgJ3ZhbGlkYXRlLWRlcGVuZGVuY2llcycgZnJvbSAnLi92YWxpZGF0ZS1kZXBlbmRlbmNpZXMudHMnO1xuZXhwb3J0ICogYXMgJ3ZlcnNpb24nIGZyb20gJy4vdmVyc2lvbi50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQUVBLFlBQVksV0FBYTtBQUN6QixZQUFZQSxzQkFBd0I7QUFDcEMsWUFBWSxjQUFnQjtBQUM1QixZQUFZQyx3QkFBMEI7QUFDdEMsWUFBWUMseUJBQTJCO0FBQ3ZDLFlBQVlDLGVBQWlCO0FBQzdCLFlBQVlDLG9CQUFzQjtBQUNsQyxZQUFZQyx1QkFBeUI7QUFDckMsWUFBWUMsbUNBQXFDO0FBQ2pELFlBQVlDLCtCQUFpQztBQUM3QyxZQUFZQyxrQ0FBb0M7QUFDaEQsWUFBWUMsZUFBaUI7QUFDN0IsWUFBWUMsZ0JBQWtCO0FBQzlCLFlBQVksVUFBWTtBQUN4QixZQUFZQyx3QkFBMEI7QUFDdEMsWUFBWSxnQkFBa0I7QUFDOUIsWUFBWSxRQUFVO0FBQ3RCLFlBQVksVUFBWTtBQUN4QixZQUFZLFNBQVc7QUFDdkIsWUFBWSxVQUFZO0FBQ3hCLFlBQVlDLG1CQUFxQjtBQUNqQyxZQUFZQyxxQkFBdUI7QUFDbkMsWUFBWSxhQUFlO0FBQzNCLFlBQVlDLHdCQUEwQjtBQUN0QyxZQUFZQyxpQkFBbUI7QUFDL0IsWUFBWUMsYUFBZTtBQUMzQixZQUFZLFNBQVc7QUFDdkIsWUFBWUMsNEJBQThCO0FBQzFDLFlBQVlDLHFCQUF1QjtBQUNuQyxZQUFZQyxxQkFBdUI7QUFDbkMsWUFBWUMsZ0JBQWtCO0FBQzlCLFlBQVksVUFBWTtBQUN4QixZQUFZQyx5QkFBMkI7QUFDdkMsWUFBWUMsa0JBQW9CO0FBQ2hDLFlBQVlDLHVCQUF5QjtBQUNyQyxZQUFZQyxtQkFBcUI7QUFDakMsWUFBWUMsMkJBQTZCO0FBQ3pDLFlBQVlDLDJCQUE2QjtBQUN6QyxZQUFZLGFBQWU7IiwKICAibmFtZXMiOiBbImJ1bGstY29uY3VycmVuY3kiLCAiY2hhbmdlbG9nLWdyb3VwaW5nIiwgImNoZWNrLXByb2plY3QtdHlwZXMiLCAiY2xpLXV0aWxzIiwgImNvZGUtZ2VuZXJhdG9yIiwgImNvbW1pdGxpbnQtY29uZmlnIiwgImNvbW1pdGxpbnQtZm9yYmlkZGVuLXBhdHRlcm5zIiwgImNvbW1pdGxpbnQtbGludC1tZC1oZWFkZXIiLCAiY29tbWl0bGludC1zcGVsbGNoZWNrLWhlYWRlciIsICJkb2NzLXNpdGUiLCAiZW52LXRvZ2dsZSIsICJmb3JiaWRkZW4tcGF0dGVybnMiLCAibGlicmFyeS1idWlsZCIsICJsaW5rLWNoZWNrLXNraXAiLCAibmFuby1zdGFnZWQtY29uZmlnIiwgIm5wbS1wdWJsaXNoIiwgIm5wbS1ydW4iLCAicGFja2FnZS1sb2NrLWludGVncml0eSIsICJwYWNrYWdlLW1hbmFnZXIiLCAicmVsZWFzZWQtaXNzdWVzIiwgInJlcG8tcGF0aHMiLCAic2hhcmVkLWNvbmZpZy1maWxlcyIsICJ0ZXN0LXJ1bm5lcnMiLCAidXBzdHJlYW0tc3luYy1jbGkiLCAidXBzdHJlYW0tc3luYyIsICJ2YWxpZGF0ZS1kZWNsYXJhdGlvbnMiLCAidmFsaWRhdGUtZGVwZW5kZW5jaWVzIl0KfQo=