module Test.WebDriver.Commands.Internal
( clientScripts ) where
import Control.Applicative
import Data.Maybe (catMaybes)
import Language.JavaScript.Parser (JSNode(..), Node(..))
import qualified Data.HashMap.Lazy as M
import qualified Data.Text as T
import qualified Language.JavaScript.Parser as JS
parseClientTop :: JSNode -> [(T.Text,T.Text)]
parseClientTop (NN (JSSourceElementsTop es)) = catMaybes $ map parseClientDef es
parseClientTop _ = []
parseClientDef :: JSNode -> Maybe (T.Text, T.Text)
parseClientDef (NN (JSExpression
[NN (JSMemberDot
[NT (JSIdentifier "clientSideScripts") _ _]
_
(NT (JSIdentifier name) _ _))
, NN (JSOperator (NT (JSLiteral "=") _ _))
, NN (JSFunctionExpression _ _ _ _ _ (NN (JSBlock _ body _)))
]))
= Just (T.pack name, T.pack $ dropWhile (=='\n') $ JS.renderToString $ NN $ JSSourceElementsTop body)
parseClientDef _ = Nothing
clientScripts :: String -> Either String (M.HashMap T.Text T.Text)
clientScripts j = M.fromList . parseClientTop <$> JS.parse j "<client>"