@@ -917,30 +917,88 @@ module Settings = {
917917 <div className = titleClass > {React .string ("ReScript Version" )} </div >
918918 <DropdownSelect
919919 name = "compilerVersions"
920- value = readyState .selected .id
920+ value = { CompilerManagerHook . Semver . toString ( readyState .selected .id )}
921921 onChange = {evt => {
922922 ReactEvent .Form .preventDefault (evt )
923- let id = (evt -> ReactEvent .Form .target )["value" ]
924- onCompilerSelect (id )
923+ let id : string = (evt -> ReactEvent .Form .target )["value" ]
924+ switch id -> CompilerManagerHook .Semver .parse {
925+ | Some (v ) => onCompilerSelect (v )
926+ | None => ()
927+ }
925928 }}>
926- {switch readyState .experimentalVersions {
927- | [] => React .null
928- | experimentalVersions =>
929+ {
930+ let (experimentalVersions , stableVersions ) =
931+ readyState .versions -> Js .Array2 .reduce ((acc , item ) => {
932+ let (lhs , rhs ) = acc
933+ if item .preRelease -> Belt .Option .isSome {
934+ Js .Array2 .push (lhs , item )
935+ } else {
936+ Js .Array2 .push (rhs , item )
937+ }-> ignore
938+ acc
939+ }, ([], []))
940+
929941 <>
930- <option disabled = true className = "py-4" > {React .string ("---Experimental---" )} </option >
931- {Belt .Array .map (experimentalVersions , version =>
932- <option className = "py-4" key = version value = version >
933- {React .string (version )}
934- </option >
935- )-> React .array }
936- <option disabled = true className = "py-4" >
937- {React .string ("---Official Releases---" )}
938- </option >
942+ {switch experimentalVersions {
943+ | [] => React .null
944+ | experimentalVersions =>
945+ let versionByOrder = experimentalVersions -> Js .Array2 .sortInPlaceWith ((a , b ) => {
946+ let cmp = ({
947+ CompilerManagerHook .Semver .major : major ,
948+ minor ,
949+ patch ,
950+ preRelease ,
951+ }) => {
952+ let preRelease = switch preRelease {
953+ | Some (preRelease ) =>
954+ switch preRelease {
955+ | Dev (id ) => 0 + id
956+ | Alpha (id ) => 10 + id
957+ | Beta (id ) => 20 + id
958+ | Rc (id ) => 30 + id
959+ }
960+ | None => 0
961+ }
962+ let number =
963+ [major , minor , patch ]
964+ -> Js .Array2 .map (v => v -> Belt .Int .toString )
965+ -> Js .Array2 .joinWith ("" )
966+ -> Belt .Int .fromString
967+ -> Belt .Option .getWithDefault (0 )
968+
969+ number + preRelease
970+ }
971+ cmp (b ) - cmp (a )
972+ })
973+ <>
974+ <option disabled = true className = "py-4" >
975+ {React .string ("---Experimental---" )}
976+ </option >
977+ {versionByOrder
978+ -> Belt .Array .map (version => {
979+ let version = CompilerManagerHook .Semver .toString (version )
980+ <option className = "py-4" key = version value = version >
981+ {React .string (version )}
982+ </option >
983+ })
984+ -> React .array }
985+ <option disabled = true className = "py-4" >
986+ {React .string ("---Official Releases---" )}
987+ </option >
988+ </>
989+ }}
990+ {switch stableVersions {
991+ | [] => React .null
992+ | stableVersions =>
993+ Belt .Array .map (stableVersions , version => {
994+ let version = CompilerManagerHook .Semver .toString (version )
995+ <option className = "py-4" key = version value = version >
996+ {React .string (version )}
997+ </option >
998+ })-> React .array
999+ }}
9391000 </>
940- }}
941- {Belt .Array .map (readyState .versions , version =>
942- <option className = "py-4" key = version value = version > {React .string (version )} </option >
943- )-> React .array }
1001+ }
9441002 </DropdownSelect >
9451003 </div >
9461004 <div className = "mt-6" >
@@ -1352,29 +1410,29 @@ module App = {
13521410
13531411let initialReContent = ` Js.log("Hello Reason 3.6!");`
13541412
1355- /**
1356- Takes a `versionStr` starting with a "v" and ending in major.minor.patch (e.g.
1357- "v10.1.0") returns major, minor, patch as an integer tuple if it's actually in
1358- a x.y.z format, otherwise will return `None`.
1359- */
1360- let parseVersion = (versionStr : string ): option <(int , int , int )> => {
1361- switch versionStr -> Js .String2 .replace ("v" , "" )-> Js .String2 .split ("." ) {
1362- | [major , minor , patch ] =>
1363- switch (major -> Belt .Int .fromString , minor -> Belt .Int .fromString , patch -> Belt .Int .fromString ) {
1364- | (Some (major ), Some (minor ), Some (patch )) => Some ((major , minor , patch ))
1365- | _ => None
1366- }
1367- | _ => None
1368- }
1369- }
1370-
1371- @react.component
1372- let make = () => {
1413+ let default = (~props : Try .props ) => {
13731414 let router = Next .Router .useRouter ()
13741415
1416+ let versions =
1417+ props .versions
1418+ -> Belt .Array .keepMap (v => v -> CompilerManagerHook .Semver .parse )
1419+ -> Js .Array2 .sortInPlaceWith ((a , b ) => {
1420+ let cmp = ({CompilerManagerHook .Semver .major : major , minor , patch , _ }) => {
1421+ [major , minor , patch ]
1422+ -> Js .Array2 .map (v => v -> Belt .Int .toString )
1423+ -> Js .Array2 .joinWith ("" )
1424+ -> Belt .Int .fromString
1425+ -> Belt .Option .getWithDefault (0 )
1426+ }
1427+ cmp (b ) - cmp (a )
1428+ })
1429+
1430+ let lastStableVersion =
1431+ versions -> Js .Array2 .find (version => version .preRelease -> Belt .Option .isNone )
1432+
13751433 let initialVersion = switch Js .Dict .get (router .query , "version" ) {
1376- | Some (version ) => Some ( version )
1377- | None => CompilerManagerHook . CdnMeta . versions -> Belt . Array . get ( 0 )
1434+ | Some (version ) => version -> CompilerManagerHook . Semver . parse
1435+ | None => lastStableVersion
13781436 }
13791437
13801438 let initialLang = switch Js .Dict .get (router .query , "ext" ) {
@@ -1388,15 +1446,11 @@ let make = () => {
13881446 | (None , Res )
13891447 | (None , _ ) =>
13901448 switch initialVersion {
1391- | Some (initialVersion ) =>
1392- switch parseVersion (initialVersion ) {
1393- | Some ((major , minor , _ )) =>
1394- if major >= 10 && minor >= 1 {
1395- InitialContent .since_10_1
1396- } else {
1397- InitialContent .original
1398- }
1399- | None => InitialContent .original
1449+ | Some ({CompilerManagerHook .Semver .major : major , minor , _ }) =>
1450+ if major >= 10 && minor >= 1 {
1451+ InitialContent .since_10_1
1452+ } else {
1453+ InitialContent .original
14001454 }
14011455 | None => InitialContent .original
14021456 }
@@ -1410,6 +1464,7 @@ let make = () => {
14101464 ~initialVersion ?,
14111465 ~initialLang ,
14121466 ~onAction ,
1467+ ~versions ,
14131468 (),
14141469 )
14151470
0 commit comments