module Test.WebDriver.Commands.Internal
( clientScripts ) where
import Data.Maybe (catMaybes)
import Data.Monoid ((<>))
import Language.JavaScript.Parser (JSAST(..), JSExpression(..), JSStatement(..))
import qualified Data.HashMap.Lazy as M
import qualified Data.Text as T
import qualified Language.JavaScript.Parser as JS
parseClientTop :: JSAST -> [(T.Text,T.Text)]
parseClientTop (JSAstProgram es _) = catMaybes $ map parseClientDef es
parseClientTop _ = []
buildFunction :: JSExpression -> T.Text
buildFunction func = "return (" <> T.pack func' <> ").apply(null, arguments);"
where
func' = dropWhile (=='\n') $ JS.renderToString $ JSAstExpression func JS.JSNoAnnot
parseClientDef :: JSStatement -> Maybe (T.Text, T.Text)
parseClientDef (JSAssignStatement
(JSMemberDot
(JSIdentifier _ "clientSideScripts")
_
(JSIdentifier _ name))
_
(func@(JSFunctionExpression{}))
_)
= Just (T.pack name, buildFunction func)
parseClientDef _ = Nothing
clientScripts :: String -> Either String (M.HashMap T.Text T.Text)
clientScripts j = M.fromList . parseClientTop <$> JS.parse j "<client>"