1 {-# LANGUAGE OverloadedStrings #-} 2 module 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 Files 15 import Web 16 import Web.Types 17 import Web.Files 18 import Web.Generate 19 import 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