@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.
Files changed (117) hide show
  1. package/README.md +22 -0
  2. package/dist/adapters/gradle/constants.d.ts +13 -0
  3. package/dist/adapters/gradle/constants.d.ts.map +1 -0
  4. package/dist/adapters/gradle/constants.js +12 -0
  5. package/dist/adapters/gradle/gradle-project-information.d.ts +18 -0
  6. package/dist/adapters/gradle/gradle-project-information.d.ts.map +1 -0
  7. package/dist/adapters/gradle/gradle-project-information.js +93 -0
  8. package/dist/adapters/gradle/gradle-properties.d.ts +15 -0
  9. package/dist/adapters/gradle/gradle-properties.d.ts.map +1 -0
  10. package/dist/adapters/gradle/gradle-properties.js +46 -0
  11. package/dist/adapters/gradle/init-project-information.gradle.kts +143 -0
  12. package/dist/adapters/gradle/services/gradle-adapter-identifier.d.ts +21 -0
  13. package/dist/adapters/gradle/services/gradle-adapter-identifier.d.ts.map +1 -0
  14. package/dist/adapters/gradle/services/gradle-adapter-identifier.js +44 -0
  15. package/dist/adapters/gradle/services/gradle-module-detector.d.ts +18 -0
  16. package/dist/adapters/gradle/services/gradle-module-detector.d.ts.map +1 -0
  17. package/dist/adapters/gradle/services/gradle-module-detector.js +26 -0
  18. package/dist/adapters/gradle/services/gradle-module-system-factory.d.ts +23 -0
  19. package/dist/adapters/gradle/services/gradle-module-system-factory.d.ts.map +1 -0
  20. package/dist/adapters/gradle/services/gradle-module-system-factory.js +27 -0
  21. package/dist/adapters/gradle/services/gradle-version-update-strategy.d.ts +21 -0
  22. package/dist/adapters/gradle/services/gradle-version-update-strategy.d.ts.map +1 -0
  23. package/dist/adapters/gradle/services/gradle-version-update-strategy.js +36 -0
  24. package/dist/adapters/project-information.d.ts +58 -0
  25. package/dist/adapters/project-information.d.ts.map +1 -0
  26. package/dist/adapters/project-information.js +1 -0
  27. package/dist/changelog/index.d.ts +27 -0
  28. package/dist/changelog/index.d.ts.map +1 -0
  29. package/dist/changelog/index.js +204 -0
  30. package/dist/config/index.d.ts +122 -0
  31. package/dist/config/index.d.ts.map +1 -0
  32. package/dist/config/index.js +115 -0
  33. package/dist/factories/adapter-identifier-registry.d.ts +12 -0
  34. package/dist/factories/adapter-identifier-registry.d.ts.map +1 -0
  35. package/dist/factories/adapter-identifier-registry.js +24 -0
  36. package/dist/factories/module-system-factory.d.ts +10 -0
  37. package/dist/factories/module-system-factory.d.ts.map +1 -0
  38. package/dist/factories/module-system-factory.js +18 -0
  39. package/dist/git/index.d.ts +253 -0
  40. package/dist/git/index.d.ts.map +1 -0
  41. package/dist/git/index.js +581 -0
  42. package/dist/index.d.ts +23 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +22 -0
  45. package/dist/semver/index.d.ts +85 -0
  46. package/dist/semver/index.d.ts.map +1 -0
  47. package/dist/semver/index.js +176 -0
  48. package/dist/services/adapter-identifier-registry.d.ts +38 -0
  49. package/dist/services/adapter-identifier-registry.d.ts.map +1 -0
  50. package/dist/services/adapter-identifier-registry.js +59 -0
  51. package/dist/services/adapter-identifier.d.ts +31 -0
  52. package/dist/services/adapter-identifier.d.ts.map +1 -0
  53. package/dist/services/adapter-identifier.js +1 -0
  54. package/dist/services/adapter-metadata-provider.d.ts +51 -0
  55. package/dist/services/adapter-metadata-provider.d.ts.map +1 -0
  56. package/dist/services/adapter-metadata-provider.js +66 -0
  57. package/dist/services/changelog-generator.d.ts +13 -0
  58. package/dist/services/changelog-generator.d.ts.map +1 -0
  59. package/dist/services/changelog-generator.js +26 -0
  60. package/dist/services/commit-analyzer.d.ts +44 -0
  61. package/dist/services/commit-analyzer.d.ts.map +1 -0
  62. package/dist/services/commit-analyzer.js +86 -0
  63. package/dist/services/configuration-loader.d.ts +23 -0
  64. package/dist/services/configuration-loader.d.ts.map +1 -0
  65. package/dist/services/configuration-loader.js +79 -0
  66. package/dist/services/configuration-validator.d.ts +16 -0
  67. package/dist/services/configuration-validator.d.ts.map +1 -0
  68. package/dist/services/configuration-validator.js +24 -0
  69. package/dist/services/git-operations.d.ts +16 -0
  70. package/dist/services/git-operations.d.ts.map +1 -0
  71. package/dist/services/git-operations.js +89 -0
  72. package/dist/services/module-detector.d.ts +24 -0
  73. package/dist/services/module-detector.d.ts.map +1 -0
  74. package/dist/services/module-detector.js +1 -0
  75. package/dist/services/module-registry.d.ts +45 -0
  76. package/dist/services/module-registry.d.ts.map +1 -0
  77. package/dist/services/module-registry.js +57 -0
  78. package/dist/services/module-system-factory.d.ts +24 -0
  79. package/dist/services/module-system-factory.d.ts.map +1 -0
  80. package/dist/services/module-system-factory.js +1 -0
  81. package/dist/services/verse-runner.d.ts +45 -0
  82. package/dist/services/verse-runner.d.ts.map +1 -0
  83. package/dist/services/verse-runner.js +182 -0
  84. package/dist/services/version-applier.d.ts +26 -0
  85. package/dist/services/version-applier.d.ts.map +1 -0
  86. package/dist/services/version-applier.js +63 -0
  87. package/dist/services/version-bumper.d.ts +156 -0
  88. package/dist/services/version-bumper.d.ts.map +1 -0
  89. package/dist/services/version-bumper.js +291 -0
  90. package/dist/services/version-manager.d.ts +68 -0
  91. package/dist/services/version-manager.d.ts.map +1 -0
  92. package/dist/services/version-manager.js +94 -0
  93. package/dist/services/version-update-strategy.d.ts +18 -0
  94. package/dist/services/version-update-strategy.d.ts.map +1 -0
  95. package/dist/services/version-update-strategy.js +1 -0
  96. package/dist/utils/banner.d.ts +2 -0
  97. package/dist/utils/banner.d.ts.map +1 -0
  98. package/dist/utils/banner.js +8 -0
  99. package/dist/utils/commits.d.ts +12 -0
  100. package/dist/utils/commits.d.ts.map +1 -0
  101. package/dist/utils/commits.js +24 -0
  102. package/dist/utils/file.d.ts +7 -0
  103. package/dist/utils/file.d.ts.map +1 -0
  104. package/dist/utils/file.js +19 -0
  105. package/dist/utils/index.d.ts +6 -0
  106. package/dist/utils/index.d.ts.map +1 -0
  107. package/dist/utils/index.js +5 -0
  108. package/dist/utils/logger.d.ts +14 -0
  109. package/dist/utils/logger.d.ts.map +1 -0
  110. package/dist/utils/logger.js +22 -0
  111. package/dist/utils/properties.d.ts +16 -0
  112. package/dist/utils/properties.d.ts.map +1 -0
  113. package/dist/utils/properties.js +62 -0
  114. package/dist/utils/versioning.d.ts +8 -0
  115. package/dist/utils/versioning.d.ts.map +1 -0
  116. package/dist/utils/versioning.js +17 -0
  117. 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"}