relion 0.18.0 → 0.20.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/cli.js +1 -1
- package/dist/index.d.ts +37 -26
- package/dist/index.js +31 -38
- package/package.json +10 -10
package/dist/cli.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{resolve as e}from"node:path";import{pathToFileURL as t}from"node:url";import n from"./index.js";import{cli as r}from"cleye";const i=async n=>{try{return(await import(t(e(process.cwd(),n)).href)).default}catch(e){throw Error(`Error loading config: ${e.message}`)}};import.meta.main&&await a();async function a(e,t){typeof e==`string`&&(e=e.split(` `)),e&&=[e].flat();let a=r({name:`relion`,flags:{config:{alias:`c`,type:String,description:`Path to the config file`,default:`relion.config.ts`},bump:{alias:`b`,type:Boolean,description:`Bump the version`,default:!1},changelog:{alias:`l`,type:Boolean,description:`Generate a changelog`,default:!1},commit:{alias:`m`,type:Boolean,description:`Create a commit`,default:!1},tag:{alias:`t`,type:Boolean,description:`Create a tag`,default:!1},profile:{alias:`p`,type:String,description:`Use config profile`},dry:{alias:`d`,type:Boolean,description:`Run without making any changes`,default:!1},latest:{alias:`L`,type:Boolean,description:`Use the latest-release commit range in changelog`,default:!1}}},void 0,e?[...e]:process.argv.slice(2));if(a)return t??=await i(a.flags.config),t.bump||=a.flags.bump,t.changelog||=a.flags.changelog,t.commit||=a.flags.commit,t.tag||=a.flags.tag,t.profile??=a.flags.profile,t.dryRun??=a.flags.dry,a.flags.latest&&t.changelog&&(t.changelog===!0&&(t.changelog={}),t.changelog.commitRange=`latest-release`),{inputConfig:t,...n(t)}}export{a as runCli};
|
|
1
|
+
import{resolve as e}from"node:path";import{pathToFileURL as t}from"node:url";import n from"./index.js";import{cli as r}from"cleye";const i=async n=>{try{return(await import(t(e(process.cwd(),n)).href)).default}catch(e){throw Error(`Error loading config: ${e.message}`)}};import.meta.main&&await a();async function a(e,t){typeof e==`string`&&(e=e.split(` `)),e&&=[e].flat();let a=r({name:`relion`,flags:{config:{alias:`c`,type:String,description:`Path to the config file`,default:`relion.config.ts`},bump:{alias:`b`,type:Boolean,description:`Bump the version`,default:!1},changelog:{alias:`l`,type:Boolean,description:`Generate a changelog`,default:!1},commit:{alias:`m`,type:Boolean,description:`Create a commit`,default:!1},tag:{alias:`t`,type:Boolean,description:`Create a tag`,default:!1},profile:{alias:`p`,type:String,description:`Use config profile`},dry:{alias:`d`,type:Boolean,description:`Run without making any changes`,default:!1},latest:{alias:`L`,type:Boolean,description:`Use the latest-release commit range in changelog`,default:!1}}},void 0,e?[...e]:process.argv.slice(2));if(a)return t??=await i(a.flags.config),t.bump||=a.flags.bump,t.changelog||=a.flags.changelog,t.commit||=a.flags.commit,t.tag||=a.flags.tag,t.profile??=a.flags.profile,t.dryRun??=a.flags.dry,a.flags.latest&&t.changelog&&(t.changelog===!0&&(t.changelog={}),t.changelog.commitRange=`latest-release`),{inputConfig:t,...await n(t)}}export{a as runCli};
|
package/dist/index.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ interface UserConfig {
|
|
|
10
10
|
newTagPrefix?: string;
|
|
11
11
|
newTagFormat?: string;
|
|
12
12
|
versionSource?: 'versionSourceFile' | 'latest-release-tag';
|
|
13
|
-
versionSourceFile?: string |
|
|
13
|
+
versionSourceFile?: string | Bumper;
|
|
14
14
|
releaseType?: ReleaseType;
|
|
15
15
|
zeroMajorBreakingIsMinor?: boolean;
|
|
16
16
|
context?: Context;
|
|
@@ -29,23 +29,26 @@ interface MergedConfig extends Omit<Required<UserConfig>, OptionalKeys>, Pick<Us
|
|
|
29
29
|
commitsParser: CompleteCommitsParser;
|
|
30
30
|
}
|
|
31
31
|
interface TransformedConfig extends Omit<MergedConfig, 'changelog'> {
|
|
32
|
-
versionSourceFile:
|
|
33
|
-
bump: FalseOrComplete<
|
|
32
|
+
versionSourceFile: Bumper;
|
|
33
|
+
bump: FalseOrComplete<Bumper[]>;
|
|
34
34
|
changelog: false | ResolvedChangelogOptions;
|
|
35
35
|
}
|
|
36
36
|
interface ResolvedConfig extends TransformedConfig {
|
|
37
37
|
context: ResolvedContext;
|
|
38
38
|
}
|
|
39
|
-
type BumpFiles = (string |
|
|
39
|
+
type BumpFiles = (string | Bumper)[];
|
|
40
40
|
interface ChangelogOptions {
|
|
41
41
|
output?: 'stdout' | (string & {});
|
|
42
42
|
commitRange?: CommitRange;
|
|
43
|
+
commitsScope?: string;
|
|
43
44
|
sections?: TypeGroupsMap;
|
|
44
45
|
header?: string;
|
|
45
46
|
prevReleaseHeaderPattern?: RegExp;
|
|
46
47
|
groupCommitsByScope?: boolean;
|
|
48
|
+
maxLinesPerRelease?: number;
|
|
47
49
|
helpers?: HelperDeclareSpec;
|
|
48
50
|
partials?: Record<string, string | ((fallback: string) => string)>;
|
|
51
|
+
review?: boolean;
|
|
49
52
|
}
|
|
50
53
|
type CompleteChangelogOptions = Required<ChangelogOptions>;
|
|
51
54
|
interface ResolvedChangelogOptions extends Omit<CompleteChangelogOptions, 'partials'> {
|
|
@@ -91,7 +94,7 @@ interface RepoInfo {
|
|
|
91
94
|
homepage?: string;
|
|
92
95
|
}
|
|
93
96
|
interface Context {
|
|
94
|
-
commits?: ParsedCommit
|
|
97
|
+
commits?: (ParsedCommit | RawCommit | string)[];
|
|
95
98
|
currentVersion?: string;
|
|
96
99
|
currentTag?: string;
|
|
97
100
|
newVersion?: string;
|
|
@@ -108,12 +111,12 @@ type CommitRange = 'all' | 'unreleased' | 'latest-release' | {
|
|
|
108
111
|
releaseTag: string;
|
|
109
112
|
} | (string & {});
|
|
110
113
|
type ReleaseType = 'major' | 'minor' | 'patch';
|
|
111
|
-
interface
|
|
114
|
+
interface Bumper {
|
|
112
115
|
file: string;
|
|
113
116
|
pattern: RegExp;
|
|
114
117
|
replacement: string;
|
|
115
118
|
}
|
|
116
|
-
interface
|
|
119
|
+
interface DefaultBumper extends Omit<Bumper, 'file'> {
|
|
117
120
|
file: RegExp;
|
|
118
121
|
}
|
|
119
122
|
//#endregion
|
|
@@ -134,7 +137,7 @@ declare enum RefType {
|
|
|
134
137
|
}
|
|
135
138
|
//#endregion
|
|
136
139
|
//#region src/types/commit.d.ts
|
|
137
|
-
|
|
140
|
+
interface RawCommit {
|
|
138
141
|
hash?: string;
|
|
139
142
|
message: string;
|
|
140
143
|
tagRefs?: string;
|
|
@@ -146,7 +149,7 @@ type RawCommit = string | {
|
|
|
146
149
|
committerTs?: string;
|
|
147
150
|
gpgSigCode?: GpgSigCode;
|
|
148
151
|
gpgSigKeyId?: string;
|
|
149
|
-
}
|
|
152
|
+
}
|
|
150
153
|
interface ParsedCommit extends CommitMessage {
|
|
151
154
|
hash: string;
|
|
152
155
|
tags?: string[];
|
|
@@ -174,10 +177,11 @@ interface CommitMessage {
|
|
|
174
177
|
}
|
|
175
178
|
interface Reference {
|
|
176
179
|
action: string;
|
|
180
|
+
raw: string;
|
|
181
|
+
number: string;
|
|
177
182
|
type?: RefType;
|
|
178
183
|
owner?: string;
|
|
179
184
|
repo?: string;
|
|
180
|
-
number: string;
|
|
181
185
|
}
|
|
182
186
|
type RefLabel = Pick<Reference, 'owner' | 'repo' | 'number'>;
|
|
183
187
|
interface Contributor {
|
|
@@ -204,23 +208,36 @@ declare const defaultChangelogSections: {
|
|
|
204
208
|
readonly breaking: {
|
|
205
209
|
readonly title: "⚠️ BREAKING CHANGES";
|
|
206
210
|
readonly commitType: "breaking";
|
|
211
|
+
readonly show: "always";
|
|
207
212
|
};
|
|
208
213
|
readonly feat: {
|
|
209
214
|
readonly title: "✨ Features";
|
|
210
215
|
readonly commitType: "feat";
|
|
216
|
+
readonly show: "always";
|
|
211
217
|
};
|
|
212
218
|
readonly fix: {
|
|
213
219
|
readonly title: "🩹 Fixes";
|
|
214
220
|
readonly commitType: "fix";
|
|
221
|
+
readonly show: "always";
|
|
215
222
|
};
|
|
216
223
|
readonly perf: {
|
|
217
224
|
readonly title: "⚡ Performance";
|
|
218
225
|
readonly commitType: "perf";
|
|
226
|
+
readonly show: "always";
|
|
227
|
+
};
|
|
228
|
+
readonly revert: {
|
|
229
|
+
readonly title: "♻️ Reverts";
|
|
230
|
+
readonly commitType: "revert";
|
|
231
|
+
readonly show: "always";
|
|
219
232
|
};
|
|
220
233
|
readonly refactor: {
|
|
221
234
|
readonly title: "🚜 Refactoring";
|
|
222
235
|
readonly commitType: "refactor";
|
|
223
236
|
};
|
|
237
|
+
readonly build: {
|
|
238
|
+
readonly title: "📦 Build";
|
|
239
|
+
readonly commitType: "build";
|
|
240
|
+
};
|
|
224
241
|
readonly docs: {
|
|
225
242
|
readonly title: "📚 Documentation";
|
|
226
243
|
readonly commitType: "docs";
|
|
@@ -229,18 +246,14 @@ declare const defaultChangelogSections: {
|
|
|
229
246
|
readonly title: "🎨 Style";
|
|
230
247
|
readonly commitType: "style";
|
|
231
248
|
};
|
|
232
|
-
readonly
|
|
233
|
-
readonly title: "
|
|
234
|
-
readonly commitType: "
|
|
249
|
+
readonly test: {
|
|
250
|
+
readonly title: "🧪 Tests";
|
|
251
|
+
readonly commitType: "test";
|
|
235
252
|
};
|
|
236
253
|
readonly ci: {
|
|
237
254
|
readonly title: "🚀 CI";
|
|
238
255
|
readonly commitType: "ci";
|
|
239
256
|
};
|
|
240
|
-
readonly revert: {
|
|
241
|
-
readonly title: "♻️ Reverts";
|
|
242
|
-
readonly commitType: "revert";
|
|
243
|
-
};
|
|
244
257
|
readonly types: {
|
|
245
258
|
readonly title: "🏷️ Types";
|
|
246
259
|
readonly commitType: "types";
|
|
@@ -254,10 +267,6 @@ declare const defaultChangelogSections: {
|
|
|
254
267
|
readonly title: "🛠️ Chores";
|
|
255
268
|
readonly commitType: "chore";
|
|
256
269
|
};
|
|
257
|
-
readonly test: {
|
|
258
|
-
readonly title: "🧪 Tests";
|
|
259
|
-
readonly commitType: "test";
|
|
260
|
-
};
|
|
261
270
|
readonly misc: {
|
|
262
271
|
readonly title: "⚙️ Miscellaneous";
|
|
263
272
|
readonly commitType: "*";
|
|
@@ -270,6 +279,7 @@ interface TypeGroupDefinition {
|
|
|
270
279
|
title: string;
|
|
271
280
|
commitType: 'breaking' | '*' | (string & {}) | string[];
|
|
272
281
|
filter?: (commit: ResolvedCommit) => boolean;
|
|
282
|
+
show?: 'always' | 'limit-or-breaking' | 'only-breaking' | 'never';
|
|
273
283
|
}
|
|
274
284
|
type TypeGroupsMap = Record<string, TypeGroupDefinition>;
|
|
275
285
|
interface ScopeGroup {
|
|
@@ -294,9 +304,10 @@ interface ReleaseContext extends ReleaseWithTypeGroups, ResolvedContext {
|
|
|
294
304
|
prevRelease: Partial<ReleaseWithTypeGroups>;
|
|
295
305
|
}
|
|
296
306
|
type DefaultChangelogSections = typeof defaultChangelogSections;
|
|
297
|
-
interface
|
|
307
|
+
interface SectionsSelector extends DefaultChangelogSections {
|
|
298
308
|
pick(...keys: (keyof DefaultChangelogSections)[]): Partial<DefaultChangelogSections>;
|
|
299
|
-
omit(...keys: (keyof
|
|
309
|
+
omit(...keys: (keyof this)[]): SectionsSelector;
|
|
310
|
+
modify(key: keyof DefaultChangelogSections, modify: (section: TypeGroupDefinition) => TypeGroupDefinition): Partial<DefaultChangelogSections>;
|
|
300
311
|
}
|
|
301
312
|
//#endregion
|
|
302
313
|
//#region src/types/result.d.ts
|
|
@@ -308,12 +319,12 @@ interface RelionResult {
|
|
|
308
319
|
}
|
|
309
320
|
//#endregion
|
|
310
321
|
//#region src/relion.d.ts
|
|
311
|
-
declare function relion(userConfig: UserConfig): RelionResult
|
|
322
|
+
declare function relion(userConfig: UserConfig): Promise<RelionResult>;
|
|
312
323
|
//#endregion
|
|
313
324
|
//#region src/utils/sections-selector.d.ts
|
|
314
|
-
declare const
|
|
325
|
+
declare const sectionsSelector: SectionsSelector;
|
|
315
326
|
//#endregion
|
|
316
327
|
//#region src/index.d.ts
|
|
317
328
|
declare const defineConfig: (config: UserConfig) => UserConfig;
|
|
318
329
|
//#endregion
|
|
319
|
-
export { BumpFiles,
|
|
330
|
+
export { BumpFiles, Bumper, ChangelogOptions, CommitMessage, CommitOptions, CommitRange, CommitsParser, CompleteChangelogOptions, CompleteCommitOptions, CompleteCommitsParser, CompleteTagOptions, Context, Contributor, DefaultBumper, DefaultChangelogSections, FalseOrComplete, FilledTypeGroup, FilledTypeGroupMap, GithubUserInfo, GpgSig, GpgSigCode, LogLevel, MergedConfig, ParsedCommit, RawCommit, RawReference, RefLabel, Reference, ReleaseContext, ReleaseType, ReleaseWithFlatCommits, ReleaseWithTypeGroups, RelionResult, RepoInfo, ResolvedChangelogOptions, ResolvedCommit, ResolvedConfig, ResolvedContext, ScopeGroup, SectionsSelector, TagOptions, TransformedConfig, TypeGroupDefinition, TypeGroupsMap, UserConfig, relion as default, defineConfig, sectionsSelector };
|
package/dist/index.js
CHANGED
|
@@ -1,43 +1,38 @@
|
|
|
1
|
-
import{existsSync as e,readFileSync as t,writeFileSync as n}from"node:fs";import r from"semver";import{createHash as
|
|
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";import s from"node:readline";const c={bump:!1,changelog:!1,commit:!1,tag:!1,versionSource:`versionSourceFile`,versionSourceFile:`./package.json`,newTagFormat:`v{{version}}`,prevReleaseTagPattern:/^v?(?<version>\d+\.\d+\.\d+)/,zeroMajorBreakingIsMinor:!0,dryRun:!1,logLevel:`info`,context:{commitHyperlink:!0,refHyperlink:!0,footerChangelogUrl:!1},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}},l={breaking:{title:`⚠️ BREAKING CHANGES`,commitType:`breaking`,show:`always`},feat:{title:`✨ Features`,commitType:`feat`,show:`always`},fix:{title:`🩹 Fixes`,commitType:`fix`,show:`always`},perf:{title:`⚡ Performance`,commitType:`perf`,show:`always`},revert:{title:`♻️ Reverts`,commitType:`revert`,show:`always`},refactor:{title:`🚜 Refactoring`,commitType:`refactor`},build:{title:`📦 Build`,commitType:`build`},docs:{title:`📚 Documentation`,commitType:`docs`},style:{title:`🎨 Style`,commitType:`style`},test:{title:`🧪 Tests`,commitType:`test`},ci:{title:`🚀 CI`,commitType:`ci`},types:{title:`🏷️ Types`,commitType:`types`},deps:{title:`🧩 Dependencies`,commitType:`chore`,filter:e=>!!e.scope?.includes(`deps`)},chore:{title:`🛠️ Chores`,commitType:`chore`},misc:{title:`⚙️ Miscellaneous`,commitType:`*`,filter:e=>e.type!==`release`&&e.scope!==`release`}},u={output:`CHANGELOG.md`,commitRange:`unreleased`,commitsScope:`.`,sections:l,header:`# Changelog
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
`,prevReleaseHeaderPattern:/^##.*?\d+\.\d+\.\d+/m,groupCommitsByScope:!0,helpers:{eq:(e,t)=>e===t,repeat:(e,t)=>e.repeat(t),isArray:e=>Array.isArray(e),
|
|
5
|
-
|
|
4
|
+
`,prevReleaseHeaderPattern:/^##.*?\d+\.\d+\.\d+/m,groupCommitsByScope:!0,maxLinesPerRelease:20,review:!1,helpers:{eq:(e,t)=>e===t,repeat:(e,t)=>e.repeat(t),isArray:e=>Array.isArray(e),isSingle:e=>e.length===1,or:(...e)=>e.slice(0,-1).some(Boolean),not:e=>!e,tagToUrlFragment:e=>`--${e.replace(` `,`-`).replace(/\./g,``)}-`},partials:{br:`
|
|
5
|
+
`,scope:`{{#if scope}}**{{scope}}**: {{/if}}`,commit:`{{{subject}}} {{" "}}
|
|
6
|
+
{{~#if @root.commitHyperlink~}}
|
|
7
|
+
[\`{{hash}}\`]({{@root.repo.homepage}}/commit/{{hash}})
|
|
8
|
+
{{~else~}}
|
|
9
|
+
{{hash}}
|
|
10
|
+
{{~/if~}}
|
|
11
|
+
{{~#if breakingChanges}} ⚠️{{>breakingChangesIndicator}}{{/if}}
|
|
12
|
+
{{~#if refs}} {{>refs}}{{/if}}`,compareLink:`{{repo.homepage~}}
|
|
13
|
+
{{#if prevRelease.tag~}}
|
|
14
|
+
/compare/{{prevRelease.tag}}...
|
|
15
|
+
{{~else~}}
|
|
16
|
+
/commits/
|
|
17
|
+
{{~/if}}
|
|
18
|
+
{{~tag}}`,refs:`({{#each refs~}}
|
|
19
|
+
{{#if @root.refHyperlink~}}
|
|
20
|
+
[{{raw}}]({{@root.repo.homepage}}/issues/{{number}})
|
|
21
|
+
{{~else~}}
|
|
22
|
+
{{raw}}
|
|
23
|
+
{{~/if}}
|
|
24
|
+
{{~#if @last}}){{else}}, {{/if}}
|
|
25
|
+
{{~/each}}`,changelogUrl:`{{repo.homepage}}/blob/main/CHANGELOG.md#{{tagToUrlFragment tag}}`,breakingChangesIndicator:`<sup>[{{breakingChangeIndex}}]</sup>`}},d={message:`chore(release): {{newTag}}`,signOff:!1,gpgSign:!1,stageAll:!0,extraArgs:null},f={name:`{{newTag}}`,message:d.message,gpgSign:!1,force:!1,extraArgs:null},p=[{file:/package\.json$/,pattern:/(^.*?"version".*?")(.*?)(")/s,replacement:`$1{{newVersion}}$3`},{file:/package-lock\.json$/,pattern:/(^.*?"version".*?"|"packages".*?"".*"version".*?")(.*?)(")/gs,replacement:`$1{{newVersion}}$3`}],m=e=>C(v(_(g(h(e))))),h=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);return n&&r?{...e,...t}:t??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`)}},g=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{...c,...e,commitsParser:{...c.commitsParser,...e.commitsParser},changelog:t(`changelog`,e.changelog,u,`partials`,`helpers`),commit:t(`commit`,e.commit,d),tag:t(`tag`,e.tag,f),context:{...c.context,...e.context}}},_=e=>{let t=e=>{let t=p.find(t=>t.file.test(e));if(t)return{...t,file:e};throw Error(`File ${e} doesn't match any default versioned files. Please provide a custom pattern for this file.`)},n=e=>{if(e===!1)return!1;if(e===!0)return[r];if(Array.isArray(e))return e.map(e=>typeof e==`string`?t(e):e);throw Error(`Invalid value for bump. It should be a boolean or an array.`)},r=typeof e.versionSourceFile==`string`?t(e.versionSourceFile):e.versionSourceFile;return{...e,versionSourceFile:r,bump:n(e.bump),changelog:e.changelog===!1?!1:{...e.changelog,compiledPartials:Q(e.changelog.partials)}}},v=e=>{let t=e.context??{},n=H(e.commitsParser.remoteUrlPattern),r=t.currentVersion??(e.versionSource===`latest-release-tag`?T(G(e.prevReleaseTagPattern)[0],e.prevReleaseTagPattern)??`0.0.0`:w(e.versionSourceFile));J(`Current version (from ${e.versionSource===`latest-release-tag`?`latest release tag`:`'${e.versionSourceFile.file}'`}): '${r}'`);let i=t.currentTag??G(e.prevReleaseTagPattern)[0],a=t.newVersion??E(e,r),o=t.newTag??(e.newTagPrefix===void 0?e.newTagFormat.replace(`{{version}}`,a):e.newTagPrefix+a),s=e.changelog?e.changelog.commitRange:`unreleased`,c=e.changelog?e.changelog.commitsScope:void 0,l=y(t.commits?t.commits.map(t=>typeof t==`object`&&`message`in t||typeof t==`string`?N(t,e.commitsParser,e.prevReleaseTagPattern):t).filter(e=>e!=null):M(s,e.commitsParser,e.prevReleaseTagPattern,c),o,e.commitsParser.revertCommitBodyPattern),u=e.changelog?b(l,e.changelog.sections,e.prevReleaseTagPattern,e.changelog.groupCommitsByScope,e.changelog.maxLinesPerRelease):null,{commits:d,...f}=t;return{...e,context:{currentVersion:r,currentTag:i,newVersion:a,newTag:o,commits:l,releases:u,...f,repo:{...n,...e.context?.repo}}}},y=(e,t,n)=>{let r=0,i=[];return e.map(a=>{let o=null,s=e.findIndex(e=>e.type===`revert`&&n.exec(e.body??``)?.groups?.hash===a.hash),c=s===-1?void 0:e[s];if(c&&(o=c.associatedReleaseTag===a.associatedReleaseTag?`inTheSameRelease`:`inOtherRelease`),o===`inTheSameRelease`){i.push(s);return}return{...a,associatedReleaseTag:a.associatedReleaseTag??t,isReverted:a.isReverted??o,breakingChangeIndex:a.breakingChanges?++r:void 0}}).filter((e,t)=>!!e&&!i.includes(t))},b=(e,t,n,r,i)=>{i??=u.maxLinesPerRelease;let a={};return e.forEach(e=>{let t=e.associatedReleaseTag;t in a?a[t].commits.push(e):a[t]={tag:t,version:T(t,n),date:e.date,commits:[e]}}),Object.values(a).map(({commits:e,...n})=>{let a=x(e,t,r);if(Object.keys(a).length===0)return;let o=0,s=!1,c={};for(let[e,t]of Object.entries(a))t.show??=`limit-or-breaking`,o+t.commits.length>i&&Object.keys(c).length&&(s=!0),t.show!==`never`&&(t.show===`only-breaking`||t.show===`limit-or-breaking`&&s?(t.commits=t.commits.filter(e=>!!e.breakingChanges),t.commits.length&&(t.scopeGroups=S(t.commits),c[e]=t,o+=t.commits.length)):(t.show===`always`||!s)&&(c[e]=t,o+=t.commits.length),o>i&&(s=!0));return{...n,commitTypeGroups:c}}).filter(e=>!!e)},x=(e,t,n)=>{let r=Object.fromEntries(Object.entries(t).map(([e,{filter:t,...n}])=>[e,{...n,commits:[]}]));e.forEach(e=>{let n=!!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(n&&!a&&s.includes(`breaking`)){r[o].commits.push(e),a=!0;continue}if(!i&&(s.includes(e.type)||s.includes(`*`))&&(r[o].commits.push(e),i=!0),i&&(!n||a))return}});let i=Object.entries(r).filter(([e,t])=>t.commits.length);return Object.fromEntries(n?i.map(([e,t])=>[e,{...t,scopeGroups:S(t.commits)}]):i)},S=e=>{let t={};return e.forEach(e=>{let n=e.scope??``;t[n]??=[],t[n].push(e)}),Object.entries(t).map(([e,t])=>({scope:e,commits:t}))},C=e=>({...e,commit:e.commit?{...e.commit,message:r.compile(e.commit.message)(e.context)}:e.commit,tag:e.tag?{...e.tag,name:r.compile(e.tag.name)(e.context),message:r.compile(e.tag.message)(e.context)}:e.tag}),w=e=>{let n=t(e.file,`utf8`),r=e.pattern.exec(n)?.[2];if(!r)throw Error(`Version not found in '${e.file}' with pattern '${e.pattern}'`);if(!i.valid(r))throw Error(`Invalid version format in '${e.file}': '${r}'`);return r},T=(e,t)=>t.exec(e)?.groups?.version,E=(e,t)=>{if(e.context?.newVersion){if(!i.valid(e.context.newVersion))throw Error(`Invalid release version format: '${e.context.newVersion}'`);return e.context.newVersion}let n;e.releaseType?n=e.releaseType:(n=D(M(`unreleased`,e.commitsParser,e.prevReleaseTagPattern)),e.zeroMajorBreakingIsMinor&&i.major(t)===0&&n===`major`&&(n=`minor`));let r=O(t,n);return J(`Determined new version: '${r}' (release type: '${n}')`),r},D=e=>e.some(e=>e.breakingChanges)?`major`:e.some(e=>e.type===`feat`)?`minor`:`patch`,O=(e,t)=>i.inc(e,t)??(()=>{throw Error(`Failed to calculate new version from '${e}' with release type '${t}'`)})();let k=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 A=new Map;let j;const M=(e,t,n,r)=>{n??=c.prevReleaseTagPattern;let i=Array.isArray(e)?e:U(e,n,r),a=t??c.commitsParser,o=i.map(e=>N(e,a,n)).filter(e=>e!==null);return j=void 0,o},N=(e,t,n)=>{t??=c.commitsParser,n??=c.prevReleaseTagPattern,typeof e==`string`&&(e={message:e});let{tagRefs:r,hash:i=P(e.message)}=e;if(A.has(i))return A.get(i)??null;let a=e.message.trim();if(!a)throw Error(`Message is missing for commit: ${JSON.stringify(e)}`);let o;try{o=F(a,t)}catch(e){return Y(`Error parsing commit '${i}':`,e.message),null}let{type:s,scope:l,subject:u,body:d,breakingChanges:f,footer:p}=o,m=r?[...r.matchAll(t.tagPattern)].map(e=>e.groups?.tag??``):[],h=p?[...p.matchAll(t.signerPattern)].map(e=>e.groups):[],g=[],_=e=>{g.some(t=>t.email===e.email)||g.push(e)},v=e.authorName&&e.authorEmail?L({name:e.authorName,email:e.authorEmail},h):void 0;v&&_(v);let y=e.committerName&&e.committerEmail?L({name:e.committerName,email:e.committerEmail},h):void 0;y&&_(y),(p?[...p.matchAll(t.coAuthorPattern)].map(e=>e.groups).map(e=>L(e,h)):[]).forEach(e=>_(e));let b=R(p??``,t),x=e.gpgSigCode?{code:e.gpgSigCode,label:k[e.gpgSigCode],keyId:e.gpgSigKeyId}:void 0,S=e[t.dateSource===`committerDate`?`committerTs`:`authorTs`];typeof S==`string`&&(S=z(new Date(S*1e3),t.dateFormat));let C=m.find(e=>n.exec(e)),w=C??j;w&&(j=w);let T={hash:i,type:s,scope:l,subject:u,body:d,breakingChanges:f,footer:p,committer:y,gpgSig:x,date:S,releaseTag:C,associatedReleaseTag:w,tags:m.length?m:void 0,authors:g.length?g:void 0,refs:b.length?b:void 0};return i&&!A.has(i)&&A.set(i,T),T},P=e=>`fake_`+a(`sha256`).update(e,`utf8`).digest(`hex`).slice(0,7),F=(e,t)=>{let[n,...r]=e.split(`
|
|
6
26
|
|
|
7
|
-
`),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=
|
|
27
|
+
`),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=I(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(`
|
|
8
28
|
|
|
9
29
|
`),``]:[r.slice(0,d).join(`
|
|
10
30
|
|
|
11
31
|
`),r.slice(d).join(`
|
|
12
32
|
|
|
13
|
-
`)];return{type:a,scope:o||void 0,subject:c,body:f||void 0,breakingChanges:l,footer:p||void 0}},
|
|
14
|
-
`).filter(t=>e.test(t));return
|
|
15
|
-
{{
|
|
16
|
-
{{#if prevRelease.tag~}}
|
|
17
|
-
/compare/{{prevRelease.tag}}...
|
|
18
|
-
{{~else~}}
|
|
19
|
-
/commits/
|
|
20
|
-
{{~/if}}
|
|
21
|
-
{{~tag}}
|
|
22
|
-
{{~/inline}}
|
|
23
|
-
|
|
24
|
-
{{~#*inline "commit"~}}
|
|
25
|
-
{{{subject}}} {{" "}}
|
|
26
|
-
{{~#if @root.commitHyperlink~}}
|
|
27
|
-
[\`{{hash}}\`]({{@root.repo.homepage}}/commit/{{hash}})
|
|
28
|
-
{{~else~}}
|
|
29
|
-
{{hash}}
|
|
30
|
-
{{~/if~}}
|
|
31
|
-
{{~#if breakingChanges}} ⚠️<sup>[{{breakingChangeIndex}}]</sup>{{/if}}
|
|
32
|
-
{{~/inline}}
|
|
33
|
-
|
|
34
|
-
{{~#*inline "scope"~}}
|
|
35
|
-
{{#if scope}}**{{scope}}**: {{/if}}
|
|
36
|
-
{{~/inline}}
|
|
37
|
-
|
|
38
|
-
{{~#>header~}}
|
|
39
|
-
##   [\` 📦 {{tag}} \`]({{>compareLink}})
|
|
40
|
-
|
|
33
|
+
`)];return{type:a,scope:o||void 0,subject:c,body:f||void 0,breakingChanges:l,footer:p||void 0}},I=(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},L=(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}`}},R=(e,t)=>[...e.matchAll(t.refPattern)].map(e=>e.groups).filter(e=>t.refActionPattern.test(e.action)).flatMap(e=>[...e.labels.matchAll(t.refLabelPattern)].map(e=>({label:e.groups,raw:e.input})).filter(({label:e})=>!!e.number).map(({label:t,raw:n})=>({raw:n,action:e.action,owner:t.owner,repo:t.repo,number:t.number}))),z=(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])},B=/##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,V=new Map,H=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;return{host:r,owner:i,name:a,homepage:`https://${r}/${i}/${a}`}},U=(e,t,n)=>{let r=W(),i=G(t),a=``,s=``,c=``;if(e===`all`)a=`{{firstCommit}}`,s=`HEAD`;else if(e===`unreleased`)a=i[0]??`{{firstCommit}}`,s=`HEAD`;else if(e===`latest-release`)a=i[1]??`{{firstCommit}}`,s=i[0]??`HEAD`;else if(typeof e==`object`){let t=i.indexOf(e.releaseTag);if(t===-1)throw Error(`Release tag '${e.releaseTag}' not found`);a=i[t+1]??`{{firstCommit}}`,s=i[t]}else c=e;return a&&s&&(c=a===`{{firstCommit}}`?`"${a}^!" ${s}`:`"${a}..${s}"`),c=c.replace(`{{firstCommit}}`,r),[...o(`git log ${c} --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" -- ${n??`.`}`,{encoding:`utf8`}).matchAll(B)].map(e=>e.groups)},W=()=>o(`git rev-list --max-parents=0 HEAD`,{encoding:`utf8`}).trim(),G=e=>{e??=c.prevReleaseTagPattern;let t=e.toString();if(V.has(t))return V.get(t)??[];let n=o(`git tag --sort=-creatordate`,{encoding:`utf8`}).split(`
|
|
34
|
+
`).filter(t=>e.test(t));return V.set(t,n),n};let K=`info`;const q=e=>K=e,J=(...e)=>{K!==`silent`&&console.log(...e)},Y=(...e)=>{K===`info`&&console.warn(...e)},X={...l,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)))},modify(e,t){return{...this,[e]:t(this[e])}}};var Z=`{{~#>header~}}
|
|
35
|
+
##   [\` 📦 {{tag}} \`]({{>compareLink}}){{>br}}
|
|
41
36
|
{{/header}}
|
|
42
37
|
|
|
43
38
|
{{~#>main~}}
|
|
@@ -47,10 +42,10 @@ import{existsSync as e,readFileSync as t,writeFileSync as n}from"node:fs";import
|
|
|
47
42
|
{{#each commits}}
|
|
48
43
|
{{#if (isArray breakingChanges)}}
|
|
49
44
|
{{~#each breakingChanges~}}
|
|
50
|
-
- {{{this}}} {{
|
|
45
|
+
- {{{this}}} {{>breakingChangesIndicator ../this}}
|
|
51
46
|
{{/each}}
|
|
52
47
|
{{else~}}
|
|
53
|
-
- {{{breakingChanges}}} {{
|
|
48
|
+
- {{{breakingChanges}}} {{>breakingChangesIndicator}}
|
|
54
49
|
{{/if}}
|
|
55
50
|
{{/each}}
|
|
56
51
|
{{else}}
|
|
@@ -77,7 +72,5 @@ import{existsSync as e,readFileSync as t,writeFileSync as n}from"node:fs";import
|
|
|
77
72
|
{{/main}}
|
|
78
73
|
|
|
79
74
|
{{~#>footer~}}
|
|
80
|
-
#####    [_All Release Commits_]({{>compareLink}})  •  _{{date}}_
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
{{/footer}}`;const Z=(e,t)=>o.compile(e)(t),Q=e=>{let t=Object.fromEntries(Object.entries(e).map(([e,t])=>[e,typeof t==`function`?$(e,t):t]));return Object.fromEntries(Object.entries(t).map(([e,t])=>[e,o.compile(t)]))},$=(e,t)=>{let n=RegExp(`${e}.*?}}\\s*(.*?){{~?/${e}`,`s`).exec(X)?.[1];if(!n)throw Error(`Partial "${e}" not found in the release template.`);return t(n)},ee=e=>{if(!e.bump)return null;let r=e.bump,i=e.context.newVersion;r.forEach(r=>{let a=t(r.file,`utf8`).replace(r.pattern,r.replacement.replace(`{{newVersion}}`,i));e.dryRun||n(r.file,a,`utf8`),q(`Updated version in '${r.file}' to '${i}'`)})},te=e=>{if(!e.changelog)return null;let t=e.changelog,n=e.context.releases;if(!n)return null;let r=W(e.prevReleaseTagPattern);o.registerPartial(t.compiledPartials),o.registerHelper(t.helpers);let i=t.header;return n.forEach((t,a)=>{let o=n[a+1];if(!o){let n=r.indexOf(t.tag);if(n!==-1){let t=r[n+1];o={tag:t,version:t&&w(t,e.prevReleaseTagPattern)}}else o={tag:e.context.currentTag,version:e.context.currentVersion}}let s={...t,...e.context,prevRelease:o},c=Z(X,s);i+=c}),t.output===`stdout`||e.dryRun?(q(`Generated changelog:`),console.log(i)):(q(`Writing changelog to file '${t.output}'`),ne(t.output,i,t.prevReleaseHeaderPattern)),i},ne=(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`})},re=e=>{if(!e.commit)return null;let t=e.commit,n=[t.stageAll&&`git add -A &&`,`git commit -m "${t.message}"`,t.signOff&&`-s`,t.gpgSign&&`-S`,t.extraArgs].filter(Boolean).join(` `);return q(`Committing with command: '${n}'`),e.dryRun||a(n,{stdio:`inherit`}),n},ie=e=>{if(!e.tag)return null;let t=e.tag,n=[`git tag -a ${t.name}`,`-m "${t.message}"`,t.gpgSign&&`-s`,t.force&&`-f`,t.extraArgs].filter(Boolean).join(` `);return q(`Tagging with command: '${n}'`),e.dryRun||a(n,{stdio:`inherit`}),n};function ae(e){K((e.logLevel??(!!e.profile&&e[`_${e.profile}`]?.logLevel))||`info`);let t=p(e);ee(t);let n=te(t),r=re(t),i=ie(t);return{resolvedConfig:t,generatedChangelog:n,commitCommand:r,tagCommand:i}}const oe=e=>e;export{Y as changelogSectionsSelector,ae as default,oe as defineConfig};
|
|
75
|
+
#####    {{#if footerChangelogUrl}}[_Release Changelog_]({{>changelogUrl}})  •  {{/if}}[_All Release Commits_]({{>compareLink}})  •  _{{date}}_{{>br}}{{>br}}
|
|
76
|
+
{{/footer}}`;const Q=e=>{let t=Object.fromEntries(Object.entries(e).map(([e,t])=>[e,typeof t==`function`?$(e,t):t]));return Object.fromEntries(Object.entries(t).map(([e,t])=>[e,r.compile(t)]))},$=(e,t)=>{let n=RegExp(`${e}.*?}}\\s*(.*?){{~?/${e}`,`s`).exec(Z)?.[1];if(!n)throw Error(`Partial "${e}" not found in the release template.`);return t(n)},ee=async e=>{let t=s.createInterface({input:process.stdin,output:process.stdout});await new Promise(n=>{t.question(e,()=>{t.close(),n()})})},te=e=>{if(!e.bump)return null;let r=e.bump,i=e.context.newVersion;r.forEach(r=>{let a=t(r.file,`utf8`).replace(r.pattern,r.replacement.replace(`{{newVersion}}`,i));e.dryRun||n(r.file,a,`utf8`),J(`Updated version in '${r.file}' to '${i}'`)})},ne=async e=>{if(!e.changelog)return null;let t=e.changelog,n=e.context.releases;if(!n)return null;let i=G(e.prevReleaseTagPattern),a=r.create();a.registerPartial(t.compiledPartials),a.registerHelper(t.helpers);let o=t.header;return n.forEach((t,r)=>{let s=n[r+1];if(!s){let n=i.indexOf(t.tag);if(n!==-1){let t=i[n+1];s={tag:t,version:t&&T(t,e.prevReleaseTagPattern)}}else s={tag:e.context.currentTag,version:e.context.currentVersion}}let c={...t,...e.context,prevRelease:s},l=a.compile(Z)(c);o+=l}),t.output===`stdout`||e.dryRun?(J(`Generated changelog:`),console.log(o)):(J(`Writing changelog to file '${t.output}'`),re(t.output,o,t.prevReleaseHeaderPattern)),t.review&&t.output!==`stdout`&&(e.commit||e.tag)&&await ee(`Please review the changelog and press Enter to continue...`),o},re=(r,i,a)=>{let o=e(r)?t(r,{encoding:`utf8`}):``,s=o.search(a);n(r,i+o.slice(s),{encoding:`utf8`})},ie=e=>{if(!e.commit)return null;let t=e.commit,n=[t.stageAll&&`git add -A &&`,`git commit -m "${t.message}"`,t.signOff&&`-s`,t.gpgSign&&`-S`,t.extraArgs].filter(Boolean).join(` `);return J(`Committing with command: '${n}'`),e.dryRun||o(n,{stdio:`inherit`}),n},ae=e=>{if(!e.tag)return null;let t=e.tag,n=[`git tag -a ${t.name}`,`-m "${t.message}"`,t.gpgSign&&`-s`,t.force&&`-f`,t.extraArgs].filter(Boolean).join(` `);return J(`Tagging with command: '${n}'`),e.dryRun||o(n,{stdio:`inherit`}),n};async function oe(e){q((e.logLevel??(!!e.profile&&e[`_${e.profile}`]?.logLevel))||`info`);let t=m(e);return te(t),{resolvedConfig:t,generatedChangelog:await ne(t),commitCommand:ie(t),tagCommand:ae(t)}}const se=e=>e;export{oe as default,se as defineConfig,X as sectionsSelector};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "relion",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Release workflow helper
|
|
3
|
+
"version": "0.20.0",
|
|
4
|
+
"description": "Release workflow helper.",
|
|
5
5
|
"author": "Kh4f <kh4f.dev@gmail.com>",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"engines": {
|
|
@@ -36,18 +36,18 @@
|
|
|
36
36
|
"semver": "^7.7.2"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@eslint/js": "^9.
|
|
39
|
+
"@eslint/js": "^9.37.0",
|
|
40
40
|
"@stylistic/eslint-plugin": "^5.4.0",
|
|
41
|
-
"@types/node": "^24.
|
|
41
|
+
"@types/node": "^24.6.2",
|
|
42
42
|
"@types/semver": "^7.7.1",
|
|
43
|
-
"eslint": "^9.
|
|
43
|
+
"eslint": "^9.37.0",
|
|
44
44
|
"globals": "^16.4.0",
|
|
45
45
|
"lint-staged": "^16.2.3",
|
|
46
46
|
"simple-git-hooks": "^2.13.1",
|
|
47
|
-
"tsdown": "^0.15.
|
|
47
|
+
"tsdown": "^0.15.6",
|
|
48
48
|
"tsx": "^4.20.6",
|
|
49
|
-
"typescript": "^5.9.
|
|
50
|
-
"typescript-eslint": "^8.
|
|
49
|
+
"typescript": "^5.9.3",
|
|
50
|
+
"typescript-eslint": "^8.45.0",
|
|
51
51
|
"vitest": "^3.2.4"
|
|
52
52
|
},
|
|
53
53
|
"simple-git-hooks": {
|
|
@@ -64,8 +64,8 @@
|
|
|
64
64
|
"lint:fix": "eslint --fix",
|
|
65
65
|
"test": "vitest run",
|
|
66
66
|
"test:watch": "vitest",
|
|
67
|
-
"release": "pnpm relion",
|
|
68
|
-
"release:github": "pnpm relion
|
|
67
|
+
"release": "pnpm relion -p local",
|
|
68
|
+
"release:github": "pnpm relion -p github",
|
|
69
69
|
"relion": "tsx scripts/relion-runner"
|
|
70
70
|
}
|
|
71
71
|
}
|