on master help sign in
Convert servant-js to use text.
commita62441077ea73889317a99c5214a34a68bbcd928 authorArian van Putten <aeroboy94@gmail.com> dateFri 2 Oct 2015, 13:59 (11 years ago) parente17987e
6 files changed+151−114
servant-js/src/Servant/JS.hs+8−3 servant-js/src/Servant/JS/Angular.hs+24−22 servant-js/src/Servant/JS/Axios.hs+19−18 servant-js/src/Servant/JS/Internal.hs+64−39 servant-js/src/Servant/JS/JQuery.hs+18−16 servant-js/src/Servant/JS/Vanilla.hs+18−16
servant-js/src/Servant/JS.hs+8−3
@@ -39,7 +39,7 @@
3939-- Let's keep it simple and produce vanilla Javascript code with the default options.
4040--
4141-- @
42−-- jsCode :: String
42+-- jsCode :: Text
4343-- jsCode = 'jsForAPI' api 'vanillaJS'
4444-- @
4545--
@@ -60,7 +60,7 @@
6060-- All you need to do to use it is to use 'vanillaJSWith' and pass it @myOptions@.
6161--
6262-- @
63−-- jsCodeWithMyOptions :: String
63+-- jsCodeWithMyOptions :: Text
6464-- jsCodeWithMyOptions = 'jsForAPI' api ('vanillaJSWith' myOptions)
6565-- @
6666--
@@ -112,7 +112,10 @@ module Servant.JS
112112 , GenerateList(..)
113113 ) where
114114
115+import Prelude hiding (writeFile)
115116import Data.Proxy
117+import Data.Text
118+import Data.Text.IO (writeFile)
116119import Servant.JS.Angular
117120import Servant.JS.Axios
118121import Servant.JS.Internal
@@ -131,7 +134,7 @@ javascript p = foreignFor p defReq
131134jsForAPI :: (HasForeign api, GenerateList (Foreign api))
132135 => Proxy api -- ^ proxy for your API type
133136 -> JavaScriptGenerator -- ^ js code generator to use (angular, vanilla js, jquery, others)
134− -> String -- ^ a string that you can embed in your pages or write to a file
137+ -> Text -- ^ a text that you can embed in your pages or write to a file
135138jsForAPI p gen = gen (listFromAPI p)
136139
137140-- | Directly generate all the javascript functions for your API
@@ -142,6 +145,8 @@ writeJSForAPI :: (HasForeign api, GenerateList (Foreign api))
142145 -> JavaScriptGenerator -- ^ js code generator to use (angular, vanilla js, jquery, others)
143146 -> FilePath -- ^ path to the file you want to write the resulting javascript code into
144147 -> IO ()
148+
149+-- TODO Data.Text
145150writeJSForAPI p gen fp = writeFile fp (jsForAPI p gen)
146151
147152-- | Utility class used by 'jsForAPI' which computes
servant-js/src/Servant/JS/Angular.hs+24−22
@@ -1,17 +1,19 @@
1+{-#LANGUAGE OverloadedStrings #-}
12module Servant.JS.Angular where
23
34import Control.Lens
4−import Data.List
55import Data.Monoid
6+import qualified Data.Text as T
7+import Data.Text (Text)
68import Servant.Foreign
79import Servant.JS.Internal
810
911-- | Options specific to the angular code generator
1012data AngularOptions = AngularOptions
11− { serviceName :: String -- ^ When generating code with wrapInService,
13+ { serviceName :: Text -- ^ When generating code with wrapInService,
1214 -- name of the service to generate
13− , prologue :: String -> String -> String -- ^ beginning of the service definition
14− , epilogue :: String -- ^ end of the service definition
15+ , prologue :: Text -> Text -> Text -- ^ beginning of the service definition
16+ , epilogue :: Text -- ^ end of the service definition
1517 }
1618
1719-- | Default options for the Angular codegen. Used by 'wrapInService'.
@@ -34,12 +36,12 @@ angularService ngOpts = angularServiceWith ngOpts defCommonGeneratorOptions
3436angularServiceWith :: AngularOptions -> CommonGeneratorOptions -> JavaScriptGenerator
3537angularServiceWith ngOpts opts reqs =
3638 prologue ngOpts svc mName
37− <> intercalate "," (map generator reqs) <>
39+ <> T.intercalate "," (map generator reqs) <>
3840 epilogue ngOpts
3941 where
4042 generator req = generateAngularJSWith ngOpts opts req
4143 svc = serviceName ngOpts
42− mName = if null (moduleName opts)
44+ mName = if moduleName opts == ""
4345 then "app."
4446 else moduleName opts <> "."
4547
@@ -50,14 +52,14 @@ angular ngopts = angularWith ngopts defCommonGeneratorOptions
5052
5153-- | Generate regular javascript functions that use the $http service.
5254angularWith :: AngularOptions -> CommonGeneratorOptions -> JavaScriptGenerator
53−angularWith ngopts opts = intercalate "\n\n" . map (generateAngularJSWith ngopts opts)
55+angularWith ngopts opts = T.intercalate "\n\n" . map (generateAngularJSWith ngopts opts)
5456
5557-- | js codegen using $http service from Angular using default options
56−generateAngularJS :: AngularOptions -> AjaxReq -> String
58+generateAngularJS :: AngularOptions -> AjaxReq -> Text
5759generateAngularJS ngOpts = generateAngularJSWith ngOpts defCommonGeneratorOptions
5860
5961-- | js codegen using $http service from Angular
60−generateAngularJSWith :: AngularOptions -> CommonGeneratorOptions -> AjaxReq -> String
62+generateAngularJSWith :: AngularOptions -> CommonGeneratorOptions -> AjaxReq -> Text
6163generateAngularJSWith ngOptions opts req = "\n" <>
6264 fname <> fsep <> " function(" <> argsStr <> ")\n"
6365 <> "{\n"
@@ -69,7 +71,7 @@ generateAngularJSWith ngOptions opts req = "\n" <>
6971 <> " });\n"
7072 <> "}\n"
7173
72− where argsStr = intercalate ", " args
74+ where argsStr = T.intercalate ", " args
7375 args = http
7476 ++ captures
7577 ++ map (view argName) queryparams
@@ -79,7 +81,7 @@ generateAngularJSWith ngOptions opts req = "\n" <>
7981 -- If we want to generate Top Level Function, they must depend on
8082 -- the $http service, if we generate a service, the functions will
8183 -- inherit this dependency from the service
82− http = case length (serviceName ngOptions) of
84+ http = case T.length (serviceName ngOptions) of
8385 0 -> ["$http"]
8486 _ -> []
8587
@@ -104,12 +106,12 @@ generateAngularJSWith ngOptions opts req = "\n" <>
104106 reqheaders =
105107 if null hs
106108 then ""
107− else " , headers: { " ++ headersStr ++ " }\n"
109+ else " , headers: { " <> headersStr <> " }\n"
108110
109− where headersStr = intercalate ", " $ map headerStr hs
110− headerStr header = "\"" ++
111− headerArgName header ++
112− "\": " ++ toJSHeader header
111+ where headersStr = T.intercalate ", " $ map headerStr hs
112+ headerStr header = "\"" <>
113+ headerArgName header <>
114+ "\": " <> toJSHeader header
113115
114116 namespace =
115117 if hasService
@@ -118,9 +120,9 @@ generateAngularJSWith ngOptions opts req = "\n" <>
118120 then "var "
119121 else (moduleName opts) <> "."
120122 where
121− hasNoModule = null (moduleName opts)
123+ hasNoModule = moduleName opts == ""
122124
123− hasService = not $ null (serviceName ngOptions)
125+ hasService = serviceName ngOptions /= ""
124126
125127 fsep = if hasService then ":" else " ="
126128
@@ -129,13 +131,13 @@ generateAngularJSWith ngOptions opts req = "\n" <>
129131 method = req ^. reqMethod
130132 url = if url' == "'" then "'/'" else url'
131133 url' = "'"
132− ++ urlPrefix opts
133− ++ urlArgs
134− ++ queryArgs
134+ <> urlPrefix opts
135+ <> urlArgs
136+ <> queryArgs
135137
136138 urlArgs = jsSegments
137139 $ req ^.. reqUrl.path.traverse
138140
139141 queryArgs = if null queryparams
140142 then ""
141− else " + '?" ++ jsParams queryparams
143+ else " + '?" <> jsParams queryparams
servant-js/src/Servant/JS/Axios.hs+19−18
@@ -1,9 +1,10 @@
1+{-#LANGUAGE OverloadedStrings #-}
12module Servant.JS.Axios where
23
34import Control.Lens
4−import Data.Char (toLower)
5−import Data.List
65import Data.Monoid
6+import Data.Text (Text)
7+import qualified Data.Text as T
78import Servant.Foreign
89import Servant.JS.Internal
910
@@ -14,9 +15,9 @@ data AxiosOptions = AxiosOptions
1415 -- should be made using credentials
1516 withCredentials :: !Bool
1617 -- | the name of the cookie to use as a value for xsrf token
17− , xsrfCookieName :: !(Maybe String)
18+ , xsrfCookieName :: !(Maybe Text)
1819 -- | the name of the header to use as a value for xsrf token
19− , xsrfHeaderName :: !(Maybe String)
20+ , xsrfHeaderName :: !(Maybe Text)
2021 }
2122
2223-- | Default instance of the AxiosOptions
@@ -36,14 +37,14 @@ axios aopts = axiosWith aopts defCommonGeneratorOptions
3637
3738-- | Generate regular javascript functions that use the axios library.
3839axiosWith :: AxiosOptions -> CommonGeneratorOptions -> JavaScriptGenerator
39−axiosWith aopts opts = intercalate "\n\n" . map (generateAxiosJSWith aopts opts)
40+axiosWith aopts opts = T.intercalate "\n\n" . map (generateAxiosJSWith aopts opts)
4041
4142-- | js codegen using axios library using default options
42−generateAxiosJS :: AxiosOptions -> AjaxReq -> String
43+generateAxiosJS :: AxiosOptions -> AjaxReq -> Text
4344generateAxiosJS aopts = generateAxiosJSWith aopts defCommonGeneratorOptions
4445
4546-- | js codegen using axios library
46−generateAxiosJSWith :: AxiosOptions -> CommonGeneratorOptions -> AjaxReq -> String
47+generateAxiosJSWith :: AxiosOptions -> CommonGeneratorOptions -> AjaxReq -> Text
4748generateAxiosJSWith aopts opts req = "\n" <>
4849 fname <> " = function(" <> argsStr <> ")\n"
4950 <> "{\n"
@@ -57,7 +58,7 @@ generateAxiosJSWith aopts opts req = "\n" <>
5758 <> " });\n"
5859 <> "}\n"
5960
60− where argsStr = intercalate ", " args
61+ where argsStr = T.intercalate ", " args
6162 args = captures
6263 ++ map (view argName) queryparams
6364 ++ body
@@ -101,30 +102,30 @@ generateAxiosJSWith aopts opts req = "\n" <>
101102 then ""
102103 else " , headers: { " <> headersStr <> " }\n"
103104
104− where headersStr = intercalate ", " $ map headerStr hs
105− headerStr header = "\"" ++
106− headerArgName header ++
107− "\": " ++ toJSHeader header
105+ where headersStr = T.intercalate ", " $ map headerStr hs
106+ headerStr header = "\"" <>
107+ headerArgName header <>
108+ "\": " <> toJSHeader header
108109
109110 namespace =
110111 if hasNoModule
111112 then "var "
112113 else (moduleName opts) <> "."
113114 where
114− hasNoModule = null (moduleName opts)
115+ hasNoModule = moduleName opts == ""
115116
116117 fname = namespace <> (functionNameBuilder opts $ req ^. funcName)
117118
118− method = map toLower $ req ^. reqMethod
119+ method = T.toLower $ req ^. reqMethod
119120 url = if url' == "'" then "'/'" else url'
120121 url' = "'"
121− ++ urlPrefix opts
122− ++ urlArgs
123− ++ queryArgs
122+ <> urlPrefix opts
123+ <> urlArgs
124+ <> queryArgs
124125
125126 urlArgs = jsSegments
126127 $ req ^.. reqUrl.path.traverse
127128
128129 queryArgs = if null queryparams
129130 then ""
130− else " + '?" ++ jsParams queryparams
131+ else " + '?" <> jsParams queryparams
servant-js/src/Servant/JS/Internal.hs+64−39
@@ -1,3 +1,4 @@
1+{-#LANGUAGE OverloadedStrings #-}
12module Servant.JS.Internal
23 ( JavaScriptGenerator
34 , CommonGeneratorOptions(..)
@@ -34,28 +35,28 @@ module Servant.JS.Internal
3435import Control.Lens ((^.))
3536import qualified Data.CharSet as Set
3637import qualified Data.CharSet.Unicode.Category as Set
37−import Data.List
3838import Data.Monoid
3939import qualified Data.Text as T
40+import Data.Text (Text)
4041import Servant.Foreign
4142
4243type AjaxReq = Req
4344
4445-- A 'JavascriptGenerator' just takes the data found in the API type
45−-- for each endpoint and generates Javascript code in a String. Several
46+-- for each endpoint and generates Javascript code in a Text. Several
4647-- generators are available in this package.
47−type JavaScriptGenerator = [Req] -> String
48+type JavaScriptGenerator = [Req] -> Text
4849
4950-- | This structure is used by specific implementations to let you
5051-- customize the output
5152data CommonGeneratorOptions = CommonGeneratorOptions
5253 {
53− functionNameBuilder :: FunctionName -> String -- ^ function generating function names
54− , requestBody :: String -- ^ name used when a user want to send the request body (to let you redefine it)
55− , successCallback :: String -- ^ name of the callback parameter when the request was successful
56− , errorCallback :: String -- ^ name of the callback parameter when the request reported an error
57− , moduleName :: String -- ^ namespace on which we define the foreign function (empty mean local var)
58− , urlPrefix :: String -- ^ a prefix we should add to the Url in the codegen
54+ functionNameBuilder :: FunctionName -> Text -- ^ function generating function names
55+ , requestBody :: Text -- ^ name used when a user want to send the request body (to let you redefine it)
56+ , successCallback :: Text -- ^ name of the callback parameter when the request was successful
57+ , errorCallback :: Text -- ^ name of the callback parameter when the request reported an error
58+ , moduleName :: Text -- ^ namespace on which we define the foreign function (empty mean local var)
59+ , urlPrefix :: Text -- ^ a prefix we should add to the Url in the codegen
5960 }
6061
6162-- | Default options.
@@ -87,7 +88,34 @@ defCommonGeneratorOptions = CommonGeneratorOptions
8788-- Couldn't work out how to handle zero-width characters.
8889--
8990-- @TODO: specify better default function name, or throw error?
90−toValidFunctionName :: String -> String
91+toValidFunctionName :: Text -> Text
92+-- @TODO: Cons text
93+--
94+
95+toValidFunctionName t =
96+ case T.uncons t of
97+ Just (x,xs) ->
98+ setFirstChar x `T.cons` T.filter remainder xs
99+ Nothing -> "_"
100+ where
101+ setFirstChar c = if firstChar c then c else '_'
102+ firstChar c = prefixOK c || any (Set.member c) firstLetterOK
103+ remainder c = prefixOK c || any (Set.member c) remainderOK
104+ -- Valid prefixes
105+ prefixOK c = c `elem` ['$','_']
106+ -- Unicode character sets
107+ firstLetterOK = [ Set.lowercaseLetter
108+ , Set.uppercaseLetter
109+ , Set.titlecaseLetter
110+ , Set.modifierLetter
111+ , Set.otherLetter
112+ , Set.letterNumber ]
113+ remainderOK = firstLetterOK
114+ <> [ Set.nonSpacingMark
115+ , Set.spacingCombiningMark
116+ , Set.decimalNumber
117+ , Set.connectorPunctuation ]
118+{-
91119toValidFunctionName (x:xs) = [setFirstChar x] <> filter remainder xs
92120 where
93121 setFirstChar c = if firstChar c then c else '_'
@@ -108,59 +136,56 @@ toValidFunctionName (x:xs) = [setFirstChar x] <> filter remainder xs
108136 , Set.decimalNumber
109137 , Set.connectorPunctuation ]
110138toValidFunctionName [] = "_"
139+-}
111140
112−toJSHeader :: HeaderArg -> String
141+toJSHeader :: HeaderArg -> Text
113142toJSHeader (HeaderArg n) = toValidFunctionName ("header" <> n)
114143toJSHeader (ReplaceHeaderArg n p)
115− | pn `isPrefixOf` p = pv <> " + \"" <> rp <> "\""
116− | pn `isSuffixOf` p = "\"" <> rp <> "\" + " <> pv
117− | pn `isInfixOf` p = "\"" <> (replace pn ("\" + " <> pv <> " + \"") p)
144+ | pn `T.isPrefixOf` p = pv <> " + \"" <> rp <> "\""
145+ | pn `T.isSuffixOf` p = "\"" <> rp <> "\" + " <> pv
146+ | pn `T.isInfixOf` p = "\"" <> (T.replace pn ("\" + " <> pv <> " + \"") p)
118147 <> "\""
119148 | otherwise = p
120149 where
121150 pv = toValidFunctionName ("header" <> n)
122151 pn = "{" <> n <> "}"
123− rp = replace pn "" p
124− -- Use replace method from Data.Text
125− replace old new = T.unpack
126− . T.replace (T.pack old) (T.pack new)
127− . T.pack
152+ rp = T.replace pn "" p
128153
129−jsSegments :: [Segment] -> String
154+jsSegments :: [Segment] -> Text
130155jsSegments [] = ""
131−jsSegments [x] = "/" ++ segmentToStr x False
132−jsSegments (x:xs) = "/" ++ segmentToStr x True ++ jsSegments xs
156+jsSegments [x] = "/" <> segmentToStr x False
157+jsSegments (x:xs) = "/" <> segmentToStr x True <> jsSegments xs
133158
134−segmentToStr :: Segment -> Bool -> String
159+segmentToStr :: Segment -> Bool -> Text
135160segmentToStr (Segment st ms) notTheEnd =
136− segmentTypeToStr st ++ jsMParams ms ++ if notTheEnd then "" else "'"
161+ segmentTypeToStr st <> jsMParams ms <> if notTheEnd then "" else "'"
137162
138−segmentTypeToStr :: SegmentType -> String
163+segmentTypeToStr :: SegmentType -> Text
139164segmentTypeToStr (Static s) = s
140−segmentTypeToStr (Cap s) = "' + encodeURIComponent(" ++ s ++ ") + '"
165+segmentTypeToStr (Cap s) = "' + encodeURIComponent(" <> s <> ") + '"
141166
142−jsGParams :: String -> [QueryArg] -> String
167+jsGParams :: Text -> [QueryArg] -> Text
143168jsGParams _ [] = ""
144169jsGParams _ [x] = paramToStr x False
145−jsGParams s (x:xs) = paramToStr x True ++ s ++ jsGParams s xs
170+jsGParams s (x:xs) = paramToStr x True <> s <> jsGParams s xs
146171
147−jsParams :: [QueryArg] -> String
172+jsParams :: [QueryArg] -> Text
148173jsParams = jsGParams "&"
149174
150−jsMParams :: [MatrixArg] -> String
175+jsMParams :: [MatrixArg] -> Text
151176jsMParams [] = ""
152−jsMParams xs = ";" ++ jsGParams ";" xs
177+jsMParams xs = ";" <> jsGParams ";" xs
153178
154−paramToStr :: QueryArg -> Bool -> String
179+paramToStr :: QueryArg -> Bool -> Text
155180paramToStr qarg notTheEnd =
156181 case qarg ^. argType of
157182 Normal -> name
158− ++ "=' + encodeURIComponent("
159− ++ name
160− ++ if notTheEnd then ") + '" else ")"
161− Flag -> name ++ "="
183+ <> "=' + encodeURIComponent("
184+ <> name
185+ <> if notTheEnd then ") + '" else ")"
186+ Flag -> name <> "="
162187 List -> name
163− ++ "[]=' + encodeURIComponent("
164− ++ name
165− ++ if notTheEnd then ") + '" else ")"
188+ <> "[]=' + encodeURIComponent("
189+ <> name
190+ <> if notTheEnd then ") + '" else ")"
166191 where name = qarg ^. argName
servant-js/src/Servant/JS/JQuery.hs+18−16
@@ -1,8 +1,10 @@
1+{-#LANGUAGE OverloadedStrings #-}
12module Servant.JS.JQuery where
23
34import Control.Lens
4−import Data.List
55import Data.Monoid
6+import qualified Data.Text as T
7+import Data.Text (Text)
68import Servant.Foreign
79import Servant.JS.Internal
810
@@ -10,19 +12,19 @@ import Servant.JS.Internal
1012-- to make the AJAX calls. Uses 'defCommonGeneratorOptions'
1113-- for the generator options.
1214jquery :: JavaScriptGenerator
13−jquery = concatMap generateJQueryJS
15+jquery = mconcat . map generateJQueryJS
1416
1517-- | Generate javascript functions that use the /jQuery/ library
1618-- to make the AJAX calls. Lets you specify your own 'CommonGeneratorOptions'.
1719jqueryWith :: CommonGeneratorOptions -> JavaScriptGenerator
18−jqueryWith opts = concatMap (generateJQueryJSWith opts)
20+jqueryWith opts = mconcat . map (generateJQueryJSWith opts)
1921
2022-- | js codegen using JQuery using default options
21−generateJQueryJS :: AjaxReq -> String
23+generateJQueryJS :: AjaxReq -> Text
2224generateJQueryJS = generateJQueryJSWith defCommonGeneratorOptions
2325
2426-- | js codegen using JQuery
25−generateJQueryJSWith :: CommonGeneratorOptions -> AjaxReq -> String
27+generateJQueryJSWith :: CommonGeneratorOptions -> AjaxReq -> Text
2628generateJQueryJSWith opts req = "\n" <>
2729 fname <> " = function(" <> argsStr <> ")\n"
2830 <> "{\n"
@@ -36,7 +38,7 @@ generateJQueryJSWith opts req = "\n" <>
3638 <> " });\n"
3739 <> "}\n"
3840
39− where argsStr = intercalate ", " args
41+ where argsStr = T.intercalate ", " args
4042 args = captures
4143 ++ map (view argName) queryparams
4244 ++ body
@@ -67,14 +69,14 @@ generateJQueryJSWith opts req = "\n" <>
6769 reqheaders =
6870 if null hs
6971 then ""
70− else " , headers: { " ++ headersStr ++ " }\n"
72+ else " , headers: { " <> headersStr <> " }\n"
7173
72− where headersStr = intercalate ", " $ map headerStr hs
73− headerStr header = "\"" ++
74− headerArgName header ++
75− "\": " ++ toJSHeader header
74+ where headersStr = T.intercalate ", " $ map headerStr hs
75+ headerStr header = "\"" <>
76+ headerArgName header <>
77+ "\": " <> toJSHeader header
7678
77− namespace = if null (moduleName opts)
79+ namespace = if (moduleName opts) == ""
7880 then "var "
7981 else (moduleName opts) <> "."
8082 fname = namespace <> (functionNameBuilder opts $ req ^. funcName)
@@ -82,13 +84,13 @@ generateJQueryJSWith opts req = "\n" <>
8284 method = req ^. reqMethod
8385 url = if url' == "'" then "'/'" else url'
8486 url' = "'"
85− ++ urlPrefix opts
86− ++ urlArgs
87− ++ queryArgs
87+ <> urlPrefix opts
88+ <> urlArgs
89+ <> queryArgs
8890
8991 urlArgs = jsSegments
9092 $ req ^.. reqUrl.path.traverse
9193
9294 queryArgs = if null queryparams
9395 then ""
94− else " + '?" ++ jsParams queryparams
96+ else " + '?" <> jsParams queryparams
servant-js/src/Servant/JS/Vanilla.hs+18−16
@@ -1,7 +1,9 @@
1+{-#LANGUAGE OverloadedStrings #-}
12module Servant.JS.Vanilla where
23
34import Control.Lens
4−import Data.List
5+import Data.Text (Text)
6+import qualified Data.Text as T
57import Data.Monoid
68import Servant.Foreign
79import Servant.JS.Internal
@@ -10,20 +12,20 @@ import Servant.JS.Internal
1012-- to your API, using /XMLHttpRequest/. Uses 'defCommonGeneratorOptions'
1113-- for the 'CommonGeneratorOptions'.
1214vanillaJS :: JavaScriptGenerator
13−vanillaJS = concatMap generateVanillaJS
15+vanillaJS = mconcat . map generateVanillaJS
1416
1517-- | Generate vanilla javascript functions to make AJAX requests
1618-- to your API, using /XMLHttpRequest/. Lets you specify your
1719-- own options.
1820vanillaJSWith :: CommonGeneratorOptions -> JavaScriptGenerator
19−vanillaJSWith opts = concatMap (generateVanillaJSWith opts)
21+vanillaJSWith opts = mconcat . map (generateVanillaJSWith opts)
2022
2123-- | js codegen using XmlHttpRequest using default generation options
22−generateVanillaJS :: AjaxReq -> String
24+generateVanillaJS :: AjaxReq -> Text
2325generateVanillaJS = generateVanillaJSWith defCommonGeneratorOptions
2426
2527-- | js codegen using XmlHttpRequest
26−generateVanillaJSWith :: CommonGeneratorOptions -> AjaxReq -> String
28+generateVanillaJSWith :: CommonGeneratorOptions -> AjaxReq -> Text
2729generateVanillaJSWith opts req = "\n" <>
2830 fname <> " = function(" <> argsStr <> ")\n"
2931 <> "{\n"
@@ -43,7 +45,7 @@ generateVanillaJSWith opts req = "\n" <>
4345 <> " xhr.send(" <> dataBody <> ");\n"
4446 <> "}\n"
4547
46− where argsStr = intercalate ", " args
48+ where argsStr = T.intercalate ", " args
4749 args = captures
4850 ++ map (view argName) queryparams
4951 ++ body
@@ -74,14 +76,14 @@ generateVanillaJSWith opts req = "\n" <>
7476 reqheaders =
7577 if null hs
7678 then ""
77− else headersStr ++ "\n"
79+ else headersStr <> "\n"
7880
79− where headersStr = intercalate "\n" $ map headerStr hs
80− headerStr header = " xhr.setRequestHeader(\"" ++
81− headerArgName header ++
82− "\", " ++ toJSHeader header ++ ");"
81+ where headersStr = T.intercalate "\n" $ map headerStr hs
82+ headerStr header = " xhr.setRequestHeader(\"" <>
83+ headerArgName header <>
84+ "\", " <> toJSHeader header <> ");"
8385
84− namespace = if null (moduleName opts)
86+ namespace = if moduleName opts == ""
8587 then "var "
8688 else (moduleName opts) <> "."
8789 fname = namespace <> (functionNameBuilder opts $ req ^. funcName)
@@ -89,13 +91,13 @@ generateVanillaJSWith opts req = "\n" <>
8991 method = req ^. reqMethod
9092 url = if url' == "'" then "'/'" else url'
9193 url' = "'"
92− ++ urlPrefix opts
93− ++ urlArgs
94− ++ queryArgs
94+ <> urlPrefix opts
95+ <> urlArgs
96+ <> queryArgs
9597
9698 urlArgs = jsSegments
9799 $ req ^.. reqUrl.path.traverse
98100
99101 queryArgs = if null queryparams
100102 then ""
101− else " + '?" ++ jsParams queryparams
103+ else " + '?" <> jsParams queryparams