@@ -917,30 +917,88 @@ module Settings = {
917
917
<div className = titleClass > {React .string ("ReScript Version" )} </div >
918
918
<DropdownSelect
919
919
name = "compilerVersions"
920
- value = readyState .selected .id
920
+ value = { CompilerManagerHook . Semver . toString ( readyState .selected .id )}
921
921
onChange = {evt => {
922
922
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
+ }
925
928
}}>
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
+
929
941
<>
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
+ }}
939
1000
</>
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
+ }
944
1002
</DropdownSelect >
945
1003
</div >
946
1004
<div className = "mt-6" >
@@ -1352,29 +1410,29 @@ module App = {
1352
1410
1353
1411
let initialReContent = ` Js.log("Hello Reason 3.6!");`
1354
1412
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 ) => {
1373
1414
let router = Next .Router .useRouter ()
1374
1415
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
+
1375
1433
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
1378
1436
}
1379
1437
1380
1438
let initialLang = switch Js .Dict .get (router .query , "ext" ) {
@@ -1388,15 +1446,11 @@ let make = () => {
1388
1446
| (None , Res )
1389
1447
| (None , _ ) =>
1390
1448
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
1400
1454
}
1401
1455
| None => InitialContent .original
1402
1456
}
@@ -1410,6 +1464,7 @@ let make = () => {
1410
1464
~initialVersion ?,
1411
1465
~initialLang ,
1412
1466
~onAction ,
1467
+ ~versions ,
1413
1468
(),
1414
1469
)
1415
1470
0 commit comments