relion 0.8.0 โ†’ 0.10.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/dist/index.d.ts CHANGED
@@ -40,7 +40,7 @@ type BumpFiles = (string | VersionedFile)[];
40
40
  interface ChangelogOptions {
41
41
  output?: 'stdout' | (string & {});
42
42
  commitRange?: CommitRange;
43
- sections?: ChangelogSectionsMap;
43
+ sections?: TypeGroupsMap;
44
44
  header?: string;
45
45
  prevReleaseHeaderPattern?: RegExp;
46
46
  helpers?: HelperDeclareSpec;
@@ -79,7 +79,8 @@ interface CommitsParser {
79
79
  remoteUrlPattern?: RegExp;
80
80
  signerPattern?: RegExp;
81
81
  dateSource?: 'authorDate' | 'committerDate';
82
- dateFormat?: string;
82
+ dateFormat?: 'US' | 'ISO' | (string & {});
83
+ revertCommitBodyPattern?: RegExp;
83
84
  }
84
85
  type CompleteCommitsParser = Required<CommitsParser>;
85
86
  interface RepoInfo {
@@ -89,7 +90,7 @@ interface RepoInfo {
89
90
  homepage?: string;
90
91
  }
91
92
  interface Context {
92
- commits?: Commit[] | RawCommit[];
93
+ commits?: ParsedCommit[] | RawCommit[];
93
94
  currentVersion?: string;
94
95
  currentTag?: string;
95
96
  newVersion?: string;
@@ -98,19 +99,12 @@ interface Context {
98
99
  [key: string]: unknown;
99
100
  }
100
101
  interface ResolvedContext extends Required<Context> {
101
- commits: Commit[];
102
- releases: ReleaseWithGroupedCommits[] | null;
102
+ commits: ResolvedCommit[];
103
+ releases: ReleaseWithTypeGroups[] | null;
103
104
  }
104
105
  type CommitRange = 'all' | 'unreleased' | 'latest-release' | {
105
106
  versionTag: string;
106
- } | {
107
- from: 'firstCommit' | (string & {});
108
- } | {
109
- to: 'HEAD' | (string & {});
110
- } | {
111
- from: 'firstCommit' | (string & {});
112
- to: 'HEAD' | (string & {});
113
- };
107
+ } | (string & {});
114
108
  type ReleaseType = 'major' | 'minor' | 'patch';
115
109
  interface VersionedFile {
116
110
  filePath: string;
@@ -150,14 +144,23 @@ type RawCommit = CommitMessageString | {
150
144
  gpgSigCode?: GpgSigCode;
151
145
  gpgSigKeyId?: string;
152
146
  };
153
- interface Commit extends CommitMessage {
154
- hash?: string;
147
+ interface ParsedCommit extends CommitMessage {
148
+ hash: string;
155
149
  tags?: string[];
156
150
  authors?: Contributor[];
157
151
  committer?: Contributor;
158
152
  refs?: Reference[];
159
153
  gpgSig?: GpgSig;
160
154
  date?: string;
155
+ releaseTag?: string;
156
+ associatedReleaseTag?: string;
157
+ isReverted?: 'inTheSameRelease' | 'inOtherRelease' | null;
158
+ }
159
+ interface ParsedCommitWithReleaseTag extends ParsedCommit {
160
+ associatedReleaseTag: NonNullable<ParsedCommit['associatedReleaseTag']>;
161
+ }
162
+ interface ResolvedCommit extends ParsedCommitWithReleaseTag {
163
+ isReverted: NonNullable<ParsedCommit['isReverted']> | null;
161
164
  }
162
165
  interface CommitMessage {
163
166
  type: string;
@@ -244,7 +247,7 @@ declare const defaultChangelogSections: {
244
247
  readonly deps: {
245
248
  readonly title: "๐Ÿงฉ Dependencies";
246
249
  readonly commitType: "chore";
247
- readonly filter: (commit: Commit) => boolean;
250
+ readonly filter: (commit: ResolvedCommit) => boolean;
248
251
  };
249
252
  readonly chore: {
250
253
  readonly title: "๐Ÿ› ๏ธ Chores";
@@ -257,31 +260,31 @@ declare const defaultChangelogSections: {
257
260
  readonly misc: {
258
261
  readonly title: "โš™๏ธ Miscellaneous";
259
262
  readonly commitType: "*";
260
- readonly filter: (commit: Commit) => boolean;
263
+ readonly filter: (commit: ResolvedCommit) => boolean;
261
264
  };
262
265
  };
263
266
  //#endregion
264
267
  //#region src/types/changelog.d.ts
265
- interface ChangelogSectionDefinition {
268
+ interface TypeGroupDefinition {
266
269
  title: string;
267
270
  commitType: 'breaking' | '*' | (string & {}) | string[];
268
- filter?: (commit: Commit) => boolean;
271
+ filter?: (commit: ResolvedCommit) => boolean;
269
272
  }
270
- type ChangelogSectionsMap = Record<string, ChangelogSectionDefinition>;
271
- interface ResolvedChangelogSection extends Omit<ChangelogSectionDefinition, 'filter'> {
272
- id: string;
273
- commits: Commit[];
273
+ type TypeGroupsMap = Record<string, TypeGroupDefinition>;
274
+ interface FilledTypeGroup extends Omit<TypeGroupDefinition, 'filter'> {
275
+ commits: ResolvedCommit[];
274
276
  }
277
+ type FilledTypeGroupMap = Record<string, FilledTypeGroup>;
275
278
  interface ReleaseWithFlatCommits {
276
279
  tag: string;
277
280
  version?: string;
278
281
  date?: string;
279
- commits: Commit[];
282
+ commits: ResolvedCommit[];
280
283
  }
281
- interface ReleaseWithGroupedCommits extends Omit<ReleaseWithFlatCommits, 'commits'> {
282
- commitTypeGroups: ResolvedChangelogSection[];
284
+ interface ReleaseWithTypeGroups extends Omit<ReleaseWithFlatCommits, 'commits'> {
285
+ commitTypeGroups: FilledTypeGroupMap;
283
286
  }
284
- interface ReleaseContext extends ReleaseWithGroupedCommits, ResolvedContext {
287
+ interface ReleaseContext extends ReleaseWithTypeGroups, ResolvedContext {
285
288
  prevTag?: string;
286
289
  prevVersion?: string;
287
290
  }
@@ -298,4 +301,4 @@ declare const defineConfig: (config: UserConfig) => UserConfig;
298
301
  //#region src/utils/sections-selector.d.ts
299
302
  declare const changelogSectionsSelector: ChangelogSectionsSelector;
300
303
  //#endregion
301
- export { BumpFiles, ChangelogOptions, ChangelogSectionDefinition, ChangelogSectionsMap, ChangelogSectionsSelector, Commit, CommitMessage, CommitOptions, CommitRange, CommitsParser, CompleteChangelogOptions, CompleteCommitOptions, CompleteCommitsParser, CompleteTagOptions, Context, ContextualConfig, Contributor, DefaultChangelogSections, DefaultVersionedFile, FalseOrComplete, GithubUserInfo, GpgSig, GpgSigCode, MergedConfig, RawCommit, RawReference, RefLabel, Reference, ReleaseContext, ReleaseType, ReleaseWithFlatCommits, ReleaseWithGroupedCommits, RepoInfo, ResolvedChangelogOptions, ResolvedChangelogSection, ResolvedConfig, ResolvedContext, TagOptions, TransformedConfig, UserConfig, VersionedFile, changelogSectionsSelector, relion as default, defineConfig };
304
+ export { BumpFiles, ChangelogOptions, ChangelogSectionsSelector, CommitMessage, CommitOptions, CommitRange, CommitsParser, CompleteChangelogOptions, CompleteCommitOptions, CompleteCommitsParser, CompleteTagOptions, Context, ContextualConfig, Contributor, DefaultChangelogSections, DefaultVersionedFile, FalseOrComplete, FilledTypeGroup, FilledTypeGroupMap, GithubUserInfo, GpgSig, GpgSigCode, MergedConfig, ParsedCommit, RawCommit, RawReference, RefLabel, Reference, ReleaseContext, ReleaseType, ReleaseWithFlatCommits, ReleaseWithTypeGroups, RepoInfo, ResolvedChangelogOptions, ResolvedCommit, ResolvedConfig, ResolvedContext, TagOptions, TransformedConfig, TypeGroupDefinition, TypeGroupsMap, UserConfig, VersionedFile, changelogSectionsSelector, relion as default, defineConfig };
package/dist/index.js CHANGED
@@ -1,27 +1,46 @@
1
- import{existsSync as e,readFileSync as t,writeFileSync as n}from"node:fs";import r from"handlebars";import i from"semver";import{execSync as a}from"node:child_process";const o={bump:!1,changelog:!1,commit:!1,tag:!1,versionSourceFile:`./package.json`,newTagFormat:`v{{newVersion}}`,prevReleaseTagPattern:/^v?(?<version>\d+\.\d+\.\d+)/,zeroMajorBreakingIsMinor:!0,dryRun:!1,silent:!1,context:{commitHyperlink:!0,refHyperlink:!0},commitsParser:{headerPattern:/^(?<type>\w+)(?:\((?<scope>.+)\))?(?<bang>!)?: (?<subject>.+)/s,breakingChangesPattern:/BREAKING CHANGES?:\s*(?<content>.+)/s,breakingChangeListPattern:/- (.+)/g,tagPattern:/tag: (?<tag>.*?)[,)]/g,coAuthorPattern:/Co-authored-by: (?<name>.+?) <(?<email>.+)>/g,signerPattern:/Signed-off-by: (?<name>.+?) <(?<email>.+)>/g,ghEmailPattern:/^(?:\d+\+)?(?<username>.+)@users\.noreply\.github\.com$/,remoteUrlPattern:/^(https:\/\/|git@)(?<host>[^/:]+)[/:](?<owner>.+?)\/(?<name>.+?)(?:\..*)?$/,refPattern:/^(?<action>.+?) (?<labels>.+)$/gm,refLabelPattern:/(?:(?<owner>\S+?)\/(?<repo>\S+?))?#(?<number>\d+)/g,refActionPattern:/Fixes|Closes|Refs/i,dateSource:`authorDate`,dateFormat:`YYYY-MM-DD`}},s={breaking:{title:`โš ๏ธ BREAKING CHANGES`,commitType:`breaking`},feat:{title:`โœจ Features`,commitType:`feat`},fix:{title:`๐Ÿฉน Fixes`,commitType:`fix`},perf:{title:`โšก Performance`,commitType:`perf`},refactor:{title:`๐Ÿšœ Refactoring`,commitType:`refactor`},docs:{title:`๐Ÿ“š Documentation`,commitType:`docs`},style:{title:`๐ŸŽจ Style`,commitType:`style`},build:{title:`๐Ÿ“ฆ Build`,commitType:`build`},ci:{title:`๐Ÿš€ CI`,commitType:`ci`},revert:{title:`โ™ป๏ธ Reverts`,commitType:`revert`},types:{title:`๐Ÿท๏ธ Types`,commitType:`types`},deps:{title:`๐Ÿงฉ Dependencies`,commitType:`chore`,filter:e=>!!e.scope?.includes(`deps`)},chore:{title:`๐Ÿ› ๏ธ Chores`,commitType:`chore`},test:{title:`๐Ÿงช Tests`,commitType:`test`},misc:{title:`โš™๏ธ Miscellaneous`,commitType:`*`,filter:e=>e.type!==`release`}},c={output:`CHANGELOG.md`,commitRange:`unreleased`,sections:s,header:`# Changelog
1
+ import{existsSync as e,readFileSync as t,writeFileSync as n}from"node:fs";import r from"handlebars";import i from"semver";import{createHash as a}from"node:crypto";import{execSync as o}from"node:child_process";const s={bump:!1,changelog:!1,commit:!1,tag:!1,versionSourceFile:`./package.json`,newTagFormat:`v{{newVersion}}`,prevReleaseTagPattern:/^v?(?<version>\d+\.\d+\.\d+)/,zeroMajorBreakingIsMinor:!0,dryRun:!1,silent:!1,context:{commitHyperlink:!0,refHyperlink:!0},commitsParser:{headerPattern:/^(?<type>\w+)(?:\((?<scope>.+)\))?(?<bang>!)?: (?<subject>.+)/s,breakingChangesPattern:/BREAKING CHANGES?:\s*(?<content>.+)/s,breakingChangeListPattern:/- (.+)/g,tagPattern:/tag: (?<tag>.*?)[,)]/g,coAuthorPattern:/Co-authored-by: (?<name>.+?) <(?<email>.+)>/g,signerPattern:/Signed-off-by: (?<name>.+?) <(?<email>.+)>/g,ghEmailPattern:/^(?:\d+\+)?(?<username>.+)@users\.noreply\.github\.com$/,remoteUrlPattern:/^(https:\/\/|git@)(?<host>[^/:]+)[/:](?<owner>.+?)\/(?<name>.+?)(?:\..*)?$/,refPattern:/^(?<action>.+?) (?<labels>.+)$/gm,refLabelPattern:/(?:(?<owner>\S+?)\/(?<repo>\S+?))?#(?<number>\d+)/g,refActionPattern:/Fixes|Closes|Refs/i,dateSource:`authorDate`,dateFormat:`US`,revertCommitBodyPattern:/^This reverts commit (?<hash>.{7})\./m}},c={breaking:{title:`โš ๏ธ BREAKING CHANGES`,commitType:`breaking`},feat:{title:`โœจ Features`,commitType:`feat`},fix:{title:`๐Ÿฉน Fixes`,commitType:`fix`},perf:{title:`โšก Performance`,commitType:`perf`},refactor:{title:`๐Ÿšœ Refactoring`,commitType:`refactor`},docs:{title:`๐Ÿ“š Documentation`,commitType:`docs`},style:{title:`๐ŸŽจ Style`,commitType:`style`},build:{title:`๐Ÿ“ฆ Build`,commitType:`build`},ci:{title:`๐Ÿš€ CI`,commitType:`ci`},revert:{title:`โ™ป๏ธ Reverts`,commitType:`revert`},types:{title:`๐Ÿท๏ธ Types`,commitType:`types`},deps:{title:`๐Ÿงฉ Dependencies`,commitType:`chore`,filter:e=>!!e.scope?.includes(`deps`)},chore:{title:`๐Ÿ› ๏ธ Chores`,commitType:`chore`},test:{title:`๐Ÿงช Tests`,commitType:`test`},misc:{title:`โš™๏ธ Miscellaneous`,commitType:`*`,filter:e=>e.type!==`release`}},l={output:`CHANGELOG.md`,commitRange:`unreleased`,sections:c,header:`# Changelog
2
2
 
3
3
 
4
- `,prevReleaseHeaderPattern:/^##.*?\d+\.\d+\.\d+/m,helpers:{eq:(e,t)=>e===t,repeat:(e,t)=>e.repeat(t)},partials:{}},l={message:`release({{repo.name}}): {{newTag}}`,signOff:!1,gpgSign:!1,stageAll:!0,extraArgs:``},u={name:`{{newTag}}`,message:`release({{repo.name}}): {{newTag}}`,gpgSign:!1,force:!1,extraArgs:``},d=[{filePathRegex:/package\.json$/,versionPattern:/(^.*?"version".*?")(.*?)(")/s},{filePathRegex:/package-lock\.json$/,versionPattern:/(^.*?"version".*?"|"packages".*?"".*"version".*?")(.*?)(")/gs}],f=async e=>{let t=p(e),n=m(t),r=h(n),i=await g(r),a=b(i);return a},p=e=>{let t=e.profile;if(!t)return e;let n=e[`_${t}`];if(!n)throw Error(`Profile "${t}" not found in configuration.`);let r=(t,...r)=>{let i=e=>Object.prototype.toString.call(e)===`[object Object]`,a=(e,t)=>{let n=i(e),r=i(t);if(n&&r)return{...e,...t};if(!n&&r)return t;if(n&&!r)return e},o=e[t],s=n[t],c=a(o,s);if(c!==void 0)return r.forEach(e=>{c[e]=a(o?.[e],s?.[e])}),c};return{...e,...n,commitsParser:r(`commitsParser`),changelog:r(`changelog`,`partials`,`helpers`),commit:r(`commit`),tag:r(`tag`),context:r(`context`)}},m=e=>{let t=(e,t,n,...r)=>{if(t==null||t===!1)return!1;if(t===!0)return n;if(typeof t!=`object`)throw Error(`Invalid value for ${e}. It should be a boolean or an object.`);let i={...n,...t};return r.forEach(e=>i[e]={...n[e],...t[e]}),i};return{...o,...e,commitsParser:{...o.commitsParser,...e.commitsParser},changelog:t(`changelog`,e.changelog,c,`partials`,`helpers`),commit:t(`commit`,e.commit,l),tag:t(`tag`,e.tag,u)}},h=e=>{let t=e=>{let t=d.find(t=>t.filePathRegex.test(e));if(t)return{filePath:e,versionPattern:t.versionPattern};throw Error(`File ${e} doesn't match any default versioned files. Please provide a custom version pattern for this file.`)},n=e=>{if(e===!1)return!1;if(e===!0)return[i];if(Array.isArray(e))return[i,...e.map(e=>typeof e==`string`?t(e):e)];throw Error(`Invalid value for bump. It should be a boolean or an array.`)},i=typeof e.versionSourceFile==`string`?t(e.versionSourceFile):e.versionSourceFile;return{...e,versionSourceFile:i,bump:n(e.bump),changelog:e.changelog===!1?!1:{...e.changelog,compiledPartials:Object.fromEntries(Object.entries(e.changelog.partials).map(([e,t])=>[e,r.compile(t)]))}}},g=async e=>{let t=e.context??{},n=P(e.commitsParser.remoteUrlPattern);t.repo={...n,...t.repo};let r=e.changelog?e.changelog.commitRange:`unreleased`;t.commits=e.context?.commits?await Promise.all(e.context.commits.map(async t=>typeof t==`object`&&`message`in t||typeof t==`string`?(await D([t],e.commitsParser,e.prevReleaseTagPattern))[0]:t)):await D(r,e.commitsParser,e.prevReleaseTagPattern),t.currentVersion??=S(e.versionSourceFile),t.currentTag??=L(e.prevReleaseTagPattern)[0],t.newVersion??=await C(e,t.currentVersion),t.newTag??=x(e.newTagFormat,t);let i={...e,context:t};return t.releases=e.changelog?_(t.commits,e.changelog.sections,i):null,i},_=(e,t,n)=>{let r={};return e.forEach(e=>{let t=e.tags?.find(e=>n.prevReleaseTagPattern.test(e));if(t)r[t]??={tag:t,version:n.prevReleaseTagPattern.exec(t)?.groups?.version,date:e.date,commits:[e]};else{let t=Object.keys(r).at(-1);t?r[t].commits.push(e):r[n.context.newTag]={tag:n.context.newTag,version:n.context.newVersion,date:e.date,commits:[e]}}}),Object.values(r).map(e=>v(e,t))},v=(e,t)=>{let{commits:n,...r}=e;return{...r,commitTypeGroups:y(n,t)}},y=(e,t)=>{let n=Object.fromEntries(Object.entries(t).map(([e,t])=>[e,{...t,commits:[]}]));return e.forEach(e=>{let r=!!e.breakingChanges,i=!1,a=!1;for(let o in t){if(t[o].filter&&!t[o].filter(e))continue;let s=[t[o].commitType].flat();if(r&&!a&&s.includes(`breaking`)){n[o].commits.push(e),a=!0;continue}if(!i&&(s.includes(e.type)||s.includes(`*`))&&(n[o].commits.push(e),i=!0),i&&(!r||a))return}}),Object.keys(n).forEach(e=>{n[e].commits.length||delete n[e]}),Object.entries(n).map(([e,{title:t,commits:n,commitType:r}])=>({id:e,title:t,commits:n,commitType:r}))},b=e=>({...e,commit:e.commit?{...e.commit,message:x(e.commit.message,e.context)}:e.commit,tag:e.tag?{...e.tag,name:x(e.tag.name,e.context),message:x(e.tag.message,e.context)}:e.tag}),x=(e,t)=>{let n=r.compile(e);return n(t)},S=e=>{let n=t(e.filePath,`utf8`),r=e.versionPattern.exec(n)?.[2];if(!r)throw Error(`Version not found in '${e.filePath}' with pattern '${e.versionPattern}'`);if(!i.valid(r))throw Error(`Invalid version format in '${e.filePath}': '${r}'`);return B(`Current version from '${e.filePath}': '${r}'`),r},C=async(e,t)=>{if(e.releaseVersion){if(!i.valid(e.releaseVersion))throw Error(`Invalid release version format: '${e.releaseVersion}'`);return e.releaseVersion}let n;if(e.releaseType)n=e.releaseType;else{let r=await D(`unreleased`,e.commitsParser,e.prevReleaseTagPattern);n=w(r),e.zeroMajorBreakingIsMinor&&i.major(t)===0&&n===`major`&&(n=`minor`)}let r=T(t,n);return B(`Determined new version: '${r}' (release type: '${n}')`),r},w=e=>{let t=e.some(e=>e.breakingChanges);if(t)return`major`;let n=e.some(e=>e.type===`feat`);return n?`minor`:`patch`},T=(e,t)=>i.inc(e,t)??(()=>{throw Error(`Failed to calculate new version from '${e}' with release type '${t}'`)})();let E=function(e){return e.G=`valid`,e.B=`bad`,e.U=`valid, unknown validity`,e.X=`valid, expired`,e.Y=`valid, made by expired key`,e.R=`valid, made by revoked key`,e.E=`cannot check (missing key)`,e.N=`no signature`,e}({});const D=async(e,t,n)=>{let r=Array.isArray(e)?e:F(e,n),i=t;return(await Promise.all(r.map(async e=>{typeof e==`string`&&(e={message:e});let{hash:t,tagRefs:n}=e,r=e.message.trim();if(!r)throw Error(`Message is missing for commit: ${JSON.stringify(e)}`);let a;try{a=O(r,i)}catch(e){console.warn(`Error parsing commit '${t??`<no hash>`}':`,e.message);return}let{type:o,scope:s,subject:c,body:l,breakingChanges:u,footer:d}=a,f=n?[...n.matchAll(i.tagPattern)].map(e=>e.groups?.tag??``):[],p=d?[...d.matchAll(i.signerPattern)].map(e=>e.groups):[],m=[],h=e=>{m.some(t=>t.email===e.email)||m.push(e)},g=e.authorName&&e.authorEmail?A({name:e.authorName,email:e.authorEmail},p):void 0;g&&h(g);let _=e.committerName&&e.committerEmail?A({name:e.committerName,email:e.committerEmail},p):void 0;_&&h(_);let v=d?[...d.matchAll(i.coAuthorPattern)].map(e=>e.groups).map(e=>A(e,p)):[];v.forEach(e=>h(e));let y=await j(d??``,i),b=e.gpgSigCode?{code:e.gpgSigCode,label:E[e.gpgSigCode],keyId:e.gpgSigKeyId}:void 0,x=e[i.dateSource===`committerDate`?`committerTs`:`authorTs`];typeof x==`string`&&(x=M(new Date(x*1e3),i.dateFormat));let S={hash:t,type:o,scope:s,subject:c,body:l,breakingChanges:u,footer:d,committer:_,gpgSig:b,date:x,tags:f.length?f:void 0,authors:m.length?m:void 0,refs:y.length?y:void 0};return S}))).filter(e=>e!==void 0)},O=(e,t)=>{let[n,...r]=e.split(`
4
+ `,prevReleaseHeaderPattern:/^##.*?\d+\.\d+\.\d+/m,helpers:{eq:(e,t)=>e===t,repeat:(e,t)=>e.repeat(t),isArray:e=>Array.isArray(e)},partials:{}},u={message:`release({{repo.name}}): {{newTag}}`,signOff:!1,gpgSign:!1,stageAll:!0,extraArgs:``},d={name:`{{newTag}}`,message:`release({{repo.name}}): {{newTag}}`,gpgSign:!1,force:!1,extraArgs:``},f=[{filePathRegex:/package\.json$/,versionPattern:/(^.*?"version".*?")(.*?)(")/s},{filePathRegex:/package-lock\.json$/,versionPattern:/(^.*?"version".*?"|"packages".*?"".*"version".*?")(.*?)(")/gs}],p=async e=>{let t=m(e),n=h(t),r=g(n),i=await _(r),a=S(i);return a},m=e=>{let t=e.profile;if(!t)return e;let n=e[`_${t}`];if(!n)throw Error(`Profile "${t}" not found in configuration.`);let r=(t,...r)=>{let i=e=>Object.prototype.toString.call(e)===`[object Object]`,a=(e,t)=>{let n=i(e),r=i(t);if(n&&r)return{...e,...t};if(!n&&r)return t;if(n&&!r)return e},o=e[t],s=n[t],c=a(o,s);if(c!==void 0)return r.forEach(e=>{c[e]=a(o?.[e],s?.[e])}),c};return{...e,...n,commitsParser:r(`commitsParser`),changelog:r(`changelog`,`partials`,`helpers`),commit:r(`commit`),tag:r(`tag`),context:r(`context`)}},h=e=>{let t=(e,t,n,...r)=>{if(t==null||t===!1)return!1;if(t===!0)return n;if(typeof t!=`object`)throw Error(`Invalid value for ${e}. It should be a boolean or an object.`);let i={...n,...t};return r.forEach(e=>i[e]={...n[e],...t[e]}),i};return{...s,...e,commitsParser:{...s.commitsParser,...e.commitsParser},changelog:t(`changelog`,e.changelog,l,`partials`,`helpers`),commit:t(`commit`,e.commit,u),tag:t(`tag`,e.tag,d)}},g=e=>{let t=e=>{let t=f.find(t=>t.filePathRegex.test(e));if(t)return{filePath:e,versionPattern:t.versionPattern};throw Error(`File ${e} doesn't match any default versioned files. Please provide a custom version pattern for this file.`)},n=e=>{if(e===!1)return!1;if(e===!0)return[i];if(Array.isArray(e))return[i,...e.map(e=>typeof e==`string`?t(e):e)];throw Error(`Invalid value for bump. It should be a boolean or an array.`)},i=typeof e.versionSourceFile==`string`?t(e.versionSourceFile):e.versionSourceFile;return{...e,versionSourceFile:i,bump:n(e.bump),changelog:e.changelog===!1?!1:{...e.changelog,compiledPartials:Object.fromEntries(Object.entries(e.changelog.partials).map(([e,t])=>[e,r.compile(t)]))}}},_=async e=>{let t=e.context??{},n=B(e.commitsParser.remoteUrlPattern);t.repo={...n,...t.repo};let r=e.changelog?e.changelog.commitRange:`unreleased`,i=e.context?.commits?(await Promise.all(e.context.commits.map(async t=>typeof t==`object`&&`message`in t||typeof t==`string`?await M(t,e.commitsParser,e.prevReleaseTagPattern):t))).filter(e=>e!=null):await j(r,e.commitsParser,e.prevReleaseTagPattern);t.currentVersion??=w(e.versionSourceFile),t.currentTag??=U(e.prevReleaseTagPattern)[0],t.newVersion??=await T(e,t.currentVersion),t.newTag??=C(e.newTagFormat,t),t.commits=v(i,t.newTag,e.commitsParser.revertCommitBodyPattern);let a={...e,context:t};return t.releases=e.changelog?y(t.commits,e.changelog.sections,a):null,a},v=(e,t,n)=>{let r=(e,t)=>e.map(e=>({...e,associatedReleaseTag:e.associatedReleaseTag??t})),i=e=>e.map(t=>{let r=null,i=e.find(e=>e.type===`revert`&&n.exec(e.body??``)?.groups?.hash===t.hash);return i&&(r=i.associatedReleaseTag===t.associatedReleaseTag?`inTheSameRelease`:`inOtherRelease`),{...t,isReverted:t.isReverted??r}}),a=r(e,t),o=i(a);return o},y=(e,t,n)=>{let r={};return e.forEach(e=>{let t=e.associatedReleaseTag;t in r?r[t].commits.push(e):r[t]={tag:t,version:n.prevReleaseTagPattern.exec(t)?.groups?.version,date:e.date,commits:[e]}}),Object.values(r).map(e=>b(e,t)).filter(e=>Object.keys(e.commitTypeGroups).length)},b=(e,t)=>{let{commits:n,...r}=e;return{...r,commitTypeGroups:x(n,t)}},x=(e,t)=>{let n=Object.fromEntries(Object.entries(t).map(([e,t])=>[e,{...t,commits:[]}]));return e.forEach(e=>{let r=!!e.breakingChanges,i=!1,a=!1;for(let o in t){if(t[o].filter&&!t[o].filter(e))continue;let s=[t[o].commitType].flat();if(r&&!a&&s.includes(`breaking`)){n[o].commits.push(e),a=!0;continue}if(!i&&(s.includes(e.type)||s.includes(`*`))&&(n[o].commits.push(e),i=!0),i&&(!r||a))return}}),Object.keys(n).forEach(e=>{n[e].commits.length||delete n[e]}),n},S=e=>({...e,commit:e.commit?{...e.commit,message:C(e.commit.message,e.context)}:e.commit,tag:e.tag?{...e.tag,name:C(e.tag.name,e.context),message:C(e.tag.message,e.context)}:e.tag}),C=(e,t)=>{let n=r.compile(e);return n(t)},w=e=>{let n=t(e.filePath,`utf8`),r=e.versionPattern.exec(n)?.[2];if(!r)throw Error(`Version not found in '${e.filePath}' with pattern '${e.versionPattern}'`);if(!i.valid(r))throw Error(`Invalid version format in '${e.filePath}': '${r}'`);return K(`Current version from '${e.filePath}': '${r}'`),r},T=async(e,t)=>{if(e.releaseVersion){if(!i.valid(e.releaseVersion))throw Error(`Invalid release version format: '${e.releaseVersion}'`);return e.releaseVersion}let n;if(e.releaseType)n=e.releaseType;else{let r=await j(`unreleased`,e.commitsParser,e.prevReleaseTagPattern);n=E(r),e.zeroMajorBreakingIsMinor&&i.major(t)===0&&n===`major`&&(n=`minor`)}let r=D(t,n);return K(`Determined new version: '${r}' (release type: '${n}')`),r},E=e=>{let t=e.some(e=>e.breakingChanges);if(t)return`major`;let n=e.some(e=>e.type===`feat`);return n?`minor`:`patch`},D=(e,t)=>i.inc(e,t)??(()=>{throw Error(`Failed to calculate new version from '${e}' with release type '${t}'`)})();let O=function(e){return e.G=`valid`,e.B=`bad`,e.U=`valid, unknown validity`,e.X=`valid, expired`,e.Y=`valid, made by expired key`,e.R=`valid, made by revoked key`,e.E=`cannot check (missing key)`,e.N=`no signature`,e}({});const k={};let A;const j=async(e,t,n)=>{let r=Array.isArray(e)?e:V(e,n),i=t,a=(await Promise.all(r.map(async e=>M(e,i,n)))).filter(e=>e!==null);return A=void 0,a},M=async(e,t,n)=>{typeof e==`string`&&(e={message:e});let{tagRefs:r,hash:i=N(e.message)}=e;if(i in k)return k[i];let a=e.message.trim();if(!a)throw Error(`Message is missing for commit: ${JSON.stringify(e)}`);let o;try{o=P(a,t)}catch(e){return console.warn(`Error parsing commit '${i}':`,e.message),null}let{type:s,scope:c,subject:l,body:u,breakingChanges:d,footer:f}=o,p=r?[...r.matchAll(t.tagPattern)].map(e=>e.groups?.tag??``):[],m=f?[...f.matchAll(t.signerPattern)].map(e=>e.groups):[],h=[],g=e=>{h.some(t=>t.email===e.email)||h.push(e)},_=e.authorName&&e.authorEmail?I({name:e.authorName,email:e.authorEmail},m):void 0;_&&g(_);let v=e.committerName&&e.committerEmail?I({name:e.committerName,email:e.committerEmail},m):void 0;v&&g(v);let y=f?[...f.matchAll(t.coAuthorPattern)].map(e=>e.groups).map(e=>I(e,m)):[];y.forEach(e=>g(e));let b=await L(f??``,t),x=e.gpgSigCode?{code:e.gpgSigCode,label:O[e.gpgSigCode],keyId:e.gpgSigKeyId}:void 0,S=e[t.dateSource===`committerDate`?`committerTs`:`authorTs`];typeof S==`string`&&(S=R(new Date(S*1e3),t.dateFormat));let C=p.find(e=>n.exec(e)),w=C??A;w&&(A=w);let T={hash:i,type:s,scope:c,subject:l,body:u,breakingChanges:d,footer:f,committer:v,gpgSig:x,date:S,releaseTag:C,associatedReleaseTag:w,tags:p.length?p:void 0,authors:h.length?h:void 0,refs:b.length?b:void 0};return i&&!(i in k)&&(k[i]=T),T},N=e=>`fake_`+a(`sha256`).update(e,`utf8`).digest(`hex`).slice(0,7),P=(e,t)=>{let[n,...r]=e.split(`
5
5
 
6
- `),i=t.headerPattern.exec(n);if(!i?.groups)throw Error(`Commit header '${n}' doesn't match expected format`);let{type:a,scope:o,bang:s,subject:c}=i.groups,l,u=r.find(e=>t.breakingChangesPattern.test(e));u?(l=k(u,t),r.splice(r.indexOf(u),1)):s&&(l=c);let d=r.findIndex(e=>e.match(t.refActionPattern)??e.match(t.coAuthorPattern)??e.match(t.signerPattern)),[f,p]=d===-1?[r.join(`
6
+ `),i=t.headerPattern.exec(n);if(!i?.groups)throw Error(`Commit header '${n}' doesn't match expected format`);let{type:a,scope:o,bang:s,subject:c}=i.groups,l,u=r.find(e=>t.breakingChangesPattern.test(e));u?(l=F(u,t),r.splice(r.indexOf(u),1)):s&&(l=c);let d=r.findIndex(e=>e.match(t.refActionPattern)??e.match(t.coAuthorPattern)??e.match(t.signerPattern)),[f,p]=d===-1?[r.join(`
7
7
 
8
8
  `),``]:[r.slice(0,d).join(`
9
9
 
10
10
  `),r.slice(d).join(`
11
11
 
12
- `)];return{type:a,scope:o||void 0,subject:c,body:f||void 0,breakingChanges:l,footer:p||void 0}},k=(e,t)=>{let n=t.breakingChangesPattern.exec(e)?.groups?.content;if(!n)throw Error(`Failed to extract breaking changes content from '${e}' using pattern "${t.breakingChangesPattern}"`);let r=[...n.matchAll(t.breakingChangeListPattern)];return r.length?r.map(e=>e[1]):n},A=(e,t)=>{let n=t.some(t=>t.email===e.email&&t.name===e.name);return{...e,hasSignedOff:n,ghLogin:e.name,ghUrl:`https://github.com/${e.name}`}},j=async(e,t)=>await Promise.all([...e.matchAll(t.refPattern)].map(e=>e.groups).filter(e=>t.refActionPattern.test(e.action)).flatMap(e=>[...e.labels.matchAll(t.refLabelPattern)].map(e=>e.groups).filter(e=>!!e.number).map(t=>({action:e.action,owner:t.owner,repo:t.repo,number:t.number})))),M=(e,t)=>{let n=e=>e.toString().padStart(2,`0`),r={YYYY:e.getUTCFullYear().toString(),MM:n(e.getUTCMonth()+1),DD:n(e.getUTCDate()),HH:n(e.getUTCHours()),mm:n(e.getUTCMinutes()),ss:n(e.getUTCSeconds())};return t.replace(/YYYY|MM|DD|HH|mm|ss/g,e=>r[e])},N=/##COMMIT##\n#HASH# (?<hash>.+)?\n#MSG# (?<message>[\s\S]*?)\n#REFS#\s+(?<tagRefs>.+)?\n#AUTHOR-NAME# (?<authorName>.+)?\n#AUTHOR-EMAIL# (?<authorEmail>.+)?\n#AUTHOR-DATE# (?<authorTs>.+)?\n#COMMITTER-NAME# (?<committerName>.+)?\n#COMMITTER-EMAIL# (?<committerEmail>.+)?\n#COMMITTER-DATE# (?<committerTs>.+)?\n#GPGSIG-CODE# (?<gpgSigCode>.+)?\n#GPGSIG-KEYID# (?<gpgSigKeyId>.+)?/g,P=e=>{let t=a(`git remote get-url origin`,{encoding:`utf8`}).trim(),n=e.exec(t);if(!n?.groups)throw Error(`Couldn't parse remote URL: `+t);let{host:r,owner:i,name:o}=n.groups,s=`https://${r}/${i}/${o}`;return{host:r,owner:i,name:o,homepage:s}},F=(e,t)=>{let n=I(),r=L(t),i,o;if(e===`all`)i=n,o=`HEAD`;else if(e===`unreleased`)i=r[0]??n,o=`HEAD`;else if(e===`latest-release`)i=r[1]??n,o=r[0]??`HEAD`;else if(`from`in e||`to`in e){let t=`from`in e?e.from:`firstCommit`;i=t===`firstCommit`?n:t,o=`to`in e?e.to:`HEAD`}else if(`versionTag`in e){let t=r.indexOf(e.versionTag);if(t===-1)throw Error(`Version tag '${e.versionTag}' not found`);i=r[t],o=r[t+1]??`HEAD`}else throw Error(`Invalid commit range provided`);let s=a(`git log "${i}..${o}" --pretty="##COMMIT##%n#HASH# %h%n#MSG# %B%n#REFS# %d%n#AUTHOR-NAME# %an%n#AUTHOR-EMAIL# %ae%n#AUTHOR-DATE# %at%n#COMMITTER-NAME# %cn%n#COMMITTER-EMAIL# %ce%n#COMMITTER-DATE# %ct%n#GPGSIG-CODE# %G?%n#GPGSIG-KEYID# %GK%n"`,{encoding:`utf8`});return[...s.matchAll(N)].map(e=>e.groups)},I=()=>a(`git rev-list --max-parents=0 HEAD`,{encoding:`utf8`}).trim(),L=e=>{let t=a(`git tag --sort=-creatordate`,{encoding:`utf8`});return t.split(`
13
- `).filter(t=>e.test(t))};let R=!1;const z=e=>R=e,B=(...e)=>{R||console.log(...e)},V={...s,pick(...e){return Object.fromEntries(e.map(e=>[e,this[e]]))},omit(...e){let t=new Set(e);return Object.fromEntries(Object.entries(this).filter(([e])=>!t.has(e)))}},H=e=>{if(!e.bump)return;let r=e.bump,i=e.context.newVersion;r.forEach(r=>{let a=t(r.filePath,`utf8`),o=a.replace(r.versionPattern,`$1${i}$3`);e.dryRun||n(r.filePath,o,`utf8`),B(`Updated version in '${r.filePath}' to '${i}'`)})};var U=`{{#>header}}
12
+ `)];return{type:a,scope:o||void 0,subject:c,body:f||void 0,breakingChanges:l,footer:p||void 0}},F=(e,t)=>{let n=t.breakingChangesPattern.exec(e)?.groups?.content;if(!n)throw Error(`Failed to extract breaking changes content from '${e}' using pattern "${t.breakingChangesPattern}"`);let r=[...n.matchAll(t.breakingChangeListPattern)];return r.length?r.map(e=>e[1]):n},I=(e,t)=>{let n=t.some(t=>t.email===e.email&&t.name===e.name);return{...e,hasSignedOff:n,ghLogin:e.name,ghUrl:`https://github.com/${e.name}`}},L=async(e,t)=>await Promise.all([...e.matchAll(t.refPattern)].map(e=>e.groups).filter(e=>t.refActionPattern.test(e.action)).flatMap(e=>[...e.labels.matchAll(t.refLabelPattern)].map(e=>e.groups).filter(e=>!!e.number).map(t=>({action:e.action,owner:t.owner,repo:t.repo,number:t.number})))),R=(e,t)=>{let n=e=>e.toString().padStart(2,`0`);if(t===`US`)return e.toLocaleString(`en-US`,{month:`short`,day:`numeric`,year:`numeric`});if(t===`ISO`)return e.toISOString().split(`T`)[0];let r={YYYY:e.getUTCFullYear().toString(),MM:n(e.getUTCMonth()+1),DD:n(e.getUTCDate()),HH:n(e.getUTCHours()),mm:n(e.getUTCMinutes()),ss:n(e.getUTCSeconds())};return t.replace(/YYYY|MM|DD|HH|mm|ss/g,e=>r[e])},z=/##COMMIT##\n#HASH# (?<hash>.+)?\n#MSG# (?<message>[\s\S]*?)\n#REFS#\s+(?<tagRefs>.+)?\n#AUTHOR-NAME# (?<authorName>.+)?\n#AUTHOR-EMAIL# (?<authorEmail>.+)?\n#AUTHOR-DATE# (?<authorTs>.+)?\n#COMMITTER-NAME# (?<committerName>.+)?\n#COMMITTER-EMAIL# (?<committerEmail>.+)?\n#COMMITTER-DATE# (?<committerTs>.+)?\n#GPGSIG-CODE# (?<gpgSigCode>.+)?\n#GPGSIG-KEYID# (?<gpgSigKeyId>.+)?/g,B=e=>{let t=o(`git remote get-url origin`,{encoding:`utf8`}).trim(),n=e.exec(t);if(!n?.groups)throw Error(`Couldn't parse remote URL: `+t);let{host:r,owner:i,name:a}=n.groups,s=`https://${r}/${i}/${a}`;return{host:r,owner:i,name:a,homepage:s}},V=(e,t)=>{let n=H(),r=U(t),i=``,a=``,s=``;if(e===`all`)i=`{{firstCommit}}`,a=`HEAD`;else if(e===`unreleased`)i=r[0]??`{{firstCommit}}`,a=`HEAD`;else if(e===`latest-release`)i=r[1]??`{{firstCommit}}`,a=r[0]??`HEAD`;else if(typeof e==`object`){let t=r.indexOf(e.versionTag);if(t===-1)throw Error(`Version tag '${e.versionTag}' not found`);i=r[t+1]??`{{firstCommit}}`,a=r[t]}else s=e;i&&a&&(s=i===`{{firstCommit}}`?`"${i}^!" ${a}`:`"${i}..${a}"`),s=s.replace(`{{firstCommit}}`,n);let c=o(`git log ${s} --pretty="##COMMIT##%n#HASH# %h%n#MSG# %B%n#REFS# %d%n#AUTHOR-NAME# %an%n#AUTHOR-EMAIL# %ae%n#AUTHOR-DATE# %at%n#COMMITTER-NAME# %cn%n#COMMITTER-EMAIL# %ce%n#COMMITTER-DATE# %ct%n#GPGSIG-CODE# %G?%n#GPGSIG-KEYID# %GK%n"`,{encoding:`utf8`});return[...c.matchAll(z)].map(e=>e.groups)},H=()=>o(`git rev-list --max-parents=0 HEAD`,{encoding:`utf8`}).trim(),U=e=>{let t=o(`git tag --sort=-creatordate`,{encoding:`utf8`});return t.split(`
13
+ `).filter(t=>e.test(t))};let W=!1;const G=e=>W=e,K=(...e)=>{W||console.log(...e)},q={...c,pick(...e){return Object.fromEntries(e.map(e=>[e,this[e]]))},omit(...e){let t=new Set(e);return Object.fromEntries(Object.entries(this).filter(([e])=>!t.has(e)))}},J=e=>{if(!e.bump)return;let r=e.bump,i=e.context.newVersion;r.forEach(r=>{let a=t(r.filePath,`utf8`),o=a.replace(r.versionPattern,`$1${i}$3`);e.dryRun||n(r.filePath,o,`utf8`),K(`Updated version in '${r.filePath}' to '${i}'`)})};var Y=`{{#>header}}
14
14
  ## &ensp; [\` ๐Ÿ“ฆ {{tag}} \`]({{repo.homepage}}/{{#if prevTag}}compare/{{prevTag}}...{{tag}}{{else}}commits/{{tag}}{{/if}})
15
15
 
16
16
  {{/header}}
17
17
  {{#each commitTypeGroups}}
18
18
  ### {{{repeat '&nbsp;' 5}}}{{title}}
19
+ {{#if (eq @key 'breaking')}}
20
+ {{#each commits}}
21
+ {{#if (isArray breakingChanges)}}
22
+ {{~#each breakingChanges~}}
23
+ - {{{this}}}
24
+ {{/each}}
25
+ {{else~}}
26
+ - {{{breakingChanges}}}
27
+ {{/if}}
28
+ {{/each}}
29
+ {{else}}
19
30
  {{#each commits}}
20
- * {{#if scope}}**{{scope}}**: {{/if}}{{#if (eq ../id 'breaking')}}{{{breakingChanges}}}{{else}}{{{subject}}}{{/if}} {{#if ../../commitHyperlink}}[\`{{hash}}\`]({{../../repo.homepage}}/commit/{{hash}}){{else}}{{hash}}{{/if}}
31
+ - {{#if scope}}**{{scope}}**: {{/if}}{{{subject}}} {{#if ../../commitHyperlink}}[\`{{hash}}\`]({{../../repo.homepage}}/commit/{{hash}}){{else}}{{hash}}{{/if}}
21
32
  {{/each}}
33
+ {{/if}}
22
34
 
23
35
  {{/each}}
24
- ##### &emsp;&ensp;&nbsp;&nbsp; [_All Release Commits_]{{#if prevTag}}({{repo.homepage}}/compare/{{prevTag}}...{{tag}}){{else}}\`{{tag}}\`]({{repo.homepage}}/commits/{{tag}}){{/if}} &ensp;โ€ข&ensp; _{{date}}_
36
+ {{#>footer}}
37
+ ##### &emsp;&ensp;&nbsp;&nbsp; [_All Release Commits_]
38
+ {{~#if prevTag~}}
39
+ ({{repo.homepage}}/compare/{{prevTag}}...{{tag}})
40
+ {{~else~}}
41
+ ({{repo.homepage}}/commits/{{tag}})
42
+ {{~/if}}
43
+ {{" "}} &ensp;โ€ข&ensp; _{{date}}_
25
44
 
26
45
 
27
- `;const W=e=>{if(!e.changelog)return;let t=e.changelog,n=e.context.releases;if(!n)return;let i=L(e.prevReleaseTagPattern);r.registerPartial(t.compiledPartials),r.registerHelper(t.helpers);let a=t.header;n.forEach((t,r)=>{let o=n[r+1],s,c;if(o)s=o.tag,c=q(s,e.prevReleaseTagPattern);else{let n=i.indexOf(t.tag);n===-1?(s=e.context.currentTag,c=q(s,e.prevReleaseTagPattern)):(s=i[n+1],c=s&&q(s,e.prevReleaseTagPattern))}let l={...t,...e.context,prevTag:s,prevVersion:c},u=K(U,l);a+=u}),t.output===`stdout`?(B(`Generated changelog:`),console.log(a)):(B(`Writing changelog to file '${t.output}'`),e.dryRun||G(t.output,a,t.prevReleaseHeaderPattern))},G=(r,i,a)=>{let o=e(r)?t(r,{encoding:`utf8`}):``,s=o.search(a),c=o.slice(s),l=i+c;n(r,l,{encoding:`utf8`})},K=(e,t)=>{let n=r.compile(e);return n(t)},q=(e,t)=>t.exec(e)?.groups?.version,J=e=>{if(!e.commit)return;let t=e.commit;B(`Committing with options:`,t),t.stageAll&&!e.dryRun&&a(`git add -A`,{stdio:`inherit`}),e.dryRun||a(`git commit -m "${t.message}" ${t.signOff?`-s`:``} ${t.gpgSign?`-S`:``} ${t.extraArgs}`,{stdio:`inherit`})},Y=e=>{if(!e.tag)return;let t=e.tag;B(`Tagging with options:`,t),e.dryRun||a(`git tag -a ${t.name} -m "${t.message}" ${t.gpgSign?`-s`:``} ${t.force?`-f`:``} ${t.extraArgs}`,{stdio:`inherit`})};async function X(e){z(!!e.silent||!!e.profile&&!!e[`_${e.profile}`]?.silent);let t=await f(e);H(t),W(t),J(t),Y(t)}const Z=e=>e;export{V as changelogSectionsSelector,X as default,Z as defineConfig};
46
+ {{/footer}}`;const X=e=>{if(!e.changelog)return;let t=e.changelog,n=e.context.releases;if(!n)return;let i=U(e.prevReleaseTagPattern);r.registerPartial(t.compiledPartials),r.registerHelper(t.helpers);let a=t.header;n.forEach((t,r)=>{let o=n[r+1],s,c;if(o)s=o.tag,c=$(s,e.prevReleaseTagPattern);else{let n=i.indexOf(t.tag);n===-1?(s=e.context.currentTag,c=$(s,e.prevReleaseTagPattern)):(s=i[n+1],c=s&&$(s,e.prevReleaseTagPattern))}let l={...t,...e.context,prevTag:s,prevVersion:c},u=Q(Y,l);a+=u}),t.output===`stdout`?(K(`Generated changelog:`),console.log(a)):(K(`Writing changelog to file '${t.output}'`),e.dryRun||Z(t.output,a,t.prevReleaseHeaderPattern))},Z=(r,i,a)=>{let o=e(r)?t(r,{encoding:`utf8`}):``,s=o.search(a),c=o.slice(s),l=i+c;n(r,l,{encoding:`utf8`})},Q=(e,t)=>{let n=r.compile(e);return n(t)},$=(e,t)=>t.exec(e)?.groups?.version,ee=e=>{if(!e.commit)return;let t=e.commit;K(`Committing with options:`,t),t.stageAll&&!e.dryRun&&o(`git add -A`,{stdio:`inherit`}),e.dryRun||o(`git commit -m "${t.message}" ${t.signOff?`-s`:``} ${t.gpgSign?`-S`:``} ${t.extraArgs}`,{stdio:`inherit`})},te=e=>{if(!e.tag)return;let t=e.tag;K(`Tagging with options:`,t),e.dryRun||o(`git tag -a ${t.name} -m "${t.message}" ${t.gpgSign?`-s`:``} ${t.force?`-f`:``} ${t.extraArgs}`,{stdio:`inherit`})};async function ne(e){G(!!e.silent||!!e.profile&&!!e[`_${e.profile}`]?.silent);let t=await p(e);J(t),X(t),ee(t),te(t)}const re=e=>e;export{q as changelogSectionsSelector,ne as default,re as defineConfig};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "relion",
3
- "version": "0.8.0",
3
+ "version": "0.10.0",
4
4
  "description": "Release workflow helper for Node.js projects.",
5
5
  "author": "Kh4f <kh4f.dev@gmail.com>",
6
6
  "license": "MIT",
@@ -56,10 +56,10 @@
56
56
  "scripts": {
57
57
  "build": "tsdown",
58
58
  "lint": "eslint",
59
- "test": "vitest run",
59
+ "test": "vitest run index",
60
60
  "build:watch": "tsdown --watch",
61
61
  "build:prod": "tsdown --production",
62
- "test:watch": "vitest",
62
+ "test:watch": "vitest index",
63
63
  "lint:fix": "eslint --fix",
64
64
  "release": "node dist/cli.js -blct",
65
65
  "release:github": "node dist/cli.js -l -p github -L"