fireflyy 4.0.0-dev.644fea9 → 4.0.0-dev.df58d2b
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/commit-analysis.service-CtIh7eez.js +503 -0
- package/dist/{dry-run-BfYCtldz.js → dry-run-korHDlWr.js} +1 -1
- package/dist/{filesystem.service-9VHML130.js → filesystem.service-BcQtLzfl.js} +3 -3
- package/dist/{git.service-CACrfCW8.js → git.service-D1Mf6LZ0.js} +2 -2
- package/dist/main.js +2 -2
- package/dist/{package-json.service-DACeZzRg.js → package-json.service-BKbXaHXQ.js} +2 -2
- package/dist/{program-CHc5t2Xm.js → program-CW3hIbzh.js} +92 -18
- package/dist/{result.constructors-C9M1MP3_.js → result.constructors-D9jmQ0uj.js} +5 -1
- package/dist/{result.utilities-DC5shlhT.js → result.utilities-CdBL5noX.js} +1 -1
- package/dist/{schema.utilities-BGd9t1wm.js → schema.utilities-BOJqWEey.js} +1 -1
- package/dist/version-bumper.service-CvPx7EZx.js +318 -0
- package/dist/version-strategy.service-BO_7MY5O.js +4 -0
- package/dist/version-strategy.service-vh5KeNCA.js +258 -0
- package/package.json +1 -1
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { t as logger } from "./main.js";
|
|
2
|
+
import { g as invalidError, r as FireflyOk, t as FireflyErr } from "./result.constructors-D9jmQ0uj.js";
|
|
3
|
+
import { Result } from "neverthrow";
|
|
4
|
+
|
|
5
|
+
//#region src/services/implementations/version-strategy.service.ts
|
|
6
|
+
const TRANSITION_KEYWORDS = [
|
|
7
|
+
"general availability",
|
|
8
|
+
"promote to stable",
|
|
9
|
+
"move to stable"
|
|
10
|
+
];
|
|
11
|
+
const LEVEL_TO_RELEASE_TYPE = {
|
|
12
|
+
0: "major",
|
|
13
|
+
1: "minor",
|
|
14
|
+
2: "patch"
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Version type categories for organizing choices.
|
|
18
|
+
*/
|
|
19
|
+
const VERSION_TYPES = {
|
|
20
|
+
RELEASE: [
|
|
21
|
+
"patch",
|
|
22
|
+
"minor",
|
|
23
|
+
"major"
|
|
24
|
+
],
|
|
25
|
+
PRERELEASE: [
|
|
26
|
+
"prepatch",
|
|
27
|
+
"preminor",
|
|
28
|
+
"premajor"
|
|
29
|
+
],
|
|
30
|
+
CONTINUATION: ["prerelease"],
|
|
31
|
+
GRADUATION: ["graduate"]
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Pre-configured choice sets for different scenarios.
|
|
35
|
+
*/
|
|
36
|
+
const VERSION_CHOICE_SETS = {
|
|
37
|
+
latestIsPreRelease: [
|
|
38
|
+
...VERSION_TYPES.CONTINUATION,
|
|
39
|
+
...VERSION_TYPES.GRADUATION,
|
|
40
|
+
...VERSION_TYPES.RELEASE
|
|
41
|
+
],
|
|
42
|
+
preRelease: VERSION_TYPES.PRERELEASE,
|
|
43
|
+
default: [...VERSION_TYPES.RELEASE, ...VERSION_TYPES.PRERELEASE]
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Human-readable descriptions for each release type.
|
|
47
|
+
*/
|
|
48
|
+
const VERSION_DESCRIPTIONS = {
|
|
49
|
+
patch: "Fixes and minor enhancements without breaking compatibility. Suitable for bug fixes and small improvements.",
|
|
50
|
+
minor: "New, backward-compatible functionality. Adds features that do not break existing APIs.",
|
|
51
|
+
major: "Incompatible API changes. Introduces breaking changes or removes deprecated features.",
|
|
52
|
+
prepatch: "Unstable patch release candidate. Used for testing patch changes before a stable release.",
|
|
53
|
+
preminor: "Unstable minor release candidate. Used for previewing new features before a minor release.",
|
|
54
|
+
premajor: "Unstable major release candidate. Used for testing breaking changes before a major release.",
|
|
55
|
+
prerelease: "Unstable pre-release continuation. Increments the pre-release number or changes identifier.",
|
|
56
|
+
graduate: "Promote pre-release to stable. Removes pre-release identifiers to create a stable version."
|
|
57
|
+
};
|
|
58
|
+
var DefaultVersionStrategyService = class {
|
|
59
|
+
bumper;
|
|
60
|
+
constructor(bumper) {
|
|
61
|
+
this.bumper = bumper;
|
|
62
|
+
}
|
|
63
|
+
resolveVersion(options, recommendation) {
|
|
64
|
+
logger.verbose("DefaultVersionStrategyService: Deciding next version...");
|
|
65
|
+
const preReleaseContext = this.analyzePreReleaseContext(options.currentVersion, recommendation);
|
|
66
|
+
if (options.releaseType === "prerelease") {
|
|
67
|
+
logger.verbose("DefaultVersionStrategyService: Handling prerelease request...");
|
|
68
|
+
return this.handlePreReleaseRequest(options, preReleaseContext);
|
|
69
|
+
}
|
|
70
|
+
if (preReleaseContext.isCurrentPreRelease && preReleaseContext.hasStableTransition) {
|
|
71
|
+
logger.verbose("DefaultVersionStrategyService: Handling pre-release to stable transition...");
|
|
72
|
+
return this.handlePreReleaseToStableTransition(options, recommendation);
|
|
73
|
+
}
|
|
74
|
+
if (recommendation) {
|
|
75
|
+
logger.verbose("DefaultVersionStrategyService: Handling recommendation-based versioning...");
|
|
76
|
+
return this.createRecommendationBasedVersion(options, recommendation, preReleaseContext);
|
|
77
|
+
}
|
|
78
|
+
if (options.releaseType) {
|
|
79
|
+
logger.verbose("DefaultVersionStrategyService: Handling explicit release type...");
|
|
80
|
+
return this.bumper.bump({
|
|
81
|
+
currentVersion: options.currentVersion,
|
|
82
|
+
releaseType: options.releaseType,
|
|
83
|
+
prereleaseIdentifier: options.prereleaseIdentifier,
|
|
84
|
+
prereleaseBase: options.prereleaseBase
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return FireflyErr(invalidError({ message: "Cannot determine next version: no release type or recommendation provided" }));
|
|
88
|
+
}
|
|
89
|
+
generateChoices(options) {
|
|
90
|
+
logger.verbose(`DefaultVersionStrategyService: Creating version choices for '${options.currentVersion.raw}'...`);
|
|
91
|
+
const choicesResults = this.determineAvailableVersionTypes(options.currentVersion, options.releaseType).map((releaseType) => this.createSingleChoice(options.currentVersion, releaseType, options.prereleaseIdentifier, options.prereleaseBase));
|
|
92
|
+
const combinedResult = Result.combine(choicesResults);
|
|
93
|
+
if (combinedResult.isErr()) return FireflyErr(combinedResult.error);
|
|
94
|
+
logger.verbose(`DefaultVersionStrategyService: Created ${combinedResult.value.length} version choices.`);
|
|
95
|
+
return FireflyOk(combinedResult.value);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Analyzes the current version and recommendation to determine pre-release context.
|
|
99
|
+
*
|
|
100
|
+
* @param currentVersion - The current version
|
|
101
|
+
* @param recommendation - The version recommendation
|
|
102
|
+
* @returns The pre-release context
|
|
103
|
+
*/
|
|
104
|
+
analyzePreReleaseContext(currentVersion, recommendation) {
|
|
105
|
+
return {
|
|
106
|
+
isCurrentPreRelease: currentVersion.isPrerelease,
|
|
107
|
+
prereleaseIdentifier: currentVersion.prereleaseIdentifier,
|
|
108
|
+
hasStableTransition: this.detectStableTransition(recommendation)
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Detects if the recommendation indicates a transition to a stable version.
|
|
113
|
+
*
|
|
114
|
+
* @param recommendation - The version recommendation
|
|
115
|
+
* @returns True if a stable transition is detected, false otherwise
|
|
116
|
+
*/
|
|
117
|
+
detectStableTransition(recommendation) {
|
|
118
|
+
if (!recommendation) return false;
|
|
119
|
+
const reason = recommendation.reason.toLowerCase();
|
|
120
|
+
return TRANSITION_KEYWORDS.some((keyword) => reason.includes(keyword));
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Handles explicit requests for pre-release versions.
|
|
124
|
+
*
|
|
125
|
+
* @param options - The version resolution options
|
|
126
|
+
* @param context - The pre-release context
|
|
127
|
+
* @returns A result containing the new pre-release version or an error
|
|
128
|
+
*/
|
|
129
|
+
handlePreReleaseRequest(options, context) {
|
|
130
|
+
logger.verbose("DefaultVersionStrategyService: Bumping to prerelease version...");
|
|
131
|
+
return this.bumper.bump({
|
|
132
|
+
currentVersion: options.currentVersion,
|
|
133
|
+
releaseType: "prerelease",
|
|
134
|
+
prereleaseIdentifier: options.prereleaseIdentifier ?? context.prereleaseIdentifier ?? "alpha",
|
|
135
|
+
prereleaseBase: options.prereleaseBase
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Handles the transition from a pre-release version to a stable version.
|
|
140
|
+
*
|
|
141
|
+
* @param options - The version resolution options
|
|
142
|
+
* @param recommendation - The version recommendation
|
|
143
|
+
* @returns A result containing the new stable version or an error
|
|
144
|
+
*/
|
|
145
|
+
handlePreReleaseToStableTransition(options, recommendation) {
|
|
146
|
+
if (!recommendation) return FireflyErr(invalidError({
|
|
147
|
+
message: "Cannot transition to stable version without recommendation",
|
|
148
|
+
source: "services/version-strategy"
|
|
149
|
+
}));
|
|
150
|
+
const graduateResult = this.bumper.bump({
|
|
151
|
+
currentVersion: options.currentVersion,
|
|
152
|
+
releaseType: "graduate"
|
|
153
|
+
});
|
|
154
|
+
if (graduateResult.isErr()) return FireflyErr(graduateResult.error);
|
|
155
|
+
const stableVersion = graduateResult.value;
|
|
156
|
+
if (recommendation.level < 2) {
|
|
157
|
+
logger.verbose("DefaultVersionStrategyService: Further bumping after graduation...");
|
|
158
|
+
const releaseType = LEVEL_TO_RELEASE_TYPE[recommendation.level];
|
|
159
|
+
return this.bumper.bump({
|
|
160
|
+
currentVersion: stableVersion,
|
|
161
|
+
releaseType
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
logger.verbose("DefaultVersionStrategyService: Graduated to stable version:", stableVersion.raw);
|
|
165
|
+
return FireflyOk(stableVersion);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Creates a new version based on the provided recommendation and pre-release context.
|
|
169
|
+
*
|
|
170
|
+
* @param options - The version resolution options
|
|
171
|
+
* @param recommendation - The version recommendation
|
|
172
|
+
* @param context - The pre-release context
|
|
173
|
+
* @returns A result containing the new version or an error
|
|
174
|
+
*/
|
|
175
|
+
createRecommendationBasedVersion(options, recommendation, context) {
|
|
176
|
+
if (context.isCurrentPreRelease && !context.hasStableTransition) {
|
|
177
|
+
logger.verbose("DefaultVersionStrategyService: Continuing prerelease versioning...");
|
|
178
|
+
return this.bumper.bump({
|
|
179
|
+
currentVersion: options.currentVersion,
|
|
180
|
+
releaseType: "prerelease",
|
|
181
|
+
prereleaseIdentifier: options.prereleaseIdentifier ?? context.prereleaseIdentifier ?? "alpha",
|
|
182
|
+
prereleaseBase: options.prereleaseBase
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
const releaseType = LEVEL_TO_RELEASE_TYPE[recommendation.level];
|
|
186
|
+
logger.verbose("DefaultVersionStrategyService: Bumping version based on recommendation...");
|
|
187
|
+
return this.bumper.bump({
|
|
188
|
+
currentVersion: options.currentVersion,
|
|
189
|
+
releaseType,
|
|
190
|
+
prereleaseIdentifier: options.prereleaseIdentifier,
|
|
191
|
+
prereleaseBase: options.prereleaseBase
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Determines the available version types based on current version and optional release type.
|
|
196
|
+
*
|
|
197
|
+
* @param currentVersion - The current version
|
|
198
|
+
* @param releaseType - Optional specific release type
|
|
199
|
+
* @returns An array of available release types
|
|
200
|
+
*/
|
|
201
|
+
determineAvailableVersionTypes(currentVersion, releaseType) {
|
|
202
|
+
if (releaseType !== void 0) return this.getVersionTypesForReleaseType(releaseType);
|
|
203
|
+
return currentVersion.isPrerelease ? VERSION_CHOICE_SETS.latestIsPreRelease : VERSION_CHOICE_SETS.default;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Retrieves the version types applicable for a given release type.
|
|
207
|
+
*
|
|
208
|
+
* @param releaseType - The type of release
|
|
209
|
+
* @returns An array of applicable release types
|
|
210
|
+
*/
|
|
211
|
+
getVersionTypesForReleaseType(releaseType) {
|
|
212
|
+
return releaseType === "prerelease" ? VERSION_CHOICE_SETS.preRelease : VERSION_CHOICE_SETS.default;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Retrieves the description for a given release type.
|
|
216
|
+
*
|
|
217
|
+
* @param releaseType - The type of release
|
|
218
|
+
* @returns The description string for the release type
|
|
219
|
+
*/
|
|
220
|
+
getVersionDescription(releaseType) {
|
|
221
|
+
return VERSION_DESCRIPTIONS[releaseType] ?? "";
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Creates a single version choice based on the provided parameters.
|
|
225
|
+
*
|
|
226
|
+
* @param currentVersion - The current version
|
|
227
|
+
* @param releaseType - The type of release to create
|
|
228
|
+
* @param prereleaseIdentifier - Optional pre-release identifier
|
|
229
|
+
* @param prereleaseBase - Optional base for pre-release
|
|
230
|
+
* @returns A result containing the version choice or an error
|
|
231
|
+
*/
|
|
232
|
+
createSingleChoice(currentVersion, releaseType, prereleaseIdentifier, prereleaseBase) {
|
|
233
|
+
const bumpOptions = {
|
|
234
|
+
currentVersion,
|
|
235
|
+
releaseType,
|
|
236
|
+
prereleaseIdentifier,
|
|
237
|
+
prereleaseBase
|
|
238
|
+
};
|
|
239
|
+
const newVersionResult = this.bumper.bump(bumpOptions);
|
|
240
|
+
if (newVersionResult.isErr()) return FireflyErr(newVersionResult.error);
|
|
241
|
+
const newVersion = newVersionResult.value;
|
|
242
|
+
return FireflyOk({
|
|
243
|
+
label: `${releaseType} (${newVersion.raw})`,
|
|
244
|
+
hint: this.getVersionDescription(releaseType),
|
|
245
|
+
value: newVersion.raw
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
/**
|
|
250
|
+
* Creates a version strategy service instance.
|
|
251
|
+
* @param bumper - The version bumper service to use
|
|
252
|
+
*/
|
|
253
|
+
function createVersionStrategyService(bumper) {
|
|
254
|
+
return new DefaultVersionStrategyService(bumper);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
//#endregion
|
|
258
|
+
export { TRANSITION_KEYWORDS as n, createVersionStrategyService as r, DefaultVersionStrategyService as t };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fireflyy",
|
|
3
|
-
"version": "4.0.0-dev.
|
|
3
|
+
"version": "4.0.0-dev.df58d2b",
|
|
4
4
|
"description": " CLI orchestrator for automatic semantic versioning, changelog generation, and creating releases. Built for my own use cases.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|