From 08702dda348b9f5a413a6a527cdc132237e53cd3 Mon Sep 17 00:00:00 2001 From: Peter Murphy <26548438+ptrfrncsmrph@users.noreply.github.com> Date: Sat, 5 Feb 2022 16:21:49 -0500 Subject: [PATCH 1/4] Display FFI errors to user --- client/src/Try/Container.purs | 23 ++++++++++++++--------- client/src/Try/Loader.purs | 7 ++----- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/client/src/Try/Container.purs b/client/src/Try/Container.purs index 4909aafd..42a03570 100644 --- a/client/src/Try/Container.purs +++ b/client/src/Try/Container.purs @@ -6,7 +6,7 @@ import Ace (Annotation) import Control.Monad.Except (runExceptT) import Data.Array (fold) import Data.Array as Array -import Data.Either (Either(..), hush) +import Data.Either (Either(..)) import Data.Foldable (for_, oneOf) import Data.FoldableWithIndex (foldMapWithIndex) import Data.Maybe (Maybe(..), fromMaybe, isNothing) @@ -189,17 +189,22 @@ component = H.mkComponent if settings.showJs then H.liftEffect teardownIFrame else do - mbSources <- H.liftAff $ map hush $ runExceptT $ runLoader loader (JS js) + eitherSources <- H.liftAff $ runExceptT $ runLoader loader (JS js) for_ warnings \warnings_ -> do let anns = Array.mapMaybe (toAnnotation MarkerWarning) warnings_ _ <- H.query _editor unit $ H.tell $ Editor.SetAnnotations anns pure unit - for_ mbSources \sources -> do - let eventData = Object.insert "" (JS js) sources - H.liftAff $ makeAff \f -> do - runEffectFn3 setupIFrame eventData (f (Right unit)) (f (Left $ Aff.error "Could not load iframe")) - mempty - H.modify_ _ { compiled = Just (Right res) } + case eitherSources of + Right sources -> do + let eventData = Object.insert "" (JS js) sources + H.liftAff $ makeAff \f -> do + runEffectFn3 setupIFrame eventData (f (Right unit)) (f (Left $ Aff.error "Could not load iframe")) + mempty + H.modify_ _ { compiled = Just (Right res) } + Left err -> do + H.liftEffect teardownIFrame + H.liftEffect $ error err + H.modify_ _ { compiled = Just (Left err) } HandleEditor (Editor.TextChanged text) -> do _ <- H.fork $ handleAction $ Cache text @@ -383,7 +388,7 @@ component = H.mkComponent renderCompiled = case _ of Left err -> - renderPlaintext "Unable to parse the response from the server." + renderPlaintext err Right res -> case res of CompileFailed { error } -> case error of OtherError err -> diff --git a/client/src/Try/Loader.purs b/client/src/Try/Loader.purs index ea845766..b459620c 100644 --- a/client/src/Try/Loader.purs +++ b/client/src/Try/Loader.purs @@ -7,7 +7,7 @@ module Try.Loader import Prelude import Control.Bind (bindFlipped) -import Control.Monad.Except (ExceptT) +import Control.Monad.Except (ExceptT, throwError) import Control.Parallel (parTraverse) import Data.Array as Array import Data.Array.NonEmpty as NonEmpty @@ -112,7 +112,7 @@ makeLoader rootPath = Loader (go Object.empty <<< parseDeps "") deps = { name: _, path: Nothing } <$> shim.deps pure { name, path, deps, src } Nothing -> - pure { name, path, deps: [], src: ffiDep name } + throwError ("FFI dependency not provided: " <> name) liftEffect $ putModule name mod pure mod @@ -130,6 +130,3 @@ makeLoader rootPath = Loader (go Object.empty <<< parseDeps "") # bindFlipped _.deps # Array.nubBy (comparing _.name) # go ms' - -ffiDep :: String -> JS -ffiDep name = JS $ "throw new Error('FFI dependency not provided: " <> name <> "');" From 25bafcbf73241c91fba1a5357ecaf31affa3f548 Mon Sep 17 00:00:00 2001 From: Peter Murphy <26548438+ptrfrncsmrph@users.noreply.github.com> Date: Sat, 5 Feb 2022 16:41:56 -0500 Subject: [PATCH 2/4] Add word wrap to plain text display --- client/public/css/index.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/client/public/css/index.css b/client/public/css/index.css index 51f7e363..e6e32b51 100644 --- a/client/public/css/index.css +++ b/client/public/css/index.css @@ -221,6 +221,12 @@ pre code { background: none; border: 0; margin: 0; + overflow-x: auto; + white-space: pre-wrap; + white-space: -moz-pre-wrap; + white-space: -pre-wrap; + white-space: -o-pre-wrap; + word-wrap: break-word; } iframe { From c0d4669c048cdc331f291bf43bb22e0921e8f1ce Mon Sep 17 00:00:00 2001 From: Peter Murphy <26548438+ptrfrncsmrph@users.noreply.github.com> Date: Sat, 5 Feb 2022 17:20:56 -0500 Subject: [PATCH 3/4] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 811ec193..d65fe015 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ Bugfixes: Other improvements: - Use `replaceState` for setting query params (#266 by @ptrfrncsmrph) +- Display missing FFI dependency error message to user (#268 by @ptrfrncsmrph) ## [v2021-11-30.1](https://github.com/purescript/trypurescript/releases/tag/v2021-11-11.1) From a142176d8ee6aeb1aa6ea48b488b719f5d21c3e5 Mon Sep 17 00:00:00 2001 From: Peter Murphy <26548438+ptrfrncsmrph@users.noreply.github.com> Date: Sat, 5 Feb 2022 18:32:10 -0500 Subject: [PATCH 4/4] Improve error message for missing FFI dep --- client/src/Try/Loader.purs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/client/src/Try/Loader.purs b/client/src/Try/Loader.purs index b459620c..9d38695f 100644 --- a/client/src/Try/Loader.purs +++ b/client/src/Try/Loader.purs @@ -9,11 +9,12 @@ import Prelude import Control.Bind (bindFlipped) import Control.Monad.Except (ExceptT, throwError) import Control.Parallel (parTraverse) +import Data.Array (foldMap) import Data.Array as Array import Data.Array.NonEmpty as NonEmpty import Data.Maybe (Maybe(..), fromMaybe) import Data.Newtype (unwrap) -import Data.String (Pattern(..)) +import Data.String (Pattern(..), joinWith) import Data.String as String import Data.String.Regex (Regex) import Data.String.Regex as Regex @@ -112,10 +113,20 @@ makeLoader rootPath = Loader (go Object.empty <<< parseDeps "") deps = { name: _, path: Nothing } <$> shim.deps pure { name, path, deps, src } Nothing -> - throwError ("FFI dependency not provided: " <> name) + throwError (missingFFIDep name) liftEffect $ putModule name mod pure mod + missingFFIDep :: String -> String + missingFFIDep name = + joinWith "\n" $ + [ "Compilation succeeded, but the following FFI dependency is missing:" + , " - " <> name + , "" + , "We don't provide FFI shims for all libraries; for example, Node libraries are not supported on Try PureScript." + , "If you would like to suggest a new FFI shim be supported, please open an issue." + ] + go :: Object JS -> Array Dependency -> ExceptT String Aff (Object JS) go ms [] = pure ms go ms deps = do