66 getLatestRavenBuilds ,
77 getLatestSparrowBuilds ,
88 getLatestNestsBuilds ,
9+ getLoomVersions ,
10+ getPloceusVersions ,
911 getVersionDetails ,
1012 isSharedVersioning
1113} from "./meta_maven_utils.js" ;
@@ -15,7 +17,6 @@ import { normalizeMinecraftVersion } from "./minecraft_semver.js";
1517( async ( ) => {
1618 const FABRIC_LOOM = "net.fabricmc.fabric-loom-remap"
1719 const QUILT_LOOM = "org.quiltmc.loom.remap"
18- const LOOM_VERSION = "1.15-SNAPSHOT"
1920 const PLOCEUS = "ploceus"
2021
2122 const FABRIC_LOADER = "net.fabricmc:fabric-loader"
@@ -57,6 +58,36 @@ import { normalizeMinecraftVersion } from "./minecraft_semver.js";
5758 return Object . entries ( dependencyManagementSelectorRadios ) . find ( ( [ _ , button ] ) => button . checked ) [ 0 ] ;
5859 }
5960
61+ function isStable ( version ) {
62+ return ! version . includes ( "-" ) ;
63+ }
64+
65+ function significantPrefix ( version ) {
66+ return version . split ( "." ) . splice ( 0 , 2 ) . join ( "." ) ;
67+ }
68+
69+ function highestCompatibleVersions ( loomVersions , ploceusVersions ) {
70+ // Map of major.minor -> latest patch of the same major.minor
71+ const ploceusLookup = new Map ( ploceusVersions . reverse ( ) . filter ( isStable ) . map ( version => {
72+ return [ significantPrefix ( version ) , version ] ;
73+ } ) ) ;
74+
75+ for ( const loomVersion of loomVersions ) {
76+ if ( ! isStable ( loomVersion ) ) {
77+ continue ;
78+ }
79+
80+ const prefix = significantPrefix ( loomVersion ) ;
81+ const ploceusVersion = ploceusLookup . get ( prefix ) ;
82+
83+ if ( ploceusVersion ) {
84+ return [ loomVersion , ploceusVersion ] ;
85+ }
86+ }
87+
88+ throw new Error ( "Unable to compute recommended Loom and Ploceus versions" ) ;
89+ }
90+
6091 async function updateDisplayedElements ( ) {
6192 const minecraftVersion = selectedMinecraftVersion ( ) ;
6293 const intermediaryGen = selectedCalamusGeneration ( ) ;
@@ -66,9 +97,11 @@ import { normalizeMinecraftVersion } from "./minecraft_semver.js";
6697 if ( minecraftVersions . includes ( minecraftVersion ) ) {
6798 const versionDetails = await getVersionDetails ( intermediaryGen , minecraftVersion ) ;
6899
69- const [ loaderVersion , featherBuilds , ravenBuilds , sparrowBuilds , nestsBuilds , oslVersion ] = await Promise . all (
100+ const [ loaderVersion , loomVersions , ploceusVersions , featherBuilds , ravenBuilds , sparrowBuilds , nestsBuilds , oslVersion ] = await Promise . all (
70101 [
71102 getLatestLoaderVersion ( modLoader ) ,
103+ getLoomVersions ( modLoader ) ,
104+ getPloceusVersions ( ) ,
72105 getLatestFeatherBuilds ( intermediaryGen , versionDetails ) ,
73106 getLatestRavenBuilds ( versionDetails ) ,
74107 getLatestSparrowBuilds ( versionDetails ) ,
@@ -78,6 +111,7 @@ import { normalizeMinecraftVersion } from "./minecraft_semver.js";
78111 ) ;
79112
80113 const sharedVersioning = isSharedVersioning ( versionDetails ) ;
114+ const [ loomVersion , ploceusVersion ] = highestCompatibleVersions ( loomVersions , ploceusVersions ) ;
81115
82116 // wait for requests to finish to avoid flicker
83117 hideElements ( ) ;
@@ -91,7 +125,7 @@ import { normalizeMinecraftVersion } from "./minecraft_semver.js";
91125 break ;
92126 case "versionCatalog" :
93127 showElement ( "version-catalog" ) ;
94- await displayVersionCatalog ( versionDetails , intermediaryGen , modLoader , loaderVersion , featherBuilds , ravenBuilds , sparrowBuilds , nestsBuilds , oslVersion ) ;
128+ await displayVersionCatalog ( versionDetails , intermediaryGen , modLoader , loaderVersion , loomVersion , ploceusVersion , featherBuilds , ravenBuilds , sparrowBuilds , nestsBuilds , oslVersion ) ;
95129 break ;
96130 default :
97131 throw new Error ( `Unknown dependency management type ${ dependencyManagement } ` ) ;
@@ -100,13 +134,13 @@ import { normalizeMinecraftVersion } from "./minecraft_semver.js";
100134 const singleProject = ( intermediaryGen != "gen1" || ! sharedVersioning || versionDetails . sharedMappings || ! versionDetails . client || ! versionDetails . server ) ;
101135
102136 if ( singleProject ) {
103- await displayBuildScript ( versionDetails , intermediaryGen , modLoader , loaderVersion , featherBuilds , ravenBuilds , sparrowBuilds , nestsBuilds , oslVersion , dependencyManagement ) ;
137+ await displayBuildScript ( versionDetails , intermediaryGen , modLoader , loaderVersion , loomVersion , ploceusVersion , featherBuilds , ravenBuilds , sparrowBuilds , nestsBuilds , oslVersion , dependencyManagement ) ;
104138
105139 if ( dependencyManagement === "propertiesFile" ) {
106140 await displayProjectProperties ( versionDetails , intermediaryGen , modLoader , loaderVersion , featherBuilds , ravenBuilds , sparrowBuilds , nestsBuilds , oslVersion ) ;
107141 }
108142 } else {
109- await displayBuildScriptForGen1Split ( "root" , versionDetails , intermediaryGen , modLoader , loaderVersion , featherBuilds , ravenBuilds , sparrowBuilds , nestsBuilds , oslVersion , dependencyManagement ) ;
143+ await displayBuildScriptForGen1Split ( "root" , versionDetails , intermediaryGen , modLoader , loaderVersion , loomVersion , ploceusVersion , featherBuilds , ravenBuilds , sparrowBuilds , nestsBuilds , oslVersion , dependencyManagement ) ;
110144
111145 if ( dependencyManagement === "propertiesFile" ) {
112146 await displayProjectPropertiesForGen1Split ( "root" , versionDetails , intermediaryGen , modLoader , loaderVersion , featherBuilds , ravenBuilds , sparrowBuilds , nestsBuilds , oslVersion , dependencyManagement ) ;
@@ -116,14 +150,14 @@ import { normalizeMinecraftVersion } from "./minecraft_semver.js";
116150 showElement ( "client.build.gradle" ) ;
117151 showElement ( "client.gradle.properties" ) ;
118152
119- await displayBuildScriptForGen1Split ( "client" , versionDetails , intermediaryGen , modLoader , loaderVersion , featherBuilds , ravenBuilds , sparrowBuilds , nestsBuilds , oslVersion , dependencyManagement ) ;
153+ await displayBuildScriptForGen1Split ( "client" , versionDetails , intermediaryGen , modLoader , loaderVersion , loomVersion , ploceusVersion , featherBuilds , ravenBuilds , sparrowBuilds , nestsBuilds , oslVersion , dependencyManagement ) ;
120154 await displayProjectPropertiesForGen1Split ( "client" , versionDetails , intermediaryGen , modLoader , loaderVersion , featherBuilds , ravenBuilds , sparrowBuilds , nestsBuilds , oslVersion , dependencyManagement ) ;
121155 }
122156 if ( versionDetails . server ) {
123157 showElement ( "server.build.gradle" ) ;
124158 showElement ( "server.gradle.properties" ) ;
125159
126- await displayBuildScriptForGen1Split ( "server" , versionDetails , intermediaryGen , modLoader , loaderVersion , featherBuilds , ravenBuilds , sparrowBuilds , nestsBuilds , oslVersion , dependencyManagement ) ;
160+ await displayBuildScriptForGen1Split ( "server" , versionDetails , intermediaryGen , modLoader , loaderVersion , loomVersion , ploceusVersion , featherBuilds , ravenBuilds , sparrowBuilds , nestsBuilds , oslVersion , dependencyManagement ) ;
127161 await displayProjectPropertiesForGen1Split ( "server" , versionDetails , intermediaryGen , modLoader , loaderVersion , featherBuilds , ravenBuilds , sparrowBuilds , nestsBuilds , oslVersion , dependencyManagement ) ;
128162 }
129163 }
@@ -192,7 +226,7 @@ import { normalizeMinecraftVersion } from "./minecraft_semver.js";
192226 }
193227 }
194228
195- async function displayBuildScript ( minecraftVersion , intermediaryGen , modLoader , loaderVersion , featherBuilds , ravenBuilds , sparrowBuilds , nestsBuilds , oslVersion , dependencyManagement ) {
229+ async function displayBuildScript ( minecraftVersion , intermediaryGen , modLoader , loaderVersion , loomVersion , ploceusVersion , featherBuilds , ravenBuilds , sparrowBuilds , nestsBuilds , oslVersion , dependencyManagement ) {
196230 const sharedVersioning = isSharedVersioning ( minecraftVersion ) ;
197231 const elementId = "build.gradle.content" ;
198232
@@ -202,16 +236,16 @@ import { normalizeMinecraftVersion } from "./minecraft_semver.js";
202236
203237 switch ( modLoader ) {
204238 case "fabric" :
205- plugins . push ( `\t${ generatePluginDefinition ( FABRIC_LOOM , "loom" , LOOM_VERSION , dependencyManagement ) } ` ) ;
239+ plugins . push ( `\t${ generatePluginDefinition ( FABRIC_LOOM , "loom" , loomVersion , dependencyManagement ) } ` ) ;
206240 break ;
207241 case "quilt" :
208- plugins . push ( `\t${ generatePluginDefinition ( QUILT_LOOM , "loom" , LOOM_VERSION , dependencyManagement ) } ` ) ;
242+ plugins . push ( `\t${ generatePluginDefinition ( QUILT_LOOM , "loom" , loomVersion , dependencyManagement ) } ` ) ;
209243 break ;
210244 default :
211245 throw new Error ( "unknown mod loader " + modLoader ) ;
212246 }
213247
214- plugins . push ( `\t${ generatePluginDefinition ( PLOCEUS , "ploceus" , LOOM_VERSION , dependencyManagement ) } ` ) ;
248+ plugins . push ( `\t${ generatePluginDefinition ( PLOCEUS , "ploceus" , ploceusVersion , dependencyManagement ) } ` ) ;
215249
216250 if ( plugins ) {
217251 plugins . unshift ( "plugins {" ) ;
@@ -332,7 +366,7 @@ import { normalizeMinecraftVersion } from "./minecraft_semver.js";
332366 }
333367 }
334368
335- async function displayBuildScriptForGen1Split ( project , minecraftVersion , intermediaryGen , modLoader , loaderVersion , featherBuilds , ravenBuilds , sparrowBuilds , nestsBuilds , oslVersion , dependencyManagement ) {
369+ async function displayBuildScriptForGen1Split ( project , minecraftVersion , intermediaryGen , modLoader , loaderVersion , loomVersion , ploceusVersion , featherBuilds , ravenBuilds , sparrowBuilds , nestsBuilds , oslVersion , dependencyManagement ) {
336370 if ( project == "root" ) {
337371 const elementId = "build.gradle.content" ;
338372
@@ -342,16 +376,16 @@ import { normalizeMinecraftVersion } from "./minecraft_semver.js";
342376
343377 switch ( modLoader ) {
344378 case "fabric" :
345- plugins . push ( `\t${ generatePluginDefinition ( FABRIC_LOOM , "loom" , LOOM_VERSION , dependencyManagement , false ) } ` ) ;
379+ plugins . push ( `\t${ generatePluginDefinition ( FABRIC_LOOM , "loom" , loomVersion , dependencyManagement , false ) } ` ) ;
346380 break ;
347381 case "quilt" :
348- plugins . push ( `\t${ generatePluginDefinition ( QUILT_LOOM , "loom" , LOOM_VERSION , dependencyManagement , false ) } ` ) ;
382+ plugins . push ( `\t${ generatePluginDefinition ( QUILT_LOOM , "loom" , loomVersion , dependencyManagement , false ) } ` ) ;
349383 break ;
350384 default :
351385 throw new Error ( "unknown mod loader " + modLoader ) ;
352386 }
353387
354- plugins . push ( `\t${ generatePluginDefinition ( PLOCEUS , "ploceus" , LOOM_VERSION , dependencyManagement , false ) } ` ) ;
388+ plugins . push ( `\t${ generatePluginDefinition ( PLOCEUS , "ploceus" , ploceusVersion , dependencyManagement , false ) } ` ) ;
355389
356390 if ( plugins ) {
357391 plugins . unshift ( "plugins {" ) ;
@@ -568,7 +602,7 @@ import { normalizeMinecraftVersion } from "./minecraft_semver.js";
568602 }
569603 }
570604
571- async function displayVersionCatalog ( minecraftVersion , intermediaryGen , modLoader , loaderVersion , featherBuilds , ravenBuilds , sparrowBuilds , nestsBuilds , oslVersion ) {
605+ async function displayVersionCatalog ( minecraftVersion , intermediaryGen , modLoader , loaderVersion , loomVersion , ploceusVersion , featherBuilds , ravenBuilds , sparrowBuilds , nestsBuilds , oslVersion ) {
572606 const elementId = "version-catalog.content" ;
573607 const lines = [ ] ;
574608
@@ -621,8 +655,8 @@ import { normalizeMinecraftVersion } from "./minecraft_semver.js";
621655 }
622656
623657 lines . push ( `` ) ;
624- lines . push ( `loom = "${ LOOM_VERSION } "` ) ;
625- lines . push ( `ploceus = "${ LOOM_VERSION } "` ) ;
658+ lines . push ( `loom = "${ loomVersion } "` ) ;
659+ lines . push ( `ploceus = "${ ploceusVersion } "` ) ;
626660
627661 lines . push ( `` ) ;
628662 lines . push ( `[libraries]` ) ;
0 commit comments