Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit0121332

Browse files
Playground toggles for jsx preserve mode and experimental features (#1107)
* Playground toggles for jsx preserve and experimental features* Make compiler config camelCase* Check apiVersion to ensure only supported methods are called
1 parent4e4fabe commit0121332

File tree

5 files changed

+233
-64
lines changed

5 files changed

+233
-64
lines changed

‎src/Playground.res‎

Lines changed: 117 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,38 @@ module Api = RescriptCompilerApi
1313

1414
typelayout=Column |Row
1515
typetab=JavaScript |Output |Problems |Settings
16+
17+
moduleJsxCompilation= {
18+
typet=
19+
|Plain
20+
|PreserveJsx
21+
22+
letgetLabel= (mode:t):string=>
23+
switchmode {
24+
|Plain=>"Plain JS functions"
25+
|PreserveJsx=>"Preserve JSX"
26+
}
27+
28+
lettoBool= (mode:t):bool=>
29+
switchmode {
30+
|Plain=>false
31+
|PreserveJsx=>true
32+
}
33+
34+
letfromBool= (bool):t=>bool ?PreserveJsx :Plain
35+
}
36+
37+
moduleExperimentalFeatures= {
38+
typet=LetUnwrap
39+
40+
letgetLabel= (feature:t):string=>
41+
switchfeature {
42+
|LetUnwrap=>"let?"
43+
}
44+
45+
letlist= [LetUnwrap]
46+
}
47+
1648
letbreakingPoint=1024
1749

1850
moduleDropdownSelect= {
@@ -31,23 +63,23 @@ module DropdownSelect = {
3163
}
3264
}
3365

34-
moduleToggleSelection= {
35-
moduleSelectionOption= {
36-
@react.component
37-
letmake= (~label, ~isActive, ~disabled, ~onClick)=> {
38-
<button
39-
className={"mr-1 px-2 py-1 rounded inline-block "++ifisActive {
40-
"bg-fire text-white font-bold"
41-
}else {
42-
"bg-gray-80 opacity-50 hover:opacity-80"
43-
}}
44-
onClick
45-
disabled>
46-
{React.string(label)}
47-
</button>
48-
}
66+
moduleSelectionOption= {
67+
@react.component
68+
letmake= (~label, ~isActive, ~disabled, ~onClick)=> {
69+
<button
70+
className={"mr-1 px-2 py-1 rounded inline-block "++ifisActive {
71+
"bg-fire text-white font-bold"
72+
}else {
73+
"bg-gray-80 opacity-50 hover:opacity-80"
74+
}}
75+
onClick
76+
disabled>
77+
{React.string(label)}
78+
</button>
4979
}
80+
}
5081

82+
moduleToggleSelection= {
5183
@react.component
5284
letmake= (
5385
~onChange:'a=>unit,
@@ -842,7 +874,7 @@ module Settings = {
842874
~config:Api.Config.t,
843875
~keyMapState: (CodeMirror.KeyMap.t, (CodeMirror.KeyMap.t=>CodeMirror.KeyMap.t)=>unit),
844876
)=> {
845-
let {Api.Config.warn_flags:warn_flags}=config
877+
let {Api.Config.warnFlags:warnFlags}=config
846878
let (keyMap,setKeyMap)=keyMapState
847879

848880
letavailableTargetLangs=Api.Version.availableLanguages(readyState.selected.apiVersion)
@@ -857,22 +889,41 @@ module Settings = {
857889
}
858890
letconfig= {
859891
...config,
860-
warn_flags:flags->normalizeEmptyFlags->WarningFlagDescription.Parser.tokensToString,
892+
warnFlags:flags->normalizeEmptyFlags->WarningFlagDescription.Parser.tokensToString,
861893
}
862894
setConfig(config)
863895
}
864896

865-
letonModuleSystemUpdate=module_system=> {
866-
letconfig= {...config,module_system}
897+
letonModuleSystemUpdate=moduleSystem=> {
898+
letconfig= {...config,moduleSystem}
899+
setConfig(config)
900+
}
901+
902+
letonJsxPreserveModeUpdate=compilation=> {
903+
letjsxPreserveMode=JsxCompilation.toBool(compilation)
904+
letconfig= {...config,jsxPreserveMode}
905+
setConfig(config)
906+
}
907+
908+
letonExperimentalFeaturesUpdate=feature=> {
909+
letfeatures=config.experimentalFeatures->Option.getOr([])
910+
911+
letexperimentalFeatures=iffeatures->Array.includes(feature) {
912+
features->Array.filter(x=>x!==feature)
913+
}else {
914+
[...features,feature]
915+
}
916+
917+
letconfig= {...config,experimentalFeatures}
867918
setConfig(config)
868919
}
869920

870-
letwarnFlagTokens=WarningFlagDescription.Parser.parse(warn_flags)->Result.getOr([])
921+
letwarnFlagTokens=WarningFlagDescription.Parser.parse(warnFlags)->Result.getOr([])
871922

872923
letonWarningFlagsResetClick=_evt=> {
873924
setConfig({
874925
...config,
875-
warn_flags:"+a-4-9-20-40-41-42-50-61-102-109",
926+
warnFlags:"+a-4-9-20-40-41-42-50-61-102-109",
876927
})
877928
}
878929

@@ -996,10 +1047,42 @@ module Settings = {
9961047
<ToggleSelection
9971048
values=["commonjs","esmodule"]
9981049
toLabel={value=>value}
999-
selected=config.module_system
1050+
selected=config.moduleSystem
10001051
onChange=onModuleSystemUpdate
10011052
/>
10021053
</div>
1054+
{readyState.selected.apiVersion->RescriptCompilerApi.Version.isMinimumVersion(V6)
1055+
? <>
1056+
<divclassName="mt-6">
1057+
<divclassName=titleClass> {React.string("JSX")} </div>
1058+
<ToggleSelection
1059+
values=[JsxCompilation.Plain,PreserveJsx]
1060+
toLabel=JsxCompilation.getLabel
1061+
selected={config.jsxPreserveMode->Option.getOr(false)->JsxCompilation.fromBool}
1062+
onChange=onJsxPreserveModeUpdate
1063+
/>
1064+
</div>
1065+
<divclassName="mt-6">
1066+
<divclassName=titleClass> {React.string("Experimental Features")} </div>
1067+
{ExperimentalFeatures.list
1068+
->Array.map(feature=> {
1069+
letkey= (feature :>string)
1070+
1071+
<SelectionOption
1072+
key
1073+
disabled=false
1074+
label={feature->ExperimentalFeatures.getLabel}
1075+
isActive={config.experimentalFeatures
1076+
->Option.getOr([])
1077+
->Array.includes(key)}
1078+
onClick={_evt=>onExperimentalFeaturesUpdate(key)}
1079+
/>
1080+
})
1081+
->React.array}
1082+
</div>
1083+
</>
1084+
:React.null}
1085+
10031086
<divclassName="mt-6">
10041087
<divclassName=titleClass> {React.string("Loaded Libraries")} </div>
10051088
<ul>
@@ -1440,7 +1523,7 @@ let make = (~bundleBaseUrl: string, ~versions: array<string>) => {
14401523
| [v]=>Some(v)// only single version available. maybe local dev.
14411524
|versions=> {
14421525
letlastStableVersion=versions->Array.find(version=>version.preRelease->Option.isNone)
1443-
switchDict.get(router.query,"version") {
1526+
switchDict.get(router.query,(CompilerManagerHook.Version :>string)) {
14441527
|Some(version)=>version->Semver.parse
14451528
|None=>
14461529
switchUrl.getVersionFromStorage(Playground) {
@@ -1451,14 +1534,20 @@ let make = (~bundleBaseUrl: string, ~versions: array<string>) => {
14511534
}
14521535
}
14531536

1454-
letinitialLang=switchDict.get(router.query,"ext") {
1537+
letinitialLang=switchDict.get(router.query,(CompilerManagerHook.Ext :>string)) {
14551538
|Some("re")=>Api.Lang.Reason
14561539
|_=>Api.Lang.Res
14571540
}
14581541

1459-
letinitialModuleSystem=Dict.get(router.query,"module")
1542+
letinitialModuleSystem=Dict.get(router.query, (Module :>string))
1543+
letinitialJsxPreserveMode=Dict.get(router.query, (JsxPreserve :>string))->Option.isSome
1544+
1545+
letinitialExperimentalFeatures=
1546+
Dict.get(router.query, (Experiments :>string))->Option.mapOr([],str=>
1547+
str->String.split(",")->Array.map(String.trim)
1548+
)
14601549

1461-
letinitialContent=switch (Dict.get(router.query,"code"),initialLang) {
1550+
letinitialContent=switch (Dict.get(router.query,(Code :>string)),initialLang) {
14621551
| (Some(compressedCode),_)=>LzString.decompressToEncodedURIComponent(compressedCode)
14631552
| (None,Reason)=>initialReContent
14641553
| (None,Res)=>
@@ -1477,6 +1566,8 @@ let make = (~bundleBaseUrl: string, ~versions: array<string>) => {
14771566
~bundleBaseUrl,
14781567
~initialVersion?,
14791568
~initialModuleSystem?,
1569+
~initialJsxPreserveMode,
1570+
~initialExperimentalFeatures,
14801571
~initialLang,
14811572
~onAction,
14821573
~versions,

‎src/bindings/RescriptCompilerApi.res‎

Lines changed: 41 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,16 @@ module Lang = {
2828
}
2929

3030
moduleVersion= {
31+
typenumbered=
32+
| @as(1)V1
33+
| @as(2)V2
34+
| @as(3)V3
35+
| @as(4)V4
36+
| @as(5)V5
37+
| @as(6)V6
38+
3139
typet=
32-
|V1
33-
|V2
34-
|V3
35-
|V4
36-
|V5
40+
|...numbered
3741
|UnknownVersion(string)
3842

3943
// Helps finding the right API version
@@ -57,6 +61,7 @@ module Version = {
5761
|list{"3"}=>V3
5862
|list{"4"}=>V4
5963
|list{"5"}=>V5
64+
|list{"6"}=>V6
6065
|_=>UnknownVersion(apiVersion)
6166
}
6267

@@ -67,6 +72,7 @@ module Version = {
6772
|V3=>"3.0"
6873
|V4=>"4.0"
6974
|V5=>"5.0"
75+
|V6=>"6.0"
7076
|UnknownVersion(version)=>version
7177
}
7278

@@ -75,9 +81,15 @@ module Version = {
7581
letavailableLanguages=t=>
7682
switcht {
7783
|V1=> [Lang.Reason,Res]
78-
|V2 |V3 |V4 |V5=> [Lang.Res]
84+
|V2 |V3 |V4 |V5|V6=> [Lang.Res]
7985
|UnknownVersion(_)=> [Res]
8086
}
87+
88+
letisMinimumVersion= (version:t,minimum:numbered)=>
89+
switchversion {
90+
|...numberedasversion=>version>=minimum
91+
|UnknownVersion(_)=>false
92+
}
8193
}
8294

8395
moduleLocMsg= {
@@ -392,10 +404,12 @@ module ConversionResult = {
392404

393405
moduleConfig= {
394406
typet= {
395-
module_system:string,
396-
warn_flags:string,
407+
@as("module_system")moduleSystem:string,
408+
@as("warn_flags")warnFlags:string,
397409
uncurried?:bool,
398-
open_modules?:array<string>,
410+
@as("open_modules")openModules?:array<string>,
411+
@as("experimental_features")experimentalFeatures?:array<string>,
412+
@as("jsx_preserve_mode")jsxPreserveMode?:bool,
399413
}
400414
}
401415

@@ -469,17 +483,31 @@ module Compiler = {
469483

470484
@sendexternalsetOpenModules: (t,array<string>)=>bool="setOpenModules"
471485

472-
letsetConfig= (t:t,config:Config.t):unit=> {
473-
letmoduleSystem=switchconfig.module_system {
486+
@sendexternalsetExperimentalFeatures: (t,array<string>)=>bool="setExperimentalFeatures"
487+
488+
@sendexternalsetJsxPreserveMode: (t,bool)=>bool="setJsxPreserveMode"
489+
490+
letsetConfig= (t:t,config:Config.t,version:Version.t):unit=> {
491+
letmoduleSystem=switchconfig.moduleSystem {
474492
|"commonjs"=>#nodejs->Some
475493
|"esmodule"=>#es6->Some
476494
|_=>None
477495
}
478496

479497
Option.forEach(moduleSystem,moduleSystem=>t->setModuleSystem(moduleSystem)->ignore)
480-
Option.forEach(config.open_modules,modules=>t->setOpenModules(modules)->ignore)
481498

482-
t->setWarnFlags(config.warn_flags)->ignore
499+
ifversion->Version.isMinimumVersion(V4) {
500+
Option.forEach(config.openModules,modules=>t->setOpenModules(modules)->ignore)
501+
}
502+
503+
ifversion->Version.isMinimumVersion(V6) {
504+
Option.forEach(config.experimentalFeatures,features=>
505+
t->setExperimentalFeatures(features)->ignore
506+
)
507+
Option.forEach(config.jsxPreserveMode,toggle=>t->setJsxPreserveMode(toggle)->ignore)
508+
}
509+
510+
t->setWarnFlags(config.warnFlags)->ignore
483511
}
484512

485513
@send

‎src/bindings/RescriptCompilerApi.resi‎

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,16 @@ module Lang: {
1919
}
2020

2121
moduleVersion: {
22+
typenumbered=
23+
| @as(1)V1
24+
| @as(2)V2
25+
| @as(3)V3
26+
| @as(4)V4
27+
| @as(5)V5
28+
| @as(6)V6
29+
2230
typet=
23-
|V1
24-
|V2
25-
|V3
26-
|V4
27-
|V5
31+
|...numbered
2832
|UnknownVersion(string)
2933

3034
// Helps finding the right API version
@@ -35,6 +39,8 @@ module Version: {
3539
letdefaultTargetLang:Lang.t
3640

3741
letavailableLanguages:t=>array<Lang.t>
42+
43+
letisMinimumVersion: (t,numbered)=>bool
3844
}
3945

4046
moduleLocMsg: {
@@ -158,11 +164,14 @@ module ConversionResult: {
158164

159165
moduleConfig: {
160166
typet= {
161-
module_system:string,
162-
warn_flags:string,
167+
@as("module_system")moduleSystem:string,
168+
@as("warn_flags")warnFlags:string,
163169
/** Only available in apiVersion > 3 (= ReScript 11+) */
164170
uncurried?:bool,
165-
open_modules?:array<string>,
171+
@as("open_modules")openModules?:array<string>,
172+
/** Only available in apiVersion >= 6 (= ReScript 12+) */
173+
@as("experimental_features")experimentalFeatures?:array<string>,
174+
@as("jsx_preserve_mode")jsxPreserveMode?:bool,
166175
}
167176
}
168177

@@ -201,7 +210,7 @@ module Compiler: {
201210

202211
letsetWarnFlags: (t,string)=>bool
203212
letsetOpenModules: (t,array<string>)=>bool
204-
letsetConfig: (t,Config.t)=>unit
213+
letsetConfig: (t,Config.t,Version.t)=>unit
205214

206215
// General format function
207216
letconvertSyntax: (~fromLang:Lang.t, ~toLang:Lang.t, ~code:string,t)=>ConversionResult.t

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp