mole-0.0.5: src/Data/Mole/Builder/JavaScript.hs
{-# LANGUAGE OverloadedStrings #-}
module Data.Mole.Builder.JavaScript where
import qualified Data.Set as S
import qualified Data.Map as M
import Data.Map (Map)
import Data.Maybe
import Data.Monoid
import qualified Data.Text.IO as T
import qualified Data.Text.Encoding as T
import Data.Mole.Types
import Data.Mole.Builder.Internal.Fingerprint
import Data.Mole.Builder.Internal.Template
javascriptBuilder :: String -> Handle -> AssetId -> IO Builder
javascriptBuilder src _ _ = do
body <- T.readFile src
let t@(Template fragments) = template [("__assetUrl(\"", "\")")] body
let deps = catMaybes $ (flip map) fragments $ \f -> case f of
(Lit _) -> Nothing
(Var _ x) -> Just $ AssetId x
return $ Builder
{ assetSources = S.singleton src
, assetDependencies = S.fromList deps
, packageAsset = r t
, sourceFingerprint = T.encodeUtf8 body
}
where
r :: Template -> Map AssetId PublicIdentifier -> Either Error Result
r t m = do
body <- render t $ \(a,b) x -> do
case M.lookup (AssetId x) m of
Nothing -> Left (UndeclaredDependency (AssetId x))
Just (PublicIdentifier v) -> Right $ a <> v <> b
let body' = T.encodeUtf8 body
return $ Result (PublicIdentifier $ fingerprint body' src) $ Just (body', "text/javascript")