happstack-jmacro 7.0.0 → 7.0.1
raw patch · 2 files changed
+68/−16 lines, 2 filesdep +base64-bytestringdep +cerealdep +digestPVP ok
version bump matches the API change (PVP)
Dependencies added: base64-bytestring, cereal, digest
API changes (from Hackage documentation)
+ Happstack.Server.JMacro: instance ToMessage PrefixedJStat
+ Happstack.Server.JMacro: jmResponse :: ServerMonad m => JStat -> m Response
Files
- Happstack/Server/JMacro.hs +58/−9
- happstack-jmacro.cabal +10/−7
Happstack/Server/JMacro.hs view
@@ -1,18 +1,67 @@+{-# LANGUAGE QuasiQuotes #-}+ -- |This modules provides support for using JMacro with Happstack. -- -- It provides the instance, ----- > instance ToMessage JStat +-- > instance ToMessage JStat -- -- Which will serve a 'JStat' value as @text/javascript; charset=UTF-8@.-module Happstack.Server.JMacro where+-- The rendered JavaScript will be wrapped in an anonymous function that is+-- then called, so as to ensure the statements execute in a local scope.+-- An implication of this is that top-level unhygienic variables in JMacro+-- will /not/ be globally available; instead, you should set properties on+-- the global @window@ object.+module Happstack.Server.JMacro (jmResponse) where -import qualified Data.ByteString.Char8 as S-import Data.ByteString.Lazy.UTF8 as LB-import Happstack.Server (ToMessage(..))-import Language.Javascript.JMacro (JStat(..), renderJs)-import Text.PrettyPrint (Style(mode), Mode(OneLineMode), style, renderStyle)+import qualified Data.ByteString as B+import qualified Data.ByteString.Char8 as S+import qualified Data.ByteString.Lazy.UTF8 as LB +import Data.ByteString.Base64.URL (encode)+import Data.Digest.Adler32 (adler32)+import Data.Serialize (runPut, putWord32le)+import Happstack.Server (ToMessage(..), ServerMonad, Request(Request, rqUri), Response, askRq)+import Language.Javascript.JMacro (JStat(..), renderJs, renderPrefixJs, jmacro, jLam, toStat)+import Text.PrettyPrint (Style(mode), Mode(OneLineMode), style, renderStyle)++lineStyle :: Style+lineStyle = style { mode = OneLineMode }++mkId :: String -> String+mkId = S.unpack+ . S.map dollar+ . S.takeWhile (/= '=')+ . encode+ . B.dropWhile (== 0)+ . runPut+ . putWord32le+ . adler32+ . S.pack+ where+ dollar '-' = '$'+ dollar c = c++data PrefixedJStat = PrefixedJStat String JStat+ instance ToMessage JStat where- toContentType _ = S.pack "text/javascript; charset=UTF-8"- toMessage js = LB.fromString . renderStyle (style { mode = OneLineMode }) . renderJs $ js+ toContentType _ = S.pack "text/javascript; charset=UTF-8"+ toMessage js =+ LB.fromString . renderStyle lineStyle . renderJs $ scoped+ where+ scoped = [jmacro| (function { `(js)`; })(); |]++instance ToMessage PrefixedJStat where+ toContentType _ = S.pack "text/javascript; charset=UTF-8"+ toMessage (PrefixedJStat prefix js) =+ LB.fromString . renderStyle lineStyle . renderPrefixJs (mkId prefix) $ js++-- | Render a 'JStat' into a 'Response', saturating the variable names with+-- a hash computed from the 'rqUri'. Unlike the 'ToMessage' instance for+-- @JStat@, this doesn't wrap the statements in a function and so the+-- workaround for global unhygienic names isn't necessary. On the other+-- hand, generated variable names are a bit longer.+jmResponse :: ServerMonad m => JStat -> m Response+jmResponse jstat =+ do Request{rqUri = uri} <- askRq+ return . toResponse $ PrefixedJStat uri jstat
happstack-jmacro.cabal view
@@ -1,5 +1,5 @@ Name: happstack-jmacro-Version: 7.0.0+Version: 7.0.1 Synopsis: Support for using JMacro with Happstack Homepage: http://www.happstack.com/ License: BSD3@@ -16,9 +16,12 @@ Library Exposed-modules: Happstack.Server.JMacro Build-depends:- base >4 && <5,- bytestring == 0.9.*,- jmacro == 0.5.*,- happstack-server >= 6.4 && <7.1,- pretty == 1.0.* || == 1.1.*,- utf8-string == 0.3.*+ base >4 && <5,+ base64-bytestring == 0.1.*,+ bytestring == 0.9.*,+ cereal == 0.3.*,+ digest == 0.0.*,+ happstack-server >= 6.4 && <7.1,+ jmacro == 0.5.*,+ pretty == 1.0.* || == 1.1.*,+ utf8-string == 0.3.*