@@ -16,11 +16,11 @@ module Obelisk.Backend
1616 , serveDefaultObeliskApp
1717 , prettifyOutput
1818 , runBackend
19− , configureFrontend
2019 ) where
2120
2221import Control.Monad
2322import Control.Monad.Except
23+import Data.ByteString (ByteString)
2424import qualified Data.ByteString.Char8 as BSC8
2525import Data.Default (Default (..))
2626import Data.Dependent.Sum
@@ -28,17 +28,15 @@ import Data.Functor.Sum
2828import Data.Functor.Identity
2929import Data.Text (Text)
3030import qualified Data.Text as T
31−import qualified Data.Text.IO as T
3231import Data.Text.Encoding
3332import Obelisk.Asset.Serve.Snap (serveAsset)
34−import Obelisk.ExecutableConfig.Inject (injectPure)
33+import Obelisk.ExecutableConfig.Inject (injectExecutableConfigs)
3534import Obelisk.Frontend
3635import Obelisk.Route
36+import Reflex.Dom
3737import Snap (MonadSnap, Snap, commandLineConfig, defaultConfig, getsRequest, httpServe, rqPathInfo,
3838 rqQueryString, writeBS, writeText)
3939import Snap.Internal.Http.Server.Config (Config (accessLog, errorLog), ConfigLog (ConfigIoLog))
40−import System.Directory
41−import System.FilePath
4240import System.IO (BufferMode (..), hSetBuffering, stderr, stdout)
4341
4442data Backend backendRoute frontendRoute = Backend
@@ -155,7 +153,7 @@ data GhcjsAppRoute :: (* -> *) -> * -> * where
155153serveGhcjsApp :: MonadSnap m => GhcjsApp (R appRouteComponent) -> R (GhcjsAppRoute appRouteComponent) -> m ()
156154serveGhcjsApp app = \case
157155 GhcjsAppRoute_App appRouteComponent :=> Identity appRouteRest ->
158− writeBS <=< liftIO $ renderFrontendHtml (appRouteComponent :/ appRouteRest) <=< configureFrontend $ ghcjsFrontend $ _ghcjsApp_value app
156+ writeBS <=< liftIO $ renderGhcjsFrontend (appRouteComponent :/ appRouteRest) $ _ghcjsApp_value app
159157 GhcjsAppRoute_Resource :=> Identity pathSegments -> serveStaticAssets (_ghcjsApp_compiled app) pathSegments
160158
161159runBackend :: Backend fullRoute frontendRoute -> Frontend (R frontendRoute) -> IO ()
@@ -169,20 +167,8 @@ runBackend backend frontend = case checkEncoder $ _backend_routeEncoder backend
169167 InL backendRoute :=> Identity a -> serveRoute $ backendRoute :/ a
170168 InR obeliskRoute :=> Identity a -> serveDefaultObeliskApp frontend $ obeliskRoute :/ a
171169
172−configureFrontend :: Frontend a -> IO (Frontend a)
173−configureFrontend f = do
174− cfgC <- getConfigs "config/common"
175− cfgF <- getConfigs "config/frontend"
176− return $ f { _frontend_head = _frontend_head f >> mapM_ (uncurry injectPure) (cfgC <> cfgF) }
177− where
178− getConfigs :: FilePath -> IO [(FilePath, Text)]
179− getConfigs fp = do
180− ps <- listDirectory fp
181− fmap concat $ forM ps $ \p -> do
182− let fullpath = fp </> p
183− dir <- doesDirectoryExist p
184− if dir
185− then getConfigs fullpath
186− else do
187− v <- T.readFile fullpath
188− return [(fullpath, v)]
170+renderGhcjsFrontend :: route -> Frontend route -> IO ByteString
171+renderGhcjsFrontend route f = do
172+ let baseTag = elAttr "base" ("href" =: "/") blank --TODO: Figure out the base URL from the routes
173+ ghcjsScript = elAttr "script" ("language" =: "javascript" <> "src" =: "ghcjs/all.js" <> "defer" =: "defer") blank
174+ renderFrontendHtml route (_frontend_head f >> injectExecutableConfigs >> baseTag) (_frontend_body f >> ghcjsScript)