Skip to content

Commit 73f0e14

Browse files
Check apiVersion to ensure only supported methods are called
1 parent eff2f49 commit 73f0e14

File tree

4 files changed

+76
-56
lines changed

4 files changed

+76
-56
lines changed

src/Playground.res

Lines changed: 31 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,43 +1047,41 @@ module Settings = {
10471047
<ToggleSelection
10481048
values=["commonjs", "esmodule"]
10491049
toLabel={value => value}
1050-
selected=config.module_system
1050+
selected=config.moduleSystem
10511051
onChange=onModuleSystemUpdate
10521052
/>
10531053
</div>
1054-
{switch readyState.selected.apiVersion {
1055-
| V1 | V2 | V3 | V4 | V5 | UnknownVersion(_) => React.null
1056-
| V6 =>
1057-
<>
1058-
<div className="mt-6">
1059-
<div className=titleClass> {React.string("JSX")} </div>
1060-
<ToggleSelection
1061-
values=[JsxCompilation.Plain, PreserveJsx]
1062-
toLabel=JsxCompilation.getLabel
1063-
selected={config.jsx_preserve_mode->Option.getOr(false)->JsxCompilation.fromBool}
1064-
onChange=onJsxPreserveModeUpdate
1065-
/>
1066-
</div>
1067-
<div className="mt-6">
1068-
<div className=titleClass> {React.string("Experimental Features")} </div>
1069-
{ExperimentalFeatures.list
1070-
->Array.map(feature => {
1071-
let key = (feature :> string)
1072-
1073-
<SelectionOption
1074-
key
1075-
disabled=false
1076-
label={feature->ExperimentalFeatures.getLabel}
1077-
isActive={config.experimental_features
1078-
->Option.getOr([])
1079-
->Array.includes(key)}
1080-
onClick={_evt => onExperimentalFeaturesUpdate(key)}
1054+
{readyState.selected.apiVersion->RescriptCompilerApi.Version.isMinimumVersion(V6)
1055+
? <>
1056+
<div className="mt-6">
1057+
<div className=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
10811063
/>
1082-
})
1083-
->React.array}
1084-
</div>
1085-
</>
1086-
}}
1064+
</div>
1065+
<div className="mt-6">
1066+
<div className=titleClass> {React.string("Experimental Features")} </div>
1067+
{ExperimentalFeatures.list
1068+
->Array.map(feature => {
1069+
let key = (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}
10871085

10881086
<div className="mt-6">
10891087
<div className=titleClass> {React.string("Loaded Libraries")} </div>

src/bindings/RescriptCompilerApi.res

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

3030
module Version = {
31+
type numbered =
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
type t =
32-
| V1
33-
| V2
34-
| V3
35-
| V4
36-
| V5
37-
| V6
40+
| ...numbered
3841
| UnknownVersion(string)
3942

4043
// Helps finding the right API version
@@ -81,6 +84,12 @@ module Version = {
8184
| V2 | V3 | V4 | V5 | V6 => [Lang.Res]
8285
| UnknownVersion(_) => [Res]
8386
}
87+
88+
let isMinimumVersion = (version: t, minimum: numbered) =>
89+
switch version {
90+
| ...numbered as version => version >= minimum
91+
| UnknownVersion(_) => false
92+
}
8493
}
8594

8695
module LocMsg = {
@@ -478,19 +487,25 @@ module Compiler = {
478487

479488
@send external setJsxPreserveMode: (t, bool) => bool = "setJsxPreserveMode"
480489

481-
let setConfig = (t: t, config: Config.t): unit => {
482-
let moduleSystem = switch config.module_system {
490+
let setConfig = (t: t, config: Config.t, version: Version.t): unit => {
491+
let moduleSystem = switch config.moduleSystem {
483492
| "commonjs" => #nodejs->Some
484493
| "esmodule" => #es6->Some
485494
| _ => None
486495
}
487496

488497
Option.forEach(moduleSystem, moduleSystem => t->setModuleSystem(moduleSystem)->ignore)
489-
Option.forEach(config.openModules, modules => t->setOpenModules(modules)->ignore)
490-
Option.forEach(config.experimentalFeatures, features =>
491-
t->setExperimentalFeatures(features)->ignore
492-
)
493-
Option.forEach(config.jsxPreserveMode, toggle => t->setJsxPreserveMode(toggle)->ignore)
498+
499+
if version->Version.isMinimumVersion(V4) {
500+
Option.forEach(config.openModules, modules => t->setOpenModules(modules)->ignore)
501+
}
502+
503+
if version->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+
}
494509

495510
t->setWarnFlags(config.warnFlags)->ignore
496511
}

src/bindings/RescriptCompilerApi.resi

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

2121
module Version: {
22+
type numbered =
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
type t =
23-
| V1
24-
| V2
25-
| V3
26-
| V4
27-
| V5
28-
| V6
31+
| ...numbered
2932
| UnknownVersion(string)
3033

3134
// Helps finding the right API version
@@ -36,6 +39,8 @@ module Version: {
3639
let defaultTargetLang: Lang.t
3740

3841
let availableLanguages: t => array<Lang.t>
42+
43+
let isMinimumVersion: (t, numbered) => bool
3944
}
4045

4146
module LocMsg: {
@@ -205,7 +210,7 @@ module Compiler: {
205210

206211
let setWarnFlags: (t, string) => bool
207212
let setOpenModules: (t, array<string>) => bool
208-
let setConfig: (t, Config.t) => unit
213+
let setConfig: (t, Config.t, Version.t) => unit
209214

210215
// General format function
211216
let convertSyntax: (~fromLang: Lang.t, ~toLang: Lang.t, ~code: string, t) => ConversionResult.t

src/common/CompilerManagerHook.res

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ let useCompilerManager = (
269269
| UpdateConfig(config) =>
270270
switch state {
271271
| Ready(ready) =>
272-
ready.selected.instance->Compiler.setConfig(config)
272+
ready.selected.instance->Compiler.setConfig(config, ready.selected.apiVersion)
273273
let selected = {...ready.selected, config}
274274
Compiling({state: {...ready, selected}, previousJsCode: None})
275275
| _ => state
@@ -450,7 +450,8 @@ let useCompilerManager = (
450450
jsxPreserveMode: initialJsxPreserveMode,
451451
?openModules,
452452
}
453-
instance->Compiler.setConfig(config)
453+
454+
instance->Compiler.setConfig(config, apiVersion)
454455

455456
let selected = {
456457
id: version,
@@ -510,7 +511,8 @@ let useCompilerManager = (
510511
moduleSystem: defaultModuleSystem,
511512
?openModules,
512513
}
513-
instance->Compiler.setConfig(config)
514+
515+
instance->Compiler.setConfig(config, apiVersion)
514516

515517
let selected = {
516518
id: version,

0 commit comments

Comments
 (0)