diff --git a/src/Playground.res b/src/Playground.res index b11f75250..0208825ce 100644 --- a/src/Playground.res +++ b/src/Playground.res @@ -13,6 +13,38 @@ module Api = RescriptCompilerApi type layout = Column | Row type tab = JavaScript | Output | Problems | Settings + +module JsxCompilation = { + type t = + | Plain + | PreserveJsx + + let getLabel = (mode: t): string => + switch mode { + | Plain => "Plain JS functions" + | PreserveJsx => "Preserve JSX" + } + + let toBool = (mode: t): bool => + switch mode { + | Plain => false + | PreserveJsx => true + } + + let fromBool = (bool): t => bool ? PreserveJsx : Plain +} + +module ExperimentalFeatures = { + type t = LetUnwrap + + let getLabel = (feature: t): string => + switch feature { + | LetUnwrap => "let?" + } + + let list = [LetUnwrap] +} + let breakingPoint = 1024 module DropdownSelect = { @@ -31,23 +63,23 @@ module DropdownSelect = { } } -module ToggleSelection = { - module SelectionOption = { - @react.component - let make = (~label, ~isActive, ~disabled, ~onClick) => { - - } +module SelectionOption = { + @react.component + let make = (~label, ~isActive, ~disabled, ~onClick) => { + } +} +module ToggleSelection = { @react.component let make = ( ~onChange: 'a => unit, @@ -842,7 +874,7 @@ module Settings = { ~config: Api.Config.t, ~keyMapState: (CodeMirror.KeyMap.t, (CodeMirror.KeyMap.t => CodeMirror.KeyMap.t) => unit), ) => { - let {Api.Config.warn_flags: warn_flags} = config + let {Api.Config.warnFlags: warnFlags} = config let (keyMap, setKeyMap) = keyMapState let availableTargetLangs = Api.Version.availableLanguages(readyState.selected.apiVersion) @@ -857,22 +889,41 @@ module Settings = { } let config = { ...config, - warn_flags: flags->normalizeEmptyFlags->WarningFlagDescription.Parser.tokensToString, + warnFlags: flags->normalizeEmptyFlags->WarningFlagDescription.Parser.tokensToString, } setConfig(config) } - let onModuleSystemUpdate = module_system => { - let config = {...config, module_system} + let onModuleSystemUpdate = moduleSystem => { + let config = {...config, moduleSystem} + setConfig(config) + } + + let onJsxPreserveModeUpdate = compilation => { + let jsxPreserveMode = JsxCompilation.toBool(compilation) + let config = {...config, jsxPreserveMode} + setConfig(config) + } + + let onExperimentalFeaturesUpdate = feature => { + let features = config.experimentalFeatures->Option.getOr([]) + + let experimentalFeatures = if features->Array.includes(feature) { + features->Array.filter(x => x !== feature) + } else { + [...features, feature] + } + + let config = {...config, experimentalFeatures} setConfig(config) } - let warnFlagTokens = WarningFlagDescription.Parser.parse(warn_flags)->Result.getOr([]) + let warnFlagTokens = WarningFlagDescription.Parser.parse(warnFlags)->Result.getOr([]) let onWarningFlagsResetClick = _evt => { setConfig({ ...config, - warn_flags: "+a-4-9-20-40-41-42-50-61-102-109", + warnFlags: "+a-4-9-20-40-41-42-50-61-102-109", }) } @@ -996,10 +1047,42 @@ module Settings = { value} - selected=config.module_system + selected=config.moduleSystem onChange=onModuleSystemUpdate /> + {readyState.selected.apiVersion->RescriptCompilerApi.Version.isMinimumVersion(V6) + ? <> +
+
{React.string("JSX")}
+ Option.getOr(false)->JsxCompilation.fromBool} + onChange=onJsxPreserveModeUpdate + /> +
+
+
{React.string("Experimental Features")}
+ {ExperimentalFeatures.list + ->Array.map(feature => { + let key = (feature :> string) + + ExperimentalFeatures.getLabel} + isActive={config.experimentalFeatures + ->Option.getOr([]) + ->Array.includes(key)} + onClick={_evt => onExperimentalFeaturesUpdate(key)} + /> + }) + ->React.array} +
+ + : React.null} +
{React.string("Loaded Libraries")}