mig-extra 0.1.0.1 → 0.1.1.0
raw patch · 6 files changed
+51/−7 lines, 6 filesdep ~migdep ~mig-clientPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: mig, mig-client
API changes (from Hackage documentation)
+ Mig.Extra.Plugin.Trace: withLogs :: MonadIO m => Server m -> Server m
+ Mig.Extra.Plugin.Trace: withLogsBy :: MonadIO m => (Value -> m ()) -> Server m -> Server m
+ Mig.Extra.Server.Common: (:|) :: a -> b -> (:|) a b
+ Mig.Extra.Server.Common: Cookie :: Maybe a -> Cookie a
+ Mig.Extra.Server.Common: Just :: a -> Maybe a
+ Mig.Extra.Server.Common: Nothing :: Maybe a
+ Mig.Extra.Server.Common: OptionalHeader :: Maybe a -> OptionalHeader (sym :: Symbol) a
+ Mig.Extra.Server.Common: SetCookie :: a -> Maybe UTCTime -> Maybe Text -> Maybe Text -> Bool -> Bool -> SetCookie a
+ Mig.Extra.Server.Common: Url :: Path -> [(Text, Text)] -> Map Text Text -> Url
+ Mig.Extra.Server.Common: [$sel:captures:Url] :: Url -> Map Text Text
+ Mig.Extra.Server.Common: [$sel:cookie:SetCookie] :: SetCookie a -> a
+ Mig.Extra.Server.Common: [$sel:domain:SetCookie] :: SetCookie a -> Maybe Text
+ Mig.Extra.Server.Common: [$sel:expires:SetCookie] :: SetCookie a -> Maybe UTCTime
+ Mig.Extra.Server.Common: [$sel:httpOnly:SetCookie] :: SetCookie a -> Bool
+ Mig.Extra.Server.Common: [$sel:path:SetCookie] :: SetCookie a -> Maybe Text
+ Mig.Extra.Server.Common: [$sel:path:Url] :: Url -> Path
+ Mig.Extra.Server.Common: [$sel:queries:Url] :: Url -> [(Text, Text)]
+ Mig.Extra.Server.Common: [$sel:secure:SetCookie] :: SetCookie a -> Bool
+ Mig.Extra.Server.Common: catMaybes :: [Maybe a] -> [a]
+ Mig.Extra.Server.Common: class IsString a
+ Mig.Extra.Server.Common: class ToUrl a
+ Mig.Extra.Server.Common: data Maybe a
+ Mig.Extra.Server.Common: data SetCookie a
+ Mig.Extra.Server.Common: data Url
+ Mig.Extra.Server.Common: data a :| b
+ Mig.Extra.Server.Common: defCookie :: a -> SetCookie a
+ Mig.Extra.Server.Common: fromJust :: HasCallStack => Maybe a -> a
+ Mig.Extra.Server.Common: fromMaybe :: a -> Maybe a -> a
+ Mig.Extra.Server.Common: fromString :: IsString a => String -> a
+ Mig.Extra.Server.Common: isJust :: Maybe a -> Bool
+ Mig.Extra.Server.Common: isNothing :: Maybe a -> Bool
+ Mig.Extra.Server.Common: lines :: String -> [String]
+ Mig.Extra.Server.Common: listToMaybe :: [a] -> Maybe a
+ Mig.Extra.Server.Common: mapMaybe :: (a -> Maybe b) -> [a] -> [b]
+ Mig.Extra.Server.Common: mapUrl :: ToUrl a => (Url -> Url) -> a -> a
+ Mig.Extra.Server.Common: maybe :: b -> (a -> b) -> Maybe a -> b
+ Mig.Extra.Server.Common: maybeToList :: Maybe a -> [a]
+ Mig.Extra.Server.Common: newtype Cookie a
+ Mig.Extra.Server.Common: newtype OptionalHeader (sym :: Symbol) a
+ Mig.Extra.Server.Common: renderUrl :: IsString a => Url -> a
+ Mig.Extra.Server.Common: setCookie :: (ToForm cookie, IsResp resp) => SetCookie cookie -> resp -> resp
+ Mig.Extra.Server.Common: toUrl :: forall (m :: Type -> Type). ToUrl a => Server m -> a
+ Mig.Extra.Server.Common: type String = [Char]
+ Mig.Extra.Server.Common: unlines :: [String] -> String
+ Mig.Extra.Server.Common: unwords :: [String] -> String
+ Mig.Extra.Server.Common: urlArity :: ToUrl a => Int
+ Mig.Extra.Server.Common: words :: String -> [String]
+ Mig.Extra.Server.Html: Link :: Url -> Text -> Link
+ Mig.Extra.Server.Html: [$sel:href:Link] :: Link -> Url
+ Mig.Extra.Server.Html: [$sel:name:Link] :: Link -> Text
+ Mig.Extra.Server.Html: data Link
+ Mig.Extra.Server.Html: instance Data.Aeson.Types.ToJSON.ToJSON Mig.Extra.Server.Html.Link
+ Mig.Extra.Server.Html: instance GHC.Base.Functor Mig.Extra.Server.Html.Resp
+ Mig.Extra.Server.Html: instance GHC.Classes.Eq a => GHC.Classes.Eq (Mig.Extra.Server.Html.Resp a)
+ Mig.Extra.Server.Html: instance GHC.Generics.Generic Mig.Extra.Server.Html.Link
+ Mig.Extra.Server.Html: instance GHC.Show.Show a => GHC.Show.Show (Mig.Extra.Server.Html.Resp a)
+ Mig.Extra.Server.Html: instance Text.Blaze.ToMarkup Mig.Extra.Server.Html.Link
+ Mig.Extra.Server.Html.IO: Link :: Url -> Text -> Link
+ Mig.Extra.Server.Html.IO: [$sel:href:Link] :: Link -> Url
+ Mig.Extra.Server.Html.IO: [$sel:name:Link] :: Link -> Text
+ Mig.Extra.Server.Html.IO: data Link
+ Mig.Extra.Server.Json: instance (GHC.Classes.Eq err, GHC.Classes.Eq a) => GHC.Classes.Eq (Mig.Extra.Server.Json.RespOr err a)
+ Mig.Extra.Server.Json: instance (GHC.Show.Show err, GHC.Show.Show a) => GHC.Show.Show (Mig.Extra.Server.Json.RespOr err a)
+ Mig.Extra.Server.Json: instance GHC.Classes.Eq a => GHC.Classes.Eq (Mig.Extra.Server.Json.Resp a)
+ Mig.Extra.Server.Json: instance GHC.Show.Show a => GHC.Show.Show (Mig.Extra.Server.Json.Resp a)
+ Mig.Extra.Server.Json.IO: (:|) :: a -> b -> (:|) a b
+ Mig.Extra.Server.Json.IO: Cookie :: Maybe a -> Cookie a
+ Mig.Extra.Server.Json.IO: Just :: a -> Maybe a
+ Mig.Extra.Server.Json.IO: Nothing :: Maybe a
+ Mig.Extra.Server.Json.IO: OptionalHeader :: Maybe a -> OptionalHeader (sym :: Symbol) a
+ Mig.Extra.Server.Json.IO: SetCookie :: a -> Maybe UTCTime -> Maybe Text -> Maybe Text -> Bool -> Bool -> SetCookie a
+ Mig.Extra.Server.Json.IO: Url :: Path -> [(Text, Text)] -> Map Text Text -> Url
+ Mig.Extra.Server.Json.IO: [$sel:captures:Url] :: Url -> Map Text Text
+ Mig.Extra.Server.Json.IO: [$sel:cookie:SetCookie] :: SetCookie a -> a
+ Mig.Extra.Server.Json.IO: [$sel:domain:SetCookie] :: SetCookie a -> Maybe Text
+ Mig.Extra.Server.Json.IO: [$sel:expires:SetCookie] :: SetCookie a -> Maybe UTCTime
+ Mig.Extra.Server.Json.IO: [$sel:httpOnly:SetCookie] :: SetCookie a -> Bool
+ Mig.Extra.Server.Json.IO: [$sel:path:SetCookie] :: SetCookie a -> Maybe Text
+ Mig.Extra.Server.Json.IO: [$sel:path:Url] :: Url -> Path
+ Mig.Extra.Server.Json.IO: [$sel:queries:Url] :: Url -> [(Text, Text)]
+ Mig.Extra.Server.Json.IO: [$sel:secure:SetCookie] :: SetCookie a -> Bool
+ Mig.Extra.Server.Json.IO: catMaybes :: [Maybe a] -> [a]
+ Mig.Extra.Server.Json.IO: class IsString a
+ Mig.Extra.Server.Json.IO: class ToUrl a
+ Mig.Extra.Server.Json.IO: data Maybe a
+ Mig.Extra.Server.Json.IO: data SetCookie a
+ Mig.Extra.Server.Json.IO: data Url
+ Mig.Extra.Server.Json.IO: data a :| b
+ Mig.Extra.Server.Json.IO: defCookie :: a -> SetCookie a
+ Mig.Extra.Server.Json.IO: fromJust :: HasCallStack => Maybe a -> a
+ Mig.Extra.Server.Json.IO: fromMaybe :: a -> Maybe a -> a
+ Mig.Extra.Server.Json.IO: fromString :: IsString a => String -> a
+ Mig.Extra.Server.Json.IO: isJust :: Maybe a -> Bool
+ Mig.Extra.Server.Json.IO: isNothing :: Maybe a -> Bool
+ Mig.Extra.Server.Json.IO: lines :: String -> [String]
+ Mig.Extra.Server.Json.IO: listToMaybe :: [a] -> Maybe a
+ Mig.Extra.Server.Json.IO: mapMaybe :: (a -> Maybe b) -> [a] -> [b]
+ Mig.Extra.Server.Json.IO: mapUrl :: ToUrl a => (Url -> Url) -> a -> a
+ Mig.Extra.Server.Json.IO: maybe :: b -> (a -> b) -> Maybe a -> b
+ Mig.Extra.Server.Json.IO: maybeToList :: Maybe a -> [a]
+ Mig.Extra.Server.Json.IO: newtype Cookie a
+ Mig.Extra.Server.Json.IO: newtype OptionalHeader (sym :: Symbol) a
+ Mig.Extra.Server.Json.IO: renderUrl :: IsString a => Url -> a
+ Mig.Extra.Server.Json.IO: setCookie :: (ToForm cookie, IsResp resp) => SetCookie cookie -> resp -> resp
+ Mig.Extra.Server.Json.IO: toUrl :: forall (m :: Type -> Type). ToUrl a => Server m -> a
+ Mig.Extra.Server.Json.IO: type String = [Char]
+ Mig.Extra.Server.Json.IO: unlines :: [String] -> String
+ Mig.Extra.Server.Json.IO: unwords :: [String] -> String
+ Mig.Extra.Server.Json.IO: urlArity :: ToUrl a => Int
+ Mig.Extra.Server.Json.IO: words :: String -> [String]
Files
- mig-extra.cabal +3/−3
- src/Mig/Extra/Plugin/Trace.hs +8/−0
- src/Mig/Extra/Server/Common.hs +14/−0
- src/Mig/Extra/Server/Html.hs +20/−1
- src/Mig/Extra/Server/Html/IO.hs +4/−1
- src/Mig/Extra/Server/Json.hs +2/−2
mig-extra.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: mig-extra-version: 0.1.0.1+version: 0.1.1.0 synopsis: Extra utils for Mig core library description: Extra utils for mig server library category: Web@@ -62,8 +62,8 @@ , http-api-data , http-media , http-types- , mig >=0.2.0.1- , mig-client+ , mig >=0.2.1.0+ , mig-client >=0.1.1.0 , openapi3 , template-haskell , text
src/Mig/Extra/Plugin/Trace.hs view
@@ -16,6 +16,8 @@ logHttpBy, ppReq, Verbosity (..),+ withLogs,+ withLogsBy, ) where import Control.Monad@@ -56,6 +58,12 @@ ifLevel current level vals | level <= current = vals | otherwise = []++withLogs :: (MonadIO m) => Server m -> Server m+withLogs = applyPlugin (logHttp V2)++withLogsBy :: (MonadIO m) => (Json.Value -> m ()) -> Server m -> Server m+withLogsBy toLogItem = applyPlugin (logHttpBy toLogItem V2) ------------------------------------------------------------------------------------- -- through
src/Mig/Extra/Server/Common.hs view
@@ -25,6 +25,9 @@ notImplemented, redirect, setHeader,+ setCookie,+ SetCookie (..),+ defCookie, -- ** methods Send (..),@@ -38,6 +41,13 @@ HEAD, TRACE, + -- ** safe URLs+ UrlOf,+ ToUrl (..),+ Url (..),+ renderUrl,+ (:|) (..),+ -- ** path and query -- | Build API for routes with queries and captures.@@ -48,6 +58,8 @@ QueryFlag (..), Optional (..), Header (..),+ OptionalHeader (..),+ Cookie (..), PathInfo (..), FullPathInfo (..), RawRequest (..),@@ -122,7 +134,9 @@ import Control.Monad.Trans.Class as X import Data.Aeson as X (FromJSON (..), ToJSON (..)) import Data.Default as X+import Data.Maybe as X import Data.OpenApi as X (OpenApi, ToParamSchema (..), ToSchema (..))+import Data.String as X import Data.Text as X (Text) import GHC.Generics as X (Generic) import Mig.Extra.Derive as X
src/Mig/Extra/Server/Html.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE UndecidableInstances #-} -- | Html servers@@ -16,6 +17,9 @@ Resp (..), RespOr, + -- * utils+ Link (..),+ -- * re-exports Body (..), module X,@@ -24,11 +28,13 @@ import Mig.Core (Body (..)) import Mig.Core qualified as Core import Mig.Extra.Server.Common as X+import Text.Blaze.Html5 qualified as H+import Text.Blaze.Html5.Attributes qualified as HA -- response newtype Resp a = Resp (Core.Resp Html a)- deriving newtype (IsResp)+ deriving newtype (IsResp, Eq, Show, Functor) type RespOr err a = Either (Resp err) (Resp a) @@ -40,3 +46,16 @@ type Options m a = Send OPTIONS m (Resp a) type Head m a = Send HEAD m (Resp a) type Trace m a = Send TRACE m (Resp a)++{-| HTML a-links, this type is useful for using+with template engines that rely on @ToJSON@ instance.+Also it can be rendered as Html with @ToMarkup@ instance.+-}+data Link = Link+ { href :: Url+ , name :: Text+ }+ deriving (Generic, ToJSON)++instance ToMarkup Link where+ toMarkup link = H.a H.! HA.href (renderUrl link.href) $ H.text link.name
src/Mig/Extra/Server/Html/IO.hs view
@@ -14,6 +14,9 @@ Resp (..), RespOr, + -- * utils+ Link (..),+ -- * re-exports Body (..), module X,@@ -21,7 +24,7 @@ import Mig.Core (Body (..)) import Mig.Extra.Server.Common as X-import Mig.Extra.Server.Html (Resp (..), RespOr)+import Mig.Extra.Server.Html (Link (..), Resp (..), RespOr) type Get a = Send GET IO (Resp a) type Post a = Send POST IO (Resp a)
src/Mig/Extra/Server/Json.hs view
@@ -41,10 +41,10 @@ -- response newtype Resp a = Resp (Core.Resp Json a)- deriving newtype (IsResp, Functor)+ deriving newtype (IsResp, Eq, Show, Functor) newtype RespOr err a = RespOr (Core.RespOr Json err a)- deriving newtype (IsResp, Functor)+ deriving newtype (IsResp, Eq, Show, Functor) -- request