@@ -915,30 +915,88 @@ module Settings = {
915
915
<div className = titleClass > {React .string ("ReScript Version" )} </div >
916
916
<DropdownSelect
917
917
name = "compilerVersions"
918
- value = readyState .selected .id
918
+ value = { CompilerManagerHook . Semver . toString ( readyState .selected .id )}
919
919
onChange = {evt => {
920
920
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
+ }
923
926
}}>
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
+
927
939
<>
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
+ }}
937
998
</>
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
+ }
942
1000
</DropdownSelect >
943
1001
</div >
944
1002
<div className = "mt-6" >
@@ -1350,29 +1408,29 @@ module App = {
1350
1408
1351
1409
let initialReContent = j ` Js.log("Hello Reason 3.6!");`
1352
1410
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 ) => {
1371
1412
let router = Next .Router .useRouter ()
1372
1413
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
+
1373
1431
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
1376
1434
}
1377
1435
1378
1436
let initialLang = switch Js .Dict .get (router .query , "ext" ) {
@@ -1386,15 +1444,11 @@ let make = () => {
1386
1444
| (None , Res )
1387
1445
| (None , _ ) =>
1388
1446
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
1398
1452
}
1399
1453
| None => InitialContent .original
1400
1454
}
@@ -1408,6 +1462,7 @@ let make = () => {
1408
1462
~initialVersion ?,
1409
1463
~initialLang ,
1410
1464
~onAction ,
1465
+ ~versions ,
1411
1466
(),
1412
1467
)
1413
1468
0 commit comments