module Static.Resources.Generation (
generateResources
) where
import Static.Resources.Types
import Data.Hash.MD5
import Data.Time
import Control.Monad
import Data.Functor
generateAgregatedResourceTypeContent :: ResourceType -> ResourceSet -> IO String
generateAgregatedResourceTypeContent rt rs = do
let files = map path $ filterByType (== rt) rs
s <- forM files $ \p -> readFile p
return $ (concat s)
generateAgregatedCSSFile :: ResourceSet -> IO FilePath
generateAgregatedCSSFile rs = do
t <- show <$> getCurrentTime
c <- generateAgregatedResourceTypeContent CSS rs
let fn = (name rs) ++ "-" ++ (md5s $ Str $ t) ++ ".css"
writeFile fn c
return fn
generateAgregatedJSFile :: ResourceSet -> IO FilePath
generateAgregatedJSFile rs = do
t <- show <$> getCurrentTime
c <- generateAgregatedResourceTypeContent JS rs
let fn = (name rs) ++ "-" ++ (md5s $ Str $ t) ++ ".js"
writeFile fn c
return fn
generateResources :: ImportType -> ResourceSpec -> IO ResourceSetsForImport
generateResources it spec = ResourceSetsForImport <$> forM (sets spec) (generateResourcesForSet it)
generateResourcesForSet :: ImportType -> ResourceSet -> IO ResourceSetForImport
generateResourcesForSet Development rs =
return $ ResourceSetForImport {
set = rs
, cssFiles = path <$> filterByType (== CSS) rs
, jsFiles = path <$> filterByType (\t -> t == JS || t == JSX) rs
}
generateResourcesForSet Production rs = do
cssF <- generateAgregatedCSSFile rs
jsF <- generateAgregatedJSFile rs
return $ ResourceSetForImport {
set = rs
, cssFiles = [cssF]
, jsFiles = jsF : (path <$> filterByType (== JSX) rs)
}