on master help sign in
Merge remote-tracking branch 'origin/master' into hydration

* origin/master: Revert "Get rid of ShowTag, EqTag, OrdTag; Use ArgDict" Add missing language extensions to Common.Route Bump reflex-platform Moved common head rendering into renderFrontendHtml Fixing references to static files. add a couple of convenience combitaors for routes Get rid of ShowTag, EqTag, OrdTag; Use ArgDict

commitf4dec8f25a6e69c32d1b52ff714aa23d2211ab6f authorAli Abrar <aliabrar@gmail.com> dateFri 8 Mar 2019, 23:29 (8 years ago) parent263616aca6edae
8 files changed+32−10
lib/backend/obelisk-backend.cabal−1 lib/backend/src/Obelisk/Backend.hs+2−4 lib/frontend/obelisk-frontend.cabal+1 lib/frontend/src/Obelisk/Frontend.hs+5−1 lib/route/src/Obelisk/Route.hs+20 lib/run/obelisk-run.cabal−1 lib/run/src/Obelisk/Run.hs+1−2 skeleton/common/common.cabal+3−1
lib/backend/obelisk-backend.cabal−1
@@ -14,7 +14,6 @@ library
1414 lens,
1515 mtl,
1616 obelisk-asset-serve-snap,
17− obelisk-executable-config-inject,
1817 obelisk-frontend,
1918 obelisk-route,
2019 obelisk-snap-extras,
lib/backend/src/Obelisk/Backend.hs+2−4
@@ -37,7 +37,6 @@ import Data.Text (Text)
3737import qualified Data.Text as T
3838import Data.Text.Encoding
3939import Obelisk.Asset.Serve.Snap (serveAsset)
40−import Obelisk.ExecutableConfig.Inject (injectExecutableConfigs)
4140import Obelisk.Frontend
4241import Obelisk.Route
4342import Obelisk.Snap.Extras (doNotCache, serveFileIfExistsAs)
@@ -167,9 +166,8 @@ mkRouteToUrl validFullEncoder =
167166
168167renderGhcjsFrontend :: MonadIO m => (route -> Text) -> route -> Frontend route -> m ByteString
169168renderGhcjsFrontend urlEnc route f = do
170− let baseTag = elAttr "base" ("href" =: "/") blank --TODO: Figure out the base URL from the routes
171− ghcjsPreload = elAttr "link" ("rel" =: "preload" <> "as" =: "script" <> "href" =: "ghcjs/all.js") blank
169+ let ghcjsPreload = elAttr "link" ("rel" =: "preload" <> "as" =: "script" <> "href" =: "ghcjs/all.js") blank
172170 ghcjsScript = elAttr "script" ("language" =: "javascript" <> "src" =: "ghcjs/all.js" <> "defer" =: "defer") blank
173171 liftIO $ renderFrontendHtml urlEnc route
174− (_frontend_head f >> injectExecutableConfigs >> baseTag >> ghcjsPreload)
172+ (_frontend_head f >> ghcjsPreload)
175173 (_frontend_body f >> ghcjsScript)
lib/frontend/obelisk-frontend.cabal+1
@@ -12,6 +12,7 @@ library
1212 jsaddle,
1313 lens,
1414 mtl,
15+ obelisk-executable-config-inject,
1516 obelisk-route,
1617 primitive,
1718 ref-tf,
lib/frontend/src/Obelisk/Frontend.hs+5−1
@@ -47,6 +47,7 @@ import Obelisk.Route.Frontend
4747import Reflex.Dom.Core
4848import Reflex.Host.Class
4949import qualified Reflex.TriggerEvent.Base as TriggerEvent
50+import Obelisk.ExecutableConfig.Inject (injectExecutableConfigs)
5051
5152makePrisms ''Sum
5253
@@ -127,6 +128,9 @@ renderFrontendHtml urlEnc route headWidget bodyWidget = do
127128 --TODO: We should probably have a "NullEventWriterT" or a frozen reflex timeline
128129 html <- fmap snd $ renderStatic $ fmap fst $ flip runRouteToUrlT urlEnc $ runSetRouteT $ flip runRoutedT (pure route) $
129130 el "html" $ do
130− el "head" headWidget
131+ el "head" $ do
132+ let baseTag = elAttr "base" ("href" =: "/") blank --TODO: Figure out the base URL from the routes
133+ -- The order here is important - baseTag has to be before headWidget!
134+ baseTag >> injectExecutableConfigs >> headWidget
131135 el "body" bodyWidget
132136 return $ "<!DOCTYPE html>" <> html
lib/route/src/Obelisk/Route.hs+20
@@ -82,6 +82,9 @@ module Obelisk.Route
8282 , renderObeliskRoute
8383 , renderBackendRoute
8484 , renderFrontendRoute
85+ , readShowEncoder
86+ , integralEncoder
87+ , pathSegmentEncoder
8588 ) where
8689
8790import Prelude hiding ((.), id)
@@ -118,6 +121,7 @@ import qualified Data.Text as T
118121import Data.Text.Encoding
119122import Data.Universe
120123import Network.HTTP.Types.URI
124+import qualified Numeric.Lens
121125import Obelisk.Route.TH
122126import Text.Read (readMaybe)
123127
@@ -859,4 +863,20 @@ renderObeliskRoute e r =
859863 enc = (pageNameEncoder . hoistParse (pure . runIdentity) e)
860864 in (T.pack . uncurry (<>)) $ encode enc r
861865
866+readShowEncoder :: (MonadError Text parse, Read a, Show a, Applicative check) => Encoder check parse a PageName
867+readShowEncoder = singlePathSegmentEncoder . unsafeTshowEncoder
868+
869+
870+integralEncoder :: (MonadError Text parse, Applicative check, Integral a) => Encoder check parse a Integer
871+integralEncoder = prismEncoder (Numeric.Lens.integral)
872+
873+pathSegmentEncoder :: (MonadError Text parse, Applicative check) =>
874+ Encoder check parse (Text, PageName) PageName
875+pathSegmentEncoder = unsafeMkEncoder EncoderImpl
876+ { _encoderImpl_encode = \(x, (y, z)) -> (x:y, z)
877+ , _encoderImpl_decode = \(xss, y) -> case xss of
878+ [] -> throwError "not enough path segments"
879+ (x:xs) -> pure (x, (xs, y))
880+ }
881+
862882--TODO: decodeURIComponent as appropriate
lib/run/obelisk-run.cabal−1
@@ -25,7 +25,6 @@ library
2525 , obelisk-asset-serve-snap
2626 , obelisk-backend
2727 , obelisk-executable-config
28− , obelisk-executable-config-inject
2928 , obelisk-frontend
3029 , obelisk-route
3130 , process
lib/run/src/Obelisk/Run.hs+1−2
@@ -50,7 +50,6 @@ import Network.WebSockets (ConnectionOptions)
5050import Network.WebSockets.Connection (defaultConnectionOptions)
5151import qualified Obelisk.Asset.Serve.Snap as Snap
5252import Obelisk.ExecutableConfig (get)
53−import Obelisk.ExecutableConfig.Inject (injectExecutableConfigs)
5453import Obelisk.Frontend
5554import Obelisk.Route.Frontend
5655import Reflex.Dom.Core
@@ -152,7 +151,7 @@ renderJsaddleFrontend :: (route -> Text) -> route -> Frontend route -> IO ByteSt
152151renderJsaddleFrontend urlEnc r f =
153152 let jsaddleScript = elAttr "script" ("src" =: "/jsaddle/jsaddle.js") blank
154153 jsaddlePreload = elAttr "link" ("rel" =: "preload" <> "as" =: "script" <> "href" =: "/jsaddle/jsaddle.js") blank
155− in renderFrontendHtml urlEnc r (_frontend_head f >> injectExecutableConfigs >> jsaddlePreload) (_frontend_body f >> jsaddleScript)
154+ in renderFrontendHtml urlEnc r (_frontend_head f >> jsaddlePreload) (_frontend_body f >> jsaddleScript)
156155
157156-- | like 'bindPortTCP' but reconnects on exception
158157bindPortTCPRetry :: Settings
skeleton/common/common.cabal+3−1
@@ -9,7 +9,9 @@ library
99 , obelisk-route
1010 , mtl
1111 , text
12−
12+ default-extensions:
13+ TypeFamilies
14+ PolyKinds
1315 exposed-modules:
1416 Common.Api
1517 Common.Route