@muverse/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -0
- package/dist/adapters/gradle/constants.d.ts +13 -0
- package/dist/adapters/gradle/constants.d.ts.map +1 -0
- package/dist/adapters/gradle/constants.js +12 -0
- package/dist/adapters/gradle/gradle-project-information.d.ts +18 -0
- package/dist/adapters/gradle/gradle-project-information.d.ts.map +1 -0
- package/dist/adapters/gradle/gradle-project-information.js +93 -0
- package/dist/adapters/gradle/gradle-properties.d.ts +15 -0
- package/dist/adapters/gradle/gradle-properties.d.ts.map +1 -0
- package/dist/adapters/gradle/gradle-properties.js +46 -0
- package/dist/adapters/gradle/init-project-information.gradle.kts +143 -0
- package/dist/adapters/gradle/services/gradle-adapter-identifier.d.ts +21 -0
- package/dist/adapters/gradle/services/gradle-adapter-identifier.d.ts.map +1 -0
- package/dist/adapters/gradle/services/gradle-adapter-identifier.js +44 -0
- package/dist/adapters/gradle/services/gradle-module-detector.d.ts +18 -0
- package/dist/adapters/gradle/services/gradle-module-detector.d.ts.map +1 -0
- package/dist/adapters/gradle/services/gradle-module-detector.js +26 -0
- package/dist/adapters/gradle/services/gradle-module-system-factory.d.ts +23 -0
- package/dist/adapters/gradle/services/gradle-module-system-factory.d.ts.map +1 -0
- package/dist/adapters/gradle/services/gradle-module-system-factory.js +27 -0
- package/dist/adapters/gradle/services/gradle-version-update-strategy.d.ts +21 -0
- package/dist/adapters/gradle/services/gradle-version-update-strategy.d.ts.map +1 -0
- package/dist/adapters/gradle/services/gradle-version-update-strategy.js +36 -0
- package/dist/adapters/project-information.d.ts +58 -0
- package/dist/adapters/project-information.d.ts.map +1 -0
- package/dist/adapters/project-information.js +1 -0
- package/dist/changelog/index.d.ts +27 -0
- package/dist/changelog/index.d.ts.map +1 -0
- package/dist/changelog/index.js +204 -0
- package/dist/config/index.d.ts +122 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +115 -0
- package/dist/factories/adapter-identifier-registry.d.ts +12 -0
- package/dist/factories/adapter-identifier-registry.d.ts.map +1 -0
- package/dist/factories/adapter-identifier-registry.js +24 -0
- package/dist/factories/module-system-factory.d.ts +10 -0
- package/dist/factories/module-system-factory.d.ts.map +1 -0
- package/dist/factories/module-system-factory.js +18 -0
- package/dist/git/index.d.ts +253 -0
- package/dist/git/index.d.ts.map +1 -0
- package/dist/git/index.js +581 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/semver/index.d.ts +85 -0
- package/dist/semver/index.d.ts.map +1 -0
- package/dist/semver/index.js +176 -0
- package/dist/services/adapter-identifier-registry.d.ts +38 -0
- package/dist/services/adapter-identifier-registry.d.ts.map +1 -0
- package/dist/services/adapter-identifier-registry.js +59 -0
- package/dist/services/adapter-identifier.d.ts +31 -0
- package/dist/services/adapter-identifier.d.ts.map +1 -0
- package/dist/services/adapter-identifier.js +1 -0
- package/dist/services/adapter-metadata-provider.d.ts +51 -0
- package/dist/services/adapter-metadata-provider.d.ts.map +1 -0
- package/dist/services/adapter-metadata-provider.js +66 -0
- package/dist/services/changelog-generator.d.ts +13 -0
- package/dist/services/changelog-generator.d.ts.map +1 -0
- package/dist/services/changelog-generator.js +26 -0
- package/dist/services/commit-analyzer.d.ts +44 -0
- package/dist/services/commit-analyzer.d.ts.map +1 -0
- package/dist/services/commit-analyzer.js +86 -0
- package/dist/services/configuration-loader.d.ts +23 -0
- package/dist/services/configuration-loader.d.ts.map +1 -0
- package/dist/services/configuration-loader.js +79 -0
- package/dist/services/configuration-validator.d.ts +16 -0
- package/dist/services/configuration-validator.d.ts.map +1 -0
- package/dist/services/configuration-validator.js +24 -0
- package/dist/services/git-operations.d.ts +16 -0
- package/dist/services/git-operations.d.ts.map +1 -0
- package/dist/services/git-operations.js +89 -0
- package/dist/services/module-detector.d.ts +24 -0
- package/dist/services/module-detector.d.ts.map +1 -0
- package/dist/services/module-detector.js +1 -0
- package/dist/services/module-registry.d.ts +45 -0
- package/dist/services/module-registry.d.ts.map +1 -0
- package/dist/services/module-registry.js +57 -0
- package/dist/services/module-system-factory.d.ts +24 -0
- package/dist/services/module-system-factory.d.ts.map +1 -0
- package/dist/services/module-system-factory.js +1 -0
- package/dist/services/verse-runner.d.ts +45 -0
- package/dist/services/verse-runner.d.ts.map +1 -0
- package/dist/services/verse-runner.js +182 -0
- package/dist/services/version-applier.d.ts +26 -0
- package/dist/services/version-applier.d.ts.map +1 -0
- package/dist/services/version-applier.js +63 -0
- package/dist/services/version-bumper.d.ts +156 -0
- package/dist/services/version-bumper.d.ts.map +1 -0
- package/dist/services/version-bumper.js +291 -0
- package/dist/services/version-manager.d.ts +68 -0
- package/dist/services/version-manager.d.ts.map +1 -0
- package/dist/services/version-manager.js +94 -0
- package/dist/services/version-update-strategy.d.ts +18 -0
- package/dist/services/version-update-strategy.d.ts.map +1 -0
- package/dist/services/version-update-strategy.js +1 -0
- package/dist/utils/banner.d.ts +2 -0
- package/dist/utils/banner.d.ts.map +1 -0
- package/dist/utils/banner.js +8 -0
- package/dist/utils/commits.d.ts +12 -0
- package/dist/utils/commits.d.ts.map +1 -0
- package/dist/utils/commits.js +24 -0
- package/dist/utils/file.d.ts +7 -0
- package/dist/utils/file.d.ts.map +1 -0
- package/dist/utils/file.js +19 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +5 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +22 -0
- package/dist/utils/properties.d.ts +16 -0
- package/dist/utils/properties.d.ts.map +1 -0
- package/dist/utils/properties.js +62 -0
- package/dist/utils/versioning.d.ts +8 -0
- package/dist/utils/versioning.d.ts.map +1 -0
- package/dist/utils/versioning.js +17 -0
- package/package.json +70 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { logger } from "../utils/logger.js";
|
|
2
|
+
import { VersionManager } from "./version-manager.js";
|
|
3
|
+
import { createModuleSystemFactory } from "../factories/module-system-factory.js";
|
|
4
|
+
import { isWorkingDirectoryClean } from "../git/index.js";
|
|
5
|
+
// Service imports
|
|
6
|
+
import { ConfigurationLoader } from "./configuration-loader.js";
|
|
7
|
+
import { CommitAnalyzer } from "./commit-analyzer.js";
|
|
8
|
+
import { VersionBumper } from "./version-bumper.js";
|
|
9
|
+
import { VersionApplier, } from "./version-applier.js";
|
|
10
|
+
import { ChangelogGenerator } from "./changelog-generator.js";
|
|
11
|
+
import { GitOperations } from "./git-operations.js";
|
|
12
|
+
import { AdapterMetadataProvider } from "./adapter-metadata-provider.js";
|
|
13
|
+
import { createAdapterIdentifierRegistry } from "../factories/adapter-identifier-registry.js";
|
|
14
|
+
import { ConfigurationValidator } from "./configuration-validator.js";
|
|
15
|
+
import { banner } from "../utils/banner.js";
|
|
16
|
+
export class VerseRunner {
|
|
17
|
+
moduleSystemFactory; // Will be initialized in run()
|
|
18
|
+
moduleRegistry; // Will be initialized in run()
|
|
19
|
+
versionManager; // Will be initialized in run()
|
|
20
|
+
config; // Will be initialized in run()
|
|
21
|
+
adapter; // Will be initialized in run()
|
|
22
|
+
options;
|
|
23
|
+
// Service instances
|
|
24
|
+
configurationLoader;
|
|
25
|
+
commitAnalyzer;
|
|
26
|
+
versionBumper; // Will be initialized in run()
|
|
27
|
+
versionApplier; // Will be initialized in run()
|
|
28
|
+
changelogGenerator;
|
|
29
|
+
gitOperations; // Will be initialized in run()
|
|
30
|
+
adapterIdentifierRegistry;
|
|
31
|
+
adapterMetadataProvider;
|
|
32
|
+
constructor(options) {
|
|
33
|
+
this.options = options;
|
|
34
|
+
// Initialize services
|
|
35
|
+
this.configurationLoader = new ConfigurationLoader(new ConfigurationValidator());
|
|
36
|
+
this.changelogGenerator = new ChangelogGenerator({
|
|
37
|
+
generateChangelog: options.generateChangelog,
|
|
38
|
+
repoRoot: options.repoRoot,
|
|
39
|
+
dryRun: options.dryRun,
|
|
40
|
+
});
|
|
41
|
+
this.adapterIdentifierRegistry = createAdapterIdentifierRegistry();
|
|
42
|
+
this.adapterMetadataProvider = new AdapterMetadataProvider(this.adapterIdentifierRegistry, {
|
|
43
|
+
repoRoot: options.repoRoot,
|
|
44
|
+
adapter: options.adapter,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
logStartupInfo() {
|
|
48
|
+
logger.info(banner);
|
|
49
|
+
logger.info("🌌 Version Engine for Repo Semantic Evolution");
|
|
50
|
+
logger.info(" Orchestrating your monorepo multiverse...");
|
|
51
|
+
logger.info("");
|
|
52
|
+
logger.info("🚀 Starting μVERSE engine...");
|
|
53
|
+
logger.info(`Repository: ${this.options.repoRoot}`);
|
|
54
|
+
logger.info(`Adapter: ${this.options.adapter || "(auto-detect)"}`);
|
|
55
|
+
logger.info(`Dry run: ${this.options.dryRun}`);
|
|
56
|
+
logger.info(`Prerelease mode: ${this.options.prereleaseMode}`);
|
|
57
|
+
if (this.options.prereleaseMode) {
|
|
58
|
+
logger.info(`Prerelease ID: ${this.options.prereleaseId}`);
|
|
59
|
+
logger.info(`Bump unchanged modules: ${this.options.bumpUnchanged}`);
|
|
60
|
+
}
|
|
61
|
+
logger.info(`Add build metadata: ${this.options.addBuildMetadata}`);
|
|
62
|
+
logger.info(`Timestamp versions: ${this.options.timestampVersions}`);
|
|
63
|
+
logger.info(`Append snapshot: ${this.options.appendSnapshot}`);
|
|
64
|
+
logger.info(`Push changes: ${this.options.pushChanges}`);
|
|
65
|
+
logger.info(`Generate changelog: ${this.options.generateChangelog}`);
|
|
66
|
+
logger.info("🏃 Running μVERSE semantic evolution...");
|
|
67
|
+
}
|
|
68
|
+
logShutdownInfo(result) {
|
|
69
|
+
if (!result)
|
|
70
|
+
return;
|
|
71
|
+
if (result.bumped) {
|
|
72
|
+
logger.info(`✅ Successfully updated ${result.changedModules.length} modules`);
|
|
73
|
+
for (const module of result.changedModules) {
|
|
74
|
+
logger.info(` ${module.id}: ${module.from} → ${module.to} (${module.bumpType})`);
|
|
75
|
+
}
|
|
76
|
+
if (result.createdTags.length > 0) {
|
|
77
|
+
logger.info(`🏷️ Created ${result.createdTags.length} tags: ${result.createdTags.join(", ")}`);
|
|
78
|
+
}
|
|
79
|
+
if (result.changelogPaths.length > 0) {
|
|
80
|
+
logger.info(`📚 Generated ${result.changelogPaths.length} changelog files`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
logger.info("✨ No version changes needed");
|
|
85
|
+
}
|
|
86
|
+
logger.info("");
|
|
87
|
+
logger.info("🎯 μVERSE completed successfully!");
|
|
88
|
+
logger.info(" Your multiverse has evolved semantically ✨");
|
|
89
|
+
}
|
|
90
|
+
async run() {
|
|
91
|
+
this.logStartupInfo();
|
|
92
|
+
let result = null;
|
|
93
|
+
try {
|
|
94
|
+
result = await this.doRun();
|
|
95
|
+
return result;
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
// Any cleanup if needed
|
|
99
|
+
this.logShutdownInfo(result);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async doRun() {
|
|
103
|
+
this.adapter = await this.adapterMetadataProvider.getMetadata();
|
|
104
|
+
// Initialize module system factory with resolved adapter
|
|
105
|
+
this.moduleSystemFactory = createModuleSystemFactory(this.adapter.id, this.options.repoRoot);
|
|
106
|
+
// Load configuration
|
|
107
|
+
this.config = await this.configurationLoader.load(this.options.repoRoot);
|
|
108
|
+
// Check if working directory is clean
|
|
109
|
+
if (!this.options.dryRun &&
|
|
110
|
+
!isWorkingDirectoryClean({ cwd: this.options.repoRoot })) {
|
|
111
|
+
throw new Error("Working directory is not clean. Please commit or stash your changes.");
|
|
112
|
+
}
|
|
113
|
+
// Discover modules and get hierarchy manager
|
|
114
|
+
logger.info("🔍 Discovering modules...");
|
|
115
|
+
const detector = this.moduleSystemFactory.createDetector();
|
|
116
|
+
this.moduleRegistry = await detector.detect();
|
|
117
|
+
// Log discovered modules through hierarchy manager
|
|
118
|
+
const moduleIds = this.moduleRegistry.getModuleIds();
|
|
119
|
+
logger.info(`Found ${moduleIds.length} modules: ${moduleIds.join(", ")}`);
|
|
120
|
+
// Analyze commits since last release
|
|
121
|
+
this.commitAnalyzer = new CommitAnalyzer(this.moduleRegistry, this.options.repoRoot);
|
|
122
|
+
const moduleCommits = await this.commitAnalyzer.analyzeCommitsSinceLastRelease();
|
|
123
|
+
// Initialize version bumper service
|
|
124
|
+
const versionBumperOptions = {
|
|
125
|
+
prereleaseMode: this.options.prereleaseMode,
|
|
126
|
+
bumpUnchanged: this.options.bumpUnchanged,
|
|
127
|
+
addBuildMetadata: this.options.addBuildMetadata,
|
|
128
|
+
appendSnapshot: this.options.appendSnapshot,
|
|
129
|
+
adapter: this.adapter,
|
|
130
|
+
timestampVersions: this.options.timestampVersions,
|
|
131
|
+
prereleaseId: this.options.prereleaseId,
|
|
132
|
+
repoRoot: this.options.repoRoot,
|
|
133
|
+
config: this.config,
|
|
134
|
+
};
|
|
135
|
+
this.versionBumper = new VersionBumper(this.moduleRegistry, versionBumperOptions);
|
|
136
|
+
// Calculate version bumps with cascade effects
|
|
137
|
+
const processedModuleChanges = await this.versionBumper.calculateVersionBumps(moduleCommits);
|
|
138
|
+
const discoveredModules = Array.from(this.moduleRegistry.getModules().values());
|
|
139
|
+
if (processedModuleChanges.length === 0) {
|
|
140
|
+
logger.info("✨ No version changes needed");
|
|
141
|
+
return {
|
|
142
|
+
bumped: false,
|
|
143
|
+
discoveredModules,
|
|
144
|
+
changedModules: [],
|
|
145
|
+
createdTags: [],
|
|
146
|
+
changelogPaths: [],
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
// Create version manager
|
|
150
|
+
const versionUpdateStrategy = this.moduleSystemFactory.createVersionUpdateStrategy();
|
|
151
|
+
this.versionManager = new VersionManager(this.moduleRegistry, versionUpdateStrategy);
|
|
152
|
+
// Initialize version applier and apply changes
|
|
153
|
+
const versionApplierOptions = {
|
|
154
|
+
dryRun: this.options.dryRun,
|
|
155
|
+
};
|
|
156
|
+
this.versionApplier = new VersionApplier(this.versionManager, versionApplierOptions);
|
|
157
|
+
const changedModules = await this.versionApplier.applyVersionChanges(processedModuleChanges);
|
|
158
|
+
// Generate changelogs
|
|
159
|
+
const changelogPaths = await this.changelogGenerator.generateChangelogs(changedModules, moduleCommits);
|
|
160
|
+
// Initialize git operations service
|
|
161
|
+
const gitOperationsOptions = {
|
|
162
|
+
pushChanges: this.options.pushChanges,
|
|
163
|
+
pushTags: this.options.pushTags,
|
|
164
|
+
repoRoot: this.options.repoRoot,
|
|
165
|
+
dryRun: this.options.dryRun,
|
|
166
|
+
isTemporaryVersion: this.options.prereleaseMode || this.options.appendSnapshot,
|
|
167
|
+
};
|
|
168
|
+
this.gitOperations = new GitOperations(gitOperationsOptions);
|
|
169
|
+
// Commit and push changes
|
|
170
|
+
await this.gitOperations.commitAndPushChanges(changedModules);
|
|
171
|
+
// Create and push tags
|
|
172
|
+
const createdTags = await this.gitOperations.createAndPushTags(changedModules);
|
|
173
|
+
logger.info("✅ μVERSE semantic evolution completed successfully!");
|
|
174
|
+
return {
|
|
175
|
+
bumped: true,
|
|
176
|
+
discoveredModules,
|
|
177
|
+
changedModules,
|
|
178
|
+
createdTags,
|
|
179
|
+
changelogPaths,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { VersionManager } from "./version-manager.js";
|
|
2
|
+
import { BumpType } from "../semver/index.js";
|
|
3
|
+
import { ProcessedModuleChange } from "./version-bumper.js";
|
|
4
|
+
export type VersionApplierOptions = {
|
|
5
|
+
dryRun: boolean;
|
|
6
|
+
};
|
|
7
|
+
export type ModuleChangeResult = {
|
|
8
|
+
readonly id: string;
|
|
9
|
+
readonly name: string;
|
|
10
|
+
readonly path: string;
|
|
11
|
+
readonly type: "module" | "root";
|
|
12
|
+
readonly from: string;
|
|
13
|
+
readonly to: string;
|
|
14
|
+
readonly bumpType: BumpType;
|
|
15
|
+
readonly declaredVersion: boolean;
|
|
16
|
+
};
|
|
17
|
+
export declare class VersionApplier {
|
|
18
|
+
private readonly versionManager;
|
|
19
|
+
private readonly options;
|
|
20
|
+
constructor(versionManager: VersionManager, options: VersionApplierOptions);
|
|
21
|
+
applyVersionChanges(processedModuleChanges: ProcessedModuleChange[]): Promise<ModuleChangeResult[]>;
|
|
22
|
+
private logPlannedChanges;
|
|
23
|
+
private stageVersions;
|
|
24
|
+
private commitVersions;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=version-applier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-applier.d.ts","sourceRoot":"","sources":["../../src/services/version-applier.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAgB,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;CACnC,CAAC;AAEF,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,qBAAqB;IAG3C,mBAAmB,CACvB,sBAAsB,EAAE,qBAAqB,EAAE,GAC9C,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAyChC,OAAO,CAAC,iBAAiB;YAeX,aAAa;YAWb,cAAc;CAM7B"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { logger } from "../utils/logger.js";
|
|
2
|
+
import { formatSemVer } from "../semver/index.js";
|
|
3
|
+
export class VersionApplier {
|
|
4
|
+
versionManager;
|
|
5
|
+
options;
|
|
6
|
+
constructor(versionManager, options) {
|
|
7
|
+
this.versionManager = versionManager;
|
|
8
|
+
this.options = options;
|
|
9
|
+
}
|
|
10
|
+
async applyVersionChanges(processedModuleChanges) {
|
|
11
|
+
if (processedModuleChanges.length === 0) {
|
|
12
|
+
logger.info("✨ No version changes to apply");
|
|
13
|
+
return [];
|
|
14
|
+
}
|
|
15
|
+
logger.info("🔍 Filtering modules with declared versions...");
|
|
16
|
+
const modulesWithDeclaredVersions = processedModuleChanges.filter((change) => change.module.declaredVersion);
|
|
17
|
+
if (modulesWithDeclaredVersions.length === 0) {
|
|
18
|
+
logger.info("✨ No modules with declared versions to update");
|
|
19
|
+
return [];
|
|
20
|
+
}
|
|
21
|
+
this.logPlannedChanges(modulesWithDeclaredVersions);
|
|
22
|
+
if (this.options.dryRun) {
|
|
23
|
+
logger.info("🏃♂️ Dry run mode - version changes will not be written to files");
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
await this.stageVersions(modulesWithDeclaredVersions);
|
|
27
|
+
await this.commitVersions();
|
|
28
|
+
}
|
|
29
|
+
// Create and return result objects
|
|
30
|
+
return processedModuleChanges.map((change) => ({
|
|
31
|
+
id: change.module.id,
|
|
32
|
+
name: change.module.name,
|
|
33
|
+
path: change.module.path,
|
|
34
|
+
type: change.module.type,
|
|
35
|
+
from: formatSemVer(change.fromVersion),
|
|
36
|
+
to: change.toVersion,
|
|
37
|
+
bumpType: change.bumpType,
|
|
38
|
+
declaredVersion: change.module.declaredVersion,
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
logPlannedChanges(processedModuleChanges) {
|
|
42
|
+
logger.info(`📈 Planning to update ${processedModuleChanges.length} modules:`);
|
|
43
|
+
for (const change of processedModuleChanges) {
|
|
44
|
+
const from = formatSemVer(change.fromVersion);
|
|
45
|
+
const to = change.toVersion;
|
|
46
|
+
logger.info(` ${change.module.id}: ${from} → ${to} (${change.bumpType}, ${change.reason})`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async stageVersions(processedModuleChanges) {
|
|
50
|
+
logger.info("✍️ Staging new versions...");
|
|
51
|
+
for (const change of processedModuleChanges) {
|
|
52
|
+
// Use toVersion directly (now includes all transformations like Gradle snapshots)
|
|
53
|
+
this.versionManager.updateVersion(change.module.id, change.toVersion);
|
|
54
|
+
logger.info(` Staged ${change.module.id} to ${change.toVersion}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async commitVersions() {
|
|
58
|
+
logger.info("💾 Committing version updates to files...");
|
|
59
|
+
const pendingUpdatesCount = this.versionManager.getPendingUpdatesCount();
|
|
60
|
+
await this.versionManager.commit();
|
|
61
|
+
logger.info(`✅ Committed ${pendingUpdatesCount} version updates`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version Bumper Service for μVERSE.
|
|
3
|
+
* Implements core version calculation logic: analyzes commits, cascades changes through
|
|
4
|
+
* dependencies, and applies versions with support for prereleases, metadata, and snapshots.
|
|
5
|
+
*/
|
|
6
|
+
import { Config } from "../config/index.js";
|
|
7
|
+
import { ModuleRegistry } from "./module-registry.js";
|
|
8
|
+
import { BumpType } from "../semver/index.js";
|
|
9
|
+
import { CommitInfo } from "../git/index.js";
|
|
10
|
+
import { SemVer } from "semver";
|
|
11
|
+
import { AdapterMetadata } from "./adapter-identifier.js";
|
|
12
|
+
import { Module } from "../adapters/project-information.js";
|
|
13
|
+
/**
|
|
14
|
+
* Configuration options for the version bumper service.
|
|
15
|
+
*/
|
|
16
|
+
export type VersionBumperOptions = {
|
|
17
|
+
/** Whether to generate prerelease versions (e.g., 1.0.0-alpha.1). */
|
|
18
|
+
prereleaseMode: boolean;
|
|
19
|
+
/** Whether to bump versions of unchanged modules in prerelease mode. */
|
|
20
|
+
bumpUnchanged: boolean;
|
|
21
|
+
/** Whether to add build metadata (commit SHA) to versions. */
|
|
22
|
+
addBuildMetadata: boolean;
|
|
23
|
+
/** Whether to append -SNAPSHOT suffix for Gradle projects. */
|
|
24
|
+
appendSnapshot: boolean;
|
|
25
|
+
/** Adapter metadata providing project-specific capabilities. */
|
|
26
|
+
adapter: AdapterMetadata;
|
|
27
|
+
/** Whether to include timestamps in prerelease identifiers. */
|
|
28
|
+
timestampVersions: boolean;
|
|
29
|
+
/** Base prerelease identifier (e.g., 'alpha', 'beta', 'rc'). */
|
|
30
|
+
prereleaseId: string;
|
|
31
|
+
/** Absolute path to the repository root directory. */
|
|
32
|
+
repoRoot: string;
|
|
33
|
+
/** Project configuration including dependency bump rules. */
|
|
34
|
+
config: Config;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Final processed module version change result.
|
|
38
|
+
* Represents a completed version calculation ready for application.
|
|
39
|
+
*/
|
|
40
|
+
export type ProcessedModuleChange = {
|
|
41
|
+
/** The module with calculated version change. */
|
|
42
|
+
readonly module: Module;
|
|
43
|
+
/** Original semantic version before changes. */
|
|
44
|
+
readonly fromVersion: SemVer;
|
|
45
|
+
/** New calculated version string (e.g., '1.1.0', '1.1.0-alpha.1', '1.1.0-SNAPSHOT'). */
|
|
46
|
+
readonly toVersion: string;
|
|
47
|
+
/** Final bump type applied ('major', 'minor', 'patch', or 'none'). */
|
|
48
|
+
readonly bumpType: BumpType;
|
|
49
|
+
/** Reason for version change. */
|
|
50
|
+
readonly reason: ChangeReason;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Reason why a module's version is being changed.
|
|
54
|
+
*/
|
|
55
|
+
export type ChangeReason = "commits" | "dependency" | "cascade" | "prerelease-unchanged" | "build-metadata" | "gradle-snapshot";
|
|
56
|
+
/**
|
|
57
|
+
* Service for calculating version bumps across modules.
|
|
58
|
+
* Handles commit analysis, dependency cascade effects, and various versioning strategies
|
|
59
|
+
* (regular, prerelease, snapshot).
|
|
60
|
+
*/
|
|
61
|
+
export declare class VersionBumper {
|
|
62
|
+
private readonly moduleRegistry;
|
|
63
|
+
private readonly options;
|
|
64
|
+
/**
|
|
65
|
+
* Creates a new VersionBumper instance.
|
|
66
|
+
* @param moduleRegistry - Registry containing all modules and their interdependencies
|
|
67
|
+
* @param options - Configuration options controlling version bump behavior
|
|
68
|
+
*/
|
|
69
|
+
constructor(moduleRegistry: ModuleRegistry, options: VersionBumperOptions);
|
|
70
|
+
/**
|
|
71
|
+
* Calculates version bumps for all modules based on their commits.
|
|
72
|
+
* Orchestrates a three-phase process: initial bumps (commit analysis), cascade effects (dependency propagation),
|
|
73
|
+
* and version application (applying strategies like prerelease, timestamps, build metadata).
|
|
74
|
+
* @param moduleCommits - Map of module IDs to their commits since last version
|
|
75
|
+
* @returns Promise resolving to array of processed module changes (only modules that need updates)
|
|
76
|
+
* @throws {Error} If git operations fail
|
|
77
|
+
*/
|
|
78
|
+
calculateVersionBumps(moduleCommits: Map<string, CommitInfo[]>): Promise<ProcessedModuleChange[]>;
|
|
79
|
+
/**
|
|
80
|
+
* Calculates initial version bump types for all modules based on commits.
|
|
81
|
+
*
|
|
82
|
+
* This is Phase 1 of the version calculation process. It analyzes commits for each
|
|
83
|
+
* module to determine the required version bump type using Conventional Commits
|
|
84
|
+
* specification.
|
|
85
|
+
*
|
|
86
|
+
* The method creates a `ProcessingModuleChange` for **every** module in the registry,
|
|
87
|
+
* not just those with commits. The `needsProcessing` flag determines which modules
|
|
88
|
+
* will ultimately be updated.
|
|
89
|
+
*
|
|
90
|
+
* **Processing Decision Logic**:
|
|
91
|
+
* - Module has commits requiring bump: `needsProcessing = true, reason = 'commits'`
|
|
92
|
+
* - Prerelease mode with bumpUnchanged: `needsProcessing = true, reason = 'prerelease-unchanged'`
|
|
93
|
+
* - Build metadata enabled: `needsProcessing = true, reason = 'build-metadata'`
|
|
94
|
+
* - Otherwise: `needsProcessing = false, reason = 'unchanged'`
|
|
95
|
+
*
|
|
96
|
+
* @param moduleCommits - Map of module IDs to their commits since last version.
|
|
97
|
+
*
|
|
98
|
+
* @returns Array of processing module changes for all modules in the registry
|
|
99
|
+
*/
|
|
100
|
+
private calculateInitialBumps;
|
|
101
|
+
/**
|
|
102
|
+
* Calculates cascade effects when modules change.
|
|
103
|
+
*
|
|
104
|
+
* This is Phase 2 of the version calculation process. It propagates version changes
|
|
105
|
+
* through the module dependency graph, ensuring that when a module changes, all
|
|
106
|
+
* modules that depend on it are also bumped appropriately.
|
|
107
|
+
*
|
|
108
|
+
* **Algorithm**: Uses a breadth-first traversal of the dependency graph:
|
|
109
|
+
* 1. Start with all modules marked for processing (needsProcessing = true)
|
|
110
|
+
* 2. For each module being processed, find all modules that depend on it
|
|
111
|
+
* 3. Calculate required bump for dependents using dependency bump rules
|
|
112
|
+
* 4. If dependent needs a higher bump, update it and add to processing queue
|
|
113
|
+
* 5. Continue until no more cascades are needed
|
|
114
|
+
*
|
|
115
|
+
* **Complexity**: O(V + E) where V = number of modules, E = number of dependencies
|
|
116
|
+
*
|
|
117
|
+
* **In-Place Modification**: This method modifies the input array in place for
|
|
118
|
+
* efficiency. The same array reference is returned with cascade effects applied.
|
|
119
|
+
*
|
|
120
|
+
* @param allModuleChanges - Array of all module changes (will be modified in place).
|
|
121
|
+
* Should include all modules from calculateInitialBumps().
|
|
122
|
+
*
|
|
123
|
+
* @returns The same array with cascade effects applied
|
|
124
|
+
*/
|
|
125
|
+
private calculateCascadeEffects;
|
|
126
|
+
/**
|
|
127
|
+
* Applies version calculations and transformations to all modules.
|
|
128
|
+
*
|
|
129
|
+
* This is Phase 3 (final) of the version calculation process. It takes modules
|
|
130
|
+
* with calculated bump types and applies version transformations including:
|
|
131
|
+
* - Semantic version bumping (major, minor, patch)
|
|
132
|
+
* - Prerelease version generation
|
|
133
|
+
* - Build metadata appending
|
|
134
|
+
* - Snapshot suffix appending
|
|
135
|
+
*
|
|
136
|
+
* **Version Application Scenarios**:
|
|
137
|
+
* 1. **Commits + Regular Mode**: Bump semantic version normally
|
|
138
|
+
* 2. **Commits + Prerelease Mode**: Bump to prerelease version
|
|
139
|
+
* 3. **No Commits + Prerelease + bumpUnchanged**: Force prerelease bump
|
|
140
|
+
* 4. **Build Metadata Mode**: Append git SHA as metadata
|
|
141
|
+
* 5. **Snapshot Mode**: Append -SNAPSHOT suffix
|
|
142
|
+
*
|
|
143
|
+
* @param processingModuleChanges - All module changes with calculated bump types
|
|
144
|
+
* from cascade effects phase.
|
|
145
|
+
*
|
|
146
|
+
* @param effectivePrereleaseId - Prerelease identifier to use (may include timestamp).
|
|
147
|
+
* Example: 'alpha', 'alpha.20251021143022'
|
|
148
|
+
*
|
|
149
|
+
* @param shortSha - Optional git commit short SHA for build metadata.
|
|
150
|
+
* Example: 'a1b2c3d'
|
|
151
|
+
*
|
|
152
|
+
* @returns Array of processed module changes ready for application (only modules with needsProcessing = true)
|
|
153
|
+
*/
|
|
154
|
+
private applyVersionCalculations;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=version-bumper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-bumper.d.ts","sourceRoot":"","sources":["../../src/services/version-bumper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,MAAM,EAAyB,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAOL,QAAQ,EACT,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,UAAU,EAA4B,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAE5D;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,qEAAqE;IACrE,cAAc,EAAE,OAAO,CAAC;IACxB,wEAAwE;IACxE,aAAa,EAAE,OAAO,CAAC;IACvB,8DAA8D;IAC9D,gBAAgB,EAAE,OAAO,CAAC;IAC1B,8DAA8D;IAC9D,cAAc,EAAE,OAAO,CAAC;IACxB,gEAAgE;IAChE,OAAO,EAAE,eAAe,CAAC;IACzB,+DAA+D;IAC/D,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gEAAgE;IAChE,YAAY,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAsBF;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,iDAAiD;IACjD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,gDAAgD;IAChD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,wFAAwF;IACxF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,sEAAsE;IACtE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,iCAAiC;IACjC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;CAC/B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB,SAAS,GACT,YAAY,GACZ,SAAS,GACT,sBAAsB,GACtB,gBAAgB,GAChB,iBAAiB,CAAC;AAEtB;;;;GAIG;AACH,qBAAa,aAAa;IAOtB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAP1B;;;;OAIG;gBAEgB,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,oBAAoB;IAGhD;;;;;;;OAOG;IACG,qBAAqB,CACzB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,GACvC,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAuCnC;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,qBAAqB;IA6C7B;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,OAAO,CAAC,uBAAuB;IAgG/B;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,OAAO,CAAC,wBAAwB;CAgFjC"}
|