@@ -7,17 +7,19 @@ import Data.List (isPrefixOf, isSuffixOf, (\\))
77import Data.Version (showVersion)
88import Happstack.Server
99import Happstack.Server.Compression
10+import System.Directory
1011import System.Environment
1112import System.FilePath
13+import System.Process
1214import qualified Language.Elm as Elm
1315import Paths_elm_server
1416
15−runtime = "/elm-" ++ showVersion version ++ ".js"
17+runtime = "/elm-runtime.js"
1618
1719serve :: Int -> String -> IO ()
1820serve portNumber libLoc = do
19− putStrLn ("Elm Server " ++ showVersion version ++
20− ": running at <http://localhost:" ++ (show portNumber) ++ ">")
21+ putStrLn $ "Elm Server " ++ showVersion version ++
22+ ": running at <http://localhost:" ++ show portNumber ++ ">"
2123 putStrLn "Just refresh a page to recompile it!"
2224 simpleHTTP httpConf $ do
2325 _ <- compressedResponseFilter
@@ -30,11 +32,16 @@ serve portNumber libLoc = do
3032pageTitle :: String -> String
3133pageTitle = dropExtension . takeBaseName
3234
35+serveElm :: FilePath -> ServerPartT IO Response
3336serveElm fp = do
3437 guard (takeExtension fp == ".elm")
35− content <- liftIO (readFile (tail fp))
36− length content `seq` (ok . toResponse $ Elm.toHtml runtime (pageTitle fp) content)
38+ let file = tail fp
39+ liftIO $ rawSystem "elm" [ "--make" ,"--runtime=" ++ runtime
40+ , "--cache-dir=elm-server-cache", file ]
41+ liftIO $ removeDirectoryRecursive "elm-server-cache"
42+ serveFile (asContentType "text/html") ("build" </> replaceExtension file "html")
3743
44+serveLib :: FilePath -> [Char] -> ServerPartT IO Response
3845serveLib libLoc fp = do
3946 guard (fp == runtime)
4047 serveFile (asContentType "application/javascript") libLoc
@@ -45,16 +52,18 @@ main = getArgs >>= parse
4552parse :: [String] -> IO ()
4653parse ("--help":_) = putStrLn usage
4754parse ("--version":_) = putStrLn ("The Elm Server " ++ showVersion version)
48−parse args = if null remainingArgs
49− then serve portNumber =<< elmRuntime
50− else putStrLn usageMini
51− where runtimeArg = filter (isPrefixOf "--runtime-location=") args
52− portArg = filter (isPrefixOf "--port=") args
53− remainingArgs = (args \\ runtimeArg) \\ portArg
55+parse args =
56+ case null remainingArgs of
57+ True -> serve portNumber =<< elmRuntime
58+ False -> putStrLn usageMini
59+ where
60+ runtimeArg = filter (isPrefixOf "--runtime-location=") args
61+ portArg = filter (isPrefixOf "--port=") args
62+ remainingArgs = (args \\ runtimeArg) \\ portArg
5463
55− argValue arg = tail $ dropWhile (/= '=') (head arg)
56− portNumber = if null portArg then 8000 else read (argValue portArg) :: Int
57− elmRuntime = if null runtimeArg then Elm.runtime else return $ argValue runtimeArg
64+ argValue arg = tail $ dropWhile (/= '=') (head arg)
65+ portNumber = if null portArg then 8000 else read (argValue portArg) :: Int
66+ elmRuntime = if null runtimeArg then Elm.runtime else return $ argValue runtimeArg
5867
5968usageMini :: String
6069usageMini =