Add a configuration mapping to Axios

This commit is contained in:
Freezeboy 2015-07-28 15:06:00 +02:00
parent 522dc3c2cb
commit 60d94be0e9
3 changed files with 58 additions and 17 deletions

View file

@ -98,6 +98,8 @@ module Servant.JS
, -- * Axios code generation , -- * Axios code generation
axios axios
, axiosWith , axiosWith
, AxiosOptions(..)
, defAxiosOptions
, -- * Misc. , -- * Misc.
listFromAPI listFromAPI

View file

@ -6,28 +6,53 @@ import Data.Char (toLower)
import Data.List import Data.List
import Data.Monoid import Data.Monoid
-- | Axios 'configuration' type
-- Let you customize the generation using Axios capabilities
data AxiosOptions = AxiosOptions
{ -- | indicates whether or not cross-site Access-Control requests
-- should be made using credentials
withCredentials :: !Bool
-- | the name of the cookie to use as a value for xsrf token
, xsrfCookieName :: !(Maybe String)
-- | the name of the header to use as a value for xsrf token
, xsrfHeaderName :: !(Maybe String)
}
-- | Default instance of the AxiosOptions
-- Defines the settings as they are in the Axios documentation
-- by default
defAxiosOptions :: AxiosOptions
defAxiosOptions = AxiosOptions
{ withCredentials = False
, xsrfCookieName = Nothing
, xsrfHeaderName = Nothing
}
-- | Generate regular javacript functions that use -- | Generate regular javacript functions that use
-- the axios library, using default values for 'CommonGeneratorOptions'. -- the axios library, using default values for 'CommonGeneratorOptions'.
axios :: JavaScriptGenerator axios :: AxiosOptions -> JavaScriptGenerator
axios = axiosWith defCommonGeneratorOptions axios aopts = axiosWith aopts defCommonGeneratorOptions
-- | Generate regular javascript functions that use the axios library. -- | Generate regular javascript functions that use the axios library.
axiosWith :: CommonGeneratorOptions -> JavaScriptGenerator axiosWith :: AxiosOptions -> CommonGeneratorOptions -> JavaScriptGenerator
axiosWith opts = intercalate "\n\n" . map (generateAxiosJSWith opts) axiosWith aopts opts = intercalate "\n\n" . map (generateAxiosJSWith aopts opts)
-- | js codegen using axios library using default options -- | js codegen using axios library using default options
generateAxiosJS :: AjaxReq -> String generateAxiosJS :: AxiosOptions -> AjaxReq -> String
generateAxiosJS = generateAxiosJSWith defCommonGeneratorOptions generateAxiosJS aopts = generateAxiosJSWith aopts defCommonGeneratorOptions
-- | js codegen using axios library -- | js codegen using axios library
generateAxiosJSWith :: CommonGeneratorOptions -> AjaxReq -> String generateAxiosJSWith :: AxiosOptions -> CommonGeneratorOptions -> AjaxReq -> String
generateAxiosJSWith opts req = "\n" <> generateAxiosJSWith aopts opts req = "\n" <>
fname <> " = function(" <> argsStr <> ")\n" fname <> " = function(" <> argsStr <> ")\n"
<> "{\n" <> "{\n"
<> " return axios({ url: " <> url <> "\n" <> " return axios({ url: " <> url <> "\n"
<> " , method: '" <> method <> "'\n" <> " , method: '" <> method <> "'\n"
<> dataBody <> dataBody
<> reqheaders <> reqheaders
<> withCreds
<> xsrfCookie
<> xsrfHeader
<> " });\n" <> " });\n"
<> "}\n" <> "}\n"
@ -55,10 +80,25 @@ generateAxiosJSWith opts req = "\n" <>
" , responseType: 'json'\n" " , responseType: 'json'\n"
else "" else ""
withCreds =
if withCredentials aopts
then " , withCredentials: true\n"
else ""
xsrfCookie =
case xsrfCookieName aopts of
Just name -> " , xsrfCookieName: '" <> name <> "'\n"
Nothing -> ""
xsrfHeader =
case xsrfHeaderName aopts of
Just name -> " , xsrfHeaderName: '" <> name <> "'\n"
Nothing -> ""
reqheaders = reqheaders =
if null hs if null hs
then "" then ""
else " , headers: { " ++ headersStr ++ " }\n" else " , headers: { " <> headersStr <> " }\n"
where headersStr = intercalate ", " $ map headerStr hs where headersStr = intercalate ", " $ map headerStr hs
headerStr header = "\"" ++ headerStr header = "\"" ++

View file

@ -61,9 +61,9 @@ data TestNames = Vanilla
deriving (Show, Eq) deriving (Show, Eq)
customOptions :: CommonGeneratorOptions customOptions :: CommonGeneratorOptions
customOptions = defCommonGeneratorOptions { customOptions = defCommonGeneratorOptions
successCallback = "okCallback", { successCallback = "okCallback"
errorCallback = "errorCallback" , errorCallback = "errorCallback"
} }
spec :: Spec spec :: Spec
@ -74,11 +74,11 @@ spec = describe "Servant.JQuery" $ do
generateJSSpec JQueryCustom (JQ.generateJQueryJSWith customOptions) generateJSSpec JQueryCustom (JQ.generateJQueryJSWith customOptions)
generateJSSpec Angular (NG.generateAngularJS NG.defAngularOptions) generateJSSpec Angular (NG.generateAngularJS NG.defAngularOptions)
generateJSSpec AngularCustom (NG.generateAngularJSWith NG.defAngularOptions customOptions) generateJSSpec AngularCustom (NG.generateAngularJSWith NG.defAngularOptions customOptions)
generateJSSpec Axios AX.generateAxiosJS generateJSSpec Axios (AX.generateAxiosJS AX.defAxiosOptions)
generateJSSpec AxiosCustom (AX.generateAxiosJSWith customOptions) generateJSSpec AxiosCustom (AX.generateAxiosJSWith (AX.defAxiosOptions { withCredentials = True }) customOptions)
angularSpec Angular angularSpec Angular
angularSpec AngularCustom --angularSpec AngularCustom
angularSpec :: TestNames -> Spec angularSpec :: TestNames -> Spec
angularSpec test = describe specLabel $ do angularSpec test = describe specLabel $ do
@ -98,7 +98,6 @@ angularSpec test = describe specLabel $ do
jsText `shouldNotContain` "getsomething($http, " jsText `shouldNotContain` "getsomething($http, "
where where
specLabel = "generateJS(" ++ (show test) ++ ")" specLabel = "generateJS(" ++ (show test) ++ ")"
--output = putStrLn
output _ = return () output _ = return ()
testName = "MyService" testName = "MyService"
ngOpts = NG.defAngularOptions { NG.serviceName = testName } ngOpts = NG.defAngularOptions { NG.serviceName = testName }