1 {-# LANGUAGE OverloadedStrings #-} 2 module Databrary.Web.Uglify 3 ( appWebJS 4 , generateUglifyJS 5 ) where 6 7 import Control.Monad (guard) 8 import Control.Monad.IO.Class (liftIO) 9 import Data.ByteString (isPrefixOf) 10 import Data.List (union) 11 import qualified System.Posix.FilePath as RF 12 import System.Process (callProcess) 13 14 import Databrary.Files 15 import Databrary.Web 16 import Databrary.Web.Types 17 import Databrary.Web.Files 18 import Databrary.Web.Generate 19 import Databrary.Web.Libs 20 21 appWebJS :: IO [WebFilePath] 22 appWebJS = do 23 includes <- webIncludes 24 pre <- mapM makeWebFilePath pre' 25 filteredJS <- filter (\f -> not (isPrefixOf "lib/" (webFileRel f)) && f `notElem` pre) <$> findWebFiles ".js" 26 let webjs = mconcat [includes, tail pre, filteredJS] 27 coffee <- map (replaceWebExtension ".js") <$> findWebFiles ".coffee" 28 return $ union webjs coffee 29 where 30 pre' = ["debug.js", "app.js", "constants.js", "routes.js", "messages.js", "templates.js"] 31 32 generateUglifyJS :: WebGenerator 33 generateUglifyJS = \fileToGenInfo@(fileToGen, _) -> do 34 inputFiles <- liftIO appWebJS 35 guard (not $ null inputFiles) 36 inputFilesAbs <- mapM ((liftIO . unRawFilePath) . webFileAbs) inputFiles 37 fileToGenAbs <- liftIO $ unRawFilePath $ webFileAbs fileToGen 38 let fileToGenMap = (webFileAbs fileToGen) RF.<.> ".map" 39 fileToGenMapAbs <- liftIO $ unRawFilePath fileToGenMap 40 webRegenerate (do 41 print "making minified with command..." 42 print 43 ("uglifyjs", 44 ["--output", fileToGenAbs 45 , "--source-map", fileToGenMapAbs 46 , "--prefix", "relative" 47 , "--screw-ie8", "--mangle", "--compress" 48 , "--define", "DEBUG=false" 49 , "--wrap", "app" 50 ] 51 ++ inputFilesAbs) 52 callProcess "uglifyjs" $ 53 ["--output", fileToGenAbs 54 , "--source-map", fileToGenMapAbs 55 , "--prefix", "relative" 56 , "--screw-ie8", "--mangle", "--compress" 57 , "--define", "DEBUG=false" 58 , "--wrap", "app" 59 ] 60 ++ inputFilesAbs) 61 [] 62 inputFiles 63 fileToGenInfo