@@ -915,30 +915,88 @@ module Settings = {
915915 <div className = titleClass > {React .string ("ReScript Version" )} </div >
916916 <DropdownSelect
917917 name = "compilerVersions"
918- value = readyState .selected .id
918+ value = { CompilerManagerHook . Semver . toString ( readyState .selected .id )}
919919 onChange = {evt => {
920920 ReactEvent .Form .preventDefault (evt )
921- let id = (evt -> ReactEvent .Form .target )["value" ]
922- onCompilerSelect (id )
921+ let id : string = (evt -> ReactEvent .Form .target )["value" ]
922+ switch id -> CompilerManagerHook .Semver .parse {
923+ | Some (v ) => onCompilerSelect (v )
924+ | None => ()
925+ }
923926 }}>
924- {switch readyState .experimentalVersions {
925- | [] => React .null
926- | experimentalVersions =>
927+ {
928+ let (experimentalVersions , stableVersions ) =
929+ readyState .versions -> Js .Array2 .reduce ((acc , item ) => {
930+ let (lhs , rhs ) = acc
931+ if item .preRelease -> Belt .Option .isSome {
932+ Js .Array2 .push (lhs , item )
933+ } else {
934+ Js .Array2 .push (rhs , item )
935+ }-> ignore
936+ acc
937+ }, ([], []))
938+
927939 <>
928- <option disabled = true className = "py-4" > {React .string ("---Experimental---" )} </option >
929- {Belt .Array .map (experimentalVersions , version =>
930- <option className = "py-4" key = version value = version >
931- {React .string (version )}
932- </option >
933- )-> React .array }
934- <option disabled = true className = "py-4" >
935- {React .string ("---Official Releases---" )}
936- </option >
940+ {switch experimentalVersions {
941+ | [] => React .null
942+ | experimentalVersions =>
943+ let versionByOrder = experimentalVersions -> Js .Array2 .sortInPlaceWith ((a , b ) => {
944+ let cmp = ({
945+ CompilerManagerHook .Semver .major : major ,
946+ minor ,
947+ patch ,
948+ preRelease ,
949+ }) => {
950+ let preRelease = switch preRelease {
951+ | Some (preRelease ) =>
952+ switch preRelease {
953+ | Dev (id ) => 0 + id
954+ | Alpha (id ) => 10 + id
955+ | Beta (id ) => 20 + id
956+ | Rc (id ) => 30 + id
957+ }
958+ | None => 0
959+ }
960+ let number =
961+ [major , minor , patch ]
962+ -> Js .Array2 .map (v => v -> Belt .Int .toString )
963+ -> Js .Array2 .joinWith ("" )
964+ -> Belt .Int .fromString
965+ -> Belt .Option .getWithDefault (0 )
966+
967+ number + preRelease
968+ }
969+ cmp (b ) - cmp (a )
970+ })
971+ <>
972+ <option disabled = true className = "py-4" >
973+ {React .string ("---Experimental---" )}
974+ </option >
975+ {versionByOrder
976+ -> Belt .Array .map (version => {
977+ let version = CompilerManagerHook .Semver .toString (version )
978+ <option className = "py-4" key = version value = version >
979+ {React .string (version )}
980+ </option >
981+ })
982+ -> React .array }
983+ <option disabled = true className = "py-4" >
984+ {React .string ("---Official Releases---" )}
985+ </option >
986+ </>
987+ }}
988+ {switch stableVersions {
989+ | [] => React .null
990+ | stableVersions =>
991+ Belt .Array .map (stableVersions , version => {
992+ let version = CompilerManagerHook .Semver .toString (version )
993+ <option className = "py-4" key = version value = version >
994+ {React .string (version )}
995+ </option >
996+ })-> React .array
997+ }}
937998 </>
938- }}
939- {Belt .Array .map (readyState .versions , version =>
940- <option className = "py-4" key = version value = version > {React .string (version )} </option >
941- )-> React .array }
999+ }
9421000 </DropdownSelect >
9431001 </div >
9441002 <div className = "mt-6" >
@@ -1350,29 +1408,29 @@ module App = {
13501408
13511409let initialReContent = j ` Js.log("Hello Reason 3.6!");`
13521410
1353- /**
1354- Takes a `versionStr` starting with a "v" and ending in major.minor.patch (e.g.
1355- "v10.1.0") returns major, minor, patch as an integer tuple if it's actually in
1356- a x.y.z format, otherwise will return `None`.
1357- */
1358- let parseVersion = (versionStr : string ): option <(int , int , int )> => {
1359- switch versionStr -> Js .String2 .replace ("v" , "" )-> Js .String2 .split ("." ) {
1360- | [major , minor , patch ] =>
1361- switch (major -> Belt .Int .fromString , minor -> Belt .Int .fromString , patch -> Belt .Int .fromString ) {
1362- | (Some (major ), Some (minor ), Some (patch )) => Some ((major , minor , patch ))
1363- | _ => None
1364- }
1365- | _ => None
1366- }
1367- }
1368-
1369- @react.component
1370- let make = () => {
1411+ let default = (~props : Try .props ) => {
13711412 let router = Next .Router .useRouter ()
13721413
1414+ let versions =
1415+ props .versions
1416+ -> Belt .Array .keepMap (v => v -> CompilerManagerHook .Semver .parse )
1417+ -> Js .Array2 .sortInPlaceWith ((a , b ) => {
1418+ let cmp = ({CompilerManagerHook .Semver .major : major , minor , patch , _ }) => {
1419+ [major , minor , patch ]
1420+ -> Js .Array2 .map (v => v -> Belt .Int .toString )
1421+ -> Js .Array2 .joinWith ("" )
1422+ -> Belt .Int .fromString
1423+ -> Belt .Option .getWithDefault (0 )
1424+ }
1425+ cmp (b ) - cmp (a )
1426+ })
1427+
1428+ let lastStableVersion =
1429+ versions -> Js .Array2 .find (version => version .preRelease -> Belt .Option .isNone )
1430+
13731431 let initialVersion = switch Js .Dict .get (router .query , "version" ) {
1374- | Some (version ) => Some ( version )
1375- | None => CompilerManagerHook . CdnMeta . versions -> Belt . Array . get ( 0 )
1432+ | Some (version ) => version -> CompilerManagerHook . Semver . parse
1433+ | None => lastStableVersion
13761434 }
13771435
13781436 let initialLang = switch Js .Dict .get (router .query , "ext" ) {
@@ -1386,15 +1444,11 @@ let make = () => {
13861444 | (None , Res )
13871445 | (None , _ ) =>
13881446 switch initialVersion {
1389- | Some (initialVersion ) =>
1390- switch parseVersion (initialVersion ) {
1391- | Some ((major , minor , _ )) =>
1392- if major >= 10 && minor >= 1 {
1393- InitialContent .since_10_1
1394- } else {
1395- InitialContent .original
1396- }
1397- | None => InitialContent .original
1447+ | Some ({CompilerManagerHook .Semver .major : major , minor , _ }) =>
1448+ if major >= 10 && minor >= 1 {
1449+ InitialContent .since_10_1
1450+ } else {
1451+ InitialContent .original
13981452 }
13991453 | None => InitialContent .original
14001454 }
@@ -1408,6 +1462,7 @@ let make = () => {
14081462 ~initialVersion ?,
14091463 ~initialLang ,
14101464 ~onAction ,
1465+ ~versions ,
14111466 (),
14121467 )
14131468
0 commit comments